aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.cirrus.yml4
-rw-r--r--.github/workflows/ci.yml16
-rw-r--r--.gitignore3
-rw-r--r--Makefile.am10
-rw-r--r--build_msvc/bitcoin_config.h.in60
-rw-r--r--build_msvc/libbitcoin_consensus/libbitcoin_consensus.vcxproj1
-rw-r--r--build_msvc/test_bitcoin-qt/test_bitcoin-qt.vcxproj8
-rw-r--r--ci/README.md4
-rwxr-xr-xci/lint/04_install.sh5
-rwxr-xr-xci/lint/06_script.sh23
-rwxr-xr-xci/lint/container-entrypoint.sh2
-rwxr-xr-xci/test/00_setup_env_arm.sh4
-rwxr-xr-xci/test/00_setup_env_i686_multiprocess.sh3
-rwxr-xr-xci/test/00_setup_env_mac_native.sh4
-rwxr-xr-xci/test/00_setup_env_native_asan.sh6
-rwxr-xr-xci/test/00_setup_env_native_fuzz.sh6
-rwxr-xr-xci/test/00_setup_env_native_fuzz_with_msan.sh2
-rwxr-xr-xci/test/00_setup_env_native_msan.sh2
-rwxr-xr-xci/test/00_setup_env_native_previous_releases.sh10
-rwxr-xr-xci/test/00_setup_env_native_tidy.sh4
-rwxr-xr-xci/test/00_setup_env_native_tsan.sh4
-rwxr-xr-xci/test/00_setup_env_win64.sh2
-rwxr-xr-xci/test/01_base_install.sh7
-rwxr-xr-xci/test/02_run_container.sh8
-rwxr-xr-xci/test/03_test_script.sh18
-rw-r--r--configure.ac91
-rw-r--r--contrib/devtools/bitcoin-tidy/CMakeLists.txt19
-rw-r--r--contrib/devtools/bitcoin-tidy/README.md (renamed from contrib/devtools/bitcoin-tidy/README)0
-rwxr-xr-xcontrib/devtools/test_deterministic_coverage.sh26
-rwxr-xr-xcontrib/devtools/test_utxo_snapshots.sh4
-rwxr-xr-xcontrib/guix/guix-build3
-rwxr-xr-xcontrib/guix/libexec/build.sh2
-rw-r--r--contrib/guix/libexec/prelude.bash2
-rw-r--r--contrib/guix/manifest.scm26
-rw-r--r--contrib/guix/patches/glibc-2.27-fcommon.patch2
-rw-r--r--contrib/guix/patches/vmov-alignment.patch38
-rwxr-xr-xcontrib/seeds/makeseeds.py21
-rw-r--r--contrib/seeds/nodes_main.txt2248
-rw-r--r--contrib/seeds/nodes_main_manual.txt1096
-rw-r--r--contrib/seeds/nodes_test.txt112
-rw-r--r--depends/builders/default.mk3
-rw-r--r--depends/builders/openbsd.mk2
-rw-r--r--depends/funcs.mk13
-rw-r--r--depends/packages.md3
-rw-r--r--depends/packages/bdb.mk6
-rw-r--r--depends/packages/capnp.mk5
-rw-r--r--depends/packages/expat.mk3
-rw-r--r--depends/packages/freetype.mk1
-rw-r--r--depends/packages/libXau.mk1
-rw-r--r--depends/packages/libevent.mk5
-rw-r--r--depends/packages/libmultiprocess.mk6
-rw-r--r--depends/packages/libxcb_util.mk1
-rw-r--r--depends/packages/qrencode.mk2
-rw-r--r--depends/packages/qt.mk13
-rw-r--r--depends/packages/sqlite.mk4
-rw-r--r--depends/packages/zeromq.mk5
-rw-r--r--depends/patches/qt/fast_fixed_dtoa_no_optimize.patch20
-rw-r--r--depends/patches/qt/fix_android_jni_static.patch1
-rw-r--r--depends/patches/qt/memory_resource.patch2
-rw-r--r--depends/patches/qt/use_android_ndk23.patch13
-rw-r--r--doc/README.md1
-rw-r--r--doc/bips.md2
-rw-r--r--doc/build-openbsd.md4
-rw-r--r--doc/build-unix.md4
-rw-r--r--doc/dependencies.md4
-rw-r--r--doc/design/assumeutxo.md18
-rw-r--r--doc/design/libraries.md9
-rw-r--r--doc/developer-notes.md15
-rw-r--r--doc/fuzzing.md7
-rw-r--r--doc/offline-signing-tutorial.md4
-rw-r--r--doc/policy/mempool-replacements.md2
-rw-r--r--doc/release-notes-27114.md2
-rw-r--r--doc/release-notes-27375.md6
-rw-r--r--doc/release-notes-28207.md7
-rw-r--r--doc/release-notes-29189.md15
-rw-r--r--doc/release-notes/release-notes-26.1.md106
-rw-r--r--doc/shared-libraries.md78
-rw-r--r--doc/translation_process.md16
-rw-r--r--libbitcoinconsensus.pc.in10
-rw-r--r--src/.clang-tidy1
-rw-r--r--src/Makefile.am39
-rw-r--r--src/Makefile.bench.include4
-rw-r--r--src/Makefile.qt_locale.include3
-rw-r--r--src/Makefile.test.include4
-rw-r--r--src/addrdb.cpp26
-rw-r--r--src/addrman.cpp4
-rw-r--r--src/bench/bench.cpp2
-rw-r--r--src/bench/index_blockfilter.cpp43
-rw-r--r--src/bench/parse_hex.cpp36
-rw-r--r--src/bench/verify_script.cpp14
-rw-r--r--src/bench/wallet_balance.cpp3
-rw-r--r--src/bench/wallet_create.cpp4
-rw-r--r--src/bench/wallet_ismine.cpp77
-rw-r--r--src/bench/wallet_loading.cpp4
-rw-r--r--src/bitcoin-chainstate.cpp32
-rw-r--r--src/bitcoin-cli.cpp5
-rw-r--r--src/chain.h67
-rw-r--r--src/chainparamsseeds.h2352
-rw-r--r--src/clientversion.cpp4
-rw-r--r--src/common/args.cpp12
-rw-r--r--src/common/args.h5
-rw-r--r--src/common/system.cpp4
-rw-r--r--src/compat/byteswap.h66
-rw-r--r--src/compat/compat.h11
-rw-r--r--src/compat/endian.h241
-rw-r--r--src/crc32c/src/crc32c_arm64.cc32
-rw-r--r--src/crypto/chacha20poly1305.cpp4
-rw-r--r--src/crypto/common.h53
-rw-r--r--src/crypto/muhash.h4
-rw-r--r--src/crypto/sha256.cpp12
-rw-r--r--src/cuckoocache.h2
-rw-r--r--src/flatfile.cpp9
-rw-r--r--src/i2p.cpp17
-rw-r--r--src/i2p.h9
-rw-r--r--src/index/base.cpp70
-rw-r--r--src/index/base.h16
-rw-r--r--src/index/blockfilterindex.cpp91
-rw-r--r--src/index/blockfilterindex.h7
-rw-r--r--src/index/coinstatsindex.cpp24
-rw-r--r--src/index/txindex.cpp12
-rw-r--r--src/init.cpp158
-rw-r--r--src/kernel/chainparams.cpp40
-rw-r--r--src/kernel/chainstatemanager_opts.h2
-rw-r--r--src/kernel/coinstats.cpp3
-rw-r--r--src/kernel/mempool_options.h4
-rw-r--r--src/kernel/mempool_persist.cpp23
-rw-r--r--src/kernel/notifications_interface.h8
-rw-r--r--src/key.h6
-rw-r--r--src/logging.h9
-rw-r--r--src/net.cpp79
-rw-r--r--src/net.h33
-rw-r--r--src/net_permissions.cpp28
-rw-r--r--src/net_permissions.h8
-rw-r--r--src/net_processing.cpp305
-rw-r--r--src/netaddress.cpp13
-rw-r--r--src/netaddress.h9
-rw-r--r--src/netbase.cpp221
-rw-r--r--src/netbase.h90
-rw-r--r--src/node/abort.cpp9
-rw-r--r--src/node/abort.h7
-rw-r--r--src/node/blockstorage.cpp111
-rw-r--r--src/node/context.h4
-rw-r--r--src/node/interfaces.cpp14
-rw-r--r--src/node/kernel_notifications.cpp8
-rw-r--r--src/node/kernel_notifications.h5
-rw-r--r--src/node/transaction.cpp4
-rw-r--r--src/node/transaction.h6
-rw-r--r--src/noui.cpp7
-rw-r--r--src/policy/rbf.cpp21
-rw-r--r--src/policy/rbf.h26
-rw-r--r--src/policy/v3_policy.cpp49
-rw-r--r--src/policy/v3_policy.h10
-rw-r--r--src/primitives/block.h8
-rw-r--r--src/qt/addressbookpage.cpp4
-rw-r--r--src/qt/askpassphrasedialog.cpp4
-rw-r--r--src/qt/bitcoin.cpp5
-rw-r--r--src/qt/bitcoin_locale.qrc3
-rw-r--r--src/qt/bitcoingui.cpp11
-rw-r--r--src/qt/bitcoinstrings.cpp9
-rw-r--r--src/qt/clientmodel.cpp47
-rw-r--r--src/qt/clientmodel.h10
-rw-r--r--src/qt/coincontroldialog.cpp4
-rw-r--r--src/qt/guiutil.cpp4
-rw-r--r--src/qt/intro.cpp8
-rw-r--r--src/qt/intro.h1
-rw-r--r--src/qt/locale/bitcoin_af.ts437
-rw-r--r--src/qt/locale/bitcoin_am.ts18
-rw-r--r--src/qt/locale/bitcoin_ar.ts4383
-rw-r--r--src/qt/locale/bitcoin_az.ts4
-rw-r--r--src/qt/locale/bitcoin_bg.ts63
-rw-r--r--src/qt/locale/bitcoin_bn.ts16
-rw-r--r--src/qt/locale/bitcoin_bs.ts4
-rw-r--r--src/qt/locale/bitcoin_ca.ts177
-rw-r--r--src/qt/locale/bitcoin_cmn.ts1090
-rw-r--r--src/qt/locale/bitcoin_cs.ts40
-rw-r--r--src/qt/locale/bitcoin_da.ts28
-rw-r--r--src/qt/locale/bitcoin_de.ts137
-rw-r--r--src/qt/locale/bitcoin_de_AT.ts120
-rw-r--r--src/qt/locale/bitcoin_de_CH.ts120
-rw-r--r--src/qt/locale/bitcoin_el.ts192
-rw-r--r--src/qt/locale/bitcoin_en.ts137
-rw-r--r--src/qt/locale/bitcoin_en.xlf2282
-rw-r--r--src/qt/locale/bitcoin_es.ts1278
-rw-r--r--src/qt/locale/bitcoin_es_CL.ts125
-rw-r--r--src/qt/locale/bitcoin_es_CO.ts285
-rw-r--r--src/qt/locale/bitcoin_es_DO.ts117
-rw-r--r--src/qt/locale/bitcoin_es_MX.ts118
-rw-r--r--src/qt/locale/bitcoin_es_SV.ts121
-rw-r--r--src/qt/locale/bitcoin_es_VE.ts119
-rw-r--r--src/qt/locale/bitcoin_fa.ts32
-rw-r--r--src/qt/locale/bitcoin_fi.ts32
-rw-r--r--src/qt/locale/bitcoin_fil.ts8
-rw-r--r--src/qt/locale/bitcoin_fo.ts26
-rw-r--r--src/qt/locale/bitcoin_fr.ts348
-rw-r--r--src/qt/locale/bitcoin_fr_CM.ts124
-rw-r--r--src/qt/locale/bitcoin_fr_LU.ts124
-rw-r--r--src/qt/locale/bitcoin_ga.ts16
-rw-r--r--src/qt/locale/bitcoin_ga_IE.ts16
-rw-r--r--src/qt/locale/bitcoin_gl_ES.ts4
-rw-r--r--src/qt/locale/bitcoin_hak.ts1094
-rw-r--r--src/qt/locale/bitcoin_he.ts24
-rw-r--r--src/qt/locale/bitcoin_hi.ts39
-rw-r--r--src/qt/locale/bitcoin_hr.ts28
-rw-r--r--src/qt/locale/bitcoin_hu.ts172
-rw-r--r--src/qt/locale/bitcoin_id.ts146
-rw-r--r--src/qt/locale/bitcoin_it.ts112
-rw-r--r--src/qt/locale/bitcoin_ja.ts102
-rw-r--r--src/qt/locale/bitcoin_km.ts8
-rw-r--r--src/qt/locale/bitcoin_ko.ts28
-rw-r--r--src/qt/locale/bitcoin_la.ts4
-rw-r--r--src/qt/locale/bitcoin_lb.ts4
-rw-r--r--src/qt/locale/bitcoin_lt.ts8
-rw-r--r--src/qt/locale/bitcoin_mi.ts4
-rw-r--r--src/qt/locale/bitcoin_mk.ts66
-rw-r--r--src/qt/locale/bitcoin_ml.ts67
-rw-r--r--src/qt/locale/bitcoin_nb.ts20
-rw-r--r--src/qt/locale/bitcoin_ne.ts105
-rw-r--r--src/qt/locale/bitcoin_nl.ts178
-rw-r--r--src/qt/locale/bitcoin_pam.ts33
-rw-r--r--src/qt/locale/bitcoin_pl.ts128
-rw-r--r--src/qt/locale/bitcoin_pt.ts123
-rw-r--r--src/qt/locale/bitcoin_pt_BR.ts123
-rw-r--r--src/qt/locale/bitcoin_ro.ts12
-rw-r--r--src/qt/locale/bitcoin_ru.ts48
-rw-r--r--src/qt/locale/bitcoin_ru_RU.ts4858
-rw-r--r--src/qt/locale/bitcoin_si.ts4
-rw-r--r--src/qt/locale/bitcoin_sk.ts28
-rw-r--r--src/qt/locale/bitcoin_sl.ts40
-rw-r--r--src/qt/locale/bitcoin_so.ts4
-rw-r--r--src/qt/locale/bitcoin_sr.ts84
-rw-r--r--src/qt/locale/bitcoin_sr@ijekavianlatin.ts84
-rw-r--r--src/qt/locale/bitcoin_sr@latin.ts84
-rw-r--r--src/qt/locale/bitcoin_sv.ts41
-rw-r--r--src/qt/locale/bitcoin_sw.ts2
-rw-r--r--src/qt/locale/bitcoin_ta.ts8
-rw-r--r--src/qt/locale/bitcoin_te.ts24
-rw-r--r--src/qt/locale/bitcoin_th.ts880
-rw-r--r--src/qt/locale/bitcoin_tk.ts16
-rw-r--r--src/qt/locale/bitcoin_tr.ts18
-rw-r--r--src/qt/locale/bitcoin_ug.ts8
-rw-r--r--src/qt/locale/bitcoin_uk.ts138
-rw-r--r--src/qt/locale/bitcoin_ur.ts4
-rw-r--r--src/qt/locale/bitcoin_uz.ts2
-rw-r--r--src/qt/locale/bitcoin_vi.ts50
-rw-r--r--src/qt/locale/bitcoin_yue.ts1134
-rw-r--r--src/qt/locale/bitcoin_zh-Hans.ts120
-rw-r--r--src/qt/locale/bitcoin_zh-Hant.ts1094
-rw-r--r--src/qt/locale/bitcoin_zh.ts2955
-rw-r--r--src/qt/locale/bitcoin_zh_CN.ts120
-rw-r--r--src/qt/locale/bitcoin_zh_HK.ts1052
-rw-r--r--src/qt/locale/bitcoin_zh_TW.ts191
-rw-r--r--src/qt/main.cpp2
-rw-r--r--src/qt/modaloverlay.cpp4
-rw-r--r--src/qt/notificator.cpp4
-rw-r--r--src/qt/optionsdialog.cpp14
-rw-r--r--src/qt/paymentserver.cpp4
-rw-r--r--src/qt/paymentserver.h4
-rw-r--r--src/qt/rpcconsole.cpp13
-rw-r--r--src/qt/rpcconsole.h2
-rw-r--r--src/qt/sendcoinsdialog.cpp1
-rw-r--r--src/qt/sendcoinsentry.cpp4
-rw-r--r--src/qt/sendcoinsrecipient.h4
-rw-r--r--src/qt/test/apptests.cpp4
-rw-r--r--src/qt/test/optiontests.cpp15
-rw-r--r--src/qt/test/test_main.cpp51
-rw-r--r--src/qt/test/wallettests.cpp2
-rw-r--r--src/qt/transactiondesc.cpp4
-rw-r--r--src/qt/utilitydialog.cpp3
-rw-r--r--src/qt/walletmodel.cpp11
-rw-r--r--src/qt/walletmodel.h4
-rw-r--r--src/qt/walletmodeltransaction.cpp4
-rw-r--r--src/random.cpp4
-rw-r--r--src/random.h3
-rw-r--r--src/rest.cpp24
-rw-r--r--src/rpc/blockchain.cpp67
-rw-r--r--src/rpc/client.cpp7
-rw-r--r--src/rpc/external_signer.cpp4
-rw-r--r--src/rpc/fees.cpp10
-rw-r--r--src/rpc/mempool.cpp46
-rw-r--r--src/rpc/mining.cpp8
-rw-r--r--src/rpc/net.cpp16
-rw-r--r--src/rpc/node.cpp6
-rw-r--r--src/rpc/register.h4
-rw-r--r--src/rpc/server.cpp4
-rw-r--r--src/rpc/util.cpp13
-rw-r--r--src/rpc/util.h5
-rw-r--r--src/scheduler.cpp14
-rw-r--r--src/scheduler.h15
-rw-r--r--src/script/bitcoinconsensus.cpp157
-rw-r--r--src/script/bitcoinconsensus.h96
-rw-r--r--src/script/descriptor.cpp42
-rw-r--r--src/script/descriptor.h7
-rw-r--r--src/script/miniscript.h2
-rw-r--r--src/script/signingprovider.cpp8
-rw-r--r--src/serialize.h44
-rw-r--r--src/support/lockedpool.cpp4
-rw-r--r--src/sync.cpp4
-rw-r--r--src/test/README.md50
-rw-r--r--src/test/bswap_tests.cpp6
-rw-r--r--src/test/coinstatsindex_tests.cpp2
-rw-r--r--src/test/compress_tests.cpp33
-rw-r--r--src/test/crypto_tests.cpp22
-rw-r--r--src/test/feefrac_tests.cpp124
-rw-r--r--src/test/fuzz/feefrac.cpp123
-rw-r--r--src/test/fuzz/feeratediagram.cpp119
-rw-r--r--src/test/fuzz/fuzz.cpp4
-rw-r--r--src/test/fuzz/headerssync.cpp2
-rw-r--r--src/test/fuzz/integer.cpp1
-rw-r--r--src/test/fuzz/net.cpp37
-rw-r--r--src/test/fuzz/net_permissions.cpp6
-rw-r--r--src/test/fuzz/p2p_transport_serialization.cpp1
-rw-r--r--src/test/fuzz/package_eval.cpp14
-rw-r--r--src/test/fuzz/process_message.cpp4
-rw-r--r--src/test/fuzz/process_messages.cpp4
-rw-r--r--src/test/fuzz/rbf.cpp130
-rw-r--r--src/test/fuzz/script_bitcoin_consensus.cpp50
-rw-r--r--src/test/fuzz/tx_pool.cpp14
-rw-r--r--src/test/fuzz/util.cpp2
-rw-r--r--src/test/i2p_tests.cpp21
-rw-r--r--src/test/main.cpp7
-rw-r--r--src/test/netbase_tests.cpp18
-rw-r--r--src/test/peerman_tests.cpp4
-rw-r--r--src/test/policyestimator_tests.cpp20
-rw-r--r--src/test/rbf_tests.cpp476
-rw-r--r--src/test/scheduler_tests.cpp10
-rw-r--r--src/test/script_tests.cpp224
-rw-r--r--src/test/serfloat_tests.cpp116
-rw-r--r--src/test/span_tests.cpp2
-rw-r--r--src/test/streams_tests.cpp9
-rw-r--r--src/test/system_tests.cpp36
-rw-r--r--src/test/txindex_tests.cpp2
-rw-r--r--src/test/txpackage_tests.cpp36
-rw-r--r--src/test/txvalidation_tests.cpp94
-rw-r--r--src/test/util/chainstate.h17
-rw-r--r--src/test/util/mining.cpp6
-rw-r--r--src/test/util/setup_common.cpp74
-rw-r--r--src/test/util/setup_common.h7
-rw-r--r--src/test/util/txmempool.cpp1
-rw-r--r--src/test/validation_block_tests.cpp8
-rw-r--r--src/test/validation_chainstatemanager_tests.cpp26
-rw-r--r--src/test/validation_tests.cpp215
-rw-r--r--src/test/validationinterface_tests.cpp31
-rw-r--r--src/txmempool.cpp141
-rw-r--r--src/txmempool.h26
-rw-r--r--src/util/asmap.cpp6
-rw-r--r--src/util/feefrac.cpp87
-rw-r--r--src/util/feefrac.h160
-rw-r--r--src/util/fs_helpers.cpp13
-rw-r--r--src/util/strencodings.cpp4
-rw-r--r--src/util/task_runner.h52
-rw-r--r--src/util/transaction_identifier.h1
-rw-r--r--src/validation.cpp630
-rw-r--r--src/validation.h28
-rw-r--r--src/validationinterface.cpp93
-rw-r--r--src/validationinterface.h111
-rw-r--r--src/wallet/bdb.cpp9
-rw-r--r--src/wallet/init.cpp4
-rw-r--r--src/wallet/interfaces.cpp4
-rw-r--r--src/wallet/receive.cpp7
-rw-r--r--src/wallet/rpc/addresses.cpp4
-rw-r--r--src/wallet/rpc/backup.cpp14
-rw-r--r--src/wallet/rpc/transactions.cpp8
-rw-r--r--src/wallet/rpc/wallet.cpp221
-rw-r--r--src/wallet/scriptpubkeyman.cpp91
-rw-r--r--src/wallet/scriptpubkeyman.h8
-rw-r--r--src/wallet/sqlite.cpp4
-rw-r--r--src/wallet/test/db_tests.cpp37
-rw-r--r--src/wallet/test/fuzz/coinselection.cpp2
-rw-r--r--src/wallet/test/util.cpp3
-rw-r--r--src/wallet/test/util.h4
-rw-r--r--src/wallet/test/wallet_tests.cpp22
-rw-r--r--src/wallet/test/walletload_tests.cpp1
-rw-r--r--src/wallet/transaction.cpp2
-rw-r--r--src/wallet/transaction.h27
-rw-r--r--src/wallet/wallet.cpp286
-rw-r--r--src/wallet/wallet.h30
-rw-r--r--src/wallet/walletdb.cpp147
-rw-r--r--src/wallet/walletdb.h16
-rw-r--r--src/wallet/walletutil.cpp56
-rw-r--r--src/wallet/walletutil.h2
-rw-r--r--src/warnings.cpp4
-rw-r--r--src/zmq/zmqnotificationinterface.cpp2
-rw-r--r--src/zmq/zmqnotificationinterface.h3
-rw-r--r--src/zmq/zmqpublishnotifier.cpp7
-rw-r--r--src/zmq/zmqpublishnotifier.h6
-rwxr-xr-xtest/functional/feature_abortnode.py2
-rwxr-xr-xtest/functional/feature_addrman.py7
-rwxr-xr-xtest/functional/feature_asmap.py15
-rwxr-xr-xtest/functional/feature_assumeutxo.py123
-rwxr-xr-xtest/functional/feature_assumevalid.py2
-rwxr-xr-xtest/functional/feature_block.py4
-rwxr-xr-xtest/functional/feature_cltv.py3
-rwxr-xr-xtest/functional/feature_csv_activation.py3
-rwxr-xr-xtest/functional/feature_dersig.py3
-rwxr-xr-xtest/functional/feature_fee_estimation.py9
-rwxr-xr-xtest/functional/feature_index_prune.py2
-rwxr-xr-xtest/functional/feature_maxuploadtarget.py5
-rwxr-xr-xtest/functional/feature_proxy.py88
-rwxr-xr-xtest/functional/feature_reindex_readonly.py9
-rwxr-xr-xtest/functional/feature_utxo_set_hash.py4
-rwxr-xr-xtest/functional/interface_rest.py6
-rwxr-xr-xtest/functional/interface_zmq.py19
-rwxr-xr-xtest/functional/mempool_accept.py14
-rwxr-xr-xtest/functional/mempool_accept_v3.py216
-rwxr-xr-xtest/functional/mempool_packages.py3
-rwxr-xr-xtest/functional/mempool_sigoplimit.py8
-rwxr-xr-xtest/functional/p2p_block_sync.py2
-rwxr-xr-xtest/functional/p2p_compactblocks.py2
-rwxr-xr-xtest/functional/p2p_feefilter.py6
-rwxr-xr-xtest/functional/p2p_filter.py3
-rwxr-xr-xtest/functional/p2p_handshake.py92
-rwxr-xr-xtest/functional/p2p_i2p_ports.py18
-rwxr-xr-xtest/functional/p2p_ibd_stalling.py3
-rwxr-xr-xtest/functional/p2p_invalid_block.py3
-rwxr-xr-xtest/functional/p2p_invalid_messages.py45
-rwxr-xr-xtest/functional/p2p_mutated_blocks.py116
-rwxr-xr-xtest/functional/p2p_node_network_limited.py79
-rwxr-xr-xtest/functional/p2p_permissions.py7
-rwxr-xr-xtest/functional/p2p_segwit.py12
-rwxr-xr-xtest/functional/p2p_timeouts.py29
-rwxr-xr-xtest/functional/p2p_v2_earlykeyresponse.py2
-rwxr-xr-xtest/functional/p2p_v2_transport.py6
-rwxr-xr-xtest/functional/rpc_net.py260
-rwxr-xr-xtest/functional/rpc_packages.py33
-rwxr-xr-xtest/functional/rpc_psbt.py13
-rwxr-xr-xtest/functional/rpc_rawtransaction.py5
-rw-r--r--test/functional/test_framework/crypto/bip324_cipher.py8
-rwxr-xr-xtest/functional/test_framework/messages.py1
-rw-r--r--test/functional/test_framework/netutil.py11
-rwxr-xr-xtest/functional/test_framework/p2p.py30
-rw-r--r--test/functional/test_framework/script.py2
-rwxr-xr-xtest/functional/test_framework/test_framework.py19
-rwxr-xr-xtest/functional/test_framework/test_node.py22
-rw-r--r--test/functional/test_framework/util.py17
-rwxr-xr-xtest/functional/test_runner.py72
-rwxr-xr-xtest/functional/wallet_abandonconflict.py9
-rwxr-xr-xtest/functional/wallet_address_types.py5
-rwxr-xr-xtest/functional/wallet_assumeutxo.py2
-rwxr-xr-xtest/functional/wallet_avoid_mixing_output_types.py4
-rwxr-xr-xtest/functional/wallet_avoidreuse.py5
-rwxr-xr-xtest/functional/wallet_backup.py13
-rwxr-xr-xtest/functional/wallet_backwards_compatibility.py19
-rwxr-xr-xtest/functional/wallet_balance.py5
-rwxr-xr-xtest/functional/wallet_basic.py6
-rwxr-xr-xtest/functional/wallet_bumpfee.py3
-rwxr-xr-xtest/functional/wallet_conflicts.py301
-rwxr-xr-xtest/functional/wallet_createwalletdescriptor.py123
-rwxr-xr-xtest/functional/wallet_fundrawtransaction.py5
-rwxr-xr-xtest/functional/wallet_gethdkeys.py185
-rwxr-xr-xtest/functional/wallet_groups.py3
-rwxr-xr-xtest/functional/wallet_hd.py3
-rwxr-xr-xtest/functional/wallet_import_rescan.py4
-rwxr-xr-xtest/functional/wallet_importdescriptors.py5
-rwxr-xr-xtest/functional/wallet_importprunedfunds.py2
-rwxr-xr-xtest/functional/wallet_keypool.py16
-rwxr-xr-xtest/functional/wallet_keypool_topup.py24
-rwxr-xr-xtest/functional/wallet_listreceivedby.py2
-rwxr-xr-xtest/functional/wallet_listsinceblock.py2
-rwxr-xr-xtest/functional/wallet_listtransactions.py6
-rwxr-xr-xtest/functional/wallet_migration.py11
-rwxr-xr-xtest/functional/wallet_reorgsrestore.py1
-rwxr-xr-xtest/functional/wallet_send.py28
-rwxr-xr-xtest/fuzz/test_runner.py17
-rw-r--r--test/lint/README.md14
-rwxr-xr-xtest/lint/lint-git-commit-check.py23
-rwxr-xr-xtest/lint/lint-include-guards.py8
-rwxr-xr-xtest/lint/lint-includes.py8
-rwxr-xr-xtest/lint/lint-spelling.py5
-rwxr-xr-xtest/lint/lint-whitespace.py136
-rw-r--r--test/lint/lint_ignore_dirs.py5
-rw-r--r--test/lint/test_runner/src/main.rs213
-rw-r--r--test/sanitizer_suppressions/ubsan4
472 files changed, 29697 insertions, 15398 deletions
diff --git a/.cirrus.yml b/.cirrus.yml
index 6628d0bbbb..3c59e41a13 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -22,7 +22,7 @@ env: # Global defaults
# - The ./ci/ depedencies (with cirrus-cli) should be installed:
#
# ```
-# apt update && apt install screen python3 bash podman-docker curl -y && curl -L -o cirrus "https://github.com/cirruslabs/cirrus-cli/releases/latest/download/cirrus-linux-$(dpkg --print-architecture)" && mv cirrus /usr/local/bin/cirrus && chmod +x /usr/local/bin/cirrus
+# apt update && apt install git screen python3 bash podman-docker curl -y && curl -L -o cirrus "https://github.com/cirruslabs/cirrus-cli/releases/latest/download/cirrus-linux-$(dpkg --print-architecture)" && mv cirrus /usr/local/bin/cirrus && chmod +x /usr/local/bin/cirrus
# ```
#
# - There are no strict requirements on the hardware, because having less CPUs
@@ -55,7 +55,7 @@ base_template: &BASE_TEMPLATE
<< : *FILTER_TEMPLATE
merge_base_script:
# Unconditionally install git (used in fingerprint_script).
- - bash -c "$PACKAGE_MANAGER_INSTALL git"
+ - git --version || bash -c "$PACKAGE_MANAGER_INSTALL git"
- if [ "$CIRRUS_PR" = "" ]; then exit 0; fi
- git fetch --depth=1 $CIRRUS_REPO_CLONE_URL "pull/${CIRRUS_PR}/merge"
- git checkout FETCH_HEAD # Use merged changes to detect silent merge conflicts
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 5857753e14..b92e3c66d0 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -62,7 +62,7 @@ jobs:
echo "TEST_BASE=$(git rev-list -n$((${{ env.MAX_COUNT }} + 1)) --reverse HEAD ^$(git rev-list -n1 --merges HEAD)^@ | head -1)" >> "$GITHUB_ENV"
- run: |
sudo apt-get update
- sudo apt-get install clang-15 ccache build-essential libtool autotools-dev automake pkg-config bsdmainutils python3-zmq libevent-dev libboost-dev libsqlite3-dev libdb++-dev systemtap-sdt-dev libminiupnpc-dev libnatpmp-dev libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools qtwayland5 libqrencode-dev -y
+ sudo apt-get install clang-15 ccache build-essential libtool autotools-dev automake pkg-config bsdmainutils python3-zmq libevent-dev libboost-dev libsqlite3-dev libdb++-dev systemtap-sdt-dev libminiupnpc-dev libnatpmp-dev qtbase5-dev qttools5-dev qttools5-dev-tools qtwayland5 libqrencode-dev -y
- name: Compile and run tests
run: |
# Run tests on commits after the last merge commit and before the PR head commit
@@ -96,7 +96,10 @@ jobs:
- name: Install Homebrew packages
env:
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
- run: brew install automake libtool pkg-config gnu-getopt ccache boost libevent miniupnpc libnatpmp zeromq qt@5 qrencode
+ run: |
+ # A workaround for "The `brew link` step did not complete successfully" error.
+ brew install python@3 || brew link --overwrite python@3
+ brew install automake libtool pkg-config gnu-getopt ccache boost libevent miniupnpc libnatpmp zeromq qt@5 qrencode
- name: Set Ccache directory
run: echo "CCACHE_DIR=${RUNNER_TEMP}/ccache_dir" >> "$GITHUB_ENV"
@@ -148,14 +151,16 @@ jobs:
with:
arch: x64
- - name: Check MSBuild and Qt
+ - name: Get tool information
run: |
msbuild -version | Out-File -FilePath "$env:GITHUB_WORKSPACE\msbuild_version"
Get-Content -Path "$env:GITHUB_WORKSPACE\msbuild_version"
$env:VCToolsVersion | Out-File -FilePath "$env:GITHUB_WORKSPACE\toolset_version"
- Get-Content -Path "$env:GITHUB_WORKSPACE\toolset_version"
+ Write-Host "VCToolsVersion $(Get-Content -Path "$env:GITHUB_WORKSPACE\toolset_version")"
$env:CI_QT_URL | Out-File -FilePath "$env:GITHUB_WORKSPACE\qt_url"
$env:CI_QT_CONF | Out-File -FilePath "$env:GITHUB_WORKSPACE\qt_conf"
+ py -3 --version
+ Write-Host "PowerShell version $($PSVersionTable.PSVersion.ToString())"
- name: Restore static Qt cache
id: static-qt-cache
@@ -288,4 +293,5 @@ jobs:
- name: Run functional tests
env:
TEST_RUNNER_EXTRA: ${{ github.event_name != 'pull_request' && '--extended' || '' }}
- run: py -3 test\functional\test_runner.py --jobs $env:NUMBER_OF_PROCESSORS --ci --quiet --tmpdirprefix=$env:RUNNER_TEMP --combinedlogslen=99999999 --timeout-factor=$env:TEST_RUNNER_TIMEOUT_FACTOR $env:TEST_RUNNER_EXTRA
+ shell: cmd
+ run: py -3 test\functional\test_runner.py --jobs %NUMBER_OF_PROCESSORS% --ci --quiet --tmpdirprefix=%RUNNER_TEMP% --combinedlogslen=99999999 --timeout-factor=%TEST_RUNNER_TIMEOUT_FACTOR% %TEST_RUNNER_EXTRA%
diff --git a/.gitignore b/.gitignore
index c77303f50e..f7bcbd1459 100644
--- a/.gitignore
+++ b/.gitignore
@@ -130,12 +130,12 @@ win32-build
test/config.ini
test/cache/*
test/.mypy_cache/
+test/lint/test_runner/target/
!src/leveldb*/Makefile
/doc/doxygen/
-libbitcoinconsensus.pc
contrib/devtools/split-debug.sh
# Output from running db4 installation
@@ -144,7 +144,6 @@ db4/
# clang-check
*.plist
-osx_volname
dist/
/guix-build-*
diff --git a/Makefile.am b/Makefile.am
index eec498dc0e..cd1509a0ff 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -14,11 +14,6 @@ endif
.PHONY: deploy FORCE
.INTERMEDIATE: $(COVERAGE_INFO)
-if BUILD_BITCOIN_LIBS
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = libbitcoinconsensus.pc
-endif
-
BITCOIND_BIN=$(top_builddir)/src/$(BITCOIN_DAEMON_NAME)$(EXEEXT)
BITCOIN_QT_BIN=$(top_builddir)/src/qt/$(BITCOIN_GUI_NAME)$(EXEEXT)
BITCOIN_TEST_BIN=$(top_builddir)/src/test/$(BITCOIN_TEST_NAME)$(EXEEXT)
@@ -118,9 +113,6 @@ OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lp
$(OSX_APP)/Contents/Resources/bitcoin.icns $(OSX_APP)/Contents/Info.plist \
$(OSX_APP)/Contents/MacOS/Bitcoin-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings
-osx_volname:
- echo $(OSX_VOLNAME) >$@
-
if BUILD_DARWIN
$(OSX_ZIP): $(OSX_APP_BUILT) $(OSX_PACKAGING)
$(PYTHON) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) $(OSX_VOLNAME) -translations-dir=$(QT_TRANSLATION_DIR) -zip
@@ -338,7 +330,7 @@ clean-docs:
clean-local: clean-docs
rm -rf coverage_percent.txt test_bitcoin.coverage/ total.coverage/ fuzz.coverage/ test/tmp/ cache/ $(OSX_APP)
rm -rf test/functional/__pycache__ test/functional/test_framework/__pycache__ test/cache share/rpcauth/__pycache__
- rm -rf osx_volname dist/
+ rm -rf dist/ test/lint/test_runner/target/ test/lint/__pycache__
test-security-check:
if TARGET_DARWIN
diff --git a/build_msvc/bitcoin_config.h.in b/build_msvc/bitcoin_config.h.in
index ec69307f50..2d6df92286 100644
--- a/build_msvc/bitcoin_config.h.in
+++ b/build_msvc/bitcoin_config.h.in
@@ -41,70 +41,10 @@
/* Define this symbol to enable ZMQ functions */
#define ENABLE_ZMQ 1
-/* Define to 1 if you have the declaration of `be16toh', and to 0 if you
- don't. */
-#define HAVE_DECL_BE16TOH 0
-
-/* Define to 1 if you have the declaration of `be32toh', and to 0 if you
- don't. */
-#define HAVE_DECL_BE32TOH 0
-
-/* Define to 1 if you have the declaration of `be64toh', and to 0 if you
- don't. */
-#define HAVE_DECL_BE64TOH 0
-
-/* Define to 1 if you have the declaration of `bswap_16', and to 0 if you
- don't. */
-#define HAVE_DECL_BSWAP_16 0
-
-/* Define to 1 if you have the declaration of `bswap_32', and to 0 if you
- don't. */
-#define HAVE_DECL_BSWAP_32 0
-
-/* Define to 1 if you have the declaration of `bswap_64', and to 0 if you
- don't. */
-#define HAVE_DECL_BSWAP_64 0
-
/* Define to 1 if you have the declaration of `fork', and to 0 if you don't.
*/
#define HAVE_DECL_FORK 0
-/* Define to 1 if you have the declaration of `htobe16', and to 0 if you
- don't. */
-#define HAVE_DECL_HTOBE16 0
-
-/* Define to 1 if you have the declaration of `htobe32', and to 0 if you
- don't. */
-#define HAVE_DECL_HTOBE32 0
-
-/* Define to 1 if you have the declaration of `htobe64', and to 0 if you
- don't. */
-#define HAVE_DECL_HTOBE64 0
-
-/* Define to 1 if you have the declaration of `htole16', and to 0 if you
- don't. */
-#define HAVE_DECL_HTOLE16 0
-
-/* Define to 1 if you have the declaration of `htole32', and to 0 if you
- don't. */
-#define HAVE_DECL_HTOLE32 0
-
-/* Define to 1 if you have the declaration of `htole64', and to 0 if you
- don't. */
-#define HAVE_DECL_HTOLE64 0
-
-/* Define to 1 if you have the declaration of `le16toh', and to 0 if you
- don't. */
-#define HAVE_DECL_LE16TOH 0
-
-/* Define to 1 if you have the declaration of `le32toh', and to 0 if you
- don't. */
-#define HAVE_DECL_LE32TOH 0
-
-/* Define to 1 if you have the declaration of `le64toh', and to 0 if you
- don't. */
-#define HAVE_DECL_LE64TOH 0
-
/* Define to 1 if you have the declaration of `setsid', and to 0 if you don't.
*/
#define HAVE_DECL_SETSID 0
diff --git a/build_msvc/libbitcoin_consensus/libbitcoin_consensus.vcxproj b/build_msvc/libbitcoin_consensus/libbitcoin_consensus.vcxproj
index 95fdcdb79b..a34ef41d16 100644
--- a/build_msvc/libbitcoin_consensus/libbitcoin_consensus.vcxproj
+++ b/build_msvc/libbitcoin_consensus/libbitcoin_consensus.vcxproj
@@ -15,7 +15,6 @@
<ClCompile Include="..\..\src\primitives\block.cpp" />
<ClCompile Include="..\..\src\primitives\transaction.cpp" />
<ClCompile Include="..\..\src\pubkey.cpp" />
- <ClCompile Include="..\..\src\script\bitcoinconsensus.cpp" />
<ClCompile Include="..\..\src\script\interpreter.cpp" />
<ClCompile Include="..\..\src\script\script.cpp" />
<ClCompile Include="..\..\src\script\script_error.cpp" />
diff --git a/build_msvc/test_bitcoin-qt/test_bitcoin-qt.vcxproj b/build_msvc/test_bitcoin-qt/test_bitcoin-qt.vcxproj
index c5a32a9711..7b4b73ca21 100644
--- a/build_msvc/test_bitcoin-qt/test_bitcoin-qt.vcxproj
+++ b/build_msvc/test_bitcoin-qt/test_bitcoin-qt.vcxproj
@@ -9,19 +9,13 @@
</PropertyGroup>
<ItemGroup>
<ClCompile Include="..\..\src\init\bitcoin-qt.cpp" />
- <ClCompile Include="..\..\src\test\util\setup_common.cpp" />
- <ClCompile Include="..\..\src\wallet\test\util.cpp">
- <ObjectFileName>$(IntDir)wallet_test_util.obj</ObjectFileName>
- </ClCompile>
<ClCompile Include="..\..\src\qt\test\addressbooktests.cpp" />
<ClCompile Include="..\..\src\qt\test\apptests.cpp" />
<ClCompile Include="..\..\src\qt\test\optiontests.cpp" />
<ClCompile Include="..\..\src\qt\test\rpcnestedtests.cpp" />
<ClCompile Include="..\..\src\qt\test\test_main.cpp" />
<ClCompile Include="..\..\src\qt\test\uritests.cpp" />
- <ClCompile Include="..\..\src\qt\test\util.cpp">
- <ObjectFileName>$(IntDir)qt_test_util.obj</ObjectFileName>
- </ClCompile>
+ <ClCompile Include="..\..\src\qt\test\util.cpp" />
<ClCompile Include="..\..\src\qt\test\wallettests.cpp" />
<ClCompile Include="..\..\src\wallet\test\wallet_test_fixture.cpp" />
<ClCompile Include="$(GeneratedFilesOutDir)\moc\moc_addressbooktests.cpp" />
diff --git a/ci/README.md b/ci/README.md
index 7cf3b1f563..b4edd4b191 100644
--- a/ci/README.md
+++ b/ci/README.md
@@ -14,10 +14,10 @@ testing compared to other parts of the codebase. If you want to keep the work tr
system in a virtual machine with a Linux operating system of your choice.
To allow for a wide range of tested environments, but also ensure reproducibility to some extent, the test stage
-requires `bash`, `docker`, and `python3` to be installed. To install all requirements on Ubuntu, run
+requires `bash`, `docker`, and `python3` to be installed. To run on different architectures than the host `qemu` is also required. To install all requirements on Ubuntu, run
```
-sudo apt install bash docker.io python3
+sudo apt install bash docker.io python3 qemu-user-static
```
It is recommended to run the ci system in a clean env. To run the test stage
diff --git a/ci/lint/04_install.sh b/ci/lint/04_install.sh
index 476417d04b..6b12c53f2a 100755
--- a/ci/lint/04_install.sh
+++ b/ci/lint/04_install.sh
@@ -10,10 +10,11 @@ export PATH=$PWD/ci/retry:$PATH
${CI_RETRY_EXE} apt-get update
# Lint dependencies:
+# - automake pkg-config libtool (for lint_includes_build_config)
# - curl/xz-utils (to install shellcheck)
# - git (used in many lint scripts)
# - gpg (used by verify-commits)
-${CI_RETRY_EXE} apt-get install -y curl xz-utils git gpg
+${CI_RETRY_EXE} apt-get install -y automake pkg-config libtool curl xz-utils git gpg
PYTHON_PATH="/python_build"
if [ ! -d "${PYTHON_PATH}/bin" ]; then
@@ -45,7 +46,7 @@ if [ ! -d "${LINT_RUNNER_PATH}" ]; then
fi
${CI_RETRY_EXE} pip3 install \
- codespell==2.2.5 \
+ codespell==2.2.6 \
flake8==6.1.0 \
lief==0.13.2 \
mypy==1.4.1 \
diff --git a/ci/lint/06_script.sh b/ci/lint/06_script.sh
index 318b2bb819..cdf0f60147 100755
--- a/ci/lint/06_script.sh
+++ b/ci/lint/06_script.sh
@@ -8,21 +8,24 @@ export LC_ALL=C
set -ex
-if [ -n "$LOCAL_BRANCH" ]; then
- # To faithfully recreate CI linting locally, specify all commits on the current
- # branch.
- COMMIT_RANGE="$(git merge-base HEAD master)..HEAD"
-elif [ -n "$CIRRUS_PR" ]; then
+if [ -n "$CIRRUS_PR" ]; then
COMMIT_RANGE="HEAD~..HEAD"
- echo
- git log --no-merges --oneline "$COMMIT_RANGE"
- echo
- test/lint/commit-script-check.sh "$COMMIT_RANGE"
+ if [ "$(git rev-list -1 HEAD)" != "$(git rev-list -1 --merges HEAD)" ]; then
+ echo "Error: The top commit must be a merge commit, usually the remote 'pull/${PR_NUMBER}/merge' branch."
+ false
+ fi
else
- COMMIT_RANGE="SKIP_EMPTY_NOT_A_PR"
+ # Otherwise, assume that a merge commit exists. This merge commit is assumed
+ # to be the base, after which linting will be done. If the merge commit is
+ # HEAD, the range will be empty.
+ COMMIT_RANGE="$( git rev-list --max-count=1 --merges HEAD )..HEAD"
fi
export COMMIT_RANGE
+echo
+git log --no-merges --oneline "$COMMIT_RANGE"
+echo
+test/lint/commit-script-check.sh "$COMMIT_RANGE"
RUST_BACKTRACE=1 "${LINT_RUNNER_PATH}/test_runner"
if [ "$CIRRUS_REPO_FULL_NAME" = "bitcoin/bitcoin" ] && [ "$CIRRUS_PR" = "" ] ; then
diff --git a/ci/lint/container-entrypoint.sh b/ci/lint/container-entrypoint.sh
index a403f923a2..c8519a3912 100755
--- a/ci/lint/container-entrypoint.sh
+++ b/ci/lint/container-entrypoint.sh
@@ -14,7 +14,7 @@ export PATH="/python_build/bin:${PATH}"
export LINT_RUNNER_PATH="/lint_test_runner"
if [ -z "$1" ]; then
- LOCAL_BRANCH=1 bash -ic "./ci/lint/06_script.sh"
+ bash -ic "./ci/lint/06_script.sh"
else
exec "$@"
fi
diff --git a/ci/test/00_setup_env_arm.sh b/ci/test/00_setup_env_arm.sh
index 65d37f01d9..c80036164f 100755
--- a/ci/test/00_setup_env_arm.sh
+++ b/ci/test/00_setup_env_arm.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
#
-# Copyright (c) 2019-2021 The Bitcoin Core developers
+# Copyright (c) 2019-present The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -10,7 +10,7 @@ export HOST=arm-linux-gnueabihf
export DPKG_ADD_ARCH="armhf"
export PACKAGES="python3-zmq g++-arm-linux-gnueabihf busybox libc6:armhf libstdc++6:armhf libfontconfig1:armhf libxcb1:armhf"
export CONTAINER_NAME=ci_arm_linux
-export CI_IMAGE_NAME_TAG="docker.io/arm64v8/debian:bookworm"
+export CI_IMAGE_NAME_TAG="docker.io/arm64v8/debian:bookworm" # Check that https://packages.debian.org/bookworm/g++-arm-linux-gnueabihf (version 12.2, similar to guix) can cross-compile
export USE_BUSY_BOX=true
export RUN_UNIT_TESTS=true
export RUN_FUNCTIONAL_TESTS=false
diff --git a/ci/test/00_setup_env_i686_multiprocess.sh b/ci/test/00_setup_env_i686_multiprocess.sh
index 0d18e2f029..00a4d781c2 100755
--- a/ci/test/00_setup_env_i686_multiprocess.sh
+++ b/ci/test/00_setup_env_i686_multiprocess.sh
@@ -8,10 +8,11 @@ export LC_ALL=C.UTF-8
export HOST=i686-pc-linux-gnu
export CONTAINER_NAME=ci_i686_multiprocess
-export CI_IMAGE_NAME_TAG="docker.io/amd64/ubuntu:22.04"
+export CI_IMAGE_NAME_TAG="docker.io/amd64/ubuntu:24.04"
export PACKAGES="llvm clang g++-multilib"
export DEP_OPTS="DEBUG=1 MULTIPROCESS=1"
export GOAL="install"
+export TEST_RUNNER_EXTRA="--v2transport"
export BITCOIN_CONFIG="--enable-debug CC='clang -m32' CXX='clang++ -m32' \
CPPFLAGS='-DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE'"
export BITCOIND=bitcoin-node # Used in functional tests
diff --git a/ci/test/00_setup_env_mac_native.sh b/ci/test/00_setup_env_mac_native.sh
index 439fba16ef..c47f13f96e 100755
--- a/ci/test/00_setup_env_mac_native.sh
+++ b/ci/test/00_setup_env_mac_native.sh
@@ -7,7 +7,9 @@
export LC_ALL=C.UTF-8
export HOST=x86_64-apple-darwin
-export PIP_PACKAGES="zmq"
+# Homebrew's python@3.12 is marked as externally managed (PEP 668).
+# Therefore, `--break-system-packages` is needed.
+export PIP_PACKAGES="--break-system-packages zmq"
export GOAL="install"
export BITCOIN_CONFIG="--with-gui --with-miniupnpc --with-natpmp --enable-reduce-exports"
export CI_OS_NAME="macos"
diff --git a/ci/test/00_setup_env_native_asan.sh b/ci/test/00_setup_env_native_asan.sh
index 60486f8f61..668e9ecc8a 100755
--- a/ci/test/00_setup_env_native_asan.sh
+++ b/ci/test/00_setup_env_native_asan.sh
@@ -17,10 +17,10 @@ else
fi
export CONTAINER_NAME=ci_native_asan
-export PACKAGES="systemtap-sdt-dev clang-17 llvm-17 libclang-rt-17-dev python3-zmq qtbase5-dev qttools5-dev-tools libevent-dev libboost-dev libdb5.3++-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev libqrencode-dev libsqlite3-dev ${BPFCC_PACKAGE}"
+export PACKAGES="systemtap-sdt-dev clang-18 llvm-18 libclang-rt-18-dev python3-zmq qtbase5-dev qttools5-dev-tools libevent-dev libboost-dev libdb5.3++-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev libqrencode-dev libsqlite3-dev ${BPFCC_PACKAGE}"
export NO_DEPENDS=1
export GOAL="install"
-export BITCOIN_CONFIG="--enable-c++20 --enable-usdt --enable-zmq --with-incompatible-bdb --with-gui=qt5 \
+export BITCOIN_CONFIG="--enable-usdt --enable-zmq --with-incompatible-bdb --with-gui=qt5 \
CPPFLAGS='-DARENA_DEBUG -DDEBUG_LOCKORDER' \
--with-sanitizers=address,float-divide-by-zero,integer,undefined \
-CC='clang-17 -ftrivial-auto-var-init=pattern' CXX='clang++-17 -ftrivial-auto-var-init=pattern'"
+CC='clang-18 -ftrivial-auto-var-init=pattern' CXX='clang++-18 -ftrivial-auto-var-init=pattern'"
diff --git a/ci/test/00_setup_env_native_fuzz.sh b/ci/test/00_setup_env_native_fuzz.sh
index abee3c1541..f50561f875 100755
--- a/ci/test/00_setup_env_native_fuzz.sh
+++ b/ci/test/00_setup_env_native_fuzz.sh
@@ -8,7 +8,7 @@ export LC_ALL=C.UTF-8
export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04"
export CONTAINER_NAME=ci_native_fuzz
-export PACKAGES="clang-17 llvm-17 libclang-rt-17-dev libevent-dev libboost-dev libsqlite3-dev"
+export PACKAGES="clang-18 llvm-18 libclang-rt-18-dev libevent-dev libboost-dev libsqlite3-dev"
export NO_DEPENDS=1
export RUN_UNIT_TESTS=false
export RUN_FUNCTIONAL_TESTS=false
@@ -16,6 +16,6 @@ export RUN_FUZZ_TESTS=true
export GOAL="install"
export CI_CONTAINER_CAP="--cap-add SYS_PTRACE" # If run with (ASan + LSan), the container needs access to ptrace (https://github.com/google/sanitizers/issues/764)
export BITCOIN_CONFIG="--enable-fuzz --with-sanitizers=fuzzer,address,undefined,float-divide-by-zero,integer \
-CC='clang-17 -ftrivial-auto-var-init=pattern' CXX='clang++-17 -ftrivial-auto-var-init=pattern'"
+CC='clang-18 -ftrivial-auto-var-init=pattern' CXX='clang++-18 -ftrivial-auto-var-init=pattern'"
export CCACHE_MAXSIZE=200M
-export LLVM_SYMBOLIZER_PATH="/usr/bin/llvm-symbolizer-17"
+export LLVM_SYMBOLIZER_PATH="/usr/bin/llvm-symbolizer-18"
diff --git a/ci/test/00_setup_env_native_fuzz_with_msan.sh b/ci/test/00_setup_env_native_fuzz_with_msan.sh
index 0b32049013..0a9dee2ed8 100755
--- a/ci/test/00_setup_env_native_fuzz_with_msan.sh
+++ b/ci/test/00_setup_env_native_fuzz_with_msan.sh
@@ -6,7 +6,7 @@
export LC_ALL=C.UTF-8
-export CI_IMAGE_NAME_TAG="docker.io/ubuntu:22.04"
+export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04"
LIBCXX_DIR="/msan/cxx_build/"
export MSAN_FLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -g -O1 -fno-optimize-sibling-calls"
LIBCXX_FLAGS="-nostdinc++ -nostdlib++ -isystem ${LIBCXX_DIR}include/c++/v1 -L${LIBCXX_DIR}lib -Wl,-rpath,${LIBCXX_DIR}lib -lc++ -lc++abi -lpthread -Wno-unused-command-line-argument"
diff --git a/ci/test/00_setup_env_native_msan.sh b/ci/test/00_setup_env_native_msan.sh
index 60987f5011..cbcd51e218 100755
--- a/ci/test/00_setup_env_native_msan.sh
+++ b/ci/test/00_setup_env_native_msan.sh
@@ -6,7 +6,7 @@
export LC_ALL=C.UTF-8
-export CI_IMAGE_NAME_TAG="docker.io/ubuntu:22.04"
+export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04"
LIBCXX_DIR="/msan/cxx_build/"
export MSAN_FLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -g -O1 -fno-optimize-sibling-calls"
LIBCXX_FLAGS="-nostdinc++ -nostdlib++ -isystem ${LIBCXX_DIR}include/c++/v1 -L${LIBCXX_DIR}lib -Wl,-rpath,${LIBCXX_DIR}lib -lc++ -lc++abi -lpthread -Wno-unused-command-line-argument"
diff --git a/ci/test/00_setup_env_native_previous_releases.sh b/ci/test/00_setup_env_native_previous_releases.sh
index 94e88f872f..9da3b18999 100755
--- a/ci/test/00_setup_env_native_previous_releases.sh
+++ b/ci/test/00_setup_env_native_previous_releases.sh
@@ -7,14 +7,14 @@
export LC_ALL=C.UTF-8
export CONTAINER_NAME=ci_native_previous_releases
-export CI_IMAGE_NAME_TAG="docker.io/debian:bullseye"
-# Use minimum supported python3.9 and gcc-10, see doc/dependencies.md
-export PACKAGES="gcc-10 g++-10 python3-zmq"
-export DEP_OPTS="NO_UPNP=1 NO_NATPMP=1 DEBUG=1 CC=gcc-10 CXX=g++-10"
+export CI_IMAGE_NAME_TAG="docker.io/ubuntu:22.04"
+# Use minimum supported python3.9 (or best effort 3.10) and gcc-11, see doc/dependencies.md
+export PACKAGES="gcc-11 g++-11 python3-zmq"
+export DEP_OPTS="NO_UPNP=1 NO_NATPMP=1 DEBUG=1 CC=gcc-11 CXX=g++-11"
export TEST_RUNNER_EXTRA="--previous-releases --coverage --extended --exclude feature_dbcrash" # Run extended tests so that coverage does not fail, but exclude the very slow dbcrash
export RUN_UNIT_TESTS_SEQUENTIAL="true"
export RUN_UNIT_TESTS="false"
export GOAL="install"
export DOWNLOAD_PREVIOUS_RELEASES="true"
-export BITCOIN_CONFIG="--enable-zmq --with-libs=no --with-gui=qt5 --enable-reduce-exports --enable-debug \
+export BITCOIN_CONFIG="--enable-zmq --with-gui=qt5 --enable-reduce-exports --enable-debug \
CFLAGS=\"-g0 -O2 -funsigned-char\" CPPFLAGS='-DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE' CXXFLAGS=\"-g0 -O2 -funsigned-char\""
diff --git a/ci/test/00_setup_env_native_tidy.sh b/ci/test/00_setup_env_native_tidy.sh
index c12044f461..4c8658479b 100755
--- a/ci/test/00_setup_env_native_tidy.sh
+++ b/ci/test/00_setup_env_native_tidy.sh
@@ -8,8 +8,8 @@ export LC_ALL=C.UTF-8
export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04"
export CONTAINER_NAME=ci_native_tidy
-export TIDY_LLVM_V="17"
-export PACKAGES="clang-${TIDY_LLVM_V} libclang-${TIDY_LLVM_V}-dev llvm-${TIDY_LLVM_V}-dev libomp-${TIDY_LLVM_V}-dev clang-tidy-${TIDY_LLVM_V} jq bear libevent-dev libboost-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev systemtap-sdt-dev libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libqrencode-dev libsqlite3-dev libdb++-dev"
+export TIDY_LLVM_V="18"
+export PACKAGES="clang-${TIDY_LLVM_V} libclang-${TIDY_LLVM_V}-dev llvm-${TIDY_LLVM_V}-dev libomp-${TIDY_LLVM_V}-dev clang-tidy-${TIDY_LLVM_V} jq bear libevent-dev libboost-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev systemtap-sdt-dev qtbase5-dev qttools5-dev qttools5-dev-tools libqrencode-dev libsqlite3-dev libdb++-dev"
export NO_DEPENDS=1
export RUN_UNIT_TESTS=false
export RUN_FUNCTIONAL_TESTS=false
diff --git a/ci/test/00_setup_env_native_tsan.sh b/ci/test/00_setup_env_native_tsan.sh
index aa23bad809..23ab1ae000 100755
--- a/ci/test/00_setup_env_native_tsan.sh
+++ b/ci/test/00_setup_env_native_tsan.sh
@@ -8,7 +8,7 @@ export LC_ALL=C.UTF-8
export CONTAINER_NAME=ci_native_tsan
export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04"
-export PACKAGES="clang-17 llvm-17 libclang-rt-17-dev libc++abi-17-dev libc++-17-dev python3-zmq"
-export DEP_OPTS="CC=clang-17 CXX='clang++-17 -stdlib=libc++'"
+export PACKAGES="clang-18 llvm-18 libclang-rt-18-dev libc++abi-18-dev libc++-18-dev python3-zmq"
+export DEP_OPTS="CC=clang-18 CXX='clang++-18 -stdlib=libc++'"
export GOAL="install"
export BITCOIN_CONFIG="--enable-zmq CPPFLAGS='-DARENA_DEBUG -DDEBUG_LOCKORDER -DDEBUG_LOCKCONTENTION' CXXFLAGS='-g' --with-sanitizers=thread"
diff --git a/ci/test/00_setup_env_win64.sh b/ci/test/00_setup_env_win64.sh
index ba9af480ac..bce5ee74b6 100755
--- a/ci/test/00_setup_env_win64.sh
+++ b/ci/test/00_setup_env_win64.sh
@@ -7,7 +7,7 @@
export LC_ALL=C.UTF-8
export CONTAINER_NAME=ci_win64
-export CI_IMAGE_NAME_TAG="docker.io/amd64/ubuntu:22.04" # Check that Jammy can cross-compile to win64
+export CI_IMAGE_NAME_TAG="docker.io/amd64/debian:bookworm" # Check that https://packages.debian.org/bookworm/g++-mingw-w64-x86-64-posix (version 12.2, similar to guix) can cross-compile
export HOST=x86_64-w64-mingw32
export DPKG_ADD_ARCH="i386"
export PACKAGES="nsis g++-mingw-w64-x86-64-posix wine-binfmt wine64 wine32 file"
diff --git a/ci/test/01_base_install.sh b/ci/test/01_base_install.sh
index 99813da106..6f1498963a 100755
--- a/ci/test/01_base_install.sh
+++ b/ci/test/01_base_install.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
#
-# Copyright (c) 2018-2022 The Bitcoin Core developers
+# Copyright (c) 2018-present The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -36,7 +36,7 @@ if [ -n "$PIP_PACKAGES" ]; then
fi
if [[ ${USE_MEMORY_SANITIZER} == "true" ]]; then
- ${CI_RETRY_EXE} git clone --depth=1 https://github.com/llvm/llvm-project -b llvmorg-17.0.6 /msan/llvm-project
+ ${CI_RETRY_EXE} git clone --depth=1 https://github.com/llvm/llvm-project -b "llvmorg-18.1.1" /msan/llvm-project
cmake -G Ninja -B /msan/clang_build/ \
-DLLVM_ENABLE_PROJECTS="clang" \
@@ -53,13 +53,14 @@ if [[ ${USE_MEMORY_SANITIZER} == "true" ]]; then
update-alternatives --install /usr/bin/llvm-symbolizer llvm-symbolizer /msan/clang_build/bin/llvm-symbolizer 100
cmake -G Ninja -B /msan/cxx_build/ \
- -DLLVM_ENABLE_RUNTIMES='libcxx;libcxxabi' \
+ -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_USE_SANITIZER=MemoryWithOrigins \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DLLVM_TARGETS_TO_BUILD=Native \
-DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \
+ -DLIBCXXABI_USE_LLVM_UNWINDER=OFF \
-DLIBCXX_HARDENING_MODE=debug \
-S /msan/llvm-project/runtimes
diff --git a/ci/test/02_run_container.sh b/ci/test/02_run_container.sh
index 8a7a978994..e6c4a61341 100755
--- a/ci/test/02_run_container.sh
+++ b/ci/test/02_run_container.sh
@@ -12,9 +12,9 @@ set -ex
if [ -z "$DANGER_RUN_CI_ON_HOST" ]; then
# Export all env vars to avoid missing some.
# Though, exclude those with newlines to avoid parsing problems.
- python3 -c 'import os; [print(f"{key}={value}") for key, value in os.environ.items() if "\n" not in value and "HOME" != key and "PATH" != key and "USER" != key]' | tee /tmp/env
+ python3 -c 'import os; [print(f"{key}={value}") for key, value in os.environ.items() if "\n" not in value and "HOME" != key and "PATH" != key and "USER" != key]' | tee "/tmp/env-$USER-$CONTAINER_NAME"
# System-dependent env vars must be kept as is. So read them from the container.
- docker run --rm "${CI_IMAGE_NAME_TAG}" bash -c "env | grep --extended-regexp '^(HOME|PATH|USER)='" | tee --append /tmp/env
+ docker run --rm "${CI_IMAGE_NAME_TAG}" bash -c "env | grep --extended-regexp '^(HOME|PATH|USER)='" | tee --append "/tmp/env-$USER-$CONTAINER_NAME"
echo "Creating $CI_IMAGE_NAME_TAG container to run in"
DOCKER_BUILDKIT=1 docker build \
--file "${BASE_READ_ONLY_DIR}/ci/test_imagefile" \
@@ -44,6 +44,8 @@ if [ -z "$DANGER_RUN_CI_ON_HOST" ]; then
# When detecting podman-docker, `--external` should be added.
docker image prune --force --filter "label=$CI_IMAGE_LABEL"
+ # Append $USER to /tmp/env to support multi-user systems and $CONTAINER_NAME
+ # to allow support starting multiple runs simultaneously by the same user.
# shellcheck disable=SC2086
CI_CONTAINER_ID=$(docker run --cap-add LINUX_IMMUTABLE $CI_CONTAINER_CAP --rm --interactive --detach --tty \
--mount "type=bind,src=$BASE_READ_ONLY_DIR,dst=$BASE_READ_ONLY_DIR,readonly" \
@@ -52,7 +54,7 @@ if [ -z "$DANGER_RUN_CI_ON_HOST" ]; then
--mount "type=volume,src=${CONTAINER_NAME}_depends_sources,dst=$DEPENDS_DIR/sources" \
--mount "type=volume,src=${CONTAINER_NAME}_depends_SDKs_android,dst=$DEPENDS_DIR/SDKs/android" \
--mount "type=volume,src=${CONTAINER_NAME}_previous_releases,dst=$PREVIOUS_RELEASES_DIR" \
- --env-file /tmp/env \
+ --env-file /tmp/env-$USER-$CONTAINER_NAME \
--name "$CONTAINER_NAME" \
"$CONTAINER_NAME")
export CI_CONTAINER_ID
diff --git a/ci/test/03_test_script.sh b/ci/test/03_test_script.sh
index cdcd731528..f5da7bc55d 100755
--- a/ci/test/03_test_script.sh
+++ b/ci/test/03_test_script.sh
@@ -10,7 +10,7 @@ set -ex
export ASAN_OPTIONS="detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1"
export LSAN_OPTIONS="suppressions=${BASE_ROOT_DIR}/test/sanitizer_suppressions/lsan"
-export TSAN_OPTIONS="suppressions=${BASE_ROOT_DIR}/test/sanitizer_suppressions/tsan:halt_on_error=1:log_path=${BASE_SCRATCH_DIR}/sanitizer-output/tsan"
+export TSAN_OPTIONS="suppressions=${BASE_ROOT_DIR}/test/sanitizer_suppressions/tsan:halt_on_error=1"
export UBSAN_OPTIONS="suppressions=${BASE_ROOT_DIR}/test/sanitizer_suppressions/ubsan:print_stacktrace=1:halt_on_error=1:report_error_type=1"
if [ "$CI_OS_NAME" == "macos" ]; then
@@ -36,8 +36,8 @@ export HOST=${HOST:-$("$BASE_ROOT_DIR/depends/config.guess")}
# CI, so as a temporary minimal fix to work around UB and CI failures, leave
# bytes_written unmodified.
# See https://github.com/bitcoin/bitcoin/pull/28359#issuecomment-1698694748
- echo 'diff --git a/src/leveldb/db/db_impl.cc b/src/leveldb/db/db_impl.cc
-index 65e31724bc..f61b471953 100644
+ # Tee patch to stdout to make it clear CI is testing modified code.
+ tee >(patch -p1) <<'EOF'
--- a/src/leveldb/db/db_impl.cc
+++ b/src/leveldb/db/db_impl.cc
@@ -1028,9 +1028,6 @@ Status DBImpl::DoCompactionWork(CompactionState* compact) {
@@ -49,8 +49,8 @@ index 65e31724bc..f61b471953 100644
- }
mutex_.Lock();
- stats_[compact->compaction->level() + 1].Add(stats);' | patch -p1
- git diff
+ stats_[compact->compaction->level() + 1].Add(stats);
+EOF
)
if [ "$RUN_FUZZ_TESTS" = "true" ]; then
@@ -71,8 +71,6 @@ elif [ "$RUN_UNIT_TESTS" = "true" ] || [ "$RUN_UNIT_TESTS_SEQUENTIAL" = "true" ]
fi
fi
-mkdir -p "${BASE_SCRATCH_DIR}/sanitizer-output/"
-
if [ "$USE_BUSY_BOX" = "true" ]; then
echo "Setup to use BusyBox utils"
# tar excluded for now because it requires passing in the exact archive type in ./depends (fixed in later BusyBox version)
@@ -182,7 +180,11 @@ if [ "${RUN_TIDY}" = "true" ]; then
set -eo pipefail
cd "${BASE_BUILD_DIR}/bitcoin-$HOST/src/"
- ( run-clang-tidy-"${TIDY_LLVM_V}" -quiet -load="/tidy-build/libbitcoin-tidy.so" "${MAKEJOBS}" ) | grep -C5 "error"
+ if ! ( run-clang-tidy-"${TIDY_LLVM_V}" -quiet -load="/tidy-build/libbitcoin-tidy.so" "${MAKEJOBS}" | tee tmp.tidy-out.txt ); then
+ grep -C5 "error: " tmp.tidy-out.txt
+ echo "^^^ ⚠️ Failure generated from clang-tidy"
+ false
+ fi
# Filter out files by regex here, because regex may not be
# accepted in src/.bear-tidy-config
# Filter out:
diff --git a/configure.ac b/configure.ac
index 50e6870dd9..964b7d0942 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,5 +1,5 @@
AC_PREREQ([2.69])
-define(_CLIENT_VERSION_MAJOR, 26)
+define(_CLIENT_VERSION_MAJOR, 27)
define(_CLIENT_VERSION_MINOR, 99)
define(_CLIENT_VERSION_BUILD, 0)
define(_CLIENT_VERSION_RC, 0)
@@ -249,16 +249,6 @@ AC_ARG_ENABLE([threadlocal],
[use_thread_local=$enableval],
[use_thread_local=auto])
-AC_ARG_ENABLE([asm],
- [AS_HELP_STRING([--disable-asm],
- [disable assembly routines (enabled by default)])],
- [use_asm=$enableval],
- [use_asm=yes])
-
-if test "$use_asm" = "yes"; 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])],
@@ -432,10 +422,7 @@ if test "$CXXFLAGS_overridden" = "no"; then
AX_CHECK_COMPILE_FLAG([-Wsuggest-override], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wsuggest-override"], [], [$CXXFLAG_WERROR])
AX_CHECK_COMPILE_FLAG([-Wimplicit-fallthrough], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wimplicit-fallthrough"], [], [$CXXFLAG_WERROR])
AX_CHECK_COMPILE_FLAG([-Wunreachable-code], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wunreachable-code"], [], [$CXXFLAG_WERROR])
-
- if test "$suppress_external_warnings" != "no" ; then
- AX_CHECK_COMPILE_FLAG([-Wdocumentation], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wdocumentation"], [], [$CXXFLAG_WERROR])
- fi
+ AX_CHECK_COMPILE_FLAG([-Wdocumentation], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wdocumentation"], [], [$CXXFLAG_WERROR])
dnl Some compilers (gcc) ignore unknown -Wno-* options, but warn about all
dnl unknown options if any other warning is produced. Test the -Wfoo case, and
@@ -463,8 +450,6 @@ enable_sse41=no
enable_avx2=no
enable_x86_shani=no
-if test "$use_asm" = "yes"; then
-
dnl Check for optional instruction set support. Enabling these does _not_ imply that all code will
dnl be compiled with them, rather that specific objects/libs may use them after checking for runtime
dnl compatibility.
@@ -603,8 +588,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
)
CXXFLAGS="$TEMP_CXXFLAGS"
-fi
-
CORE_CPPFLAGS="$CORE_CPPFLAGS -DHAVE_BUILD_INFO"
AC_ARG_WITH([utils],
@@ -643,15 +626,9 @@ AC_ARG_ENABLE([experimental-util-chainstate],
[build_bitcoin_chainstate=$enableval],
[build_bitcoin_chainstate=no])
-AC_ARG_WITH([libs],
- [AS_HELP_STRING([--with-libs],
- [build libraries (default=yes)])],
- [build_bitcoin_libs=$withval],
- [build_bitcoin_libs=yes])
-
AC_ARG_WITH([experimental-kernel-lib],
[AS_HELP_STRING([--with-experimental-kernel-lib],
- [build experimental bitcoinkernel library (default is to build if we're building libraries and the experimental build-chainstate executable)])],
+ [build experimental bitcoinkernel library (default is to build if we're building the experimental build-chainstate executable)])],
[build_experimental_kernel_lib=$withval],
[build_experimental_kernel_lib=auto])
@@ -797,7 +774,10 @@ case $host in
AX_CHECK_LINK_FLAG([-Wl,-headerpad_max_install_names], [CORE_LDFLAGS="$CORE_LDFLAGS -Wl,-headerpad_max_install_names"], [], [$LDFLAG_WERROR])
CORE_CPPFLAGS="$CORE_CPPFLAGS -DMAC_OSX -DOBJC_OLD_DISPATCH_PROTOTYPES=0"
- OBJCXXFLAGS="$CXXFLAGS"
+
+ dnl ignore deprecated-declarations warnings coming from objcxx code
+ dnl "'NSUserNotificationCenter' is deprecated: first deprecated in macOS 11.0".
+ OBJCXXFLAGS="$CXXFLAGS -Wno-deprecated-declarations"
;;
*android*)
dnl make sure android stays above linux for hosts like *linux-android*
@@ -975,7 +955,7 @@ if test "$TARGET_OS" = "darwin"; then
AX_CHECK_LINK_FLAG([-Wl,-fixup_chains], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-fixup_chains"], [], [$LDFLAG_WERROR])
fi
-AC_CHECK_HEADERS([endian.h sys/endian.h byteswap.h sys/select.h sys/prctl.h sys/sysctl.h vm/vm_param.h sys/vmmeter.h sys/resources.h])
+AC_CHECK_HEADERS([sys/select.h sys/prctl.h sys/sysctl.h vm/vm_param.h sys/vmmeter.h sys/resources.h])
AC_CHECK_DECLS([getifaddrs, freeifaddrs],[CHECK_SOCKET],,
[#include <sys/types.h>
@@ -990,18 +970,6 @@ AC_CHECK_DECLS([pipe2])
AC_CHECK_FUNCS([timingsafe_bcmp])
-AC_CHECK_DECLS([le16toh, le32toh, le64toh, htole16, htole32, htole64, be16toh, be32toh, be64toh, htobe16, htobe32, htobe64],,,
- [#if HAVE_ENDIAN_H
- #include <endian.h>
- #elif HAVE_SYS_ENDIAN_H
- #include <sys/endian.h>
- #endif])
-
-AC_CHECK_DECLS([bswap_16, bswap_32, bswap_64],,,
- [#if HAVE_BYTESWAP_H
- #include <byteswap.h>
- #endif])
-
AC_MSG_CHECKING([for __builtin_clzl])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
(void) __builtin_clzl(0);
@@ -1174,14 +1142,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
[ AC_MSG_RESULT([no])]
)
-AC_MSG_CHECKING([for if type char equals int8_t])
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdint.h>
- #include <type_traits>]],
- [[ static_assert(std::is_same<int8_t, char>::value, ""); ]])],
- [ AC_MSG_RESULT([yes]); AC_DEFINE([CHAR_EQUALS_INT8], [1], [Define this symbol if type char equals int8_t]) ],
- [ AC_MSG_RESULT([no])]
-)
-
AC_MSG_CHECKING([for fdatasync])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <unistd.h>]],
[[ fdatasync(0); ]])],
@@ -1232,10 +1192,23 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
getauxval(AT_HWCAP);
]])],
- [ AC_MSG_RESULT([yes]); HAVE_STRONG_GETAUXVAL=1; AC_DEFINE([HAVE_STRONG_GETAUXVAL], [1], [Define this symbol to build code that uses getauxval)]) ],
+ [ AC_MSG_RESULT([yes]); HAVE_STRONG_GETAUXVAL=1; AC_DEFINE([HAVE_STRONG_GETAUXVAL], [1], [Define this symbol to build code that uses getauxval]) ],
[ AC_MSG_RESULT([no]); HAVE_STRONG_GETAUXVAL=0 ]
)
+# Check for UNIX sockets
+AC_MSG_CHECKING(for sockaddr_un)
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+ #include <sys/socket.h>
+ #include <sys/un.h>
+ ]], [[
+ struct sockaddr_un addr;
+ addr.sun_family = AF_UNIX;
+ ]])],
+ [ AC_MSG_RESULT([yes]); AC_DEFINE([HAVE_SOCKADDR_UN], [1], [Define this symbol if platform supports unix domain sockets]) ],
+ [ AC_MSG_RESULT([no]); ]
+)
+
have_any_system=no
AC_MSG_CHECKING([for std::system])
AC_LINK_IFELSE(
@@ -1283,7 +1256,6 @@ if test "$enable_fuzz" = "yes"; then
build_bitcoin_chainstate=no
build_bitcoin_wallet=no
build_bitcoind=no
- build_bitcoin_libs=no
bitcoin_enable_qt=no
bitcoin_enable_qt_test=no
bitcoin_enable_qt_dbus=no
@@ -1442,7 +1414,7 @@ if test "$use_boost" = "yes"; then
dnl Check for Boost headers
AX_BOOST_BASE([1.73.0],[],[AC_MSG_ERROR([Boost is not available!])])
if test "$want_boost" = "no"; then
- AC_MSG_ERROR([only libbitcoinconsensus can be built without Boost])
+ AC_MSG_ERROR([Boost is required])
fi
dnl we don't use multi_index serialization
@@ -1656,18 +1628,8 @@ fi
AM_CONDITIONAL([BUILD_BITCOIN_CHAINSTATE], [test $build_bitcoin_chainstate = "yes"])
AC_MSG_RESULT($build_bitcoin_chainstate)
-AC_MSG_CHECKING([whether to build libraries])
-AM_CONDITIONAL([BUILD_BITCOIN_LIBS], [test $build_bitcoin_libs = "yes"])
-
-if test "$build_bitcoin_libs" = "yes"; then
- AC_DEFINE([HAVE_CONSENSUS_LIB], [1], [Define this symbol if the consensus lib has been built])
- AC_CONFIG_FILES([libbitcoinconsensus.pc:libbitcoinconsensus.pc.in])
-fi
-
AM_CONDITIONAL([BUILD_BITCOIN_KERNEL_LIB], [test "$build_experimental_kernel_lib" != "no" && ( test "$build_experimental_kernel_lib" = "yes" || test "$build_bitcoin_chainstate" = "yes" )])
-AC_MSG_RESULT($build_bitcoin_libs)
-
AC_LANG_POP
if test "$use_ccache" != "no"; then
@@ -1801,8 +1763,8 @@ else
AC_MSG_RESULT([no])
fi
-if test "$build_bitcoin_wallet$build_bitcoin_cli$build_bitcoin_tx$build_bitcoin_util$build_bitcoin_libs$build_bitcoind$bitcoin_enable_qt$enable_fuzz_binary$use_bench$use_tests" = "nononononononononono"; then
- AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-libs --with-daemon --with-gui --enable-fuzz(-binary) --enable-bench or --enable-tests])
+if test "$build_bitcoin_wallet$build_bitcoin_cli$build_bitcoin_tx$build_bitcoin_util$build_bitcoind$bitcoin_enable_qt$enable_fuzz_binary$use_bench$use_tests" = "nonononononononono"; then
+ AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-daemon --with-gui --enable-fuzz(-binary) --enable-bench or --enable-tests])
fi
AM_CONDITIONAL([TARGET_DARWIN], [test "$TARGET_OS" = "darwin"])
@@ -1828,7 +1790,6 @@ AM_CONDITIONAL([ENABLE_AVX2], [test "$enable_avx2" = "yes"])
AM_CONDITIONAL([ENABLE_X86_SHANI], [test "$enable_x86_shani" = "yes"])
AM_CONDITIONAL([ENABLE_ARM_CRC], [test "$enable_arm_crc" = "yes"])
AM_CONDITIONAL([ENABLE_ARM_SHANI], [test "$enable_arm_shani" = "yes"])
-AM_CONDITIONAL([USE_ASM], [test "$use_asm" = "yes"])
AM_CONDITIONAL([WORDS_BIGENDIAN], [test "$ac_cv_c_bigendian" = "yes"])
AM_CONDITIONAL([USE_NATPMP], [test "$use_natpmp" = "yes"])
AM_CONDITIONAL([USE_UPNP], [test "$use_upnp" = "yes"])
@@ -1963,7 +1924,6 @@ echo
echo "Options used to compile and link:"
echo " external signer = $use_external_signer"
echo " multiprocess = $build_multiprocess"
-echo " with libs = $build_bitcoin_libs"
echo " with wallet = $enable_wallet"
if test "$enable_wallet" != "no"; then
echo " with sqlite = $use_sqlite"
@@ -1983,7 +1943,6 @@ echo " with fuzz binary = $enable_fuzz_binary"
echo " with bench = $use_bench"
echo " with upnp = $use_upnp"
echo " with natpmp = $use_natpmp"
-echo " use asm = $use_asm"
echo " USDT tracing = $use_usdt"
echo " sanitizers = $use_sanitizers"
echo " debug enabled = $enable_debug"
diff --git a/contrib/devtools/bitcoin-tidy/CMakeLists.txt b/contrib/devtools/bitcoin-tidy/CMakeLists.txt
index 35e60d1d87..1260c71423 100644
--- a/contrib/devtools/bitcoin-tidy/CMakeLists.txt
+++ b/contrib/devtools/bitcoin-tidy/CMakeLists.txt
@@ -1,14 +1,25 @@
-cmake_minimum_required(VERSION 3.9)
+cmake_minimum_required(VERSION 3.22)
-project(bitcoin-tidy VERSION 1.0.0 DESCRIPTION "clang-tidy checks for Bitcoin Core")
+project(bitcoin-tidy
+ VERSION
+ 1.0.0
+ DESCRIPTION "clang-tidy checks for Bitcoin Core"
+ LANGUAGES CXX)
include(GNUInstallDirs)
-set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_EXTENSIONS False)
-# TODO: Figure out how to avoid the terminfo check
+set(CMAKE_DISABLE_FIND_PACKAGE_CURL ON)
+set(CMAKE_DISABLE_FIND_PACKAGE_FFI ON)
+set(CMAKE_DISABLE_FIND_PACKAGE_LibEdit ON)
+set(CMAKE_DISABLE_FIND_PACKAGE_LibXml2 ON)
+set(CMAKE_DISABLE_FIND_PACKAGE_Terminfo ON)
+set(CMAKE_DISABLE_FIND_PACKAGE_ZLIB ON)
+set(CMAKE_DISABLE_FIND_PACKAGE_zstd ON)
+
find_package(LLVM REQUIRED CONFIG)
find_program(CLANG_TIDY_EXE NAMES "clang-tidy-${LLVM_VERSION_MAJOR}" "clang-tidy" HINTS ${LLVM_TOOLS_BINARY_DIR})
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
diff --git a/contrib/devtools/bitcoin-tidy/README b/contrib/devtools/bitcoin-tidy/README.md
index c15e07c4ed..c15e07c4ed 100644
--- a/contrib/devtools/bitcoin-tidy/README
+++ b/contrib/devtools/bitcoin-tidy/README.md
diff --git a/contrib/devtools/test_deterministic_coverage.sh b/contrib/devtools/test_deterministic_coverage.sh
index 8501c72f04..23c260b529 100755
--- a/contrib/devtools/test_deterministic_coverage.sh
+++ b/contrib/devtools/test_deterministic_coverage.sh
@@ -17,21 +17,21 @@ NON_DETERMINISTIC_TESTS=(
"blockfilter_index_tests/blockfilter_index_initial_sync" # src/checkqueue.h: In CCheckQueue::Loop(): while (queue.empty()) { ... }
"coinselector_tests/knapsack_solver_test" # coinselector_tests.cpp: if (equal_sets(setCoinsRet, setCoinsRet2))
"fs_tests/fsbridge_fstream" # deterministic test failure?
- "miner_tests/CreateNewBlock_validity" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
+ "miner_tests/CreateNewBlock_validity" # validation.cpp: if (signals.CallbacksPending() > 10)
"scheduler_tests/manythreads" # scheduler.cpp: CScheduler::serviceQueue()
"scheduler_tests/singlethreadedscheduler_ordered" # scheduler.cpp: CScheduler::serviceQueue()
- "txvalidationcache_tests/checkinputs_test" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "txvalidationcache_tests/tx_mempool_block_doublespend" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "txindex_tests/txindex_initial_sync" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "txvalidation_tests/tx_mempool_reject_coinbase" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "validation_block_tests/processnewblock_signals_ordering" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "wallet_tests/coin_mark_dirty_immature_credit" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "wallet_tests/dummy_input_size_test" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "wallet_tests/importmulti_rescan" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "wallet_tests/importwallet_rescan" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "wallet_tests/ListCoins" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "wallet_tests/scan_for_wallet_transactions" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "wallet_tests/wallet_disableprivkeys" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
+ "txvalidationcache_tests/checkinputs_test" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "txvalidationcache_tests/tx_mempool_block_doublespend" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "txindex_tests/txindex_initial_sync" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "txvalidation_tests/tx_mempool_reject_coinbase" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "validation_block_tests/processnewblock_signals_ordering" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "wallet_tests/coin_mark_dirty_immature_credit" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "wallet_tests/dummy_input_size_test" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "wallet_tests/importmulti_rescan" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "wallet_tests/importwallet_rescan" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "wallet_tests/ListCoins" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "wallet_tests/scan_for_wallet_transactions" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "wallet_tests/wallet_disableprivkeys" # validation.cpp: if (signals.CallbacksPending() > 10)
)
TEST_BITCOIN_BINARY="src/test/test_bitcoin"
diff --git a/contrib/devtools/test_utxo_snapshots.sh b/contrib/devtools/test_utxo_snapshots.sh
index 93a4cd1683..d7c019f4a6 100755
--- a/contrib/devtools/test_utxo_snapshots.sh
+++ b/contrib/devtools/test_utxo_snapshots.sh
@@ -183,8 +183,8 @@ echo "-- Initial state of the client:"
client_rpc getchainstates
echo
-echo "-- Loading UTXO snapshot into client..."
-client_rpc loadtxoutset "$UTXO_DAT_FILE"
+echo "-- Loading UTXO snapshot into client. Calling RPC in a loop..."
+while ! client_rpc loadtxoutset "$UTXO_DAT_FILE" ; do sleep 10; done
watch -n 0.3 "( tail -n 14 $CLIENT_DATADIR/debug.log ; echo ; ./src/bitcoin-cli -rpcport=$CLIENT_RPC_PORT -datadir=$CLIENT_DATADIR getchainstates) | cat"
diff --git a/contrib/guix/guix-build b/contrib/guix/guix-build
index 298e7bfbd6..870938cb52 100755
--- a/contrib/guix/guix-build
+++ b/contrib/guix/guix-build
@@ -74,7 +74,8 @@ mkdir -p "$VERSION_BASE"
################
# Default to building for all supported HOSTs (overridable by environment)
-export HOSTS="${HOSTS:-x86_64-linux-gnu arm-linux-gnueabihf aarch64-linux-gnu riscv64-linux-gnu powerpc64-linux-gnu powerpc64le-linux-gnu
+# powerpc64le-linux-gnu currently disabled due non-determinism issues across build arches.
+export HOSTS="${HOSTS:-x86_64-linux-gnu arm-linux-gnueabihf aarch64-linux-gnu riscv64-linux-gnu powerpc64-linux-gnu
x86_64-w64-mingw32
x86_64-apple-darwin arm64-apple-darwin}"
diff --git a/contrib/guix/libexec/build.sh b/contrib/guix/libexec/build.sh
index b301369ad9..b15f553ac9 100755
--- a/contrib/guix/libexec/build.sh
+++ b/contrib/guix/libexec/build.sh
@@ -300,11 +300,9 @@ mkdir -p "$DISTSRC"
case "$HOST" in
*darwin*)
- make osx_volname ${V:+V=1}
make deploydir ${V:+V=1}
mkdir -p "unsigned-app-${HOST}"
cp --target-directory="unsigned-app-${HOST}" \
- osx_volname \
contrib/macdeploy/detached-sig-create.sh
mv --target-directory="unsigned-app-${HOST}" dist
(
diff --git a/contrib/guix/libexec/prelude.bash b/contrib/guix/libexec/prelude.bash
index 6c912ca748..ce6a9562b4 100644
--- a/contrib/guix/libexec/prelude.bash
+++ b/contrib/guix/libexec/prelude.bash
@@ -51,7 +51,7 @@ fi
time-machine() {
# shellcheck disable=SC2086
guix time-machine --url=https://git.savannah.gnu.org/git/guix.git \
- --commit=d5ca4d4fd713a9f7e17e074a1e37dda99bbb09fc \
+ --commit=dc4842797bfdc5f9f3f5f725bf189c2b68bd6b5a \
--cores="$JOBS" \
--keep-failed \
--fallback \
diff --git a/contrib/guix/manifest.scm b/contrib/guix/manifest.scm
index 7335596107..e24a61bf9d 100644
--- a/contrib/guix/manifest.scm
+++ b/contrib/guix/manifest.scm
@@ -91,7 +91,7 @@ chain for " target " development."))
(home-page (package-home-page xgcc))
(license (package-license xgcc)))))
-(define base-gcc gcc-10)
+(define base-gcc gcc-12)
(define base-linux-kernel-headers linux-libre-headers-6.1)
(define* (make-bitcoin-cross-toolchain target
@@ -423,6 +423,7 @@ inspecting signatures in Mach-O binaries.")
(list "--enable-initfini-array=yes",
"--enable-default-ssp=yes",
"--enable-default-pie=yes",
+ "--enable-standard-branch-protection=yes",
building-on)))
((#:phases phases)
`(modify-phases ,phases
@@ -505,9 +506,6 @@ inspecting signatures in Mach-O binaries.")
automake
pkg-config
bison
- ;; Native GCC 10 toolchain
- gcc-toolchain-10
- (list gcc-toolchain-10 "static")
;; Scripting
python-minimal ;; (3.10)
;; Git
@@ -516,14 +514,26 @@ inspecting signatures in Mach-O binaries.")
python-lief)
(let ((target (getenv "HOST")))
(cond ((string-suffix? "-mingw32" target)
- ;; Windows
- (list zip
+ (list ;; Native GCC 12 toolchain
+ gcc-toolchain-12
+ (list gcc-toolchain-12 "static")
+ zip
(make-mingw-pthreads-cross-toolchain "x86_64-w64-mingw32")
nsis-x86_64
nss-certs
osslsigncode))
((string-contains target "-linux-")
- (list (make-bitcoin-cross-toolchain target)))
+ (list ;; Native GCC 12 toolchain
+ gcc-toolchain-12
+ (list gcc-toolchain-12 "static")
+ (make-bitcoin-cross-toolchain target)))
((string-contains target "darwin")
- (list clang-toolchain-17 binutils cmake-minimal python-signapple zip))
+ (list ;; Native GCC 10 toolchain
+ gcc-toolchain-10
+ (list gcc-toolchain-10 "static")
+ binutils
+ clang-toolchain-17
+ cmake-minimal
+ python-signapple
+ zip))
(else '())))))
diff --git a/contrib/guix/patches/glibc-2.27-fcommon.patch b/contrib/guix/patches/glibc-2.27-fcommon.patch
index 817aa85bb9..f8d14837fc 100644
--- a/contrib/guix/patches/glibc-2.27-fcommon.patch
+++ b/contrib/guix/patches/glibc-2.27-fcommon.patch
@@ -5,7 +5,7 @@ Date: Fri May 6 11:03:04 2022 +0100
build: use -fcommon to retain legacy behaviour with GCC 10
GCC 10 started using -fno-common by default, which causes issues with
- the powerpc builds using gibc 2.27. A patch was commited to glibc to fix
+ the powerpc builds using gibc 2.27. A patch was committed to glibc to fix
the issue, 18363b4f010da9ba459b13310b113ac0647c2fcc but is non-trvial
to backport, and was broken in at least one way, see the followup in
commit 7650321ce037302bfc2f026aa19e0213b8d02fe6.
diff --git a/contrib/guix/patches/vmov-alignment.patch b/contrib/guix/patches/vmov-alignment.patch
index 7976b864af..96e1cb7cd1 100644
--- a/contrib/guix/patches/vmov-alignment.patch
+++ b/contrib/guix/patches/vmov-alignment.patch
@@ -168,14 +168,19 @@ Based on a patch originally by Claude Heiland-Allen <claude@mathr.co.uk>
default:
gcc_unreachable ();
}
---- a/gcc/config/i386/i386.c
-+++ b/gcc/config/i386/i386.c
-@@ -4981,13 +4981,13 @@
- switch (type)
+--- a/gcc/config/i386/i386.cc
++++ b/gcc/config/i386/i386.cc
+@@ -5418,17 +5418,15 @@ ix86_get_ssemov (rtx *operands, unsigned size,
{
case opcode_int:
-- opcode = misaligned_p ? "vmovdqu32" : "vmovdqa32";
-+ opcode = "vmovdqu32";
+ if (scalar_mode == E_HFmode)
+- opcode = (misaligned_p
+- ? (TARGET_AVX512BW ? "vmovdqu16" : "vmovdqu64")
+- : "vmovdqa64");
++ opcode = TARGET_AVX512BW ? "vmovdqu16" : "vmovdqu64";
+ else
+- opcode = misaligned_p ? "vmovdqu32" : "vmovdqa32";
++ opcode = "vmovdqu32";
break;
case opcode_float:
- opcode = misaligned_p ? "vmovups" : "vmovaps";
@@ -187,9 +192,24 @@ Based on a patch originally by Claude Heiland-Allen <claude@mathr.co.uk>
break;
}
}
-@@ -4996,16 +4996,16 @@
- switch (scalar_mode)
+@@ -5438,29 +5436,21 @@ ix86_get_ssemov (rtx *operands, unsigned size,
{
+ case E_HFmode:
+ if (evex_reg_p)
+- opcode = (misaligned_p
+- ? (TARGET_AVX512BW
+- ? "vmovdqu16"
+- : "vmovdqu64")
+- : "vmovdqa64");
++ opcode = TARGET_AVX512BW ? "vmovdqu16" : "vmovdqu64";
+ else
+- opcode = (misaligned_p
+- ? (TARGET_AVX512BW
+- ? "vmovdqu16"
+- : "%vmovdqu")
+- : "%vmovdqa");
++ opcode = TARGET_AVX512BW ? "vmovdqu16" : "%vmovdqu";
+ break;
case E_SFmode:
- opcode = misaligned_p ? "%vmovups" : "%vmovaps";
+ opcode = "%vmovups";
@@ -208,7 +228,7 @@ Based on a patch originally by Claude Heiland-Allen <claude@mathr.co.uk>
break;
default:
gcc_unreachable ();
-@@ -5017,48 +5017,32 @@
+@@ -5472,48 +5462,32 @@ ix86_get_ssemov (rtx *operands, unsigned size,
{
case E_QImode:
if (evex_reg_p)
diff --git a/contrib/seeds/makeseeds.py b/contrib/seeds/makeseeds.py
index f03c2ab5e8..79bb178b21 100755
--- a/contrib/seeds/makeseeds.py
+++ b/contrib/seeds/makeseeds.py
@@ -27,6 +27,7 @@ MIN_BLOCKS = 730000
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"^([a-z2-7]{56}\.onion):(\d+)$")
+PATTERN_I2P = re.compile(r"^([a-z2-7]{52}\.b32.i2p):(\d+)$")
PATTERN_AGENT = re.compile(
r"^/Satoshi:("
r"0.14.(0|1|2|3|99)|"
@@ -40,7 +41,8 @@ PATTERN_AGENT = re.compile(
r"22.(0|1|99)|"
r"23.(0|1|99)|"
r"24.(0|1|99)|"
- r"25.99"
+ r"25.(0|1|99)|"
+ r"26.(0|99)|"
r")")
def parseline(line: str) -> Union[dict, None]:
@@ -65,7 +67,13 @@ def parseline(line: str) -> Union[dict, None]:
if m is None:
m = PATTERN_ONION.match(sline[0])
if m is None:
- return None
+ m = PATTERN_I2P.match(sline[0])
+ if m is None:
+ return None
+ else:
+ net = 'i2p'
+ ipstr = sortkey = m.group(1)
+ port = int(m.group(2))
else:
net = 'onion'
ipstr = sortkey = m.group(1)
@@ -140,6 +148,7 @@ def filterbyasn(asmap: ASMap, ips: list[dict], max_per_asn: dict, max_per_net: i
# Sift out ips by type
ips_ipv46 = [ip for ip in ips if ip['net'] in ['ipv4', 'ipv6']]
ips_onion = [ip for ip in ips if ip['net'] == 'onion']
+ ips_i2p = [ip for ip in ips if ip['net'] == 'i2p']
# Filter IPv46 by ASN, and limit to max_per_net per network
result = []
@@ -163,6 +172,7 @@ def filterbyasn(asmap: ASMap, ips: list[dict], max_per_asn: dict, max_per_net: i
# Add back Onions (up to max_per_net)
result.extend(ips_onion[0:max_per_net])
+ result.extend(ips_i2p[0:max_per_net])
return result
def ip_stats(ips: list[dict]) -> str:
@@ -172,7 +182,7 @@ def ip_stats(ips: list[dict]) -> str:
if ip is not None:
hist[ip['net']] += 1
- return f"{hist['ipv4']:6d} {hist['ipv6']:6d} {hist['onion']:6d}"
+ return f"{hist['ipv4']:6d} {hist['ipv6']:6d} {hist['onion']:6d} {hist['i2p']:6d}"
def parse_args():
argparser = argparse.ArgumentParser(description='Generate a list of bitcoin node seed ip addresses.')
@@ -194,7 +204,7 @@ def main():
ips = [parseline(line) for line in lines]
print('Done.', file=sys.stderr)
- print('\x1b[7m IPv4 IPv6 Onion Pass \x1b[0m', file=sys.stderr)
+ print('\x1b[7m IPv4 IPv6 Onion I2P Pass \x1b[0m', file=sys.stderr)
print(f'{ip_stats(ips):s} Initial', file=sys.stderr)
# Skip entries with invalid address.
ips = [ip for ip in ips if ip is not None]
@@ -208,11 +218,12 @@ def main():
# Require service bit 1.
ips = [ip for ip in ips if (ip['service'] & 1) == 1]
print(f'{ip_stats(ips):s} Require service bit 1', file=sys.stderr)
- # Require at least 50% 30-day uptime for clearnet, 10% for onion.
+ # Require at least 50% 30-day uptime for clearnet, 10% for onion and i2p.
req_uptime = {
'ipv4': 50,
'ipv6': 50,
'onion': 10,
+ 'i2p' : 10,
}
ips = [ip for ip in ips if ip['uptime'] > req_uptime[ip['net']]]
print(f'{ip_stats(ips):s} Require minimum uptime', file=sys.stderr)
diff --git a/contrib/seeds/nodes_main.txt b/contrib/seeds/nodes_main.txt
index 100fe09685..be7607c0f7 100644
--- a/contrib/seeds/nodes_main.txt
+++ b/contrib/seeds/nodes_main.txt
@@ -1,894 +1,1746 @@
-1.65.195.98:8333 # AS4760
-2.59.236.56:8333 # AS24904
-2.83.114.20:8333 # AS8657
-2.248.194.16:8333 # AS3301
-5.2.154.6:8333 # AS8708
-5.101.140.30:8333 # AS42831
+1.253.159.19:8333 # AS9318
+2.152.74.211:8333 # AS12430
+5.2.23.226:8333 # AS21472
5.128.87.126:8333 # AS31200
-5.144.21.49:8333 # AS15600
-5.172.132.104:8333 # AS15600
+5.157.103.202:8333 # AS35612
5.188.62.18:8333 # AS34665
-5.200.2.180:8333 # AS49544
+5.253.18.218:8333 # AS58073
+5.255.109.160:8333 # AS60404
8.129.184.255:8333 # AS37963
-8.209.105.138:8333 # AS45102
+8.209.70.77:8333 # AS45102
+8.210.18.56:8333 # AS45102
12.34.98.148:8333 # AS7018
-14.199.102.151:8333 # AS9269
18.27.79.17:8333 # AS3
-18.27.124.231:8333 # AS3
-18.216.249.151:8333 # AS16509
-23.88.155.58:8333 # AS10242
-23.93.101.158:8333 # AS46375
-23.109.156.76:8333 # AS7979
-23.175.0.220:8333 # AS395502
+23.93.170.118:8333 # AS46375
+23.154.136.144:8333 # AS54002
+23.175.0.212:8333 # AS395502
23.175.0.222:8333 # AS395502
-24.232.36.225:8333 # AS7303
+24.84.164.50:8333 # AS6327
+24.86.90.127:8333 # AS6327
+24.101.126.194:8333 # AS27364
+24.183.75.154:8333 # AS20115
27.124.108.19:8333 # AS58511
27.148.206.140:8333 # AS4134
-31.7.70.195:8333 # AS49666
31.25.98.16:8333 # AS48635
31.41.23.249:8333 # AS31287
-31.47.102.92:8333 # AS8251
31.47.202.112:8333 # AS34385
-31.165.78.146:8333 # AS6730
-31.165.228.138:8333 # AS6730
-34.64.101.4:8333 # AS139070
-34.105.19.97:8333 # AS15169
-34.126.107.179:8333 # AS396982
-34.126.115.35:8333 # AS396982
-35.245.186.117:8333 # AS15169
+31.156.128.248:8333 # AS30722
+31.164.160.162:8333 # AS6730
+31.201.190.134:8333 # AS50266
+31.208.34.61:8333 # AS29518
+34.78.14.25:8333 # AS15169
+34.80.134.68:8333 # AS15169
+35.137.133.225:8333 # AS7843
+35.193.192.48:8333 # AS396982
+35.194.39.250:8333 # AS396982
37.15.60.144:8333 # AS12479
-37.16.105.63:8333 # AS20904
-37.120.155.34:8333 # AS9009
+37.60.228.251:8333 # AS31214
+37.60.229.117:8333 # AS31214
+37.110.132.94:8333 # AS42610
37.120.179.29:8333 # AS47147
37.139.102.73:8333 # AS35816
-37.193.227.16:8333 # AS31200
+37.157.192.94:8333 # AS197019
37.220.135.151:8333 # AS41206
-38.53.129.67:8333 # AS40237
+38.9.81.160:8333 # AS16904
+38.21.221.252:8333 # AS40545
38.54.14.89:8333 # AS138915
-38.141.134.140:8333 # AS174
-38.145.151.150:8333 # AS40545
-41.72.154.66:8333 # AS37153
-43.143.203.198:8333 # AS45090
-45.15.124.117:8333 # AS35913
-45.43.97.103:8333 # AS26827
-45.44.213.116:8333 # AS54198
-45.58.187.101:8333 # AS46844
-45.79.192.236:8333 # AS63949
-45.81.241.97:8333 # AS30823
-45.83.220.102:8333 # AS39351
-45.83.241.46:8333 # AS206238
-45.87.106.57:8333 # AS39238
-45.129.38.5:8333 # AS49666
-45.130.20.177:8333 # AS3214
-45.134.142.40:8333 # AS60068
-45.135.4.143:8333 # AS25596
-45.135.92.127:8333 # AS12555
-45.145.188.112:8333 # AS206805
-46.23.87.218:8333 # AS51088
-46.32.50.98:8333 # AS39642
-46.32.78.17:8333 # AS48416
-46.59.40.91:8333 # AS8473
-46.138.246.77:8333 # AS8359
+38.91.106.111:8333 # AS63023
+38.102.85.36:8333 # AS174
+42.2.162.218:8333 # AS4760
+43.129.75.20:8333 # AS132203
+43.159.61.16:8333 # AS132203
+43.225.62.107:8333 # AS63953
+43.245.196.214:8333 # AS63916
+45.13.7.221:8333 # AS60377
+45.44.213.123:8333 # AS54198
+45.48.75.224:8333 # AS20001
+45.79.76.12:8333 # AS63949
+45.94.209.127:8333 # AS13789
+45.130.23.57:8333 # AS3214
+45.132.118.25:8333 # AS208451
+45.144.249.207:8333 # AS203936
+45.145.40.43:8333 # AS63213
+45.155.169.30:8333 # AS62000
+46.17.99.13:8333 # AS57043
+46.17.99.26:8333 # AS57043
+46.21.250.25:8333 # AS24875
+46.28.204.161:8333 # AS197988
+46.128.199.26:8333 # AS16097
+46.164.59.139:8333 # AS21283
46.166.142.2:8333 # AS43350
-46.166.162.59:8333 # AS16125
-46.175.178.3:8333 # AS28725
-46.188.15.6:8333 # AS39153
-46.188.30.118:8333 # AS39153
-46.223.223.216:8333 # AS51185
-46.226.18.135:8333 # AS52176
-47.88.86.79:8333 # AS45102
-47.148.7.69:8333 # AS5650
-47.198.223.60:8333 # AS5650
-50.2.13.164:8333 # AS62904
-50.4.135.84:8333 # AS12083
-50.53.39.237:8333 # AS20055
+46.172.233.241:8333 # AS6752
+46.252.5.112:8333 # AS206774
+47.28.85.71:8333 # AS20115
+47.176.248.250:8333 # AS5650
+47.198.60.180:8333 # AS5650
+50.27.22.141:8333 # AS19108
+50.39.170.149:8333 # AS20055
50.53.250.162:8333 # AS20055
-50.68.121.44:8333 # AS6327
-50.117.132.178:8333 # AS577
51.154.62.103:8333 # AS15796
51.158.150.155:8333 # AS12876
-51.250.46.215:8333 # AS200350
-54.176.63.16:8333 # AS16509
-58.158.0.86:8333 # AS2519
+51.174.206.76:8333 # AS29695
+54.217.136.122:8333 # AS16509
+54.253.15.33:8333 # AS16509
+57.128.96.115:8333 # AS8220
+57.128.148.169:8333 # AS8220
+58.6.46.171:8333 # AS7545
+58.96.77.114:8333 # AS10143
+58.96.123.120:8333 # AS38195
+58.168.253.35:8333 # AS1221
+59.167.191.60:8333 # AS4739
60.205.205.119:8333 # AS37963
+60.212.189.151:8333 # AS4837
61.74.99.193:8333 # AS4766
-61.92.59.104:8333 # AS9269
-62.122.173.171:8333 # AS50245
+62.24.76.122:8333 # AS16019
+62.106.70.249:8333 # AS8100
+62.168.65.42:8333 # AS5578
62.171.129.32:8333 # AS51167
-62.178.27.239:8333 # AS8412
-62.209.210.3:8333 # AS6855
-62.215.127.73:8333 # AS21050
-62.238.148.104:8333 # AS15435
-62.245.153.8:8333 # AS8767
-64.146.136.45:8333 # AS16713
-65.21.134.184:8333 # AS24940
-66.18.13.146:8333 # AS13767
-66.23.233.43:8333 # AS19318
-66.27.98.216:8333 # AS20001
-66.29.129.218:8333 # AS22612
-66.38.94.13:8333 # AS11979
+62.245.75.70:8333 # AS16019
+62.248.8.167:8333 # AS16010
+64.23.150.211:8333 # AS3064
+64.98.119.136:8333 # AS32133
+65.24.75.34:8333 # AS7843
+65.175.185.101:8333 # AS11776
66.45.141.46:8333 # AS11232
-66.58.243.215:8333 # AS8047
-66.114.33.49:8333 # AS23175
-66.198.211.167:8333 # AS10835
-66.208.64.128:8333 # AS10352
-66.219.196.170:8333 # AS29933
+66.58.163.185:8333 # AS8047
+66.85.133.182:8333 # AS12189
+66.206.22.26:8333 # AS29802
+67.40.102.33:8333 # AS209
+67.43.210.62:8333 # AS394883
+67.82.136.177:8333 # AS6128
+67.193.87.50:8333 # AS7992
67.210.228.203:8333 # AS7819
-68.183.75.251:8333 # AS14061
-68.194.125.140:8333 # AS6128
-68.199.120.17:8333 # AS6128
+67.211.211.118:8333 # AS19318
+67.231.246.58:8333 # AS40244
+68.6.84.222:8333 # AS22773
+68.48.136.216:8333 # AS7922
+68.69.170.92:8333 # AS6315
69.4.94.226:8333 # AS36352
69.8.175.201:8333 # AS21766
-69.59.18.22:8333 # AS397444
+69.57.160.49:8333 # AS22612
+69.112.103.124:8333 # AS6128
69.196.152.33:8333 # AS5645
-69.228.219.124:8333 # AS7018
-70.64.27.12:8333 # AS6327
-70.160.240.132:8333 # AS22773
-71.79.109.128:8333 # AS7843
-71.184.193.75:8333 # AS701
-72.15.59.173:8333 # AS21949
-72.48.253.168:8333 # AS7459
-72.207.171.210:8333 # AS22773
-73.117.132.138:8333 # AS7922
-73.212.226.59:8333 # AS7922
-74.76.151.110:8333 # AS7843
-74.91.115.229:8333 # AS14586
+71.19.148.180:8333 # AS6939
+73.227.153.213:8333 # AS1351
+74.50.81.93:8333 # AS19318
+74.101.205.214:8333 # AS701
74.118.137.119:8333 # AS20326
74.213.175.108:8333 # AS21949
74.213.251.239:8333 # AS14978
74.220.255.190:8333 # AS23175
-74.221.189.109:8333 # AS26827
-75.83.203.225:8333 # AS20001
-75.172.52.186:8333 # AS209
-76.24.143.22:8333 # AS1351
-76.69.202.247:8333 # AS577
-76.73.198.242:8333 # AS12083
-76.119.248.240:8333 # AS1351
77.20.48.144:8333 # AS3209
-77.22.152.239:8333 # AS204028
-77.37.224.222:8333 # AS42610
-77.48.196.234:8333 # AS16019
-77.70.16.245:8333 # AS8717
+77.21.149.160:8333 # AS204028
+77.37.240.209:8333 # AS42610
+77.43.14.68:8333 # AS5396
+77.111.57.109:8333 # AS3212
77.162.190.90:8333 # AS1136
-78.20.227.249:8333 # AS6848
-78.21.167.8:8333 # AS6848
+77.173.132.140:8333 # AS1136
+77.202.10.220:8333 # AS15557
+78.27.139.13:8333 # AS6723
+78.31.71.190:8333 # AS24961
78.35.147.203:8333 # AS8422
-78.108.108.25:8333 # AS8251
-78.154.237.60:8333 # AS9155
-79.11.31.76:8333 # AS3269
-79.87.88.235:8333 # AS15557
-79.101.1.25:8333 # AS8400
-79.124.7.241:8333 # AS203380
+78.42.144.24:8333 # AS51185
+78.43.153.185:8333 # AS51185
+78.56.89.146:8333 # AS8764
+78.70.208.53:8333 # AS3301
+79.109.120.38:8333 # AS12430
+79.116.56.89:8333 # AS57269
79.124.7.253:8333 # AS203380
-79.150.68.42:8333 # AS3352
-79.249.10.53:8333 # AS3320
-80.82.21.77:8333 # AS42927
-80.82.76.59:8333 # AS202425
-80.88.172.227:8333 # AS31263
-80.93.213.246:8333 # AS42910
-80.111.142.213:8333 # AS6830
-80.208.227.134:8333 # AS62282
-80.208.228.9:8333 # AS62282
-80.209.64.86:8333 # AS31027
+79.136.250.162:8333 # AS9049
+80.83.186.25:8333 # AS33891
+80.98.75.248:8333 # AS21334
80.229.28.60:8333 # AS2856
-81.7.16.182:8333 # AS35366
+80.244.26.192:8333 # AS35432
+81.4.110.168:8333 # AS198203
+81.7.17.202:8333 # AS35366
81.19.10.2:8333 # AS24641
-81.162.196.43:8333 # AS34955
+81.83.214.134:8333 # AS6848
+81.170.142.100:8333 # AS8473
81.171.22.143:8333 # AS60781
-81.172.221.4:8333 # AS12430
-81.224.44.164:8333 # AS3301
-81.245.96.36:8333 # AS5432
-82.1.68.54:8333 # AS5089
+81.242.239.139:8333 # AS5432
82.66.10.11:8333 # AS12322
-82.66.211.31:8333 # AS12322
-82.71.4.154:8333 # AS13037
+82.66.204.177:8333 # AS12322
82.96.96.40:8333 # AS29686
-82.116.50.101:8333 # AS30936
-82.136.98.249:8333 # AS8821
-82.195.237.253:8333 # AS1836
-83.137.41.10:8333 # AS31394
-83.171.175.5:8333 # AS8767
+82.149.225.249:8333 # AS29551
+82.155.148.211:8333 # AS8657
+82.181.218.133:8333 # AS16086
+83.99.247.25:8333 # AS24651
+83.136.232.21:8333 # AS29182
+83.192.226.66:8333 # AS3215
83.208.193.242:8333 # AS5610
-83.233.76.165:8333 # AS29518
-83.240.89.196:8333 # AS31246
-84.38.3.249:8333 # AS196691
-84.54.23.48:8333 # AS35913
-84.126.216.77:8333 # AS12430
+83.240.118.196:8333 # AS31246
+84.7.219.130:8333 # AS15557
+84.52.64.82:8333 # AS25408
+84.64.99.78:8333 # AS5378
+84.112.60.16:8333 # AS8412
+84.113.129.195:8333 # AS8412
84.211.187.211:8333 # AS41164
-84.246.200.122:8333 # AS42455
-84.255.244.61:8333 # AS34779
-85.165.42.115:8333 # AS2119
-85.194.238.134:8333 # AS47605
-85.208.69.21:8333 # AS25091
-85.208.71.36:8333 # AS42275
-85.209.240.91:8333 # AS205581
+84.217.134.213:8333 # AS2119
+84.247.128.15:8333 # AS49788
+84.247.132.27:8333 # AS29286
+84.247.173.117:8333 # AS29286
+84.247.179.51:8333 # AS49788
+84.255.245.194:8333 # AS34779
+85.145.79.26:8333 # AS50266
+85.173.165.66:8333 # AS12389
+85.195.196.86:8333 # AS13030
85.214.118.71:8333 # AS6724
-85.214.161.252:8333 # AS6724
-85.236.190.252:8333 # AS35032
-85.243.115.136:8333 # AS8657
86.22.20.13:8333 # AS5089
-86.49.34.92:8333 # AS16019
-86.95.8.249:8333 # AS1136
-86.104.228.10:8333 # AS31638
-86.104.228.23:8333 # AS31638
+86.45.238.115:8333 # AS5466
+86.182.223.189:8333 # AS2856
+86.215.168.115:8333 # AS3215
87.79.94.221:8333 # AS8422
-88.10.89.23:8333 # AS3352
+87.90.94.120:8333 # AS5410
+87.92.171.53:8333 # AS16086
+87.236.195.198:8333 # AS35592
+87.236.199.197:8333 # AS35592
+88.6.31.66:8333 # AS3352
+88.9.73.252:8333 # AS3352
88.84.223.30:8333 # AS21453
-88.86.125.50:8333 # AS39392
-88.90.77.100:8333 # AS2119
-88.97.40.50:8333 # AS13037
-88.137.109.62:8333 # AS15557
-88.147.244.250:8333 # AS12389
-88.208.115.70:8333 # AS29208
-88.212.53.246:8333 # AS42841
-89.35.142.168:8333 # AS34977
-89.78.111.197:8333 # AS6830
-89.117.59.129:8333 # AS1239
-89.147.108.200:8333 # AS44735
-89.163.132.180:8333 # AS24961
+88.146.114.173:8333 # AS29208
+89.35.142.177:8333 # AS34977
+89.44.41.142:8333 # AS56478
+89.116.25.234:8333 # AS398465
+89.117.58.113:8333 # AS1239
+89.117.172.121:8333 # AS3320
89.165.232.242:8333 # AS48161
-89.216.21.96:8333 # AS31042
-90.50.172.182:8333 # AS3215
-90.146.130.214:8333 # AS12605
-90.146.208.162:8333 # AS12605
+89.190.142.56:8333 # AS38919
+89.216.91.120:8333 # AS31042
+89.247.224.28:8333 # AS8881
+90.146.207.67:8333 # AS12605
90.156.26.148:8333 # AS12741
-90.163.172.139:8333 # AS12479
-90.177.163.77:8333 # AS5610
-91.67.145.110:8333 # AS3209
-91.93.194.154:8333 # AS34984
+90.163.172.78:8333 # AS12479
+90.192.118.202:8333 # AS5607
+90.208.159.11:8333 # AS5607
+90.247.70.31:8333 # AS5378
+91.86.25.207:8333 # AS47377
91.123.182.164:8333 # AS51648
91.123.183.219:8333 # AS51792
+91.134.145.202:8333 # AS16276
91.135.0.187:8333 # AS12496
-91.147.232.98:8333 # AS5483
-91.184.168.249:8333 # AS9063
-91.193.237.116:8333 # AS42916
-91.199.41.45:8333 # AS6866
+91.152.122.36:8333 # AS6667
+91.184.174.191:8333 # AS9063
91.204.149.5:8333 # AS42765
+91.206.17.195:8333 # AS13259
+91.209.51.131:8333 # AS48239
91.215.91.254:8333 # AS48078
-91.219.25.232:8333 # AS50448
+91.231.182.53:8333 # AS44103
+91.236.251.137:8333 # AS57944
+91.236.251.139:8333 # AS57944
91.237.88.218:8333 # AS56813
92.27.150.46:8333 # AS13285
92.27.150.47:8333 # AS13285
-92.221.20.232:8333 # AS29695
-92.221.126.65:8333 # AS29695
-93.33.192.204:8333 # AS12874
-93.41.237.78:8333 # AS12874
-93.95.88.13:8333 # AS35434
-93.95.227.125:8333 # AS44735
+92.42.110.219:8333 # AS1273
+92.43.187.34:8333 # AS8359
+92.206.105.31:8333 # AS20880
+92.233.2.59:8333 # AS5089
+92.240.181.45:8333 # AS16246
+93.51.13.120:8333 # AS12874
+93.57.81.162:8333 # AS12874
+93.71.19.130:8333 # AS30722
+93.81.254.159:8333 # AS8402
+93.90.82.227:8333 # AS47626
+93.100.35.189:8333 # AS35807
93.103.13.1:8333 # AS34779
-93.115.86.239:8333 # AS3223
93.123.180.164:8333 # AS35539
-93.186.201.173:8333 # AS24961
-93.190.117.26:8333 # AS196881
+93.177.188.74:8333 # AS16010
+93.188.102.53:8333 # AS43989
94.19.7.55:8333 # AS35807
-94.23.21.80:8333 # AS16276
-94.23.205.110:8333 # AS16276
-94.131.0.73:8333 # AS29632
-94.142.237.4:8333 # AS48926
-94.154.159.99:8333 # AS62240
-94.202.50.200:8333 # AS15802
+94.63.75.74:8333 # AS12353
+94.72.141.61:8333 # AS57344
+94.72.143.47:8333 # AS203380
+94.105.53.124:8333 # AS47377
+94.181.46.106:8333 # AS9049
94.231.253.18:8333 # AS35224
95.42.140.142:8333 # AS8866
-95.67.18.100:8333 # AS34867
-95.70.238.176:8333 # AS12735
-95.83.73.31:8333 # AS8359
-95.90.128.3:8333 # AS204028
+95.82.130.223:8333 # AS31246
+95.88.61.176:8333 # AS204028
+95.105.172.171:8333 # AS15962
95.110.234.93:8333 # AS31034
-95.161.12.45:8333 # AS39598
-95.172.62.167:8333 # AS201826
-95.179.128.87:8333 # AS20473
+95.164.182.44:8333 # AS29632
95.191.130.100:8333 # AS12389
-95.214.53.154:8333 # AS201814
96.3.53.254:8333 # AS11232
-97.75.145.12:8333 # AS22709
-97.81.198.180:8333 # AS20115
-97.87.216.110:8333 # AS20115
-99.229.210.111:8333 # AS812
+97.75.144.9:8333 # AS22709
+98.17.95.93:8333 # AS398465
+98.128.230.186:8333 # AS8473
+98.163.242.149:8333 # AS22773
+98.229.126.23:8333 # AS1351
+99.233.20.215:8333 # AS812
99.246.87.2:8333 # AS812
-101.43.124.195:8333 # AS45090
-102.132.192.141:8333 # AS37680
-103.21.3.89:8333 # AS38195
-103.35.121.72:8333 # AS9498
-103.99.168.100:8333 # AS6939
-103.99.168.140:8333 # AS6939
+101.51.138.194:8333 # AS38040
+102.130.113.94:8333 # AS328364
103.99.170.210:8333 # AS54415
103.99.170.220:8333 # AS54415
-103.105.202.50:8333 # AS137764
-104.238.220.199:8333 # AS23470
-104.243.33.165:8333 # AS23470
+103.156.165.171:8333 # AS63859
+103.219.169.49:8333 # AS13335
+104.171.202.244:8333 # AS30496
+104.225.220.33:8333 # AS29802
104.244.73.6:8333 # AS53667
-108.26.125.214:8333 # AS701
+104.244.79.131:8333 # AS53667
+108.49.65.132:8333 # AS701
109.86.60.33:8333 # AS13188
+109.91.141.145:8333 # AS3209
109.99.63.159:8333 # AS9050
109.120.194.136:8333 # AS34569
-109.123.233.138:8333 # AS15685
-109.123.240.53:8333 # AS15685
-109.153.94.35:8333 # AS2856
-109.173.126.157:8333 # AS42610
-109.193.76.200:8333 # AS51185
-109.221.229.197:8333 # AS3215
-109.236.90.117:8333 # AS49981
-109.248.206.13:8333 # AS203493
-111.90.140.23:8333 # AS45839
+109.196.124.182:8333 # AS196883
+109.201.168.32:8333 # AS41750
+109.224.84.149:8333 # AS197197
111.90.140.46:8333 # AS45839
-111.90.145.37:8333 # AS18106
-114.173.159.209:8333 # AS4713
+112.139.10.25:8333 # AS10010
+114.34.130.206:8333 # AS3462
116.58.171.67:8333 # AS2514
+116.86.195.192:8333 # AS4657
119.31.179.202:8333 # AS17408
119.42.55.203:8333 # AS133159
-122.222.160.190:8333 # AS2519
+120.226.39.100:8333 # AS9808
+120.226.39.103:8333 # AS9808
+121.6.69.73:8333 # AS9506
+121.99.240.87:8333 # AS9790
+122.148.147.136:8333 # AS4826
+122.199.40.21:8333 # AS38195
123.60.213.192:8333 # AS55990
+123.202.193.121:8333 # AS9269
+124.170.182.194:8333 # AS7545
124.197.54.113:8333 # AS9790
-125.168.140.108:8333 # AS4826
+125.168.110.28:8333 # AS4826
+125.227.178.68:8333 # AS3462
128.0.190.26:8333 # AS30764
-128.65.194.136:8333 # AS29222
-129.13.189.212:8333 # AS34878
129.13.189.215:8333 # AS34878
-129.226.216.148:8333 # AS132203
-131.188.40.191:8333 # AS680
-134.65.9.63:8333 # AS19653
-134.122.200.160:8333 # AS64050
-134.195.185.52:8333 # AS13536
+130.44.176.111:8333 # AS6079
+130.204.161.3:8333 # AS8717
+131.153.232.139:8333 # AS12189
+131.188.40.47:8333 # AS680
+134.65.193.149:8333 # AS19037
+135.19.41.208:8333 # AS5769
135.19.253.101:8333 # AS5769
-136.29.109.58:8333 # AS19165
-136.32.238.6:8333 # AS16591
-136.49.201.24:8333 # AS16591
+135.23.204.98:8333 # AS5645
+135.181.215.237:8333 # AS24940
+136.55.46.15:8333 # AS16591
+136.62.58.224:8333 # AS16591
+136.175.8.175:8333 # AS14315
+136.244.19.126:8333 # AS397412
137.226.34.46:8333 # AS680
-138.207.211.189:8333 # AS11776
-139.130.41.82:8333 # AS1221
+138.59.20.209:8333 # AS28201
+139.59.70.163:8333 # AS14061
140.238.220.99:8333 # AS31898
+141.193.68.11:8333 # AS396998
142.54.181.218:8333 # AS32097
-142.166.19.23:8333 # AS855
-142.254.87.115:8333 # AS46375
-143.177.229.149:8333 # AS50266
-144.2.101.21:8333 # AS3303
+142.115.140.2:8333 # AS577
+142.188.125.200:8333 # AS577
+143.110.252.124:8333 # AS14061
144.24.236.64:8333 # AS31898
-145.40.51.52:8333 # AS49808
+144.137.29.181:8333 # AS1221
146.71.69.103:8333 # AS7782
-146.120.241.173:8333 # AS208515
-147.50.238.53:8333 # AS45265
-148.103.101.132:8333 # AS28118
-149.75.48.92:8333 # AS6079
+149.28.159.141:8333 # AS20473
+149.143.32.26:8333 # AS15435
+149.202.79.199:8333 # AS16276
+149.248.1.254:8333 # AS20473
+151.248.221.197:8333 # AS8821
152.44.137.83:8333 # AS11404
-154.0.3.194:8333 # AS37680
+152.230.180.115:8333 # AS14259
154.26.137.105:8333 # AS174
-154.26.154.73:8333 # AS1299
-154.57.5.11:8333 # AS200736
-155.4.55.21:8333 # AS8473
-156.146.137.142:8333 # AS1448
-156.146.177.221:8333 # AS1448
-157.22.72.175:8333 # AS397379
-157.97.0.118:8333 # AS43571
-158.140.141.69:8333 # AS132132
-158.181.132.84:8333 # AS41750
-159.2.215.98:8333 # AS855
-159.196.3.239:8333 # AS4764
-159.224.189.250:8333 # AS13188
-160.80.12.16:8333 # AS137
-161.230.38.160:8333 # AS12353
-161.246.11.230:8333 # AS9486
-162.0.210.152:8333 # AS22612
-162.62.18.226:8333 # AS132203
-162.254.118.20:8333 # AS6130
-163.158.168.181:8333 # AS15435
-165.173.19.33:8333 # AS132132
-165.228.174.117:8333 # AS1221
+154.92.111.100:8333 # AS141356
+157.131.20.174:8333 # AS46375
+158.129.140.201:8333 # AS5479
+158.181.114.196:8333 # AS8821
+158.220.85.82:8333 # AS8556
+158.220.121.93:8333 # AS8556
+159.2.191.175:8333 # AS855
+159.224.238.145:8333 # AS13188
+161.97.167.10:8333 # AS51167
+162.213.119.12:8333 # AS2711
+162.226.61.8:8333 # AS7018
+162.254.171.209:8333 # AS17210
+163.114.159.205:8333 # AS15830
+163.172.84.134:8333 # AS12876
165.255.241.184:8333 # AS327693
-167.88.11.203:8333 # AS20278
167.179.147.155:8333 # AS4764
+169.150.206.206:8333 # AS60068
170.17.151.235:8333 # AS3303
-170.64.174.230:8333 # AS15108
+170.254.147.116:8333 # AS265398
172.92.102.115:8333 # AS11404
172.105.21.216:8333 # AS63949
-172.111.176.244:8333 # AS46562
-172.255.98.108:8333 # AS7979
-173.82.5.202:8333 # AS35916
+172.219.229.252:8333 # AS852
+172.251.101.27:8333 # AS20001
+173.12.119.133:8333 # AS7922
+173.19.176.228:8333 # AS30036
173.181.35.50:8333 # AS395570
-173.212.253.137:8333 # AS51167
-173.235.73.87:8333 # AS11272
-174.30.29.85:8333 # AS209
-174.141.209.40:8333 # AS6461
+173.212.98.0:8333 # AS11260
+173.241.227.243:8333 # AS19009
+173.246.31.114:8333 # AS1403
+174.20.57.30:8333 # AS209
+175.27.247.104:8333 # AS45090
+175.136.174.174:8333 # AS4788
176.9.17.121:8333 # AS24940
-176.12.16.135:8333 # AS8717
+176.37.82.83:8333 # AS39608
176.74.136.237:8333 # AS35613
-176.74.139.120:8333 # AS35613
-176.122.122.134:8333 # AS50581
-176.126.167.10:8333 # AS8449
-176.151.244.130:8333 # AS5410
-176.186.19.106:8333 # AS5410
-176.212.185.153:8333 # AS9049
-177.142.146.193:8333 # AS4230
+176.118.220.29:8333 # AS60042
+176.138.233.166:8333 # AS5410
+177.32.50.167:8333 # AS28573
178.21.118.178:8333 # AS49544
-178.61.141.198:8333 # AS21050
-178.124.162.209:8333 # AS6697
-178.143.25.194:8333 # AS15962
-178.154.233.197:8333 # AS200350
+178.41.11.254:8333 # AS6855
+178.79.83.147:8333 # AS3212
+178.88.189.254:8333 # AS9198
+178.154.222.104:8333 # AS200350
178.159.98.133:8333 # AS202390
-178.232.186.191:8333 # AS41164
-178.236.137.63:8333 # AS44843
-179.60.149.4:8333 # AS395839
-184.160.110.104:8333 # AS5769
-184.174.37.139:8333 # AS1239
-185.8.104.179:8333 # AS16125
-185.14.30.25:8333 # AS21100
+178.198.23.120:8333 # AS3303
+178.250.232.111:8333 # AS31197
+182.229.145.161:8333 # AS3786
+183.88.223.208:8333 # AS45758
+183.129.178.205:8333 # AS4134
185.25.48.184:8333 # AS61272
+185.26.99.171:8333 # AS44066
+185.31.136.246:8333 # AS47605
185.52.93.45:8333 # AS39449
-185.64.116.15:8333 # AS31736
-185.69.105.117:8333 # AS6855
-185.98.54.20:8333 # AS39572
+185.69.53.153:8333 # AS62282
+185.84.224.116:8333 # AS8816
185.107.83.55:8333 # AS43350
-185.132.109.122:8333 # AS38919
-185.135.81.50:8333 # AS57494
-185.140.253.169:8333 # AS200735
+185.116.94.239:8333 # AS39184
+185.140.209.159:8333 # AS44901
185.148.3.227:8333 # AS47605
-185.154.2.3:8333 # AS29119
-185.162.92.36:8333 # AS41722
-185.163.44.36:8333 # AS39798
+185.152.138.74:8333 # AS6697
+185.153.196.14:8333 # AS15836
+185.153.196.162:8333 # AS15836
+185.156.37.30:8333 # AS202605
+185.156.154.129:8333 # AS41897
+185.158.113.172:8333 # AS28917
185.165.170.19:8333 # AS3223
-185.167.113.59:8333 # AS207054
-185.185.59.12:8333 # AS48614
+185.190.24.72:8333 # AS9002
+185.199.209.52:8333 # AS49666
185.203.41.148:8333 # AS9009
185.209.12.76:8333 # AS212323
-185.209.70.17:8333 # AS204568
185.210.125.33:8333 # AS205671
185.233.189.210:8333 # AS61303
-185.238.131.19:8333 # AS206238
-185.239.220.210:8333 # AS61282
-185.239.221.5:8333 # AS61282
-185.250.90.246:8333 # AS61955
-186.249.217.25:8333 # AS7195
-186.250.95.132:8333 # AS262967
+185.250.36.66:8333 # AS1239
+185.254.97.164:8333 # AS44486
+186.235.86.249:8333 # AS263097
+188.27.79.235:8333 # AS8708
188.35.167.14:8333 # AS34123
188.68.53.44:8333 # AS47147
-188.120.255.115:8333 # AS29182
-189.6.195.111:8333 # AS28573
-190.2.130.44:8333 # AS49981
-190.13.122.89:8333 # AS33576
-190.123.27.11:8333 # AS52468
-190.145.127.254:8333 # AS14080
-191.220.156.64:8333 # AS8167
-192.31.136.90:8333 # AS54098
-192.69.53.43:8333 # AS11142
+188.119.67.137:8333 # AS9002
+188.127.243.41:8333 # AS56694
+188.138.112.60:8333 # AS20773
+188.142.199.17:8333 # AS21334
+188.155.72.160:8333 # AS6730
+188.214.129.52:8333 # AS16125
+188.214.129.139:8333 # AS16125
+188.215.62.122:8333 # AS203600
+188.237.167.51:8333 # AS8926
+188.246.224.12:8333 # AS49505
+189.6.221.37:8333 # AS28573
+190.2.146.90:8333 # AS49981
+190.17.18.190:8333 # AS7303
+190.210.98.253:8333 # AS16814
+192.3.11.24:8333 # AS36352
+192.69.53.18:8333 # AS11142
192.146.137.44:8333 # AS25376
-192.174.121.33:8333 # AS11492
-192.222.147.175:8333 # AS1403
-193.198.34.24:8333 # AS2108
-193.222.130.14:8333 # AS29208
-194.35.185.167:8333 # AS9063
-194.54.83.234:8333 # AS41018
-194.233.84.100:8333 # AS141995
-195.2.73.88:8333 # AS48282
-195.48.12.8:8333 # AS1836
-195.154.200.157:8333 # AS12876
-197.211.133.15:8333 # AS51265
-198.84.146.8:8333 # AS5645
-198.98.55.86:8333 # AS53667
-199.247.7.208:8333 # AS20473
-200.116.154.131:8333 # AS13489
-201.191.6.103:8333 # AS11830
-201.221.234.200:8333 # AS27928
-202.47.225.242:8333 # AS9931
-202.107.219.130:8333 # AS4134
-202.108.211.135:8333 # AS4837
-202.138.13.122:8333 # AS4826
-203.86.195.32:8333 # AS23655
-203.184.52.247:8333 # AS9790
-204.111.163.114:8333 # AS4922
-205.178.41.124:8333 # AS11039
+193.22.128.12:8333 # AS39647
+193.39.142.89:8333 # AS60781
+193.46.74.252:8333 # AS395003
+193.46.74.254:8333 # AS395003
+193.95.249.3:8333 # AS5603
+193.149.176.200:8333 # AS40676
+193.151.155.122:8333 # AS49666
+193.187.90.122:8333 # AS3399
+193.196.37.62:8333 # AS34878
+194.35.184.95:8333 # AS9063
+194.165.30.20:8333 # AS35162
+194.191.232.153:8333 # AS1836
+195.32.108.164:8333 # AS3269
+195.56.63.11:8333 # AS5483
+195.56.63.12:8333 # AS5483
+195.123.217.63:8333 # AS21100
+195.128.248.153:8333 # AS25229
+195.140.226.154:8333 # AS35614
+195.160.222.81:8333 # AS31148
+195.206.105.7:8333 # AS9009
+199.36.253.252:8333 # AS16713
+199.58.100.115:8333 # AS25961
+202.90.242.93:8333 # AS4764
+202.112.238.128:8333 # AS4538
+202.186.38.99:8333 # AS9930
+203.12.0.167:8333 # AS134697
+203.12.10.224:8333 # AS134697
+203.210.193.21:8333 # AS45899
+204.228.142.211:8333 # AS6315
+205.178.182.133:8333 # AS396998
+206.55.178.157:8333 # AS10242
206.192.203.0:8333 # AS7029
-207.229.46.80:8333 # AS852
-207.244.248.81:8333 # AS40021
+207.98.253.88:8333 # AS12083
+207.115.84.47:8333 # AS18530
207.255.193.47:8333 # AS11776
-208.59.133.63:8333 # AS11039
-209.58.145.157:8333 # AS394380
-209.97.189.249:8333 # AS14061
-209.177.138.245:8333 # AS7832
+208.104.92.74:8333 # AS14615
+209.38.244.87:8333 # AS2914
+209.204.29.18:8333 # AS395439
+209.205.204.218:8333 # AS55081
209.237.133.54:8333 # AS53859
-210.54.37.190:8333 # AS4648
-210.54.39.238:8333 # AS4648
-212.34.225.118:8333 # AS44395
-212.41.9.30:8333 # AS49505
-212.51.132.176:8333 # AS13030
-212.69.60.77:8333 # AS12496
+210.6.95.127:8333 # AS9269
+210.205.146.114:8333 # AS9318
+211.221.42.143:8333 # AS4766
+212.5.157.40:8333 # AS8866
+212.51.136.50:8333 # AS13030
212.86.32.106:8333 # AS15366
-213.47.64.105:8333 # AS8412
+212.162.152.149:8333 # AS24875
+212.227.150.147:8333 # AS8560
+212.227.155.170:8333 # AS8560
+212.251.162.190:8333 # AS2119
+213.109.236.129:8333 # AS47702
213.141.154.201:8333 # AS12714
-213.142.148.169:8333 # AS6762
-213.184.244.24:8333 # AS60280
-213.227.147.244:8333 # AS60781
-213.250.21.112:8333 # AS5603
-216.146.251.8:8333 # AS54579
-216.232.157.104:8333 # AS395570
-217.15.178.11:8333 # AS25534
-217.26.32.10:8333 # AS197312
+213.193.83.251:8333 # AS6830
+213.193.83.252:8333 # AS6830
+213.202.225.122:8333 # AS24961
+216.83.150.142:8333 # AS5048
+216.186.236.98:8333 # AS12083
+216.232.33.24:8333 # AS395570
+217.64.47.138:8333 # AS39324
217.64.47.200:8333 # AS39324
-217.76.51.25:8333 # AS39597
+217.76.61.78:8333 # AS39597
217.92.55.246:8333 # AS3320
+217.113.121.169:8333 # AS8416
+217.155.244.170:8333 # AS13037
217.170.124.170:8333 # AS35401
+217.173.236.25:8333 # AS8447
+217.180.192.116:8333 # AS30600
217.180.221.162:8333 # AS30600
-217.180.238.137:8333 # AS30600
-220.84.232.46:8333 # AS4766
-220.133.39.61:8333 # AS3462
-220.233.91.182:8333 # AS38195
-[2001:19f0:1000:1db3:5400:4ff:fe56:5a8d]:8333 # AS20473
-[2001:19f0:5:24da:3eec:efff:feb9:f36e]:8333 # AS20473
-[2001:19f0:5:24da::]:8333 # AS20473
-[2001:19f0:5:4535:3eec:efff:feb9:87e4]:8333 # AS20473
-[2001:19f0:5:4535::]:8333 # AS20473
+218.43.123.236:8333 # AS4713
+219.77.79.128:8333 # AS4760
+223.18.222.210:8333 # AS9304
+223.167.75.165:8333 # AS4837
+[2001:1620:5566:100::62c]:8333 # AS13030
+[2001:1620:a21:0:da5e:d3ff:fee3:68a0]:8333 # AS13030
+[2001:19f0:4401:e8a:5400:4ff:fe8e:d398]:8333 # AS20473
[2001:1bc0:c1::2000]:8333 # AS29686
-[2001:1c04:4008:6300:8a5f:2678:114b:a660]:8333 # AS6830
-[2001:41d0:203:3739::]:8333 # AS16276
-[2001:41d0:203:8f49::]:8333 # AS16276
-[2001:41d0:203:bb0a::]:8333 # AS16276
-[2001:41d0:2:bf8f::]:8333 # AS16276
-[2001:41d0:303:de8b::]:8333 # AS16276
+[2001:4060:4419:8001::42]:8333 # AS6772
+[2001:41d0:203:8f46::]:8333 # AS16276
+[2001:41d0:30e:8e00::]:8333 # AS16276
[2001:41d0:403:3d61::]:8333 # AS16276
-[2001:41d0:405:9600::]:8333 # AS16276
+[2001:41d0:405:6e00::]:8333 # AS16276
+[2001:41d0:8:83cf:195b:b202:9271:cc5b]:8333 # AS16276
[2001:41d0:8:ed7f::1]:8333 # AS16276
[2001:41d0:a:69a2::1]:8333 # AS16276
-[2001:41f0::62:6974:636f:696e]:8333 # AS6830
+[2001:41d0:a:6b4d::1]:8333 # AS16276
+[2001:470:1b55::]:8333 # AS6939
[2001:470:1b62::]:8333 # AS6939
-[2001:470:1f05:43b:2831:8530:7179:5864]:8333 # AS6939
[2001:470:1f09:b14::11]:8333 # AS6939
-[2001:470:1f15:106:e2d5:5eff:fe42:7ae5]:8333 # AS6939
-[2001:470:1f1b:365:aa20:66ff:fe3f:1909]:8333 # AS6939
+[2001:470:1f0a:89a::2]:8333 # AS6939
[2001:470:1f1b:5a6:216:3eff:fe24:1162]:8333 # AS6939
-[2001:470:6a7c::]:8333 # AS6939
[2001:470:75e9:1::10]:8333 # AS6939
-[2001:470:8ca0:2:4e72:b9ff:fe56:f8b8]:8333 # AS6939
-[2001:470:dbc7:0:1010::100]:8333 # AS6939
-[2001:4ba0:cafe:14cc::1]:8333 # AS24961
-[2001:4ba0:ffff:24::1]:8333 # AS24961
+[2001:470:88ff:2e::1]:8333 # AS6939
+[2001:470:8ca0:2:7646:a0ff:fe9b:e662]:8333 # AS6939
+[2001:470:a:c13::2]:8333 # AS6939
+[2001:470:c:1077::2]:8333 # AS6939
[2001:4dd0:3564:0:30b7:1d7b:6fec:4c5c]:8333 # AS8422
[2001:4dd0:3564:0:88e:b4ff:2ad0:699b]:8333 # AS8422
[2001:4dd0:3564:0:9c1c:cc31:9fe8:5505]:8333 # AS8422
[2001:4dd0:3564:0:a0c4:d41f:4c4:1bb0]:8333 # AS8422
+[2001:4dd0:3564:0:fd76:c1d3:1854:5bd9]:8333 # AS8422
[2001:4dd0:3564:1::7676:8090]:8333 # AS8422
[2001:4dd0:3564:1:b977:bd71:4612:8e40]:8333 # AS8422
[2001:4dd0:af0e:3564::69:1]:8333 # AS8422
[2001:4dd0:af0e:3564::69:90]:8333 # AS8422
[2001:560:441f:1::4]:8333 # AS18530
-[2001:638:a000:4140::ffff:191]:8333 # AS680
-[2001:67c:25dc:91::2]:8333 # AS41018
+[2001:5a8:40c7:f500:7a0d:d50:255e:dbac]:8333 # AS46375
+[2001:638:a000:4140::ffff:47]:8333 # AS680
[2001:67c:26b4:ff00::44]:8333 # AS25376
-[2001:67c:2db8:6::36]:8333 # AS39798
+[2001:67c:440:688:91:236:251:137]:8333 # AS57944
+[2001:67c:440:688:91:236:251:139]:8333 # AS57944
[2001:7c0:2310:0:f816:3eff:fe6c:4f58]:8333 # AS34878
-[2001:861:3242:8420::40]:8333 # AS5410
-[2001:8b0:1301:1000::60]:8333 # AS20712
-[2001:b030:2422::208d]:8333 # AS3462
-[2001:b07:2ef:6e4a:3d:974e:784a:684b]:8333 # AS12874
-[2001:b07:5d32:b142:8f77:3c7d:a2fd:ed2e]:8333 # AS12874
+[2001:861:c62:2fd0:ca7f:54ff:fece:6d9]:8333 # AS5410
+[2001:871:23d:d5d1:5a47:caff:fe71:c8d]:8333 # AS8447
+[2001:910:109d:2c03:d217:c2ff:fe07:2cd9]:8333 # AS20766
[2001:b07:6461:7811:489:d2da:e07:1af7]:8333 # AS12874
[2001:b07:646b:8074:32e8:9243:a337:e60a]:8333 # AS12874
-[2001:b07:646b:8074:4cc6:79a5:3af7:7132]:8333 # AS12874
-[2001:b07:ad4:ca4b:7dd5:8471:50c3:5363]:8333 # AS12874
+[2001:bc8:1201:715:ca1f:66ff:fec9:5ff0]:8333 # AS12876
[2001:bc8:1201:71a:2e59:e5ff:fe42:52f4]:8333 # AS12876
[2001:bc8:1600:0:208:a2ff:fe0c:8a2e]:8333 # AS12876
-[2001:bc8:323c:ff:a634:384f:1849:f4bc]:8333 # AS12876
-[2001:bc8:323c:ff:d217:c2ff:fe07:2cd9]:8333 # AS12876
-[2001:bc8:700:2b14::1]:8333 # AS12876
-[2001:bc8:700:8d16::1]:8333 # AS12876
-[2001:e68:5400:58d0:bd15:ea8c:5b20:7523]:8333 # AS4788
-[2400:2411:a3e1:4900:7298:f550:67e7:b99b]:8333 # AS17676
-[2400:8901::f03c:93ff:fe2b:5c0b]:8333 # AS63949
-[2400:8901::f03c:93ff:fe5a:685c]:8333 # AS63949
+[2003:dc:2f4a:eb00:4ecc:6aff:fe25:c9a3]:8333 # AS3320
+[2003:f6:3f31:600:4c9f:7620:8324:d4a7]:8333 # AS3320
+[2400:6180:100:d0::848:5001]:8333 # AS14061
+[2400:6180:100:d0::940:4001]:8333 # AS14061
+[2400:6180:100:d0::953:8001]:8333 # AS14061
+[2400:6180:100:d0::a02:2001]:8333 # AS14061
+[2400:6180:100:d0::a0f:9001]:8333 # AS14061
+[2400:6180:100:d0::a3d:b001]:8333 # AS14061
+[2400:6180:100:d0::a3f:1001]:8333 # AS14061
+[2400:6180:100:d0::a49:a001]:8333 # AS14061
+[2400:6180:100:d0::a56:d001]:8333 # AS14061
+[2400:6180:100:d0::a56:e001]:8333 # AS14061
[2401:b140:1::100:210]:8333 # AS54415
[2401:b140:1::100:220]:8333 # AS54415
-[2401:d002:3902:700:d72c:5e22:4e95:389d]:8333 # AS38195
-[2404:4408:63a4:a01::250]:8333 # AS9790
+[2402:e280:3d17:945:1889:d3c6:8e85:d3c4]:8333 # AS134674
+[2403:6200:8821:2fdf:3903:a2b1:9f:c897]:8333 # AS20473
[2406:3400:216:8b00:211:32ff:feca:336b]:8333 # AS10143
-[2406:8c00:0:3422:133:18:228:108]:8333 # AS24282
-[2406:da11:169:b03:32b5:f901:9f7c:3e4b]:8333 # AS16509
-[2406:da18:9f1:f301:7d2e:c256:c112:f2be]:8333 # AS16509
-[2406:da18:9f1:f303:c1c9:c569:b799:2057]:8333 # AS16509
-[2406:da1e:a4e:8a00:20db:dd8d:3670:28f0]:8333 # AS16509
-[2406:da1e:a4e:8a03:2aad:496b:768d:e497]:8333 # AS16509
+[2406:da14:335:b600:eb14:5fd:2072:3653]:8333 # AS16509
+[2406:da1c:50b:cd00:3cae:1728:ecfc:4334]:8333 # AS16509
+[2406:da1c:50b:cd03:36d6:13fa:eba8:6543]:8333 # AS16509
+[2406:da1e:a4e:8a03:d90a:fbb0:23d3:ccb4]:8333 # AS16509
[2407:3640:2107:1278::1]:8333 # AS141995
-[2407:3640:3010:4012::1]:8333 # AS141995
-[2407:8800:bc61:2202:d63d:7eff:fe6c:dc36]:8333 # AS7545
-[2600:1700:5c5b:b0:aaa1:59ff:fe5f:615a]:8333 # AS7018
-[2600:1700:ec7b:5730::48]:8333 # AS7018
-[2600:1900:4000:4cc4:0:1::]:8333 # AS15169
-[2600:1900:4000:4cc4:0:2::]:8333 # AS15169
-[2600:1900:4000:4cc4:0:3::]:8333 # AS15169
-[2600:1900:4000:4cc4::]:8333 # AS15169
-[2600:1900:4030:a25e::]:8333 # AS15169
-[2600:1f14:40e:e301:afdd:ad00:e568:d220]:8333 # AS16509
-[2600:1f1c:2d3:2400:f15e:2f2a:760d:a33d]:8333 # AS16509
+[2407:7000:9f71:2d00:1c5a:5292:5108:c734]:8333 # AS9500
+[2408:8207:2655:fae0::10b]:8333 # AS4837
+[2408:8207:5456:d8d0::5c6]:8333 # AS4837
+[2409:250:60a0:2600:a971:1cdd:3d5b:654d]:8333 # AS55392
+[240d:1a:4b1:e700:19:d9ef:7f3:8e75]:8333 # AS2527
+[2600:1700:3948:82f:ce04:d382:5226:4cac]:8333 # AS7018
+[2600:1f16:a08:b900:4bfe:2f81:ae31:5f5]:8333 # AS16509
+[2600:1f1c:2d3:2401:6989:b1fd:d2a6:fbc8]:8333 # AS16509
+[2600:1f1e:2fe:3601:63a8:ebf6:83e4:1932]:8333 # AS16509
[2600:2104:1003:c5ab:dc5e:90ff:fe18:1d08]:8333 # AS11404
-[2600:3c00::f03c:92ff:fe92:2745]:8333 # AS63949
-[2600:3c00::f03c:92ff:fecf:61b6]:8333 # AS63949
-[2600:3c00:e002:2e32::1:14]:8333 # AS63949
-[2600:3c01::f03c:93ff:fe2a:5266]:8333 # AS63949
-[2600:3c01::f03c:93ff:fe74:5f59]:8333 # AS63949
-[2600:3c01::f03c:93ff:fee6:2146]:8333 # AS63949
-[2600:3c02::f03c:92ff:fe5d:9fb]:8333 # AS63949
-[2600:4040:2004:3201:459f:8fe8:444d:baf1]:8333 # AS13786
-[2600:4040:4541:4900:4e1:b58a:8438:450e]:8333 # AS13786
+[2600:3c00::f03c:91ff:fe4b:c52]:8333 # AS63949
+[2600:3c00:e002:2e32::1:c8]:8333 # AS63949
+[2600:3c02::f03c:94ff:fecc:c99c]:8333 # AS63949
+[2600:6c4e:a00:cd0:428d:5cff:fe58:4884]:8333 # AS20115
[2600:6c54:7100:1ad1:c92e:36d:651:bd18]:8333 # AS20115
-[2600:8801:2f80:477::141c]:8333 # AS22773
-[2600:8801:8d00:3eb0:20c:29ff:fec3:d799]:8333 # AS22773
-[2600:8805:2400:14e:12dd:b1ff:fef2:3013]:8333 # AS22773
[2601:184:300:156c:ba4c:30:9da:6c06]:8333 # AS7922
-[2601:346:d7f:fff7:18c6:4856:ef75:744c]:8333 # AS7922
-[2601:405:4a00:876:c8d3:f081:2ce8:ba8e]:8333 # AS7922
-[2602:24c:b8f:cd90::7840]:8333 # AS46375
-[2602:fec3:0:1::69]:8333 # AS62563
-[2602:ff16:1:0:1:412:0:1]:8333 # AS29802
-[2603:3001:2618:c000:2ec1:df1f:a463:9119]:8333 # AS7922
+[2601:185:8302:12f0:1ab2:2840:9de4:1550]:8333 # AS7922
[2603:3003:11b:e100:20c:29ff:fe38:bbc0]:8333 # AS7922
[2603:3004:6a1:3800:851f:584d:7aba:affb]:8333 # AS7922
-[2603:3004:6a1:3800::7bba]:8333 # AS7922
-[2603:3004:6a1:3800::f667]:8333 # AS7922
-[2603:3024:1606:1400::29ec]:8333 # AS7922
[2603:3024:18ee:8000:20e:c4ff:fed1:ef15]:8333 # AS7922
-[2603:6000:a400:9300::2000]:8333 # AS7843
-[2603:6010:7001:4830::2:1]:8333 # AS7843
[2603:8080:1f07:6fdd:7de2:d969:78c9:b7ea]:8333 # AS7843
-[2603:8080:d600:1800:7ce1:74a2:6a8a:4643]:8333 # AS7843
-[2603:8081:6c00:306e:215:5dff:fe02:150a]:8333 # AS7843
-[2604:3d09:7182:8700:bba9:cde6:5b37:a8df]:8333 # AS6327
-[2604:4080:1036:80b1::3be]:8333 # AS11404
-[2604:a00:3:1223:216:3eff:fe27:76e0]:8333 # AS19318
-[2604:a880:400:d0::261f:6001]:8333 # AS14061
-[2604:a880:4:1d0::13e:f000]:8333 # AS14061
-[2604:a880:4:1d0::17a:7000]:8333 # AS14061
-[2604:a880:4:1d0::c1:3000]:8333 # AS14061
-[2604:a880:4:1d0::e5:b000]:8333 # AS14061
-[2605:4a80:a302:7940:7254:1ed4:90d7:4f39]:8333 # AS11232
-[2605:4a80:a302:7940::2]:8333 # AS11232
+[2604:4080:1036:80b1:50e1:43ff:fe0e:9df5]:8333 # AS11404
[2605:6400:30:f220::]:8333 # AS53667
-[2605:a140:3010:4014::1]:8333 # AS40021
-[2605:ae00:203::203]:8333 # AS7819
-[2605:b40:14d0:5b00:7988:eb8:6bb6:66e2]:8333 # AS174
+[2605:6400:30:fd6f::4]:8333 # AS53667
[2605:c000:2a0a:1::102]:8333 # AS7393
+[2606:6d00:100:5102:3d2:f06a:c2e8:a54]:8333 # AS1403
+[2607:5300:60:2e54::1]:8333 # AS16276
[2607:5300:61:854::1]:8333 # AS16276
[2607:9280:b:73b:250:56ff:fe14:25b5]:8333 # AS395502
[2607:9280:b:73b:250:56ff:fe21:9c2f]:8333 # AS395502
[2607:9280:b:73b:250:56ff:fe21:bf32]:8333 # AS395502
[2607:9280:b:73b:250:56ff:fe33:4d1b]:8333 # AS395502
[2607:9280:b:73b:250:56ff:fe3d:401]:8333 # AS395502
-[2620:6e:a000:1:42:42:42:42]:8333 # AS397444
-[2620:a6:2000:1:1:0:5:1601]:8333 # AS27566
-[2620:a6:2000:1:2:0:9:900b]:8333 # AS27566
-[2620:a6:2000:1:2:0:b:300e]:8333 # AS27566
-[2800:150:11d:d2f:bdac:7807:2f5:4aa0]:8333 # AS22047
-[2803:9800:a007:82ba:650b:82b8:8377:d0]:8333 # AS19037
-[2804:14c:155:45e0:1e86:15a3:efd9:7287]:8333 # AS28573
-[2804:14c:657d:4030:28b4:eff:fe9b:8894]:8333 # AS28573
-[2804:14d:1087:9434::1002]:8333 # AS4230
-[2804:954:24:2:b390:d83b:358a:db53]:8333 # AS263073
-[2804:d57:554d:de00:3e7c:3fff:fe7b:80aa]:8333 # AS8167
-[2a00:1028:838c:563a:fd25:87b6:5a54:811]:8333 # AS5610
+[2620:a6:2000:1:1:0:d:3015]:8333 # AS27566
+[2620:a6:2000:1:2:0:3:266c]:8333 # AS27566
+[2620:a6:2000:1:2:0:9:930b]:8333 # AS27566
+[2620:a6:2000:1:2:0:b:3011]:8333 # AS27566
+[2800:150:11d:2426:62b:b164:704a:6962]:8333 # AS22047
+[2800:300:8251:b50::d]:8333 # AS27651
+[2800:300:8251:b50:e92:64f5:22af:c31e]:8333 # AS27651
+[2800:40:15:6ad:48e8:2200:a882:e08e]:8333 # AS16814
+[2803:5180:4100:4000::2]:8333 # AS52468
+[2803:9800:9447:84bb:cab8:d2f5:388c:9a57]:8333 # AS19037
+[2804:14d:7e33:83b0:6e41:1ccc:cf20:aff9]:8333 # AS4230
+[2804:431:e038:cd01:aaa1:59ff:fe0d:44b8]:8333 # AS27699
+[2804:d57:450d:f00:a422:9828:b00e:91e9]:8333 # AS8167
+[2806:2f0:5020:d287:4dcd:6204:909b:4125]:8333 # AS17072
[2a00:1298:8001::6542]:8333 # AS5578
-[2a00:1398:4:2a03:215:5dff:fed6:1033]:8333 # AS34878
+[2a00:12e0:101:99:20c:29ff:fe29:d03f]:8333 # AS6798
+[2a00:1398:4:2a03:3eec:efff:fe05:d93e]:8333 # AS34878
[2a00:1398:4:2a03::bc03]:8333 # AS34878
[2a00:1768:2001:27::ef6a]:8333 # AS43350
[2a00:1f40:5001:108:5d17:7703:b0f5:4133]:8333 # AS42864
[2a00:23c5:fe80:7301:d6ae:52ff:fed5:56a5]:8333 # AS2856
-[2a00:6020:13dc:bc00:5559:258:27d:b52b]:8333 # AS60294
-[2a00:6020:4503:3700:20c:29ff:fe61:4a4c]:8333 # AS60294
-[2a00:6020:b434:eb00:dea6:32ff:fe0d:a5c0]:8333 # AS60294
+[2a00:23c6:5c8a:5c00:c05a:4dff:fe65:9d69]:8333 # AS2856
+[2a00:6020:4503:3700:5054:ff:fe90:640e]:8333 # AS60294
[2a00:6020:b489:2000:5054:ff:fefc:5ed8]:8333 # AS60294
-[2a00:7c80:0:10c::2]:8333 # AS49981
-[2a00:7c80:0:25::e37a]:8333 # AS49981
[2a00:8a60:e012:a00::21]:8333 # AS680
-[2a00:bbe0:cc:0:5a11:22ff:feb4:8f5c]:8333 # AS47605
-[2a00:bbe0:cc:0:62a4:4cff:fe23:7510]:8333 # AS47605
-[2a00:ca8:a15:9a5b:8b42:a886:7d48:7a21]:8333 # AS30764
-[2a00:ca8:a1f:f9b7:cb55:5766:524b:acaa]:8333 # AS30764
-[2a00:d4e0:ff:fc02:5e55:4a7c:b83b:e5a1]:8333 # AS15600
+[2a00:bbe0:0:221f::246]:8333 # AS47605
[2a00:d520:9:9300:420b:544e:8019:6d3a]:8333 # AS15600
-[2a00:d880:5:c2::d329]:8333 # AS198203
-[2a00:ee2:1200:1900:8d3:d2ff:feb1:bc58]:8333 # AS5603
-[2a01:4f8:173:230a::2]:8333 # AS24940
+[2a00:fd40:c:c::c]:8333 # AS3269
+[2a01:4f8:171:1f16::2]:8333 # AS24940
[2a01:4f8:200:7222::2]:8333 # AS24940
-[2a01:4f8:202:3e6::2]:8333 # AS24940
-[2a01:4f8:221:44d7::2]:8333 # AS24940
-[2a01:4f8:231:915::2]:8333 # AS24940
-[2a01:4f8:261:2bcd::2]:8333 # AS24940
-[2a01:4f8:261:3cae::2]:8333 # AS24940
+[2a01:4f8:202:4205::2]:8333 # AS24940
+[2a01:4f8:242:2016::2]:8333 # AS24940
[2a01:4f8:261:420c::2]:8333 # AS24940
+[2a01:4f8:272:4cd9::2]:8333 # AS24940
+[2a01:4f9:1a:a966::2]:8333 # AS24940
+[2a01:4f9:1a:af0d::2]:8333 # AS24940
[2a01:4f9:2b:29a::2]:8333 # AS24940
-[2a01:4f9:3a:2dd2::2]:8333 # AS24940
+[2a01:4f9:5a:44a5::2]:8333 # AS24940
[2a01:7a7:2:2804:ae1f:6bff:fe9d:6c94]:8333 # AS20773
-[2a01:7c8:aac2:180:5054:ff:fe56:8d10]:8333 # AS20857
-[2a01:7c8:aac9:c9:5054:ff:fedf:ff95]:8333 # AS20857
-[2a01:7e01::f03c:93ff:fe49:2f5b]:8333 # AS63949
[2a01:8740:1:753::e5cb]:8333 # AS57344
+[2a01:8740:1:ff2e::9428]:8333 # AS57344
[2a01:8740:1:ffc5::8c6a]:8333 # AS57344
-[2a01:cb00:b63:c000:227:eff:fe28:c565]:8333 # AS3215
-[2a01:cb19:688:e900:aa60:b6ff:fe29:bbae]:8333 # AS3215
-[2a01:e0a:163:c0b0:9da5:1690:a12b:bede]:8333 # AS12322
-[2a01:e0a:282:67b0:b4f4:aaff:fe7c:44a6]:8333 # AS12322
+[2a01:cb00:790:f500:110b:b446:2260:7d2c]:8333 # AS3215
+[2a01:cb10:336:cb00:61ac:d15d:4ac0:2cbd]:8333 # AS3215
+[2a01:cb10:336:cb00:d237:45ff:fec5:2cd0]:8333 # AS3215
+[2a01:cb15:804c:8000:21e:6ff:fe51:2c32]:8333 # AS3215
+[2a01:e0a:185:55f0:a0ba:9eaf:9853:92b7]:8333 # AS12322
[2a01:e0a:301:7010:b87d:e14b:cea9:b998]:8333 # AS12322
-[2a01:e0a:320:39a0:325a:3aff:fe02:3180]:8333 # AS12322
-[2a01:e0a:351:9fb0:6bf2:95d6:b7bd:b846]:8333 # AS12322
-[2a01:e0a:5fa:a0a0:ca1f:66ff:fece:b8a2]:8333 # AS12322
-[2a01:e0a:83d:dd30:3676:5d8e:8a6f:115a]:8333 # AS12322
-[2a01:e0a:9e9:c240:7b44:f32a:6ec0:a8af]:8333 # AS12322
+[2a01:e0a:3b3:1420:7ca0:3a9a:5cc3:b644]:8333 # AS12322
+[2a01:e0a:5:9390:bf35:4d41:8a2a:570]:8333 # AS12322
+[2a01:e0a:9e9:c240:8e3a:af64:4f0:8f79]:8333 # AS12322
+[2a01:e0a:b0f:37e0:a13f:e65:ac42:8e36]:8333 # AS12322
[2a01:e0a:b5:7f50:c257:a55b:4846:97e1]:8333 # AS12322
-[2a01:e11:100c:70:cbc8:9e31:4b77:1626]:8333 # AS12322
-[2a02:1210:2cdf:4600:2bc:e03e:43e8:4718]:8333 # AS3303
+[2a01:e0a:bf6:8d70:20c:29ff:fe30:4fd2]:8333 # AS12322
+[2a01:e11:100c:70:39f3:e3c9:832f:37a]:8333 # AS12322
+[2a01:e34:ec1d:7100:8aae:ddff:fe02:4159]:8333 # AS12322
+[2a02:1210:7c92:5100:211:32ff:feae:152d]:8333 # AS3303
[2a02:1210:86bf:f100:a9ac:d041:1f8e:6925]:8333 # AS3303
-[2a02:1210:94c3:3400:d8c3:743c:90f6:a48a]:8333 # AS3303
-[2a02:168:2000:96::12]:8333 # AS13030
-[2a02:168:420b:a::20]:8333 # AS13030
-[2a02:168:676e:0:e65f:1ff:fe09:3591]:8333 # AS13030
-[2a02:1748:f39f:5872:216:3eff:fe21:266]:8333 # AS51184
-[2a02:180:1:1::517:10b6]:8333 # AS35366
-[2a02:2780:9000:70::7]:8333 # AS35434
-[2a02:2780:9000:70::f]:8333 # AS35434
-[2a02:2780::e01a]:8333 # AS35434
-[2a02:2f05:6008:ce00::1]:8333 # AS48571
+[2a02:22a0:bbb3:dc10:50e1:57ff:fe70:9492]:8333 # AS1136
+[2a02:247a:215:3e00:1::1]:8333 # AS8560
+[2a02:2c60:f103:7c0:1a31:bfff:fecc:5d91]:8333 # AS9063
+[2a02:3102:4d5c:f000:dea6:32ff:febb:b9cb]:8333 # AS6805
+[2a02:3102:bc00:10e9:ca5:9dff:fea9:1cbb]:8333 # AS6805
[2a02:390:9000:0:aaa1:59ff:fe43:b57b]:8333 # AS12496
-[2a02:578:85ce:1600:1e1b:dff:fee3:774b]:8333 # AS9031
[2a02:768:f92b:db46:5e46:772b:71d:29b7]:8333 # AS44489
-[2a02:7a01::91:228:45:130]:8333 # AS16019
-[2a02:7b40:50d0:e386::1]:8333 # AS62282
-[2a02:7b40:50d1:e35b::1]:8333 # AS62282
-[2a02:7b40:5928:89::1]:8333 # AS62282
-[2a02:7b40:b945:344d::1]:8333 # AS62282
-[2a02:7b40:d418:6d9a::1]:8333 # AS62282
-[2a02:8070:b84:6ae0:f9c6:fbb9:1c41:81aa]:8333 # AS51185
-[2a02:8070:f186:38e0::d5a6]:8333 # AS51185
-[2a02:8084:103:6810:1e69:7aff:fea2:1acc]:8333 # AS6830
-[2a02:8308:8081:f300:3b8:7ec0:2837:1b57]:8333 # AS16019
+[2a02:8070:f181:f600:bcb:2d1:d790:78ff]:8333 # AS51185
+[2a02:8071:6380:c500:7285:c2ff:feb5:a39c]:8333 # AS3209
+[2a02:8084:2021:73f3::66e6]:8333 # AS6830
+[2a02:8308:8188:5100:6d8b:4531:4331:eee2]:8333 # AS16019
[2a02:8388:e302:7980:6f85:a0b3:4b4d:8b0f]:8333 # AS8412
[2a02:8388:e5c3:4a80:201:2eff:fe82:b3cc]:8333 # AS8412
-[2a02:842a:1df:8a01:1e1b:dff:fe0b:236d]:8333 # AS15557
-[2a02:a210:28be:5f80::111]:8333 # AS6830
-[2a02:a44b:5cf9:1:b62e:99ff:fe49:d492]:8333 # AS1136
-[2a02:a44d:14d6:1:2c0:8ff:fe8f:b3b2]:8333 # AS1136
+[2a02:a31a:e03d:9400:3f18:2729:c86:d754]:8333 # AS6830
[2a02:a45a:94cd:f00d::1]:8333 # AS1136
-[2a02:a45f:3b9d:31::199]:8333 # AS1136
-[2a02:a464:3d6b::1:2]:8333 # AS1136
-[2a02:a46c:7f8e:1:35bf:3aeb:137c:1d35]:8333 # AS1136
-[2a02:a46d:36f:1:20d:b9ff:fe4e:6398]:8333 # AS1136
-[2a02:c205:2021:4216::1]:8333 # AS51167
-[2a02:c206:2044:9826::1]:8333 # AS51167
-[2a02:c206:2075:3351::1]:8333 # AS51167
-[2a02:c207:0:3829::1]:8333 # AS51167
-[2a02:c207:2014:4199::1]:8333 # AS51167
-[2a02:c207:2014:8757::1]:8333 # AS51167
-[2a02:c207:2026:6682::1]:8333 # AS51167
+[2a02:a465:80f4:1:f369:4ef5:aa12:7566]:8333 # AS1136
+[2a02:ab88:20b:ce00:223:24ff:fe56:6202]:8333 # AS21334
+[2a02:c206:2016:2394::1]:8333 # AS51167
+[2a02:c206:2162:5603::1]:8333 # AS51167
+[2a02:c206:2162:5605::1]:8333 # AS51167
+[2a02:c206:2162:5606::1]:8333 # AS51167
+[2a02:c206:2162:5856::1]:8333 # AS51167
+[2a02:c206:2162:7348::1]:8333 # AS51167
+[2a02:c206:2162:7352::1]:8333 # AS51167
+[2a02:c206:2162:8026::1]:8333 # AS51167
[2a02:c207:2034:7358::1]:8333 # AS51167
-[2a02:c207:3002:7468::1]:8333 # AS51167
-[2a02:c207:3008:4592::1]:8333 # AS51167
-[2a02:cb43:4000::178]:8333 # AS33891
-[2a02:e5e:1:10::27]:8333 # AS25057
-[2a02:e98:20:1504::1]:8333 # AS24641
-[2a03:4000:28:68:7411:53ff:fe4c:21d]:8333 # AS47147
-[2a03:4000:65:fdc:3462:66ff:fe05:ec5c]:8333 # AS47147
-[2a03:6000:870:0:46:23:87:218]:8333 # AS51088
-[2a03:94e0:ffff:185:243:218:0:19]:8333 # AS56655
-[2a03:b0c0:1:e0::397:6001]:8333 # AS14061
-[2a03:b0c0:1:e0::794:9001]:8333 # AS14061
-[2a03:b0c0:2:f0::288:c001]:8333 # AS14061
-[2a03:b0c0:2:f0::30c:1]:8333 # AS14061
-[2a03:b0c0:3:d0::e3b:5001]:8333 # AS14061
-[2a03:cfc0:8000:7::5fd6:3557]:8333 # AS201814
-[2a04:2180:dc05:2::3b]:8333 # AS61272
-[2a04:2180:ffff:fffe::d]:8333 # AS61272
-[2a04:52c0:103:c455::1]:8333 # AS60404
-[2a04:bc40:1dc3:8d::2:1001]:8333 # AS35277
-[2a05:3580:dc0b:1600:def4:5a62:de42:324a]:8333 # AS20764
-[2a05:d014:a55:4000:8dde:69f:4ac7:b26]:8333 # AS16509
-[2a05:d016:98f:5201:6be0:a4de:80c7:32d5]:8333 # AS16509
-[2a05:d018:a75:6c03:75b:2c73:8caa:414b]:8333 # AS16509
-[2a05:f480:1800:697:5400:2ff:feb6:c36d]:8333 # AS20473
-[2a06:e040:7603:2918:c6ef:464e:9fe5:73ec]:8333 # AS198507
-[2a07:abc4::89:234:180:194]:8333 # AS62000
-[2a07:d884::127e]:8333 # AS6762
-[2a09:2681:1010:10::5]:8333 # AS61282
-[2a09:2681:102::210]:8333 # AS61282
-[2a0b:f300:2:6::2]:8333 # AS62240
-[2a0d:8340:24::2]:8333 # AS50113
-[2a0e:8f02:21d1:144::101]:8333 # AS20473
-[2a0e:b780::55d1:f05b]:8333 # AS205581
-[2a10:3781:2c19::1]:8333 # AS206238
-[2a10:d200:1:33:a6bf:1ff:fe6a:46a9]:8333 # AS212323
-[2a12:8e40:5668:e40a::1]:8333 # AS34465
-[2a12:8e40:5668:e40b::1]:8333 # AS34465
-[2a12:8e40:5668:e40c::1]:8333 # AS34465
-[2a12:8e40:5668:e40d::1]:8333 # AS34465
-[2a12:8e40:5668:e40e::1]:8333 # AS34465
-[2a12:8e40:5668:e40f::1]:8333 # AS34465
-[2a12:8e40:5668:e410::1]:8333 # AS34465
-[2a12:8e40:5668:e411::1]:8333 # AS34465
-[2a12:8e40:5668:e412::1]:8333 # AS34465
-[2a12:8e40:5668:e417::1]:8333 # AS34465
-[2c0f:f8f0:da51:0:3a45:fc57:5e30:2593]:8333 # AS30844
-
-# manually updated 2023-04 for minimal torv3 bootstrap support
-
-2bqghnldu6mcug4pikzprwhtjjnsyederctvci6klcwzepnjd46ikjyd.onion:8333
-4lr3w2iyyl5u5l6tosizclykf5v3smqroqdn2i4h3kq6pfbbjb2xytad.onion:8333
-5g72ppm3krkorsfopcm2bi7wlv4ohhs4u4mlseymasn7g7zhdcyjpfid.onion:8333
-5sbmcl4m5api5tqafi4gcckrn3y52sz5mskxf3t6iw4bp7erwiptrgqd.onion:8333
-776aegl7tfhg6oiqqy76jnwrwbvcytsx2qegcgh2mjqujll4376ohlid.onion:8333
-77mdte42srl42shdh2mhtjr7nf7dmedqrw6bkcdekhdvmnld6ojyyiad.onion:8333
-azbpsh4arqlm6442wfimy7qr65bmha2zhgjg7wbaji6vvaug53hur2qd.onion:8333
-b64xcbleqmwgq2u46bh4hegnlrzzvxntyzbmucn3zt7cssm7y4ubv3id.onion:8333
-bsqbtcparrfihlwolt4xgjbf4cgqckvrvsfyvy6vhiqrnh4w6ghixoid.onion:8333
-bsqbtctulf2g4jtjsdfgl2ed7qs6zz5wqx27qnyiik7laockryvszqqd.onion:8333
-cwi3ekrwhig47dhhzfenr5hbvckj7fzaojygvazi2lucsenwbzwoyiqd.onion:8333
-devinbtcmwkuitvxl3tfi5of4zau46ymeannkjv6fpnylkgf3q5fa3id.onion:8333
-devinbtctu7uctl7hly2juu3thbgeivfnvw3ckj3phy6nyvpnx66yeyd.onion:8333
-devinbtcyk643iruzfpaxw3on2jket7rbjmwygm42dmdyub3ietrbmid.onion:8333
-dtql5vci4iaml4anmueftqr7bfgzqlauzfy4rc2tfgulldd3ekyijjyd.onion:8333
-emzybtc25oddoa2prol2znpz2axnrg6k77xwgirmhv7igoiucddsxiad.onion:8333
-emzybtc3ewh7zihpkdvuwlgxrhzcxy2p5fvjggp7ngjbxcytxvt4rjid.onion:8333
-emzybtc454ewbviqnmgtgx3rgublsgkk23r4onbhidcv36wremue4kqd.onion:8333
-emzybtc5bnpb2o6gh54oquiox54o4r7yn4a2wiiwzrjonlouaibm2zid.onion:8333
-fpz6r5ppsakkwypjcglz6gcnwt7ytfhxskkfhzu62tnylcknh3eq6pad.onion:8333
-hanvo3hzqbhcqm5vahhi5a3czxxdwc7vt56p5gr7bifcvelaqurv6iid.onion:8333
-hz7oqntvj4adrwtqappcgaxfribg5u4rvfkpwlo3xup5fcuyvylkxlqd.onion:8333
-ityrxhidvjnjnf6imzyuqqnkkwridjnebkbokx25so3suq3fzezmksid.onion:8333
-jto2jfbsxhb6yvhcrrjddrgbakte6tgsy3c3z3prss64gndgvovvosyd.onion:8333
-k7nb3r7hxi5exvr4xmvnilhfw6hei7sw4rwz2t6onh4py6wbora6tuyd.onion:8333
-kpgvmscirrdqpekbqjsvw5teanhatztpp2gl6eee4zkowvwfxwenqaid.onion:8333
-l7kw3vjs4cf5mnuejjgqcxrw6wwsjmabllq3h3amy4f5q33d6cgo2kyd.onion:8333
-m7cbpjolo662uel7rpaid46as2otcj44vvwg3gccodnvaeuwbm3anbyd.onion:8333
-mowb2qwpjgs2a6q3yj3xa7nxklfssul4w7ynonyycw3uyopfu3x6ujad.onion:8333
-mwmfluek4au6mxxpw6fy7sjhkm65bdfc7izc7lpz3trewfdghyrzsbid.onion:8333
-rfqmn3qe36uaptkxhdvi74p4hyrzhir6vhmzb2hqryxodig4gue2zbyd.onion:8333
-rsgwtnousfc7zyg4qsm3gvczjx7cihh2njyjbjl3qvcj3xg7wmvhddqd.onion:8333
-s2d52bbttuwcl3pdrwzhxpmhtxn3jg23havjqg5eygwhtiw6lgyelpqd.onion:8333
-upvthy74hgvgbqi6w3zd2mlchoi5tvvw7b5hpmmhcddd5fnnwrixneid.onion:8333
-who3qs4eqlqzoxhqqgan4mg54ua5uz3mk4lj33ag53ei4orvnznrjbad.onion:8333
-wizbit5555bsslwv4ctronnsgk5vh2w2pdx7v7eyuivlyuoteejk7lid.onion:8333
-yrmedr35tt4wqfnwgilltxh5bnukeukxjpgg3jzmmsyld5lgsn5amvyd.onion:8333
-
-# manually updated 2023-04 for minimal i2p bootstrap support
-255fhcp6ajvftnyo7bwz3an3t4a4brhopm3bamyh2iu5r3gnr2rq.b32.i2p:0
-27yrtht5b5bzom2w5ajb27najuqvuydtzb7bavlak25wkufec5mq.b32.i2p:0
-3gocb7wc4zvbmmebktet7gujccuux4ifk3kqilnxnj5wpdpqx2hq.b32.i2p:0
-4fcc23wt3hyjk3csfzcdyjz5pcwg5dzhdqgma6bch2qyiakcbboa.b32.i2p:0
-4osyqeknhx5qf3a73jeimexwclmt42cju6xdp7icja4ixxguu2hq.b32.i2p:0
-4umsi4nlmgyp4rckosg4vegd2ysljvid47zu7pqsollkaszcbpqq.b32.i2p:0
-6j2ezegd3e2e2x3o3pox335f5vxfthrrigkdrbgfbdjchm5h4awa.b32.i2p:0
-6n36ljyr55szci5ygidmxqer64qr24f4qmnymnbvgehz7qinxnla.b32.i2p:0
-72yjs6mvlby3ky6mgpvvlemmwq5pfcznrzd34jkhclgrishqdxva.b32.i2p:0
-a5qsnv3maw77mlmmzlcglu6twje6ttctd3fhpbfwcbpmewx6fczq.b32.i2p:0
-aovep2pco7v2k4rheofrgytbgk23eg22dczpsjqgqtxcqqvmxk6a.b32.i2p:0
-bitcoi656nll5hu6u7ddzrmzysdtwtnzcnrjd4rfdqbeey7dmn5a.b32.i2p:0
-brifkruhlkgrj65hffybrjrjqcgdgqs2r7siizb5b2232nruik3a.b32.i2p:0
-c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p:0
-day3hgxyrtwjslt54sikevbhxxs4qzo7d6vi72ipmscqtq3qmijq.b32.i2p:0
-du5kydummi23bjfp6bd7owsvrijgt7zhvxmz5h5f5spcioeoetwq.b32.i2p:0
-e55k6wu46rzp4pg5pk5npgbr3zz45bc3ihtzu2xcye5vwnzdy7pq.b32.i2p:0
-eciohu5nq7vsvwjjc52epskuk75d24iccgzmhbzrwonw6lx4gdva.b32.i2p:0
-ejlnngarmhqvune74ko7kk55xtgbz5i5ncs4vmnvjpy3l7y63xaa.b32.i2p:0
-fhzlp3xroabohnmjonu5iqazwhlbbwh5cpujvw2azcu3srqdceja.b32.i2p:0
-fx6np3oheacr3t7gluftrqo2qxldbbatgw4hepp7ulb4j5ry57ca.b32.i2p:0
-gehtac45oaghz54ypyopim64mql7oad2bqclla74l6tfeolzmodq.b32.i2p:0
-hhfi4yqkg2twqiwezrfksftjjofbyx3ojkmlnfmcwntgnrjjhkya.b32.i2p:0
-jz3s4eurm5vzjresf4mwo7oni4bk36daolwxh4iqtewakylgkxmq.b32.i2p:0
+[2a02:c207:3006:3185::1]:8333 # AS51167
+[2a03:cfc0:8000:2a::9532:6507]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:6510]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:6511]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:6516]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:651d]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:6520]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:6522]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:6523]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:659a]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:659d]:8333 # AS201814
+[2a03:ec0:0:928::701:701]:8333 # AS199669
+[2a04:ee41:86:50b6:fa75:a4ff:fe3c:243f]:8333 # AS15796
+[2a05:d012:42a:5703:4dc5:8116:787c:e016]:8333 # AS16509
+[2a05:d014:a55:4001:f6ab:dd5e:4039:b46c]:8333 # AS16509
+[2a05:d018:a75:6c00:c05b:4d0a:3658:1030]:8333 # AS16509
+[2a07:9a07:3::2:1]:8333 # AS202605
+[2a07:d884::130e]:8333 # AS6762
+[2a0a:ef40:e44:9b01:2746:ca1e:6788:351c]:8333 # AS1273
+[2a0b:f4c0:c1:920e:b25a:daff:fe87:77b4]:8333 # AS205100
+[2a10:c941:100:24::2:1001]:8333 # AS141011
+[2a12:8e40:5668:f001::1]:8333 # AS34465
+[2a12:a302:1:a180::b5ca]:8333 # AS23959
+[2c0f:f4a8:b:b108:807d:b2d6:9146:38be]:8333 # AS37254
+[2c0f:f4a8:b:b108:c458:5c61:dcca:cb10]:8333 # AS37254
+iy7go4454pb4p2zmnkwrgsi6v6oqv53zxnmalz6rnfjemxftapfa.b32.i2p:0
+j225nrmndwviihpe7ib6mm5h723cg62wrb7vnwofopv472ue3zwa.b32.i2p:0
+j2m526lqsujvt6b6xl4ipzbjkvkuecrye3vkggwo6jadvzqu7f7q.b32.i2p:0
+j2pyenyhoppsjexenznxvgqrcs4buv4nssctowgpg6czdoo3nyiq.b32.i2p:0
+j3usxovx7ukl645u77jud2mpmrk7ryh5yaxno6rceu77hqlxkuta.b32.i2p:0
+j42dsnjlg4vv33tshgs5jyham6plf3suj2sn2k6ew4tmcz3fpaqq.b32.i2p:0
+j4tjrfxnwcmbhkixmqlnotginhfxgfdvjahr6yn7j7rkbdqngh4a.b32.i2p:0
+jb3iui7grnljdjmsz7qbustrl5vn3ip3upnkzbaegaiklric7cha.b32.i2p:0
+jbmqtghha7hscwbwpi7ps2dnghq2bvxjnfeb5glngnvgjmeackaq.b32.i2p:0
+jd43pc2l73ek6hk2tp6hiyada7ed7vshqo2fvxbga2daylcghfyq.b32.i2p:0
+jd63whebd5yuls7r34mi3lnnuuhqxxr4lns672tzliru4vk7hwrq.b32.i2p:0
+je6ju6ihybxm5wkw5daeqjet74lscvi4ls5wn5wf7kiaczfggafq.b32.i2p:0
+jeidstlwdlt63lju7cnj2mh4fofysjnc2wcvilphynprd7jw64ma.b32.i2p:0
+jeox5nruuoopedsfpuoi6kwewmhbbsnhf7kib2q6oafvchxvmnnq.b32.i2p:0
+jex3ykw2nmw7owhgbtio5flv7us624bxwp46nr7rhmteujrmtvvq.b32.i2p:0
+jfdh65i4nhpg4obnoe4aqi3vzvbi6fyzjj2ee7s3qm2gbcnllkvq.b32.i2p:0
+jh2qxkjqngj2m5tn2ecaidfqac4awgnmkgsajntoqs5qqyjtp5yq.b32.i2p:0
+jh7ev4a5zfzmeyekinhtbqfi6c7xhvc4msdpyi67j3sxl6r44ukq.b32.i2p:0
+jibaw7ynbnxueqsy7k7jyvoj6ldzbuckppfx5wozt7mftihy5vcq.b32.i2p:0
+jicc5kwy4tv4j2nn6gfbis7e6dxy2kdvet3zpxdbyp74h5gpnxuq.b32.i2p:0
+jimdydczt6e2lceezopnl4fgz7q2jeqqhlqaxrgen33ouxk57xiq.b32.i2p:0
+jjangl6h4py2pd2gwamhqlsymyuocmpioneinzf5bb5qvvdjzzqa.b32.i2p:0
+jk56z3febpco6rbkpzzv3jszf4px5uztmoxzkpss7mxnzqlpsdla.b32.i2p:0
+jkfuajo4ayvo2rbv5qdj443q6adqmnormbhsf2f7rlp5t24xomda.b32.i2p:0
+jkvey2vfdto2ucudi4jlgsbpmlls3uwmlkjonfhk5yminkwzwi2q.b32.i2p:0
+jl4vr5kac7njyltivn7ut5afyq5ipzc5woxl4523emodxixci3zq.b32.i2p:0
+jmebfluhrl6ad5pt4ipevf3g3a4trcu7axalpubpkir6zlwovm5q.b32.i2p:0
+jndr5i4qhxs6aa2bqvufrgttq6enavyghi54dqfuku2qnstdqa5a.b32.i2p:0
+jopiw2tup5h5xh2hwef4oflgskawbpfmswub2iosmqocejijd4fa.b32.i2p:0
+jrert3o2rhbkpquybwg7tq4bdvlxeh6lnlcr5ddexkuguvi2l2pq.b32.i2p:0
+jrobuecgmuuqmpdsbxwbqeldt2735cgcemngoasnbbkdz2ufdlmq.b32.i2p:0
+jrvg22xvbmjyrkqg7mr622zhnda3ijtua65cqngwrven7sf5zd7q.b32.i2p:0
+jsg4dsxvgjcqz3c2qgtwi4ip3l4n4hlxodbvgukwaipycwo26zua.b32.i2p:0
+jt35uwbl5wx7ponyxomksrjjs7zy5yymvtud3nmogt7ci7xxlm2q.b32.i2p:0
+jvaoh33cpczp626ldwr4azh4hb5cjmxlbz3dq3cxisdlzn7z25eq.b32.i2p:0
+jvlj7qyxcmolf76wneyvmdxrpiezsxkiimapwxbdbiw2phvlyjba.b32.i2p:0
+jwqlvqmfvodnrslde2idqt25qxiyvgqdlr2q4uod5s6lkmlempya.b32.i2p:0
+jxjc7oe24vxdepkfvl365qfwrxcad2f3j43fnfuchtvqqkqd2rzq.b32.i2p:0
+k4mch53m72zv7jdda3poa2zn7bi3jacqwfb45peealxbhysdozcq.b32.i2p:0
+k4pjt6m25dcxno3udek6rasooz5ztqnywa3f2owpvcjzvisg7nga.b32.i2p:0
+k5ars7hsrfubadroe5h7oypjnqwi6v2vxxy6rmns7zubf66aivbq.b32.i2p:0
+k6eeshsk4vf34b5gfnraz4p5qb6scv4kw6eiltebel5exw6keppq.b32.i2p:0
+k6gt64xby5igmln5hfcuzspt2tndimzrdvj65yo76h22g5yhlvja.b32.i2p:0
+k7kcnrqe3ybqu2w3fali7zext6na7o5o65rx6f5oqza2lonsry6a.b32.i2p:0
+kbawcieyelwwitrjow537zpmdkncwiq42rhjgayw5o7u562mk23a.b32.i2p:0
+kcqkothplemakipfpeajxmu4xsszpaxpprgtuv5tgfdaqejg2sqq.b32.i2p:0
+kdrcbr6wg2bj6oipsbeqy6bp3v7dqpth6cheviysmvo4bdta7fda.b32.i2p:0
+kehosmgk76fxnjywqjj6nqs4ohg4hsutljdzjo4sswhxlj5l5tca.b32.i2p:0
+khxruoaom7juockko2tbxqo3bnrjmoqjhdoady3yyr4qacz4somq.b32.i2p:0
+kjaa3zlp4sipfxikketgvlx4oxq5ok57ifxenbiewmsrew6lcw7q.b32.i2p:0
+kjvrzgckasb57yqhluvjblx2ngxstumfg6uufz5mc7zyetkjlr7a.b32.i2p:0
+kkihsh2faw2gxil6it4glol4u37ccruuzsusyikquzmkffj3wn6q.b32.i2p:0
+km3b5j6cqrcqewdpuveibptw5gguwktwan36jlow4xykpg2dgr6a.b32.i2p:0
+kppcor54kkge6cgq47nzevlfrhbxingcjfmk2emkrdaejpixkqdq.b32.i2p:0
+kskidltmbigp2etp4pdl67ke2qzjjw66wqairzr4wn2apq4o7bka.b32.i2p:0
+ksxxinje357zctkobwnxsy44ddivq7yp2n3n5gopk4okir2vghaa.b32.i2p:0
+ktua3j43ijxhhhfeljsp32kdiuic5nlnfnkx3ealy7ojva4vwkoq.b32.i2p:0
+kuzu73gzvlnog4cdtdk7edbusxr4pigknvwg2bjo6l46ugsgmrtq.b32.i2p:0
+kw3v6gq5semgt4gg6itum3qtaylanyof7wn6bnbngdeby4xixuoa.b32.i2p:0
+l364nudwoj63fe5nsjmniiun63e3ycdqrjyknbfixxtre5spx7ga.b32.i2p:0
+l3ach5wbdx3n5nq53sv6tagijrbse3nwa2gkqz5oj7aifyaizpcq.b32.i2p:0
+l5fita4r7niir3hxmu7mzcwrigxinkrn4oqeembdkgao7k2yztha.b32.i2p:0
+l5obkk7zzop3nztnt6ijugz4okqsyhhb5o6gkbqottgqzzzcgvla.b32.i2p:0
+lai3534z6zs2tukzixdagrciezum2bkyuask2srxjrn67yu4c57a.b32.i2p:0
+lbif3mgg2b2ir5dkz7u6iatdrui2h2a64vlmffcfgqnpjuvwzaxa.b32.i2p:0
+leu37bptuuu5377mi7cb5t2vsu4hesblyxl5zptnnk4vodhovwea.b32.i2p:0
+lfuvzzzceuik5u5pnd2i67amegel5ua2rrnncxkyyc7bhteq73aa.b32.i2p:0
+lgpojpoix7zd6dhpo5hdrnwm4ueyjvi7tbot4qsqybk3upuocnpa.b32.i2p:0
+lh7qjombcmiekvv6niz5eflr55cnd3oxx7nuus6vmehqfodr67za.b32.i2p:0
+lhupu3owhuc7qwvyfazgkbcmr7sjp5qqxps732vy52v67fsn5guq.b32.i2p:0
+li4vuovafxjrf54kvfg3mjrg2mebs6edpl5yrr2dohddvgmxjyvq.b32.i2p:0
liu75cvktv4icbctg72w7nxbk4eibt7wamizfdii4omz7gcke5vq.b32.i2p:0
+lmlf3yjyg4djrb7wtzmrb4fbkorqba7k4lvk7ax4omay4mbytupa.b32.i2p:0
+lpal67whroip3c2yj4fxbayj46d3tr5osyqog6el5n6ctktdnakq.b32.i2p:0
+lpektonr2uyiohuzi35shtj3oaa77rklmqsivuydxkcxkea2dwuq.b32.i2p:0
+lpffyejskwwap2go7ommmryex2autlkmcnnpk2tm6aitxcalwrha.b32.i2p:0
+lpqkgbek3ci3w4qobpeqepjor3bukz555rzlmghck4o7wwb7ajza.b32.i2p:0
+lprgmkc45te7skx7rffpz72ca5c3zdg3tabiksdboao5w4wceu5a.b32.i2p:0
+lqn32kgic4cincyqlybpwbywcrowcxmscfcm4mqt4fgp24qs3y3q.b32.i2p:0
lrah7acdsgopybg43shadwwiv6igezaw64i6jb5muqdg7dmhj3la.b32.i2p:0
+ls52j74gwtsrqhlgqcai2cjl2rcivfib7jzovc4454h6tq3i6k7q.b32.i2p:0
+ls5otp5mybmxqsaeaid7wlori2ukieehr644adjfwdxux7jxlvga.b32.i2p:0
+lttdnbluvybzbjq52t5vbdkk3pvzc6zyi2oji7yjdpcgtgz732bq.b32.i2p:0
+lunkwblewltvq4spt7j5u2nfpqyndvgepl7edkiru322mmtpy2lq.b32.i2p:0
+lvdbqavgdom5h5denwkmdwslfzxckf6eddwflelbog7tgo2m7usa.b32.i2p:0
+lwjrapkfexjyjqf2rrdr4ghhxmlr3jdygsonetgtheglvmru5x6q.b32.i2p:0
+lyg26sjkcx5ied5a4a7jdxmfeplfcnux3fux5rsxzkm5mgbbsllq.b32.i2p:0
+lyqmygrc6gujxa4xlnwqku3vtfkbrszdiirsagn6xd2yw4kvodrq.b32.i2p:0
lzuu6mjtu7vd55d2biphicihufipoa7vyym6xfnkmmlra3tiziia.b32.i2p:0
+m2k7ajij2wvgfpsbg32zuorbsjt72iye3ozz6dbyxtj57fx7xsqq.b32.i2p:0
+m3hlmj2gz2co5gu4ss3wj4b7ebeg2xbkrr65ogxvhn76uxna5qma.b32.i2p:0
+m4o2kndr75clxemwbq5m6vnok7eiqshf42wjjvag7dtwxtafxhra.b32.i2p:0
m6bpynxkv2ktwxkg6p2gyudjfhdupb6kuzabeqdnckkdkf4kxjla.b32.i2p:0
-m6v454xd6p3bt5swujgmveklsp7lzbkqlqqfc2p36cjlwv5dbucq.b32.i2p:0
-mlgeizrroynuhpxbzeosajt5u4ddcvynxfmcbm6kwjpaufilxigq.b32.i2p:0
+me6x2p4m6jw3cxi2xl4a37u4orzmv3xdopr5t2vgwjmauiuqrmzq.b32.i2p:0
+mf6tmlegp7uga66cdael5376uaz4qd3wacuh44yvepa3kbu4fk3a.b32.i2p:0
+mhgxec57s6h7eixgemsghlcuhmgh7m7p7phqd5kzmm4wovrp2pqq.b32.i2p:0
+mjpulaafdyuanouslfpjcsvumi4edtckfu3ffn3ipabkxj4sn35q.b32.i2p:0
+mlakhs4ixcqwvk4vo4ce3loa54wmdlfingk73jookrkbra6ppq4q.b32.i2p:0
+mnkqn3r4jmg6vrmlprabenndyft2z2jw6g4nsnolt434coiklmyq.b32.i2p:0
+mnrbc3qi4zuk2tzghmy55kplawncih6jkmt75qczfu27enu3gcea.b32.i2p:0
+mnrrefebq3yxr2avprp3ay7w42sx27ijv6stjljzpwohnfnkg26a.b32.i2p:0
+mo27t6wym666b3wfauhndqocbetdsssxksep6x4dcpuh5dxe76oa.b32.i2p:0
+mo6mp2tymma5l2swob6kqzzb25ccmgccfj5pic6omjkktv4wve2q.b32.i2p:0
+mpi7bivbr2pywsgasslw5we766m757os2667h3hqnhcftaszdv3a.b32.i2p:0
+mpqb3jdmdibarrflyiik5wj3ekitxpe2oqieztlax3uomxspgsvq.b32.i2p:0
+mqocuhx3qwcwfuuin42yuhtqgm76drlmfvzikf7urot75qw3ykpa.b32.i2p:0
+mrbhw6ow77bjqmb67rurbkcl4xs2ocj4pti6hnz4wcsg6bduwtya.b32.i2p:0
+mrypjr2fagjhg6z4ixr73f5npkeyoxsjamcdv5uc6oj5oi2ylsvq.b32.i2p:0
+msjl4a7mdp7x2bcllmbxurhfmtxvolykonz45psmh7j6pptfyy5a.b32.i2p:0
+mtlznxqya5nbuyorybzul4cpdlrnvlrhalx2eogwjce5j32js5wa.b32.i2p:0
+mv7b44duaxqpzbdztnrdvnj6ypsp7yhs4z3dc2q64jov6pritmja.b32.i2p:0
+mvs5a3s6rgfbvvgq44wzyd57vf5pr3jcthc5qdo75xgj4slsm7tq.b32.i2p:0
+mwcqoe2lu7u6ogwo77kr5sr4wx6pxnotkdeck3yyjfh4uklytj2a.b32.i2p:0
+mwevh5r5dkzddlo2ol6bojpdds3kno4xqoy6p6ulid3paamgrtla.b32.i2p:0
+mwyjzdrgtypbwjyulw4ifetejz6xusqstvzylztsphpg2r2zf7ua.b32.i2p:0
+my66tuvzfyy6kkbdeqvgfpk3xuoxerucxt73tw6wxv3ian2p2snq.b32.i2p:0
+n3f4ngbs2igvp3j27vsi7thguqxoyvbfenaqhgypuqdz5iovek2a.b32.i2p:0
+n3fa2yuf3i3opdktiwyxzhbpudcut73valxdrlre2xs2ooepddaa.b32.i2p:0
+n47e4gkf5xujcamnsarfuy7435hfsgs4zhndcxaw2evafn6r2rma.b32.i2p:0
+n4n7bivjb2mffgll2ulpwyb4m2oomv5roxtdj6bmlb4cgpf3wdja.b32.i2p:0
+n4zwusew5coibur4p2g436ktc3cyogz3sklztu6ruulag3je6ita.b32.i2p:0
+n7ykk3cxcqzcoeipo7ghzb62ko4d6bxzfgenzxistvg6fuclebva.b32.i2p:0
+nazasriqoa6qoxdlgzjwsggubxl6i4nge5q7om7nijaqi24ulgua.b32.i2p:0
+ncdjjthck6v6phz4laddyc7a7czoujys55melfcoptvl2h4izqlq.b32.i2p:0
+ndtoi53fz7e6ml6v6jn33675nwciw7mu5msn7afzbhebprusqg7a.b32.i2p:0
+ndunnsjyp6l4w3jebow4zgsfrdsy2lrapjgslb3tv7dg6oypfbwq.b32.i2p:0
+ndx23xqvt4qezezih4wlj7mqtwc4nzbvmgseq6fc6e2ddywrmkwq.b32.i2p:0
+nejmippeopyo75wd3gjrhca3fr5mo2g37owzwdezxmg7uhx6ygxa.b32.i2p:0
+nfsi3fenzrzoccj7bpzuvjbxnij7dmzuprg7ia4geuortoquja7q.b32.i2p:0
+ngn5elnvbm234yyun5kbjyr76oy5nhrvyckn33cqcbx25hw4lfoq.b32.i2p:0
+nhpbv2ravt6t5fhxyvuhrxyma37wph6dzuzpddlw3uoivzl6tx4a.b32.i2p:0
+ni4ns3ou7v6zh5qrawvkwnmshnrzcyc5zojkw647rrniplmurrba.b32.i2p:0
+nigrfbou3zt6wxegn5im4cyminjcjmbsqror7ntcr5i7yv6chwvq.b32.i2p:0
+nij7pzb6mhrra5glb3dyghjt55sngwrikzdlagmpsf7jn2onvoaa.b32.i2p:0
+nisd4was4gm3pkvuwjh3sbaoo35jtxop6y2d7ug4iol4cffkrk5q.b32.i2p:0
+niyz7v5fdhqqtlr4y3tcgdoeu3myntub4trzvgixlgjbmowccgja.b32.i2p:0
+nloq52novup3cawccvaakmbudooatwkw7dqltnr6q3j4qy7r6oia.b32.i2p:0
+nn7p4y7pun3m3txaqbkeptkxykzwrf75ru2zimadnewj7g3r4una.b32.i2p:0
+noj7le7kkj54umo6mdftagvvk327cuir7q75bnvuphrxa7kjujna.b32.i2p:0
+npcmehkhh4z2wtk3f5426izrytvqvyf6aa7hyx6hf6jdbxveqima.b32.i2p:0
+nrrg4p7tztllzthlkqzomqi3dejfcak7t63n7zzuomt5atzz5m4a.b32.i2p:0
+nt3ysas4wpjgkft5pohrfstm2vgj7t2vx34u32voy7rqon7dlbga.b32.i2p:0
+nu2ao72zway2ponkhrf322wyfrrn4mdmyp7n5q5xzmjhcge5odma.b32.i2p:0
+nufliiw3uav3tzdalit224yhbfpcjtgfrm5ic7ob6l3mmsay6cpa.b32.i2p:0
+numilh7hhhf6inzkzway3hzif4kiroqstxqbz7hzvoy2ctgpaqda.b32.i2p:0
+nuwphtuudfrswids22qjq63zgxh5wu7erafl36jyniuxhz75ikyq.b32.i2p:0
+nvmuuajhaw74g565l3a7dpezs4rkzm22ub5jhh6mdvzu43j4a6dq.b32.i2p:0
+nz4lq7pmswngaevv2uqyainqzutfxlkavxgde2w2slo2p6e2kcfq.b32.i2p:0
+o5ijpzor3en5xnndm3ntti7o4fxvv24t3veh4g7mahk7ogesb67a.b32.i2p:0
+o6b747qkpgu6gvsem7leylvmxsaaqby67pu55fmqn52dgazuvbxa.b32.i2p:0
o6t4fr5ayfadzieutstgwcllvwxeuzjlxmzsmpj3hpkvefhzfaea.b32.i2p:0
-ofubxr2ir7u2guzjwyrvujicivzmvinwa36nuzlrg7tnsmebal7a.b32.i2p:0
+o6vbupdnpd5bwvcx7ivaecgyo7x5vdu5em4va6cmx5iwcf5tyaca.b32.i2p:0
+oaeqbkgpek4qnm3nly76x2tfrad2tun2xefliez7a3uxddeq4i4a.b32.i2p:0
+obf5kfk5n4nnsw7ez6ls6chqu4lz4wlck7utwvmjnlin4nzfnspq.b32.i2p:0
+oeydvkjoeqy3473wxkkbmoc6zz5m6zcmf6ov2hfkci54efsityua.b32.i2p:0
+of2gy2vblht57tn6yfczslnmp2xybdiazzta43y24w76tl6tu2xa.b32.i2p:0
+oggn6qbpmbag224gumagzgno53mgozb65tpzt5lezjbfbbiqky4q.b32.i2p:0
+ognn4mwwtmtjbrnq2kur7spcfohivxlrvz3sfamt3t46pk2e2ibq.b32.i2p:0
+ogqdcq2igslh3n5jn3utz2vpevttul366bt2246vilfnowuyvova.b32.i2p:0
+okjamsyd4wutvhfhsffejwk6ioru4mmvwagfssoy5hcocg2gj76a.b32.i2p:0
+om32whhwvcsbrf4g6uh5hupsl67oapccourkxyr7uf5zwaqxtxbq.b32.i2p:0
+ommky7qetuh45h4lk3raili27fnbhsgxv3zucinoaymnymo5735q.b32.i2p:0
+omngcjfwtiyqwbfqqggzbkttqgm3blywu43kpto2py2e4gp7fhra.b32.i2p:0
+opnpvz7mzfw6nypgmnn5zgtlzx7xuc4w7vat5bsr4mdtp77kz7eq.b32.i2p:0
+oqrl573nw6my2o5mup6uq6pm5immw3gnviahig5cceges4wfnyhq.b32.i2p:0
+orvshryqq24l24e4dvockx2ekj4hu42otqxsvyvy7tm7hhdjsz7a.b32.i2p:0
+oukeldqgovavh3npgb2by7w6hug575uae24z6uqfdl6flh7ma6rq.b32.i2p:0
+ovnk3wfbrkvvute6vkn5glhdtlxr6nyvebiflvr5l6ws6sorpa2q.b32.i2p:0
+owexluejb3eszx4p3b6zuxyggsxxtkxfgxoylkagfecs3bgfnpja.b32.i2p:0
oz2ia3flpm3du2tyusulrn7h7e2eo3juzkrmn34bvnrlcrugv7ia.b32.i2p:0
-pohfcrfc7prn4bvn4xstw6nt3e7hjmb7kuj4djtsfqsskwhmhnna.b32.i2p:0
-qd6jlsevsexww3wefpqs7iglxb3f63y4e6ydulfzrvwflpicmdqa.b32.i2p:0
-rfjkzdzv4cwpxo6hzuncicvuyui76wxqx3a23lynq72ktwqs7aja.b32.i2p:0
-rizfinyses2r3or4iubs5wx66gdy6mpf73w7uobfacm2l5cral3q.b32.i2p:0
-sedndhv5vpcgdmykyi5st4yqhdxl3hpdtglta4do435wupahhx6q.b32.i2p:0
-tugq6wa2ls2bv27pr2iy3da3k5ow3fzefbcvjcr22uc7w5vmevja.b32.i2p:0
-usztavbib756k5vqggzgkyswoj6mttihjvp3c2pa642t2mb4pvsa.b32.i2p:0
+oznpphdisfvlcjgkvny6ma62wy637nh4vtpxww47ifpmlqkjv3ba.b32.i2p:0
+p3au2w5jnkqugxnkukj4rusvynvz3oxawdf4ajzeyxvfvyzhmetq.b32.i2p:0
+p4tsqwvdpaitvlgaujfr2m2qbr36qiwusas5zkiut7w2wjcp3sqa.b32.i2p:0
+p6o3tzllswm2j4wah35niry4tcdu6lq5b67ehevcx45sae7pb6da.b32.i2p:0
+p7ifeij3vhds3diihx5qimucyzgck5omfkqxc4pkbbjtfu4hp6wq.b32.i2p:0
+pbag76x5yyo5d3wypvtohxmgbtdrjjb35ljnq4w5fpoguyt5mj6q.b32.i2p:0
+pbftrtdthbj5qcecraden3hdvwomqrgseec6ib5h24n2zcivdqaa.b32.i2p:0
+pc4d5v74tr4vz54pbr57ejga765ep6vwk5kox55gfobi5572apta.b32.i2p:0
+pcc6cnry4maul7zlbd32khalaavkcbw5hdjuk4zjwposaorjicca.b32.i2p:0
+pcdlqw2awppohbiued4rffgs6n3lv3thhon3r67jmx2652qx2khq.b32.i2p:0
+peteksofgwgndsdh6ovh2ydkrgpyqgttit4ususs4bzksvdqkbea.b32.i2p:0
+phendyytrqdr2vfsw3kil6yui5vb2p4v5xuddezg57wsdw5uyquq.b32.i2p:0
+plhoz53xhplmyuejnsg5bkfe24ow3pbldysoovuupu6qwb3nttca.b32.i2p:0
+pm4nukrzndd2lvd3shivpjrcbjlontmxhag2xzdf572snwbr3p6a.b32.i2p:0
+pn5cx32ljrvzj6x7hpgyff3rlftextqpp4zn3nkfufrrpnpuimzq.b32.i2p:0
+pnhspu3rloczdbzsysa2iftsgoiy3zgcd22jodmk7zdjanhiemla.b32.i2p:0
+ppe2jfsb2xrmgwugbq7agy44ucb6yq4qbufaf2sh76b4kwpa4jcq.b32.i2p:0
+ppez53yrs6lanyvyxuxblqxiuvhnqvvtafmwaid2kgp2dx2v5iaq.b32.i2p:0
+pqnqwxl7jsrok7vgpgcvlxwlkg6yckx33n3g4xf5lvuntwn63b6a.b32.i2p:0
+pri376r6uuwgnbnevki7c363h4ryfwjza7pcbfswqqxk6hnrkhja.b32.i2p:0
+pscw5yzaj5js2fn7gzrzoj6teonlsohlbnvdco65ubdefpnpwhpa.b32.i2p:0
+pt3mqmvkv7aleja7vattlysu6x7gjnbwqvwtu4skzabvkjztfi2q.b32.i2p:0
+pu6e2b5bz75qnmp2rox252aksllnitv2grnn7qfyzjkfio7w5h6a.b32.i2p:0
+punslpht6pysnlteht24rgvrkmzdd437lnpflojwakl5dy6mbema.b32.i2p:0
+pv6g7uin653rerdiivdgtoirjvokjowi4b3fwatszdlteyos3i2a.b32.i2p:0
+pvqyvn2lpvoeyhgcgunoqtetkrkp76iegyoii2af4crnlto6gb2q.b32.i2p:0
+pw42656k2vbwxmvrc2qbsz3jslvcxahln7rehsbia5jdio2knh3q.b32.i2p:0
+pxbyhv62tcdqqpl6pbp3og7ajzzcnbximv5kyt3hid3djd3uwkdq.b32.i2p:0
+pyf2csixjugwp6ad3bkry2ulkzj7inc747dsmpk7iebuidk4l3ra.b32.i2p:0
+pyole4gslrmenfcmd4ilqyzvsuyrjyffjbw7angentqjkkljitqq.b32.i2p:0
+q3ueujd332k5qjxdqkjtjlgkm3ktvdy7ats4c2ogcvokog4wm3vq.b32.i2p:0
+q4o7bf37e6afx7evwdyovsqptjwo6td3c6qtjh4rtdngp3trwi3a.b32.i2p:0
+q55g5g6s47hi7pcuomug3vrcd67vji7us2gqmfe7qn2nkq5vz52a.b32.i2p:0
+q6lzsezu4idxpdwro4x6svwz7j6h6gso6enidcxv7jhc2gbepuzq.b32.i2p:0
+q6o3eqnyg44uzjzqeudsankgdouylshkhdhl7b4bqxkbmdnm4iaq.b32.i2p:0
+q76g4lkosb2sxenh47eutqgwwzjyph52rirc635wkwnxsejrzdda.b32.i2p:0
+q7ntdwy6xueyvghbjamfrh62aqtuu3ikwg622em44pa3czomrdjq.b32.i2p:0
+qa77lz7dl64qwtj4fxxlz6otkuvv42dciggnmx62eobs2xqi3vlq.b32.i2p:0
+qaqvxmyvq2m4wombmtaz3our3qmp7eet3qle5flnrs3a5wgfhxba.b32.i2p:0
+qawed5ou5vb42ugi42goxr2s6cqzpyh3s5atkhvfvyhyc6anxyaa.b32.i2p:0
+qddg7myylinn4tw6kdjmmp6fsyetkosnrbp2gsjx77tmkqyqv6ua.b32.i2p:0
+qelsaseevnmz2unpovh4nbpjpshjg45iudiaf5zbngealwwuxe2a.b32.i2p:0
+qfbughfr5hhgoomasyviwk3zin24uerpl6urz5smzxc2div5ixxa.b32.i2p:0
+qfl3i45ipgugo7ueswy3ynnbaet77xawiplvmm3kp4fj72qvzc6a.b32.i2p:0
+qhuk5zq5v7h5p7o62gsxgtqqo7va4i77o5vei6wttxqcgaw47h7a.b32.i2p:0
+qivuqkrr3pv3rul4wgx4o4zon5wegidt5auylv3bhebfuj6oqauq.b32.i2p:0
+qjdftbhcaghdslzxjqx3nmem4z5p5jt7e7ou5bdz5llnqlxshe5a.b32.i2p:0
+qk3iq3wr6emttdilvdqbv6vnqjshuzz6mylwyfo3z6vpjywvnfca.b32.i2p:0
+qkohzoxigef43ro7mf2bd76eyneuuj2vfyremufvufssksbvj3jq.b32.i2p:0
+qksthizqtfdjjxcrahqxkl3bev75k24blagrkoszxen45zelijpa.b32.i2p:0
+qlhklv3q3rrszbrkxw755lpdburxwcj5dkxwicas46flztlkdcja.b32.i2p:0
+qmtg5ukzxemsktsxw2brwmohehyehwlleky3kuzeqzy4ledcou3a.b32.i2p:0
+qndgqhj3cpbxrktu6r7ysaooccqzvselvn2tphu3plx2z5ouocgq.b32.i2p:0
+qnqojlthym7z4gwizcblhpd2thy7v4a6ifme57bzyl3nxzkj6ica.b32.i2p:0
+qorzdjceszf432obxa73tnwhqb7ltxrxlfkkqmw2flmfjhoyv36a.b32.i2p:0
+qp5ppgozzbkuingg22zgamf4ozpe2n5hjlu4i25r6pjqw2ngrhoq.b32.i2p:0
+qpddavnflr5tdmeypeu5lrjjwsgtdhz7hw5emxiyjkcp7m7xysca.b32.i2p:0
+qpo3u565rmgeioruszadbc4vmpgjyoh7qorv4lyefl7geewyyz7a.b32.i2p:0
+qqiakw24obfwz375gfb6muzaz7tr6ani3od6leoox7jwzrizyxkq.b32.i2p:0
+qqmxvujwi4ktgj2cuqmw4kiujkf7ukrkoe5ryy4bjb7tyleplsja.b32.i2p:0
+qrpz67rcwrbpcockid5ml24dtdhhhekty3xd66ekkyatpfjd2wka.b32.i2p:0
+quzkrgzb5pmn4465647ke5lsfbseqnorr6ljvfsxcagj7rzl7hcq.b32.i2p:0
+qv5e4jlcmmkdlmh5spkvv2wgj343vm4yoty2hofuzi4lornn3hzq.b32.i2p:0
+qwhvlprhk3ntswr5xntnc2hhgmvd3bbgzgkbombiibhrsj7k6gyq.b32.i2p:0
+qykavpjbecssape77mrxjxwxces2gbjd6gzewd6zys32uhmnnw3a.b32.i2p:0
+qyqwn5xs24h65rldrle5msyarmqof3lb33uz7sutauwdg5qiuhoq.b32.i2p:0
+r2p5kqr7xjo4ncz7l6ekdx2ge6su2j22j2tdsoxu4jw3u67z7poa.b32.i2p:0
+r4ukdj7c2k557k7qd6siauhhqucshwy2rrkm66twzyh4jiucimaq.b32.i2p:0
+r5d5jgscvs6ix5v646ohwa64vutu7umfeknrc2hrezdjtlr4lm6a.b32.i2p:0
+r6d4moarp22wnnsnmsxqt3s32gzyscaccackcazvimrep7sa26ma.b32.i2p:0
+r6hd3knqi2p6kaw7hybrcf2q5lcarulcczs3sgcuz4yc2saj3gya.b32.i2p:0
+r7bug6wbhevqqlbavouj3ggpa7e57sbd3oivkzqeyagrtxshmjpa.b32.i2p:0
+ra7ztq7oq7jcozpui7c4zv76gh7rjwhq5fkpxp7dvw7ritick66q.b32.i2p:0
+rb7tyjd6gi7evmt5mzvtboramqip43sh72zjxnwhj5k72zfi3g6a.b32.i2p:0
+rb7x26lmepfbcd7wtxu42pf4tdxbe5p5zsf3cwuukd4fs4zhxtba.b32.i2p:0
+rd2cw3iukuth2lwe44q7fipawrne2io6y3fyyv5xew6vd3hos2qa.b32.i2p:0
+refo4v727jmff6ylrpbkvd5emlfr2hamaeh7zho6oval5dmnwlta.b32.i2p:0
+refrtydbdslzcgcsmmph3435qigyajh4q2nvl756f5yojouln4yq.b32.i2p:0
+rfgsjhyvqbunef5b5r2emjuoxx2i7rcsl7gathy2n4gwjyyat6bq.b32.i2p:0
+rg677vpfzyhsckzzcvoyvqdbwtdkqig7lxv4unmxcz63vtr6tgza.b32.i2p:0
+rgbq36syjadm2ex2gftc6xztivckrqzcjszla3jacwfo5hqutzqa.b32.i2p:0
+rizuiypjfhukt3bqnetppoauovuaqq5e6jzgd7tgy24zrwa2ydxq.b32.i2p:0
+rkhb3463btvfozwta37itlkt37iyncpkzak2xhoe4kg7tqafqria.b32.i2p:0
+rl4b3r5h5xodo7kiw4nykd4rhoc4j37kxizzyb6ukgcomyc2qrya.b32.i2p:0
+rnsjgirap5lfhxpb2xczuawgoztb4ptgdwt5rcb2bz72vhtai2jq.b32.i2p:0
+rrm2pems425buhonptp7lbtbprmwwjhbftey4ujvk25nclx7rerq.b32.i2p:0
+rvjzxak3jvwwti7klfb64wrsmlfcs6ceiqhzbbmjynokn5tz3egq.b32.i2p:0
+rwgf2wj2x66xtnjx3dggxhkuy6gvihvur42tbkoej6bd7iukoqiq.b32.i2p:0
+rxatc4b7obgosvznpqrmyrl6ty2yixhi7rpbh45sopqwzglyimga.b32.i2p:0
+ry3iuaabf5ek73otfvchwrqryez3nsgq57bpmzkyzumqhfbhgtaq.b32.i2p:0
+rypsyqod2yq3zagcvvc2643vydtv4zm2ew5r3w5kjzyq2snvzv2a.b32.i2p:0
+s35hlnmumkgdsvj2gepnwro4wo2h7ts7ddjhhihqggywn7qcym2a.b32.i2p:0
+s3rbe5n7lyy6smerpkgr4ictzbvkciu7gxyj6zqw3xyw62rmivha.b32.i2p:0
+s43w4tsmzmddvu2cxugh2lx4o5mup3rkvjhm455u2qqpg4bqlhyq.b32.i2p:0
+s4qlly4iwzevejk4ex5zfqhb4t666o73mvdmy4gpu47tpb775nja.b32.i2p:0
+s5ls42vzfaqzgrjr6cvgkmgifei2rtvj7uzaljkpsmt62jwtmvxq.b32.i2p:0
+s6umfzwe27x7az2yjsgqftjzawoj5lrcrgxldkfwfq2qwobml2ma.b32.i2p:0
+s6vsdby2liaahn2fh7qvrehqfus7gaz3p3u3rpjtfjhm4ahvz46q.b32.i2p:0
+sa3k2xipbuwm62bb5n2mwaqyyjcvxzb53kmzinoojgnjpnqurzeq.b32.i2p:0
+sadnlzguaa4k6kvpiky27izp36er3i5h74l452povbnajqullpca.b32.i2p:0
+saj5uchj7dzmxjv3kdzalgtbqzw6wu4wzxxdiobc23m452ehk3zq.b32.i2p:0
+sbalp2doxyedtr52kj57va2rmbi5npspv4drk4vxnujag72gtpiq.b32.i2p:0
+sdxfzbgwxpf6hbik7k4bqm63wm4xld7qgo3hjlhknnehzxyyeu5a.b32.i2p:0
+sh5hww42vwlsl57cdropaeqmmwozinnr2tg6wq4prg5wrkusvxja.b32.i2p:0
+shpd3cifcjoebw6pskj4pfmrm7lwecrygjnje55heorhsxm2lnrq.b32.i2p:0
+si5x3fon3ew644friidc5o3syrf5v6kk4pxxjvhibev3odxk7nyq.b32.i2p:0
+sikkmrxv6wat265rpay2tk7jywyvlzkekpolmwyp2el5g7iihsvq.b32.i2p:0
+sjpqyf3rq7ojcalldlybvyyh5lqiq5j3ade5w6txe3473ybhk3sa.b32.i2p:0
+sk7aivked563g6g2ri2saggni7jqzxmucuqa6xkudcgjvpbjsyda.b32.i2p:0
+slbbsiq2pmouqht3hznafnowq7sxzlidmwghfch7iiq64rzdhwra.b32.i2p:0
+sle3cbbdom6rknc3drqtawctpy635ica5d5gerjjdahfymkok4ma.b32.i2p:0
+slnmute5o6h23ldim34wro4zh4qa2pchnskmdpek2nzc7u5oz7jq.b32.i2p:0
+snfinsblh4j4wsv2n5kmkfxbvqzcei2ryfyu4heqy6u73mosep6q.b32.i2p:0
+snsw3ewf7wjtwspiuj33h3vtxnybllurzcwm7u62iutf5phoitkq.b32.i2p:0
+sooo7ajo74ajo6m2yomcc6jcofdgkdoyjcbrpl3nyvvusr6fw7ta.b32.i2p:0
+sorobw22rerrhpx5t67joyqai3ou6xsvqxb7wdomtnwnqztm4sga.b32.i2p:0
+sotpvcqqzzmty6llimwlvknqsdcypn4wsnwk677kepzmy76w2gqa.b32.i2p:0
+spbb34lslk2tldwzr4ydi2culk7sxgl3imb2gg746xbxqqcj7vzq.b32.i2p:0
+spuaa2y6qsaywypklz7itcb5klesogef2x66m4flws2r574qjc5a.b32.i2p:0
+sqjjqyrhh45jpgfp66idiirgh5ck7f4s76ee2l5bli4obsotu7zq.b32.i2p:0
+sqjorsqambyienumg5qpw3foftkp44vpsd4lwklgbl4lag4mm6gq.b32.i2p:0
+sqr66feh2g3f6bknt2tnltmnhqdkzoq3jhdaatfusshrv6v2zhma.b32.i2p:0
+stltasmf4b54srrjb3mf7hjtjvmvvms26btxakccdtllgrm2qzgq.b32.i2p:0
+su7d4biurihkyr3qeea7makkxzikxr5zi4znvryh3bjespppfhxq.b32.i2p:0
+swmtaospvaup7me3dvzlw5xoeohhj4zn5q6agivif7kxtseweriq.b32.i2p:0
+syhxehvl6rublw6k5ysmzcsqrzdsnd7eqrbwalfkvhgfccpu2osq.b32.i2p:0
+sykjw3jnb7n6bo574wnpiaxhp2nm4gc6hc4jh4v6trsbpboysooa.b32.i2p:0
+syqxyl67b4hdo5u3jtkkzsabccvtjaerpushov7nrc2f42x67fja.b32.i2p:0
+t2e45js4dn4cfsyyevm26z5ltvmu6lftxziji4fm3v4v2t3ykaoa.b32.i2p:0
+t32qcc2tbjgqxrydr2txgm4ahhhae3zkkojmguehw5gsbtrdvxsa.b32.i2p:0
+t43qqzux7ik7kki2rxtillcgbxrznuhjac7wtqh52sqovk5ay3xq.b32.i2p:0
+t4notlid4bejwz2tzucpvednkeuskenpnu5sqcbdhh3lqouigqxa.b32.i2p:0
+t5cd7q36no6doxduuvk5psdx47zl7ousnckjgw7c6zr3o3ke7ffa.b32.i2p:0
+t7gbmefspnynaezmvx445fjapp24pjjf7wx3evpwlmolzyu3wi5q.b32.i2p:0
+tanmhvkoyd35kf6a2nhj5rmbwpt3shc6thypsle45my565womjya.b32.i2p:0
+tbqehmm3nuuf2spwsjobrc4hg6uxji4mdelivhywz4b7f5lv6rka.b32.i2p:0
+tbrjczwl76v7ob6hon36z6f35otpv5g467q33pgzyyakp525wwfq.b32.i2p:0
+tcx3ftsdl36ukysuuewydapdzuu4alewyg22squei2wda4a74tba.b32.i2p:0
+tetoqjagsf7fpejajiwm4rosqscy5huqbz5hcqgfuha5tdfnlrnq.b32.i2p:0
+tf4tozh5unsgyzpdsmrdcpbgekw2agu7tp5jvyclzcs5kjudwwpa.b32.i2p:0
+tfuvti7yonn5pjptzzvpshh23x4rqjvm2usolrbnlu42laj4mhyq.b32.i2p:0
+tg6goh3flzmcer5voft2nf3tudm7ikyez334zry66vqxmc4ieixa.b32.i2p:0
+tgt7rdhywtlwob47flp6ccq7prrbh4ipnwm3xszuykq7be2pksyq.b32.i2p:0
+th3dj5sqw75lga3tnffbsywajxafv7cvlb7sed6w7q3w3sxuqo6a.b32.i2p:0
+tj2upmck47iktfh4vncmyajnkbatqglqzy4coqef7wioor4hbsjq.b32.i2p:0
+tk63xbzug7def6esivofwq2h2c53ar3ot7hsezdq3amxqqaoyr5a.b32.i2p:0
+tkzuysa4lkad53cywbt6sgpcndvvvdkjeatpkwyfweorx7rfe3ba.b32.i2p:0
+tl3xkknuukvyinyhvt7saz3tvz24ptgyqtzy3igygyfapcf2o3lq.b32.i2p:0
+tl66bkfoqu6eameaqtlwrvfttyc6xj3s57za3hd7omnfnjg3i44a.b32.i2p:0
+tlfttkbshrcixu6i6syntl5xjsoh6mtgfpix54knahyeuhlju4ga.b32.i2p:0
+tmmjmcrwegjke5fzv2hha2wkis7l6xdaa7fkq24ge5rbvqpwxzpa.b32.i2p:0
+tobdew6554c76jhrulcd2ssgvef7dryini2xjxem2zushe37ycua.b32.i2p:0
+trucvlawpufrszky4zzhhxtddnhio4mnqawzc47n7kik6i444m2q.b32.i2p:0
+tsfr6zvcgsmw2ekaxqqtkdrnbib5uio7lgmrtmscrvwe2d46g7jq.b32.i2p:0
+tsrlbxayhihugr723z6rkyafglnhcyzi2zhojzsyfdjsqkkd53bq.b32.i2p:0
+tv3x4kddbu753tnlghgh3txogp26tlydt47rl5scx7eoxgnocf4a.b32.i2p:0
+tvbutrv73xhwqbtosmbp3cesdyc5bbtslay4gjsf7rzdx4ztgzaq.b32.i2p:0
+tvotv5p3emxxnti2bnvucbfy4to7gxptwvh4qznuhy62hghnju4a.b32.i2p:0
+txpr56jvbf3lmqgaozqdqzgckfpugzyd4cwplkjootvf3hk42ibq.b32.i2p:0
+tyfkhz6ggpi2rykez3v3j5f3evnjxfoau7ve7m2heaukrcqiui4a.b32.i2p:0
+tyvsuqy36cx2yvf7jhnkd5ojc52g6vxl2rw5qshqwpk63ptovdda.b32.i2p:0
+tz5txdipkxcnydzcsuqw47qxdvpob644u3cttlbrbfg3zp75vl7q.b32.i2p:0
+tzudbbctweb7rpnf2vswuw26j63ysqztsbt7lfpfj6xautueiklq.b32.i2p:0
+u2tnrysboqqwjn73awg4hfxtfjgbqab6vrdgyu43s672jdcanhca.b32.i2p:0
+u5ixxcd6slvzxouj532njusx7ec4wemrfwmg6gwltlnkruubi63q.b32.i2p:0
+u635477uxqs7z4uvwx224u6ojn3c3ewcb66f3j7qlbzqyrrevxja.b32.i2p:0
+u6wrw47yfjdzk6a7nc6c6scvfokwuqmvuhxehqvymrv7owiajxia.b32.i2p:0
+u7uklnwthbrynr3z2gc3yxfmi5yoemsugjbb4nm44x26f25vxp5q.b32.i2p:0
+u7ygn3heosxu6l2die34y7wteexfp6h2w5j3nhr424yoblysigyq.b32.i2p:0
+uags6hm646f2qsyqfhzjt2xlnjqbiopiodghywosdgz7bwtbggta.b32.i2p:0
+uc52rzz4xu5ikx6hl6r6sqxfmiyyxsffpcu5frrtepczidwjwuha.b32.i2p:0
+udfxh2r5yfu5z7ynzacur7p3g7ug35kfa33ghes2bazpdivxlhsq.b32.i2p:0
+udkwqdo5odg5npn52rueipghn5omhvojthzdmvcvuomgzglum7fa.b32.i2p:0
+udzbx5jyvrp4g3iujlca7jnlaaaa5m3e4jv4sbr7tvp6k6cdjc5q.b32.i2p:0
+ufgoaa6g746zzpphuvxuomuizkyfpz45chqta7skrywqq6cjbqna.b32.i2p:0
+ufittrlr4eautphuqzuotc7b3xx27n4xgy5afm4foc6nsv56q7ka.b32.i2p:0
+ugw5zbhs2pvsgxieklmc6z4z6d5cvyux4pctpf2udhjgxvajot2a.b32.i2p:0
+ujg6b4cyxhi5pf4puwvwupur3iddm23uibapigpwl4bstvlt4cva.b32.i2p:0
+undzufsjeb4qlf7y5llh56tji6zlhtshlsyht4yjdsa2k4ayx7vq.b32.i2p:0
+uobwophnzqq4yhpp54aisud5ojgrxq6pasmq4aq6qw7dhgjcoqpa.b32.i2p:0
+uodycjdscpurlego2nrs7ptoze26p6236t2r2tax5ubdgi6duqaa.b32.i2p:0
+uohuxnjd27cftarbf6kh4czmotwvstpon2sgs2vpffqkgmg7guxa.b32.i2p:0
+up2kudwqomqrwvfognnhz2mjwqvkgpknfyscp4ue5ioev3q4jd5q.b32.i2p:0
+upme7c64dwjgbt7w72yf5ydl3dyp25dtenrkq6z3aw6hbircqzsa.b32.i2p:0
+uppxodf6bz3qibvpzzvtedl5lk3h7fslrwmed2cmqvdpgtvqkv2q.b32.i2p:0
+urqlr3cei7pp2cruga4txxmmvel3bh7nsbqzqzpe7omvmbm4v75a.b32.i2p:0
+usgqijrwhtwgoekjcr26yqcgpncwpsescrr3eek35e3rhkrtptoa.b32.i2p:0
+uu47uxdqqtv2pqorbaxnhhfmcsxmknvpreambqqkosr45b44h5ia.b32.i2p:0
+uv44mjoqrj3m3gzz5wxlnszt5pvgk3iqlc3pmqfe6un6gxays2cq.b32.i2p:0
+uyshm6nokdjyq3l43224at2rigpa4zmiyybuufyq22t4l65ialmq.b32.i2p:0
+uysvdsh2bzicmdqqdl7ezuftxcywzapohbzl5ap5hyiinki354mq.b32.i2p:0
+uyy4dbfyx2i2x3goobc6uxj4nb7ktzsu72zlksypjfisgka3xnta.b32.i2p:0
+uzgfmsjcbjxitt6bed3p3gpdzviyop2rz3cxqyu64ec3z2r5imqa.b32.i2p:0
+vbzp4sjkgqwymn2z4ikbae7rv3clbo7vv4mwv4ft7tu7ubrmbeha.b32.i2p:0
+vcksnyuyw3i6hfviob5yzoynq7okxi677bw7224273fjhsk2kgra.b32.i2p:0
+vdpfoahxse7cjciw5l7ffbwzc6e4xdlf5ulvrk34mzm2gy4mhlwq.b32.i2p:0
+vdv2aitgqica4taqcmjexw5xfbrfbhvf5kuxwvfjf3yiki5a5cjq.b32.i2p:0
+vet6qwwa74jrqrjzcm7ylfprzwpnt3hlzjvkbnaoiv4o2zzkr3sq.b32.i2p:0
+veucihmd74nnumiunvruyjs6kpjs5sqw5dprldlzcf7i3h4igkda.b32.i2p:0
+vewdrismzwnlxlvni7slpq722wlwfami2elghudm2ofcjhpjcs6a.b32.i2p:0
+vf3l3f5unlwrfmr3fiphpomgslxgm6m4chg72itf45yfu3brmy2q.b32.i2p:0
+vfpzasrsrqh3llkudmas5fymwn2ohswqi3vakclgm6fn4nb6s5xq.b32.i2p:0
+vgkou4ysuxvhlxrwf5n2ihn4ffyvvedluun47l6dobi5ycziy3nq.b32.i2p:0
vgu6llqbyjphml25umd5ztvyxrxuplz2g74fzbx75g3kkaetoyiq.b32.i2p:0
-wjrul5jwwb4vqdmkkrjbmly7osj6amecdpsac5xvaoqrti4nb3ha.b32.i2p:0
+vj54d2pkdeqvcuj5ykeggr6jnhhnmq5q6qe7nttvb6yjetweadma.b32.i2p:0
+vlwovj6fxzvtsypnmslocootmphezr5txanyfz2gjhn5lanrn2fa.b32.i2p:0
+vmatpbu2vf5p76k2emzg2tjyqi6p6yj3cl4z32ncdhz37ubprkha.b32.i2p:0
+vmbyttxf6sw6ivdamftxung44mktqb4vphmm4lqzdqqpcmksterq.b32.i2p:0
+vmoogdd5lztt5wpzkwhd67uwnvpupye7ycsbz55jl25sueowcxxq.b32.i2p:0
+vn5rsr26rp7yxrqliq7vo4zb6aoichaybd3urvc5eedaspxjp3la.b32.i2p:0
+vnxjmzogakc2a4xn5w4qormiqt5khnjptnoaro74ehinrv4q3yga.b32.i2p:0
+voi5u3azhajnt7476tcikl5mactxcvtsbnrzixwkj62qhpaw5ujq.b32.i2p:0
+vpevx6tl6ma6mnlj42d4fke57en4v5r76yx6rcmhtvw47guo34uq.b32.i2p:0
+vpmkctqhkdqgkekt72srqm4sqaliug37uq2wp2ywady3p235cpaq.b32.i2p:0
+vptzpxba7oys3w2htjgh4uxogaedursdh2yz5k6e7yh4b3pokuna.b32.i2p:0
+vs67sj5crkcjo7m74tdunzefj6ahgrgohs6egj5jxmneszwaoo7a.b32.i2p:0
+vuqk76jvxfk55bkovqcmmkvycmndee7j3tuv7ezdb2slrfpjyvoa.b32.i2p:0
+vxokhkidetjp4tjrj7idojx45hguhnl2azvqnbulougvdkstf3ma.b32.i2p:0
+vxs2es6f7uw2uuneslb7ipvmg6kqh6ytpjezoj2ptwx7od4jqmxa.b32.i2p:0
+vziy2cbrbvliqpi27feak2hiewovxtlkqppsagtaxeib6nkonknq.b32.i2p:0
+vzqowkd4aoyekapcskylli77aj3e5fomixsjyiawnldzj6c5nxtq.b32.i2p:0
+w2a73mo4grdgwvkzdsh6nyutagd4bmywywacxviodw7xnof72aoa.b32.i2p:0
+w2mgaza75amrvfocl7wt6v7eimprlasuj3bi4xezdr2wyqhkxzwq.b32.i2p:0
+w2zi3xos4jaz3ft5yca2x5zf34esctpmzqlqpdrqntjmi2o3gfba.b32.i2p:0
+w3hyqnlueb4yv5lkzj3wlnrjp7fzpxnig6x6m3w5du2ptfjcm2jq.b32.i2p:0
+w4arykcvc7eckzuqr7kvs2njsjpknzb6vvsodpyzp6tvu27bzoka.b32.i2p:0
+w4k4gm3chiyskfzshilxjchpgtpx2xmc6euvkyzkyjvzvdbqroma.b32.i2p:0
+w55r4ykzu6qt6uhp33exqbqmlt357cts2u2zoi7hkuphqmv5iupa.b32.i2p:0
+w6jl2gubyscdpubizes5bp6s42cito4k27xwcjwh76rvuik2prha.b32.i2p:0
+wacfewi6ehmfxvftxqmracfh7se2t7ozl62u4hsuyd4c5xfzuajq.b32.i2p:0
+weidpvshind3dnblwtb4zpssazeenkf7a63favavkc4crhqdk76a.b32.i2p:0
+wgrbhqemtf7qu4c6acjicb7uyee6rlinafyysvxc2yocq4t2ilca.b32.i2p:0
+wjfukwyohljaxgv4woewdtpoxi3q6hnwcnefpgrtif2kqfrxslnq.b32.i2p:0
+wlepjf4lxs4e553rtpoys6kqp2ozcv4pqjwzoybawcl3zhrdvz2a.b32.i2p:0
+wmly6cz5j54w2g2gibnhlpvuhh3bky26cq3a5jy6dp2hg3hc34oq.b32.i2p:0
+wnp26nyphqfmq3udocgcwenpsgfwk4ssw53st4wvwt6mwf7wm35q.b32.i2p:0
+woanasilvwu3yfurvhvqj3lxd25bzj4fxwy3ef3qjbso3cozvyca.b32.i2p:0
+wpnewole7fofvwvrvkkgf45sgcverlodocu7fstm2axp5jfykraq.b32.i2p:0
+wrqu543ssub7kiwzfug4o7m6lc5ibmaamdc3o4uo6a7ntxiqzd4q.b32.i2p:0
+wsbf5tpo7ecsafusflyym72k6tbyclgvqav56qafvyc4j3spzdoq.b32.i2p:0
+wtfebbwmsxoywu6nw5cowlxqhtokxrxftve2zee6flvrpqg4j6ma.b32.i2p:0
+wtoh5v7xm3wx4rqutbyvqaixybwlprx5ua2yiv2gac3prria5emq.b32.i2p:0
+wuikfwkext6lbl6urhoysr2abcyff5lkm2ojr6mfenqq25nzlluq.b32.i2p:0
+wumjwpr45uhvtggq6jkzfda47e4iqk2onizw6vn5po3bd3uqcduq.b32.i2p:0
+wv335vkr73gsaza4t6foqypnovccubvwfsarkmw3xtc3t3sncmya.b32.i2p:0
+wvktcp7hy4l6immhi5cxyz2dlsbhhvtcmskjemrnqehacnoap23q.b32.i2p:0
+wwbojywnrcf2mci7f3zgbomrukcm4d3nv6pttb3dohjpge2sz27a.b32.i2p:0
wwbw7nqr3ahkqv62cuqfwgtneekvvpnuc4i4f6yo7tpoqjswvcwa.b32.i2p:0
-xfkarmvk43vfkfvhkehy7ioj2b6wtfdlezvmlakblz3q4r7mccfq.b32.i2p:0
+wxfs2ccar4szd66dlmlijh3i3r4muehqjxjmabwbb46cq3gpbsoa.b32.i2p:0
+wy2udklgydh7iknnffbzvldoiwsct6dy3o7fjcsjcdjoq4b65vha.b32.i2p:0
+wzui6sc7667w7aabs6iebiex47o7cysxpryfdaltaklw2z2xgtuq.b32.i2p:0
+wzvki5234ffqhri26fqoxosqq3xengl23eoitkvip4mp7aipo3lq.b32.i2p:0
+x4cetuarbwiqphebitvgv4x4kzh6yhyyvu5c4yjlm4jsyl4bvs5q.b32.i2p:0
+x5qtgyzzgkovoko62l6n54p55xma5pbstbp6t6xc6hbugxz5ck2a.b32.i2p:0
+xasewpiqpzhyggxwsajmnkrppi2ozmapqv6673zuuymoueq67tla.b32.i2p:0
+xbetybs3nyeykskasolpatj4qrfnigz7a2bx7wcsyrniqd3usnaq.b32.i2p:0
+xd2byhr22rqkawocapbxedovmifyk77qrh6br4ctx7ny26hpmusq.b32.i2p:0
+xdoonpwnxhr7sjoyca3lkqsapmefd2puyar22ztocod4drjju6fq.b32.i2p:0
+xdq2g4tkaukzcu6mnvdukchinma7koi6c3noflpjabrzjrgeumfa.b32.i2p:0
+xegcohfrnnnuz3hdmb7r4e6pzxbmtg466n6mty2oz3tcoqutxj7q.b32.i2p:0
+xfyzfugo3qtfpq3s5zccbbqrxfkgy3ttlqhz6t6ovmtgrsuyce7q.b32.i2p:0
+xgbz5vpek6vaeej2zejxrjloqg2sqb67gim72qqpodqfq62rflvq.b32.i2p:0
+xgqzxudkvgbqwosaha7zb26jgza5wb7m66727rk4v2zj72xgg2ia.b32.i2p:0
+xgsk2huqghiftyznr6llr6ztepo523hiwqscxjpawcbme7xtjrta.b32.i2p:0
+xjebyiaydsbb76gqzetsmccgh67oeaxt3c4mkwmt7gjlfym266ea.b32.i2p:0
+xlfxusgnzpmatutaredcvx27zoiecno4tpxm52jicdvn4sr5dyya.b32.i2p:0
+xm55wnfhgmsy4wz24swjs2ziguheut6y72kht4ytwyfdmjsxslnq.b32.i2p:0
+xnb3pxtmai6ofbarycclwwueaarn4r3zt3zgkeepo4pgmswqvfcq.b32.i2p:0
+xnvsgbonlja7cmeokr2msvdelqlasbkwgqndqg7eakw43t3m465q.b32.i2p:0
+xpqubs4ftu7ym4xwrirlz2e36gvyjkil3chvq74bj4lf7djcrw4q.b32.i2p:0
+xrrx2rcpj3zefshtt7kamz3uflnwebpv2gkgd6vlrdazxgln57gq.b32.i2p:0
+xrwuqylcgkr2ovsf4pziosd27ywd7pfaohnreoyzm72qlnvoktrq.b32.i2p:0
+xtxh4wtmbjls76wxnehe57etubuqvsdiunwgve6kwjt4acwswnjq.b32.i2p:0
+xud4fgmeq4hl4cgsbjn3ubz2iyjguogskn7wreesvpsm3ib27kpa.b32.i2p:0
+xuivvnpcj2rhsxmkyyjzmyq6a7gwgusnqwdklgimamvkzu7rnnmq.b32.i2p:0
+xvpzaqftlfx2etqys733mndm7jr3l2j3if3wskfljzaow5s4rrfq.b32.i2p:0
+xvtvmaele7ns725mjaowsajpx4bgfecburyh6pqmdnn37cq7cs2q.b32.i2p:0
+xw6ble42juwkfrjetb3hmk2ep6jnyufhutoenyrou6ieoqiomw4q.b32.i2p:0
+xwlkpubkvsdsyaeylqfmxfk43juk6sz3hxnmwe4zencjq77aznea.b32.i2p:0
+xydzqrwggskdbmeqrhgt6alroglzbkcarzdlhabmvrszm5u6cfuq.b32.i2p:0
+xyhlemqmoeusqbbzr4oqph6kgmvm3a3lrbuanxkmyetwohxoynna.b32.i2p:0
+y365lf3vlh6vg4rs6trnjc4ia2xqplahk26y3tyqjly2q2vpfnqa.b32.i2p:0
+y3equ2tc6zsxqtndugsfzottuenfgxnl7eqgadmnzjkoigxvseka.b32.i2p:0
+y3occl5rqc2mz64esu5mqzoyfzlbxop7tttf2b3gyxjust57txfq.b32.i2p:0
+y45xhqkb43ncokfwhsmr4z6fwykuit6o3p2kbso3emv7stpiwwoq.b32.i2p:0
+y4njm6ftdn562q5thzd3fvb2f5mbi6bglmyupukcmcpt2tuo6slq.b32.i2p:0
+y5wr2bw3rt4rvw7hqqj7qtlf7vdds6zk6cs3mu3myyduasieqoka.b32.i2p:0
+ybjgylnhvk3fzyacxvyh6dwvrh7lk273qh5qws7uquvrhhwr6rka.b32.i2p:0
yc4xwin5ujenvcr6ynwkz7lnmmq3nmzxvfguele6ovqqpxgjvonq.b32.i2p:0
-zdoabsg7ugzothyawodjhq54nvlofa746rxfkxpnjzj6nukmha6a.b32.i2p:0
-zsxwyo6qcn3chqzwxnseusqgsnuw3maqnztkiypyfxtya4snkoka.b32.i2p:0
-zysrlpii5ftrzivfcyhdrwpeyyqddbrdefnfu5q6otk5gtugmh2a.b32.i2p:0
+yemrkyqmjzwwn2yast2ga6dcnsovnxwip2rjpid56grdg7itugpa.b32.i2p:0
+yfplj67xwcblbiu4ozddmzlmjl4ifa7bhkzzu6fu6jkoyqui6v6q.b32.i2p:0
+ygtc5m4mh3qhi7tct44gxqbenhkasp2y4ydjn5qua4l5vh35osdq.b32.i2p:0
+yj3v3ocgldnackxptsjmwasa4xzxj3it6rtuhmlpxvwlq5kmyytq.b32.i2p:0
+yk2srkdlbm7kebv53dx45ss7q2fjcy56m3gywqvw65eya7co7hgq.b32.i2p:0
+ykppjmwunzqzuuqc6qqsijomfzdgieeq2mkidapc4awrww2ninbq.b32.i2p:0
+ykv62rivlxurq2wkecagzs76tulfor765c237bsjn7jt4436kn2q.b32.i2p:0
+yllvqk2utimxjtoyzk7l24s4n5sqp5dbn5vwsbt3g3dd6h4dxseq.b32.i2p:0
+ylpyfcs24ij67dkl7ighyou4z2gpfhjlt2iellj2ad4ddrxci63a.b32.i2p:0
+ymo2cnldmstzqlsdhx7kurii7aaffrhpgafxlli3s47pzbfe5evq.b32.i2p:0
+yny6zqtb7qve7wwfctsozhzhbq4hyitlqco4uhc5q3rvjex77oaq.b32.i2p:0
+ynzhhxlieigtmj6l7f2dq54ypnsaf723au7o3uhnismlgnkmcqjq.b32.i2p:0
+yof4yvv4agwhfmicj5u2drem47nvfkihnp6bil7ocg65gydyzzcq.b32.i2p:0
+yojuyryq6vfoy2mftrdmybmq2hjefuzrwmpqqfvk2kd5hptgr3qa.b32.i2p:0
+ypbq5aleoqqoxto4tkxlmlxh2hrstjxzpgonj3lk7dzweahs3hhq.b32.i2p:0
+yql2k4zjl64dtybuculjgg4v4u6sje4smnyay3vslv7irrigzxka.b32.i2p:0
+ys36rtuedg44sahelbysqi2mbc2l3rcfdy33zdvhvfkx5uocacba.b32.i2p:0
+ys7np3pmfhiyq3z2rcoeylb7agfbyfuhhp7ky2uzvvuzswad6cia.b32.i2p:0
+yuqb55drzrhxfnvobycxqau47kibaaf4voamk3kxl77xbb42xkqa.b32.i2p:0
+ywfauauaekbrxgwaahcjzifemzdq26xsshw54sg4bpr5z74scwiq.b32.i2p:0
+ywpsgu6nlnf2l4sy44tit2av7hfzwwttbjvwbtsbtqur3awiax2a.b32.i2p:0
+z34pw5tlowwi3gpj3ycb2dptgyuq65bpj7w36xahslgikggo5eaa.b32.i2p:0
+z3j2xshl4tpbxaybcprhzq7cuz6urboqoxvvpnfriv4n2lq72jsq.b32.i2p:0
+z3pgyfiwfzcd2g7v4rs6el5tvc55y7a3tai4gcbpso6flaejckea.b32.i2p:0
+z6mlyrxcjddpcaoumxnw5peulnkvj56hgwqmnc5adoutp7piujaa.b32.i2p:0
+z6xsstyq4zynzvagwv3wr7htz4vxttrotzb5izefotlwqm7kjtua.b32.i2p:0
+z7cjxpy4taui2ka3ekfqtoumsb7pg2sok3wfey3m2roeuppcrzhq.b32.i2p:0
+z7cjzfmv6wadjguzaavu7pfsqhujbczspbf5sxxrqndeovu3lt3a.b32.i2p:0
+z7gkesbkbl27lpcpbnhgfofjz5fhnvljzfvyydu7ky3odzdqs4lq.b32.i2p:0
+zafd45c2hzd4w2t24qtjqqbqm3z4hayb6vadj6sd5oukjyij2ara.b32.i2p:0
+zbkqcqtiiw4nwsds5pjel6alr5i4hgiyqf5giwurdygfysacru2a.b32.i2p:0
+zbz722dh7rvu6ugdydmlmtgfyc7rnpeslae525c7mhr7rgsekjba.b32.i2p:0
+zcwgqw7hlw7437a7au6n6obljdb4arnshoibdqo6voree4xiznoq.b32.i2p:0
+zd4ns4zcyvgpwkioftiiftgj74n6mf4m4ieq6aedqaznmdi6rhdq.b32.i2p:0
+zgwseerxwqnid3zhculzuqbkhghthsbvsbnqowredostfqlvawsq.b32.i2p:0
+ziehuxdpyg5dvvnzedmcqxszdcflsrx6fqmgzb7odefqwqaxrs7q.b32.i2p:0
+zk2r7kzzigzu5kz67xnrbe56u5walngylcsk756bkmt66cmeeydq.b32.i2p:0
+zkbjgfp4ouockpsmpbdyli4ilo7f3lbfjsboay3nf47ymir2ldrq.b32.i2p:0
+zki6halesukhfel76pziutgica4zrp5qtbmlmgyqf6dnnomk7hja.b32.i2p:0
+zkij473aummp6rvwvi7wbr5iio6xu2uh4rophbhyot37uxhrygiq.b32.i2p:0
+zpvqqdrcnagad5ayutf7hkp6prtvrbmknhqdul3qweft7oa5ikzq.b32.i2p:0
+zqft7c6riv7aux62qwe5xfqki3dcb4urvbfy6m4wz7f46j2us3la.b32.i2p:0
+zqhoqgf3enj2pv74sjov6dthpr6jqafw5qqzzsvnfdqzycychxpq.b32.i2p:0
+zrrki54mn56fytizkfmhx7eubea37padxa3zliwq6gtknrsxv2aa.b32.i2p:0
+zsfpcnbk4g2bwxl7yy5ebrcvlxd5gpcxatewdrgpige7oqykunwq.b32.i2p:0
+zszq7enaxbz5p3f3idhfkkd2u2ygpeqwj3o6hkofffcmllnymwqa.b32.i2p:0
+ztr3c7qz6v4hrnegmkzjsr52wyi4u6ery4m74sk3m77oup2ws4ka.b32.i2p:0
+ztyxbjae7ucfyupxpy75jwpzdktg4gbvhl43nh2crwqrx2uhveda.b32.i2p:0
+zuamj63ad73jmnw7xnxrmjsbjg7vg23j46w3mpc2udpcgjfkcqcq.b32.i2p:0
+zvchlrjuzqdlx37fhibhnym4y6p56vtlymujjuzhh2cp34yqfrtq.b32.i2p:0
+zxsd3fqczh6ddgejc24nnmb3ww7nalieq3a7cs2mqiy6tmff3wia.b32.i2p:0
+zy2ywvyqds5bgdoo4tgbu3bwjp3ygyn3zfuby44jemc6xa6fbwta.b32.i2p:0
+zzre44vh766jgfordw2ehu2r6p44j23uyovgvm7iwuhp3g5iz4ca.b32.i2p:0
+ycdw2e4ufgfwhcqna4g3m2qsvaly23ozaexawcj3x4gtgcehgwujjgid.onion:8333
+ycfvedulkprd5bmivqejur5aptcs47daqtcvzotnnhfvwu3o6gcp5cyd.onion:8333
+yck6l5ffw6oszgtoc7et4fytvp3sqdf5awyky4tlpgem2n4y6icxqoqd.onion:8333
+ycnepnzktkhfysqijlgbjk5awivls3eiqb5kjudotjvnvlbe6ah2k5yd.onion:8333
+ycwrrabomoixkxggkxldyxkqoc7qqy2t5wxcsxjgodlvuydwch6dqoyd.onion:8333
+ycwwrwkqibvkftpc5kyqs6nf7hrzetrmqgwo4yae7bq5otvubkfsread.onion:8333
+ycxjdh4jr4vun447cdszcoge26pbdnqblfi2osmk5e4uqmrigw7y4byd.onion:8333
+yd2ami3rem3i24q2b76l4ujyq343ycrowrthwqycvpcsofgpwlxyryqd.onion:8333
+yd4nyusqking6tkcwmmopznlxhyfhk3gsw265alz7vpo6toqg3kwn6yd.onion:8333
+yd6b3wtmu6bz5km7hw645omyv65one627xech7f3vnlwkblsvqdtmiyd.onion:8333
+ydforbx54mnz7g5u2mu2ulkomvakdbwxoad6araknijb2i47gkfeh7qd.onion:8333
+ydiqekqpcf536w5uwsdclw5pt4n2fkz52fo4vwdducc5t5l4ghqaxnad.onion:8333
+ydl5kqr2auvie5mtjkm37hzkqh43pobibty4msfzkbu4junpg5gak6yd.onion:8333
+ydojumivjpins2lwgql5xaywbngrmw56nvmtalvfiy7sr42ksvr6apyd.onion:8333
+ydvbxdzs6w5wefifiqsqntpbd7tliofenqih5hlnz34546fvy4ab7iid.onion:8333
+yeat6ea4esvd4nimhg2rcb3ghpusoqzjb44alb3hhdj4d2nimn2vpoad.onion:8333
+yeficzguf443sojjdcmh7lzk7l6y43a6v2jbyk3x2w4n7xokjs4crnqd.onion:8333
+yefjaylovpdhbb5b5bhjx37digt5u62lmzyc54ygtabwdphm3zwd77id.onion:8333
+yeghpcuryadlbxzk6o3ujebmfuumkpoi32dr2ctfmql6vqn5wjioehqd.onion:8333
+yenw26f3i6kf5u2nad6xligxk5iyizjvl7msx3pzjcatiesogdef4zqd.onion:8333
+yeoadueo3ukf6s3fetywtbvgmpvrtkja5rlp7wcp4aich6tfhh35giyd.onion:8333
+yeqjrnnuf4fbgzik74qfhrohcymj7ccbze6ndky4pe673chfsjconfqd.onion:8333
+yernmfgru46g43vsijjv44n7m35tpoznnkd2p2wl3uqzkietukxqxoqd.onion:8333
+yettfzp2vanmkehwxeaugotqcsg3wsomcargvetk4nhwnebrpq7ah2qd.onion:8333
+yfgo33tiu6w3nrvnfyw2nmpcwtfozinctn57566y5l4hfcttuvgff7id.onion:8333
+yfmujam6pa75vm7p5q7gvgkocqzcwm7lgbnodwtmzfw7usy5dvlgqyqd.onion:8333
+yfpqwz4qogg2r5sdweggggz76pmhxtegnisz55urw3egvcq2e3amvkid.onion:8333
+yfpucmv4zspytubs5epnze4xc4joqny52s7ifjk3vu644axwkfyfurad.onion:8333
+yfq3sexjxzuww7tnwc7jj2ethiu5f5r65ewpy66os3ozhoeje7na4hyd.onion:8333
+yftuiua74fspnqanvait246qn6vmab4aoympjd3omppu46jkq777axid.onion:8333
+yfxz53gdbxu5hapg3e5kaa5pyxpbrpiql6j7sfe4i7fqj4blpqpufzyd.onion:8333
+yg5xbesziuiaigwyxjrn5c5hvj6fxef45edl7pir7risnr6un6esjtid.onion:8333
+yg75fc53cicbsarrpfv2s4crpkx6vdjub4va7cvbducwzhsf6qehx5id.onion:8333
+ygczn2llqhks3ohxvfck4ks45ekg4xr3loriyynnejw2jfmi7hjsfead.onion:8333
+ygdfwrg33s3qwiarwxbejalkirmqui3wjz7wfccprjry6bm5la65vhad.onion:8333
+ygh4hx4ugapidwxodkjr6vgl6vkaqvievk2eiie7v3ewuvjvg2mzp5id.onion:8333
+yglvvnb3dk2vh2wwgpcnvm6t4lgbdhnvpy4jfj3ee4ugb4xzvjrrcfqd.onion:8333
+ygospbn7dc5a6haqur4eoe2oj6jttjohs43rhl5m22ltruh4fz5isxyd.onion:8333
+ygowwz67kvvri2lcwknsc5xjdz7ffat5tqkm7fmxrrzfgvqnxoxkvgid.onion:8333
+ygwuwz5autfc4tqluyuoebghc7f6lgjykm6oprynh3h2vfp4xmhiapqd.onion:8333
+yh4edjvpbo55vsankh7e33u77ep7eah5h5gvfgu7t7mbb7kkmjvgirqd.onion:8333
+yh4uoyfzey53dnoj6zm3frihhgwpqfqkw36sjmqsvfnl3rqohs52wqid.onion:8333
+yh5us7dk25ttxkt6miers3bazlm3jiums5nwz6mzd4i6kn5oizjccuqd.onion:8333
+yhddybpp6lgu34i7uurdqg5jznfdajwr7co3twiqf7pgnj4yjgzbnpqd.onion:8333
+yhiswltkrs3upvkrygsuiou5i2njnyxk3gwtsmcr5yn4lfinzifbpkid.onion:8333
+yhjkylctf577degc7ufffvg3gsdxgnx64pdhzfujxjgfhbulmtc7yaad.onion:8333
+yhnzb5pmcbeiqs6bxm3xvzdy2dgblteiswvvtg6vhkum5gjjw7abjzqd.onion:8333
+yhqytulgwdtvozjhuyod2cufnkbh75mgyw43k6w63ah2fzulskfssyid.onion:8333
+yhtxfuf5zxqoqkuodfpmzsnnmtm354y5rtexqplt5l3fkzzksjkkzvyd.onion:8333
+yhvyxjfauptpsjrxrf3oxtv5zlju2gdpitwsabcmj5gdpjr6i4z4ulyd.onion:8333
+yhxcgpy2bwwhhpmgellyghjpkw7cfrjlq6trq2yl3632rxerwbmkvfyd.onion:8333
+yi2k4otmwujg7bi5iw7ewqntnxb26jyplx5xyk7bjvvaut2y2mhcgqid.onion:8333
+yi32omh7hh54oeot4i2ze2tif4l4cwdhzxxn4bzmtqrotfxrepttfead.onion:8333
+yi4gxqy63csutkea3zss2oryz4get22hcfginwcejy65g35ec5t4uzad.onion:8333
+yi4nvghovjd5bzcbhitvezh4uwg32n6r23et633odlacu4eamfym5mad.onion:8333
+yi5x6isngj7pivr5wt6i3drntlqsvbzijpdy254lbjdnihxmfy2cdgad.onion:8333
+yi6umkklbb6vr4j75buoss7kqkgcsdsx5fvgi57h7j5bzuleoe3ae4qd.onion:8333
+yibgffpo7dimyvjlbzfr3dnmnl2r5hbrpxbtcpksthsko6udsrk5uzqd.onion:8333
+yiiyiuwns45zhmkwi3wjumqhnyfkwkahbggd6hrxtnrxfqwn2vdx7pid.onion:8333
+yijdxmlgnfcwrb5zxvchjhgtc5357mecuopminujkono7bwjgqu4acyd.onion:8333
+yise75jksg27th74bxo3a6rcr3huvromhmuhnmy3n3ngcgfpagq445id.onion:8333
+yised7sf3xzsnlggeuioas2of4crrllkpz2gfbdy7c5cysa5sxi23lad.onion:8333
+yisvuvmqtn7wht6dndrqzsdl7vuspxwrmfwwu5o7wldnzn4mbzeb4yad.onion:8333
+yitceyo3wv2mk56omv6mon3n7dcfr7jiggdmzlmtikpoam2otiey64yd.onion:8333
+yiuesqqc73nn7kxadavmlwc7ymciszzk7bxs3bd4fwucaocme6qb7lyd.onion:8333
+yiz7d2lkgk2mftp6i5e2tqhotqkqjgxbdmzbnflwvsioyfydqrvll6qd.onion:8333
+yj3gs4nvumsfztawn7ku4cmner2zlmcn5kke33g4j2vywxsrqmbd7kyd.onion:8333
+yj3q4iustxfcq4bisbuw3jvqc7ph2ggld56mvyxqvgw2tmsinbwlnzyd.onion:8333
+yj666fxjddvz4xzkhtzhh53wvkiobvildczzxb3mixjipqqiqaz3bzid.onion:8333
+yjdhdurh6vqxuykgmuskpabjzjni3ehxxh3zq5redu5hqdmhdw5b5jyd.onion:8333
+yjkojvjsg6yhfj2ln2bpcrh2e6fr42ul3yzsebbz2kkytg7pf2zzjzid.onion:8333
+yjudzsswyvfqyeth2eghfvegxg6z6ubnx72kmqjljhdewrckw56lggyd.onion:8333
+yk2foofoifxgbrp5a45okwbelrsvycgqgw24xv56hmuqxlpmw6msndad.onion:8333
+yk4sercvyzvqxgbgn7srm6eeivlzoa3t4sz363aygcyciubcieihhxqd.onion:8333
+ykh3t44zjojpj76ouqeo662ljhyc2t6e3mike76iqpelcdztgaxuw5id.onion:8333
+ykkhln6x6hcmhyrx5rxaf3c5auh5k4plrpaisits63r33ecwkmtexhqd.onion:8333
+ykqehwl47hwypuhhuuxkpoexocldvllixqhplpsy6ym65vbjfa3yfbid.onion:8333
+yku2clwr3x3ndzfjdk3o4spoztoqy6ndatken5wopgapg7qkvypuqoid.onion:8333
+ykwrwuffwvaxlwivt3hlhyz2yo5xde7dw4x67ygc4xh2t6m4i5cftkid.onion:8333
+yl2preaby2yqyhmviyq46roapupmnijt2g3mzmvwtxptvybz7rbs32ad.onion:8333
+yl2stshaozpyqtut7m6ln47z2qhledknuwhij6kvxsuaai4nwy6fp7qd.onion:8333
+yl37nyh3vujz2fyrz3eoqoteixyiz3dj5rfnnmrglcgcswzbeqbjhiid.onion:8333
+yl3bo5zwwsg5dbhrrcjkvoyvwwxp3kbdgprhe6md52ob2lra7ynrbwid.onion:8333
+ylaoywooejvpfosewxmyxjhc2ahfepjbvuyjc4p7bymwirexlkdituid.onion:8333
+ylaprgwti4dsumx5xvlhul3esf3yi3ebyyubb2dwfgwe3zysv3e6nyad.onion:8333
+ylblnrd2jnfjtustl6yt6pix4mgqr5qqoevunmwk32e6fxq6uj3dchqd.onion:8333
+yldtx7o5y5jf2utrrtqf5yf56akol55wars2uwxuvjoubustrtmuqxid.onion:8333
+ylh3vliup6k27pt2thw4xgfguiziaosb5y3ovee4w6dzwcb6hc6czwqd.onion:8333
+ylsvnjqrcgatkzj5gfkwt6cz236z76yvgpeulggzml3xb7tnbsttjnad.onion:8333
+yluwecwlibf5dw2sup64dq4gs4cfdhtkfhoy5cszrvu75wljeqanr7ad.onion:8333
+ylyuglp5b2p65gmiofhe2irpxswlhecdecg7d27qhcwehegr2efmesyd.onion:8333
+ymgyodvztfs4nnijjnwiv6eadetxjm765iv3ryuyhsq4upnjwncpvsqd.onion:8333
+ymiw3d4klephwuwbkgdpllrs6hssb4svcg2um7sdm3hsnnksbnvj2vqd.onion:8333
+ymnypd7xmz2fka2r4yxvq2ibf7rvdyl6eemppo74rfehu2d2oqkclcqd.onion:8333
+ympp5jlakwfhj2bozw6w33qailkrqbroizxm3pdfxvjdbrkwtyx5iiqd.onion:8333
+ymrunm2vhoarw7rpo6jdmq4mev5hz63umljki65q2v327vmnw6wjyvad.onion:8333
+ymt2hdfgdxo2awvj2k4y5tbpvapj75j7v34tvvlrqy44lsvvdcnjx3qd.onion:8333
+ymuufa5br75liswfrb6pgm3hc6o67gnzhyg7vpfo2qsw3oyw7m7nsaqd.onion:8333
+ymxea74sswjyqvv7jsh74dnvimcsq4rnao5x5g7dfjnbfy67oj37l7id.onion:8333
+yn3avowdk5cox7qz34s3qiz2u5j2xg3irxckhzikfjv5ccjqrdiramid.onion:8333
+yna4zorq57ehghewlega7lb4zgx3t4lgv5k24orv7b4qcg27svymosid.onion:8333
+ync7fc7dz24s32kp6opdkbvohb74obme4jgo3rkkvjzywslxegist2id.onion:8333
+ynilvzuulga2tlv2hcic7ayc5qpd4nz7r7snsyejp4vxwnxlonf4gvid.onion:8333
+ynkv7njh6hj5xewxxy3gvtnu6ocyvu4tgrl3gnw5xxkdpfshalppqmyd.onion:8333
+ynqgzojvdwv2rui2rlechb22e5hwqipltusdnfkv7s65iz6fgrnybnyd.onion:8333
+yo4ykt7hngppavow7f2sz36ajl6w34bw6qrcfee6i3s6jkm6seove7ad.onion:8333
+yoat2b46hzeuhy7n57gjmfxgppei3xnzdxwsl2ipc5ny656j7zp6ovqd.onion:8333
+yobra7r3ketjuhr4g4cfdqumsez4om2eefvmgxrxq7wxnkouzmcemwid.onion:8333
+yogfxdco264tjbbeek22o26lznu2g2kwvs4lmft3ib3xelndagtf3uqd.onion:8333
+yomwxfciljad63gicbd5757og4lypcph5f5mqdou5kj5rowkyotaohid.onion:8333
+yon5gz4q7soici4i7jf2zaciusioym56jo2bat363tr3peoiurransqd.onion:8333
+yoobb72dyt62n5dpsu3aqpqa3lmfj6gfurno46o6vmqdbpwqw32ahjad.onion:8333
+yotcqynj24k2ckilo54hjhftjuvvwiacbzoraqc2kq5vtmsxloswddad.onion:8333
+yp3juo763dmi7ryhkv3kq2l262cllrru6ks5tlzcdlxdakmip3zosuyd.onion:8333
+yp47gud6fjsvjgu54oica4b3ij4zfreactcaon6fx7v7pfbxbrvqhtyd.onion:8333
+yp6klgnrvisq73qg4dk255h7un2k7pbk666jtzc22rxjs2en64ojauqd.onion:8333
+ypaazf2z3t5dqzudlygjjpyb2uvk63guovstzubsohbbeomometn7cad.onion:8333
+ypakyst4bbhh2juqd6r7xymqnrgwx3eajekpg6o5b4fazccy3mwovdqd.onion:8333
+ypkjkt4dnyqy6svecydigttwnsj5x643w6edk6qzhfo2hkxxu4ln6zad.onion:8333
+ypmikts3saaffj2uo5zmkbac5m7xnbblxkbhpw5xtxbamajqf36wgdad.onion:8333
+ypninar2hybv3jdovr7ax7teq6wpzvrw6n74csq7edos3hzumh2h27qd.onion:8333
+ypoinzgql3zo5d3strpmannbkdtndxkxlajwgcpaj4ngbc5mqrzzgpid.onion:8333
+ypp73pv2vcjfq23ltwhojuremxxfknwtgkxsvwe3widlaevyx34pepqd.onion:8333
+yq7s6pe7jzrzj5uxlorytwxd5bs4kljyvp27akdrpang765yd3sexwqd.onion:8333
+yqnal4phy7wz3lsoi23rziyb56bnbzvvypy2mg5ponzrk63qpyvle3qd.onion:8333
+yqoiqt3molj4ygq44zyme5gdbgee7catlf4ndjr4myiicduuwiev3fad.onion:8333
+yqvhbmvc45iy3drl7nceuhugdt2fevwx4x53zafio6h2626kflwtrcqd.onion:8333
+yrambbqlzkm6o5pkc5q563njvrkfallqobvscvpdik5owbdtnhbc5jad.onion:8333
+yrdtnt4lkpysyyrvryqhxw3k427gxwziosdtipf2dcifougwzomdfcqd.onion:8333
+yrlc4r3qfcr4x5wnciutrdvasrpahor3ui25lgdgkxbit3zwtmwfmxad.onion:8333
+yrmpasdjmb77ono4c6rjh24fj5gt7bbjx7nxurytkmxbww2gam6vodyd.onion:8333
+yrqolwaoxpa32cw2zegnaggmniuer66umflznja6dcp7udqpaoanqwqd.onion:8333
+yrwksigpx4foqlwnf6cxwtppx2z2msompig73dkcm34pwsmy5bwwg6yd.onion:8333
+yrybhm2es4siupjnyjffviemvqx24mqj5niwm2wf56spdqlwau44r4id.onion:8333
+yrzwl3rbfjx7eybyjvnjz2y7qmvpnkexkmylqpwsb7ivpg6ch42mmxyd.onion:8333
+ys2muyvcnpdadettzavleh7qrn7t6r7e2tobfp7yxftta7ez2i6rdxad.onion:8333
+yshp2g6b53ndeez34nxnk4bz6cqbzlfxqdggi7btqlwzxzuc7sweqcad.onion:8333
+ysq5rtpfzkz5gt2s62idbsd7secz3jepzlup6hqf5ttdutsdmwg2ryqd.onion:8333
+ysyx5eagwnqpfemz2nhwcxs2c3eueqk5f3jnyvyfqfno3pflcqfw6yqd.onion:8333
+yt2vub6llcegxuucu3iekjqfpmbyz4kreuxx4su2pqcetw7kbkbipzid.onion:8333
+yta7q7v5lkzt4zyp3m44cxcdtymxgmuqdntnagz6h3hwidmqoeavifid.onion:8333
+yti2ofsqg7k4zbln6aqx4zqaor2zpmlsebyljxlu7jczsjqtd4ctd5yd.onion:8333
+ytkkqeik77zjjwabsdlctuum37jr3r2rg6ckxudza7y7tialqr2wfeqd.onion:8333
+ytq4uowr6vwyjmrjvac7aimjjlzylfmhqhn3z4ecenm5dd6u2ccsijyd.onion:8333
+ytqhsolk7pqur5cu2faxruehvx72yiiwb33p4szdnzidjqksanps3nyd.onion:8333
+ytqzrm7fke3kqgh5b62taq7yyejgtd3yxwaifj2pimoqbfq4p7xi7sid.onion:8333
+ytrhvysmp4iq2qumdrpgp54q3ushkf53b6i4oxpddg4rmlk7hbayusqd.onion:8333
+ytyn2e3bkmgavrygpk5rzydfdmhpkercccqcaks3xtnbgq5qsyg4euyd.onion:8333
+ytz6ov6l5ofhjudlfi5k26lsg4v36p7xwciafy2sdau4cn6ozxgmefyd.onion:8333
+ytznm6jwapg5h3firimqb7ao2g7uihakg3gt6hcpfqkkgcyemklfufid.onion:8333
+yu6ilgxjfffdb3fq7srwwmz6ymp3fxberstpl6vdocmxbrrf5e3tw2qd.onion:8333
+yu7c5kjgmlci4arofpgq5d2qs5fvbw3zac52nampn2vc6vximc6qovqd.onion:8333
+yufe3o5x7spybs5tku64r6hzbrc46uq6izky6z3dyvba2ymblvehyiid.onion:8333
+yuhebtpb6urpsrr3g3vk7tcl5lp5dt7kcaj7zpgox5r4x6ptysxzvgqd.onion:8333
+yuqoihr4p76t2yupxuciurcpzsij5i32enjlsynqor25fhdvidx3djid.onion:8333
+yux32z6r5leyhbdrgdpti4sggxyoy336qb73ia6sk5egfli5qsvkxvyd.onion:8333
+yv2ezeqqfeoprti36q4fds3ckq43vdv7vktqfpn2npv6isnbxay47hid.onion:8333
+yv7ainbyxz6wejjhpjgzx6ghcomdwd3k7fclru4woooxcovyjwrp7dqd.onion:8333
+yv7llcydwvi2m4xpnulhgxcrje6vswtsasu5bbmgxuk3lgln37tdvbyd.onion:8333
+yvgzvmh4ngi36zvn7pe3bocsxj6pccafh7v6wmswkdobbxdzh3b56iyd.onion:8333
+yvhvl5bvjp5ljmooujmw74wdyqnhvwlm44766wwgq5thnzctyni6yeyd.onion:8333
+yvnppv3n3hwexlvugfviwv33ycavxdwnh24dps5vp3y7kw6kze36v3qd.onion:8333
+yvsokw66m7kqqqjxb4mntjvwhnpoovoec6rrpqtdze6fdvpbtvt4iyqd.onion:8333
+yvud2f6wb6puec4xq3a6yruax25jydqepowhz65uvlbvblsyi64skoid.onion:8333
+yvvodwqb3szlgkx4egcyq7qmhpyoqxdyxdnksxl6ppnmagnsu4noemqd.onion:8333
+yw7tqaujnglpjmjak5r7sxvjg4gqeubwetm5h54e7fbfn7yx7kgr4kyd.onion:8333
+ywbprsiodgtlc2qoubvot5qm22logutr2dbizmlond4dcifklaxqlcad.onion:8333
+ywkxlaydopi6ygjeggtv5znptkrldzsh7peg6wabkjmcu4k3hmbjivid.onion:8333
+ywmh5zcx3r2rd7zmkyx5kymgxk43lsamie52kbhayqwqyod5togs6aqd.onion:8333
+ywq6oxdfdvlict3cuasd3akvcl47iw6bxykrvkalemrcyqzyzclbf6id.onion:8333
+ywqkdkihpzr3hx6la2lzqsguoqbuwkn36qcrbkhvltd62zdrguprljad.onion:8333
+ywqp3kjwchkto24so4nn4ofq5m5c454btnkux5jxftkkqz66ducu3mad.onion:8333
+ywqygs72qzxbkjekezlhsnrsfnnvm66igkovfoh267ru7ho3qtxtalqd.onion:8333
+ywvpyur4ny6zhfxpsva4mh6cd4htw4q7ylx7tissnxehwg2bid5fumyd.onion:8333
+yx3nnyxy3h4ex22uqdjwephoprte34jelnkpr4ua3d23ks7qxjrqzoqd.onion:8333
+yxa2iu56fp4i4mxzdkmv7xxrluyxtkylqvexuceivx4fqxbjyzme76id.onion:8333
+yxgvp66ll3c6ko7w4hm7xvzofd3cb3ku3jjqc4wihapnyk3wxijafrid.onion:8333
+yxlaxiaatyfnrx3l2vhb4p6d347djzux75gcl2d33aydlwspo5w5wpad.onion:8333
+yxlwpmsjdbpldhi5hlzopision3iqbjzpvyaaeb4yst3z73qbgqy5fad.onion:8333
+yxnuslj7hslwmofh36a37stlm5jjnq46vvvyntf42uw3zuouot3sjaid.onion:8333
+yxq3bjwdrck3lflvwixj2fc2l7pzqnea5l7cucviamoc63a2xozk7iad.onion:8333
+yxreb5ajudnpt3b7z5hyizaj6ufgd46o334wtduuyaakboxwztgji2id.onion:8333
+yy3bnszld2tbbyd45f2j7btrbdz2p5zsuzie27liqr7xgkfh37rcojqd.onion:8333
+yy7rusheh2cq2xghpsdzlrx4gpejgfvsfhq6333d2jttcovhh5jo44ad.onion:8333
+yygxdcvyp6tn46umpmxlsgsi6crg2xjchuhi3okobofsx4dqgwucnnad.onion:8333
+yyo5s4r6wr6p7l5p5umlp7xgb47ugeptugscv4gvpsxvjlwymfpwruyd.onion:8333
+yyr2peqznujer3t63yyhlcasjndbhllvtxxkmcvr7p4yxpuzjrcylcid.onion:8333
+yywmc2hhk7t56e7jun62oidqft6jvtvvlylexihzgcrtkzxe5axsd7id.onion:8333
+yz3izxf6pdtr3ucbriuo4bpgjn2visad4vgocktexnpv3rfgar3kydid.onion:8333
+yz4l7aqcjf3lcdtdcuxoxljedrcrlo3lu6kths2bvjeoil4wqx3d46id.onion:8333
+yz5i6sldywr2mqzh5qmwoqfgsta5f67bgdhqogejjmpengl3llafdjyd.onion:8333
+yzakgornrhzzenpclo4ahyai5lxsg6mjq4zrwlhqt3ff4sblxi42jwad.onion:8333
+yzbka2sygb5eqgrgk2svqin5hl3dfknzfdn6wzwncexsejmrp5wgm4id.onion:8333
+yzh2ineefkzohck7vkwcfe62kvplsly5xn4dmm25fpxbjq2va34bu5id.onion:8333
+yzigosfexpco67cy3e32xehlpwor37fp52my5pwtr2xsnj3mxl7gfoid.onion:8333
+yzijb7pu6mrrdwb7sku2e3epfyrkhl7t2a723vaisqulr3roaxoy4xid.onion:8333
+yzlai35raddd2kdjnukns7u5t4m4ngi5dfrlq72e6lqf2hp5dzkuszqd.onion:8333
+yzo2vz4kuitm53zwynkm7ddfdw5escsp5fp7rgf6uspphe653mvdekqd.onion:8333
+yzqfzw7fgzzs63xpvsgznhnassxcadbfaxxaxbmkffvesgdxizhxkyyd.onion:8333
+yzrw7ukful7rhvlletmabm37wupkhsxwo2esqqotsoh6gxib57ss3tyd.onion:8333
+yzs2bdhwhxfgaozpcic4v66w7wwlxrr3v4xpgzer733qehcwewijipqd.onion:8333
+z23pfizxwpae2sbje722iesvd6rcxntazcaoefabzsudkc4xxmtbqoqd.onion:8333
+z2eky4p4ozlkrrmuq2jqcz6w2k22re6hxrm3um4ypcnmzmpsi4p6l2id.onion:8333
+z2eo4uckd3ymgtsjitag7yqukmjsjpwuf3d3npq4oskeatpkcinxkcad.onion:8333
+z2gnzha7ttijmle75dvqdzaeqz3xyxzjrrqbzribvwbomh74je4xeiad.onion:8333
+z2ihxne7lyodwglkwpvdmz3a6343msirrvjmaf2pytuo3jysabrkiiqd.onion:8333
+z2lhlshxak5owviqqzacj73ioftqmvq5idawmrgt4k347bwr6yubmqad.onion:8333
+z2njilhjl33youet5rbdfmncadpt7tohtconls3qhpvuqfkreoteqfyd.onion:8333
+z2nocd4haqt257cyr6festid7enoe72qpmu27cuvveoon4rcak4femad.onion:8333
+z2yjvxbv3rfpso4cjkxc4i72f55xb5fihthcdbvh6dp7ghxz2q2tabyd.onion:8333
+z33gr6fni32nkhfmkovcbvpuk7s2atoqfbuzdgz2jszh5ua7zdu6uvad.onion:8333
+z36427rantiy4ikleyihwfwh2ga3pyqqz7doezrzkyv52bi3mpcgt2yd.onion:8333
+z3asgzuzdvhrrejqjnkg5qfeynspuwzzrl3sr7seqxlwkiemnrpsrzyd.onion:8333
+z3hdtpvmnaz2izvnlopzmfgdb2synsomzgy62h7vlxvsn3yqhgufqjyd.onion:8333
+z3hgdhj7zxtih2gkjlnex6occtzw3tpd6f5eobwrntrhxtiww6ke43qd.onion:8333
+z3jl2izfxwfmqnbbrac3tustn4bngymj2tia2sn7nuyconbmjskedtyd.onion:8333
+z3m3a6wii62jc37c2fw7huca7mu4eywnssindvhn3hrh3t4y4kwj7dyd.onion:8333
+z3od23fobhkvypxarneq3fqsdsksjt3hmujnlaiwb65hdwa2n5xdjiyd.onion:8333
+z42np5zjd3thnd54h5n45ibynz5vb3flbgypt4me2c3bnvntn4rsgryd.onion:8333
+z4d7f4dvqutzvvqkmj35znzpyorroqg53jhbft34gyk2h34wzorv2rqd.onion:8333
+z4gvqymmj5jmg3dnao7k3vc245pzepqcrevzyh4s5xn5fcc6ape22sqd.onion:8333
+z4mmpbj7md2ljj2nzbk5b6stdromp2sxhysdexiq6kjqp2go2yfhlwyd.onion:8333
+z4pyvdupcieuqtzvhh47sbiahdyegvpgtwgfmlvfsrm4yj6g5mt6cgad.onion:8333
+z4qgvajgk3tr6aomi7zkpiilx5xb6tvavupvw42sgjf3bfqrgwk4tjyd.onion:8333
+z4rgrsudz3wjx7uykg2kmcadwixklibr5b4k5nulwrpxcjkasu6gnjqd.onion:8333
+z4s6g5bqdmo445vu2i6tcm54zjypfhl5uwnxqjq764bbu5h37gkp5gqd.onion:8333
+z4zr3v232rayjy7e4wuxxez2blz6p6apyv4souxjztqnv3mvaytb4nid.onion:8333
+z52bx6657mva3yjtrutjhxojkbwmrmndk3r3nptxc5xqz3nd62frfoqd.onion:8333
+z5ecnh7crpgo54nfll6qbwl4ybvfbq3izazsdu3pp6zqkam47nuux5ad.onion:8333
+z5v63i7lvhkfdqcex3ioeny62glxhptowtrfof54qbl545mlchkul5qd.onion:8333
+z62kddfut74o5njyehkdlj4caa6yg5orz5lznaccpbloqq2siiwbtayd.onion:8333
+z62r52qegmgv4otygobjdsubc6jffaei23he6n553akc4wnf5ryur4ad.onion:8333
+z63d77gd7artekfeamkqycni7tzrkvbc54fqr733veuoaqx45jwmytyd.onion:8333
+z63fpitzdw3ot62wtxtindh5334uatz2flxg6ronyy6jwx2ztjs4meqd.onion:8333
+z642d45aauehr2ycmv4ewv6zkwjlvlhwf5wlueuy5ynpu4qmffc7utyd.onion:8333
+z65lbxuvo5x36vuv5rgwgyoplqjzzciwvb2whvo3tlghzhp6zij6grad.onion:8333
+z6gr5c5yrp5seqsw73b2pkn3i4aqd5idmzgidjchjjm7f2hdgfkl4fad.onion:8333
+z6n3h75u5kkd5xkqfwbqasd2rekxams3jinrrqaj7p33qdxq7fdlmdqd.onion:8333
+z6n5kkyabl2huqtcp332n6xbo7kpilcw4b64govztw3swtzulgtxcjyd.onion:8333
+z6nq6lkmjoyjhqp5j3tg2gcjq4e3hgduo74unmtmnybd7a777hp4asad.onion:8333
+z6nuvxnjicev3v47o4vxjwakfz6g3jvyo3l4rds5qqfjptqie5re27qd.onion:8333
+z6okjxmclwc55pbwioqx5wyua7rjobcmbttpte525tlt2gexjcjtr4qd.onion:8333
+z6qmf32mld7uqjmx6hroqnkieerstp3vle3u3do6odxig3ubmv557qid.onion:8333
+z6s6t6bi4llpuod6rnakc344wn3h6ejpfejxrkjohjjy246shwfd34yd.onion:8333
+z6soa5spkni5ze6p2xg6lnehu3d7hnqn5ddiy34jtedwegf4syqnnaad.onion:8333
+z6t6fxwhgndvi36vra6d5duaryx2m75v6a5yoz3cqjlj53ko4wm7fhyd.onion:8333
+z6tmafvqwf2sd4rchnafg4urcug4xpkylwls2owruyifaduaeneyqkqd.onion:8333
+z6u4s3uz6bxke3tyibyccbg7uaxt4cb4dued3cu3pbjw6frqc5nil5yd.onion:8333
+z72rd3arkarr6eehucg7rrkjmvqnzdbjmppfk7zcvzd7jqrvisf7rpyd.onion:8333
+z745wkcll7vkkrx7zamibvbyqjtcp3y7wdz5kd33gijxfz54cxzg3mad.onion:8333
+z7eb2xkiigjdfay4ch4pubeqxb2jwyzdb5fo5owkbteyhefek76qoqyd.onion:8333
+z7f7lrvup632wkbzinvbkyyrhmguaf4fzt6zleiynk2vuvwdwt6ysnqd.onion:8333
+z7g3tx3nucmd5ozvs7wgq4i2riiufxlutv2usowr3p4lixfbx54fc3yd.onion:8333
+z7g4iekn3i7nliiowlt3ek7o6xlhi5tv2hofycacjqkpeoijghmiyxqd.onion:8333
+z7j2lcfj5b3isqznsb44ivi66lwmidcfspmvdrmhbfuyub2h3wbmnkid.onion:8333
+z7jbbwkyza6e37iqos6u7ln3nedom5i3dcnowdscr7wfj2xygre47aqd.onion:8333
+z7jtpaghm4na5po5p27fwbdh2aq3z4rkpwhhzemlrhsoefru2z5eyvyd.onion:8333
+z7m7rmzhol6swqnk6l4sadrjgxwnggt5zwgp2jx6tadca74o5puyuyid.onion:8333
+z7mcuih5vw5qob6o5qg27jhozuczpqx5lmzl2ghfxra53tov2h5xtmqd.onion:8333
+z7rxmrmvtsbgrrwwh4k37bpkk6dtu3aq7f5d442ys75nepy6r2q2xaad.onion:8333
+z7u326iowflnv6tvy6uiwwkusx4vat5gdaxwamcp6jd2we35ih6zplqd.onion:8333
+za6k2u2t22ohdrpqbirjhl75eadxcjvnqfkl4bzeygbnliqsc45gplyd.onion:8333
+zabx7shizdfchrfthsjcuyypqy473ni23ebi4aedow4bg5c4tl4cxbqd.onion:8333
+zac6qhbqbb5yo4rvcsmbilp33odkzfwrftwma4yo5hor4brj4d3ksiad.onion:8333
+zad5dkykkoelu5tdj7l7mr24pdf6eos4o7cbs5nvx6bcg5443eqwaiid.onion:8333
+zafdafmd2h6ue2pmuj25chhmkqad3jdcxwtaess2opxkrroopwdqfvyd.onion:8333
+zagkhagdzvkgpuo5znflvxcqxal5tweg3vsaoaonsvsl7r7orhlwshqd.onion:8333
+zahrvinucuxpxu56h6nkiiw7cvutxrua65l4jynvwkzt2bzmeuvdpuqd.onion:8333
+zalrhwuj5j47tntffl77xrdehzfwq7c7duhaq4jwnq5vdtdtajwiucad.onion:8333
+zaw7gnlyeqrlpgcmsp3e63anveudschhifaaezu3web3z6pjjdtvviqd.onion:8333
+zayfuym6j35mxprdsm2x7pvws2vyaoinsomdbgrqbe22rcc77j7jtnqd.onion:8333
+zb226sk3eljxccaswfgouu6mitu43sf2dan4feygrqnlvrot6z65oxad.onion:8333
+zb2qixzmsethowd6fqnwikvp3yeeeo3zvhgjmq2yb27tfslscgkp2zid.onion:8333
+zb62u4o5qzst7rzjaq6tafgzoybi2ncogcjp3sf7zbto7b2xmicwvyad.onion:8333
+zbci2c2pkku7hwg64ek4z4cbyn6o5bnzpzyriqwjckzgs34xmu62szid.onion:8333
+zbmhiorqlldelgniyhwogswpvrlcdjqxxcfm6vulenrpwiadvv37anad.onion:8333
+zbnovu66ikceaodzrkpwww4vop6iwvtebbeznngo2mtjkikwknqzgrid.onion:8333
+zbwbqxytihkvupc5zhezoh7oibfb7bopfcw6y4qbhh2kugnsw6zur4qd.onion:8333
+zbwpgu4z2lfuto566v6duz2qw5kkyvor37rpihk244bfjzqiuohdcyid.onion:8333
+zc2c56k7hcdux5wrlpixrx6lfutylfamr676tu2nr5z2vf5gwoyzrnid.onion:8333
+zc4l45jx3txlag7hduov4su5kl633sykaw7guioejg5pq2qyuescabqd.onion:8333
+zcc4wsaenndkzqdp4xsfzn6ilsdhwzpqiswumdc22dv5ejejec3o7qyd.onion:8333
+zcdv7z3vetrpeo7souyie7u3vyy6w43cuautaogldhs4n2fitytsihyd.onion:8333
+zcezifa7mmgv4voul4jf4wbqmr24djgrskwszktkt5hihywblltpahid.onion:8333
+zcif26i4yzp53k3uedswyrqkdmsmkflpmclmasdo6hat57pqjpm2omqd.onion:8333
+zcnl5vojc5aufydmssv4yxeotzeqpvyoxyae4kmoskty77j4dx4aykqd.onion:8333
+zctnwv5ln3yktcyqsbgie3qcee33x44b5quhjdq4zwjprl75r3snduid.onion:8333
+zcugrsfyxb3y5ucbdndifvt5ilp47a2233sv42ryf2cvzoncrgo2mrid.onion:8333
+zcw6xk4bfnl46fx3mkrmlnknbwnpssxsp7hlllj34fdrkutzts6yepyd.onion:8333
+zcyumipuaiotm5fhffmhit3ajzrgqihhibh73lvjo5hdt4aituudguyd.onion:8333
+zd2mgisets23i4mslxjl75froqjygtue4lnoq56qk3ohd4qcxpop7pqd.onion:8333
+zd3fxn7nwlj76qyjseubm4o2gs73jv2g22px6t24z7p5oeogqe3icyid.onion:8333
+zd7irysta3wti4efbjq3di2jfv237nhwotupj3rtufvvav4e5umtkfqd.onion:8333
+zd7uq75dlcseq546lmbqymh37cninokajwkixpvupillb7fgpqgbwjid.onion:8333
+zdi46azujxcjqa2wnvdecld3bdkps5erbodcvw2mn424gk2by5mterad.onion:8333
+zdm5zxotwdsma3jvij3jmlke5wmblwy7qa2kikfctlzltexx6l35u2id.onion:8333
+zdn24r3iovbxfkp5qx5ng7ribn4cqm4v5ers4olnbzugyp2gbhd56yid.onion:8333
+zdovdneke7oxtxdnee7f43vcu5mjzoa5m4bexpxgvopa5kaxyrcwa4qd.onion:8333
+zdovy6gcj6nrmxaygnjqf3ym5hbd3s7h3irznsbrjmgdywd2rkj2m6ad.onion:8333
+zdoyjklv576u3w4paxyjb4jmdhx2id7xoqkd7zn3sspodasmmazbbpqd.onion:8333
+zdqon7u5ofin5gy4rcmkixc7u42xypwklntwceohpektisokskrn5gad.onion:8333
+zdqxfzqxbaa654nsngnaqdz3jfsfe2u4hxs42covbct2dou7z7jpa7id.onion:8333
+zdtchifs5gqldijr7vzcgqqaftlcydhatm57owdwzrgudns5vpdcx3qd.onion:8333
+zdzkcrnoctqhn26hjbngpcl54nmvozbodf4gwf7anfxjrwhjxgurrdad.onion:8333
+zej7mizjlb26qecppzvgyswervt7ov6f4x6fwrot7obvab23xsv5jjid.onion:8333
+zejyatwyaptvvubp6b22cpow3an47bsrve63l6rerkldmuwwb37b74qd.onion:8333
+zepqddw4zaqqawkx7aqezpqwykxmxxeh2opnl3xnq2i6piazcvyb6qid.onion:8333
+zeso2dbskp3curnpgug5mjyvhs7i6rero3zbqo5n534wccstcok6ywad.onion:8333
+zexnlgnfxldyx6leiqvyhuimrfxznjfjoko2ek6rdtu4dvwkvztfysqd.onion:8333
+zf4cm7bgv4qollcjcj7kpx4qrtqzcsa3q7sds2jc3mxu45gvazlts3ad.onion:8333
+zf4k4efdpcwsfyobz444dgdfnsa6tdbd6aor7p2s6mpuol3ladssb6ad.onion:8333
+zf6nwlrrtd6q73svcimgfp54pinn46hbcriqnqqsitz3fbibzmkev3qd.onion:8333
+zf6tbmhchmzo46lmhx6vu3smjj3y4hjjrv4lnwpa3uq7bvtjcwapmqid.onion:8333
+zfhx5nerqkerm3jfoq4763vlmay4pifit5a6a6jtcjxpu7t4galhxwad.onion:8333
+zfo72va3rnioxbhh4kuth4epqwqque74aehlonvde3re6mvhz4uzgaqd.onion:8333
+zfomias3uj7w6sai3ty3coxhnb6voldudbeyldgyedxqo6kfc7rg7sqd.onion:8333
+zg2yslkwabguckkqanyxwbncrtozc2fjivsyesrcd27xxkowkbcwnxqd.onion:8333
+zg7obxhb4c4j3dgzg47zffbetclv2so4foyutdxizfnedhdkhjzo2cid.onion:8333
+zgaubbm4h7qckt4pgtp5zawrcf6aazby2zk7aeo5xsqpgwsc2yrlbiyd.onion:8333
+zgegpxbr7z34gupenib4tuwywyk4nlevo5dkfg3jt6c2jw23len76qad.onion:8333
+zgjrto32gianyp6i4gc73nlilodiqyo2s5dkr5ev73yq4qvcjxkwycad.onion:8333
+zgp3f3dmwbnr7257rouxkgddijr34keobzrtk5gkm2dgfbw2bylcwqyd.onion:8333
+zgrpshddeijmdp34xfyw2kz22la4jxgwce42pupjp3bo6xtchsorrxqd.onion:8333
+zgvklnnz2avqcnyiffw7t6umb3is4tfthnkzbhnyfr76sjtwu5u35pad.onion:8333
+zgwclfbi25s4ta5hfiwylboeitti64xzoan5aewuqimp5j55nye663qd.onion:8333
+zgxg4d4jifuihgozqblrt3kjkrh5zhbr4uyivtrzf2khnbtbe4z3qxad.onion:8333
+zhabxolberrktnga2eixvhe6vmaoxour3ktd6jgjq3emzkgthsmaq3ad.onion:8333
+zhapnpxpk3lmrfsmhluytttodeosmie7yabywa3aaxmtkreh2lmeemqd.onion:8333
+zhdd42th33pv6qnfi7v3w3gddy3tlgu6pjo2bhh5ezuytutxhivbtqqd.onion:8333
+zhea7pvhuzw4cte7pkd7u6lwjyiqczxi7wgvzhfovtjd7qwdc24pleqd.onion:8333
+zhgdvhnh5zymbwrmd2rfjncparbxfiyraqh4imk6kl3tkltgccl5cgqd.onion:8333
+zhhkv5u7pxuu36y7vzu6wlbjpd3wftxfuadsst3ifs3q23eydmako4yd.onion:8333
+zhhxxlz3wvdaj4scdetokkqgs2ndmdvyfwq4qwrn3l3hv2iftlgsucqd.onion:8333
+zhrzks7gkdvyef6s2aogxxuw7iqheixmrdzgkqotpvl5bjz4vq5tkkid.onion:8333
+zhwmsba7q6vn4yfi63p4tc3dobsarso4322ynl5ofggjbyiozefttcid.onion:8333
+zhzpumb4itgdxy53chqowtu43ru23ag3f37r77ydjs3t5o7bookfe3ad.onion:8333
+zi77cxawtknqkjiod4rhf7gsughbvv2z6e7mg5kax465uc4vtg4cwlid.onion:8333
+zike5s7xtcgp6frbjgzjhcz6gsvd3pghkl2jin3sdasrek3vy7l4ibqd.onion:8333
+zip37ysefmcbnyqvt4jiag6dj3h45ie7h56hmw7ktheotkuagippyiyd.onion:8333
+zipzgdr2m6gmjfucup7xpertovt746f57hrgb7lj6m4rxeniem6zdgad.onion:8333
+ziquiv5d3hditb2r2qmt7hn7knosdcokxe3khj3kgn253l6cynl62zyd.onion:8333
+ziyp62u4xfsuljn5ae4n7jea7wfd6vfutket2e73bzrhpstozs5364yd.onion:8333
+zj55khmgsehm24efh4nmye7oao3u3l4tjuk5edghey3mt2ippfste7yd.onion:8333
+zj7jf7o4b3qztdorj2stojv4us7lzqs37fbubqpqq2wu4dxi3cxpa3ad.onion:8333
+zjdf27w3vt4rpyb6usa3r5yi455svyaha4qtsfwvyrmf3hmz5hckbwad.onion:8333
+zjgnxih45rz3kalgxvhyebyavcnohmoa3bcnl5cwkmq5pmbyypavqcyd.onion:8333
+zjx5rmakdzormbwzl27w4xcucehwiat3dnncoqdiwesbmb7dg4fpmgad.onion:8333
+zjy7d5t6rxljc64pvta3hqi6yxzfsnixtbslafamoxiiw6ptcmv3kfyd.onion:8333
+zk3cgisxp3uxevuxmbzbmqyhvkhezspeydo2bmhu72b6mw2kl6v43fqd.onion:8333
+zkc2lid246a5jr2dpxtvmtu2tfiwt5dbry3xybu22b62vguco5a4qvid.onion:8333
+zkisbl3pv7dsz3szdawti4r7mhrhssqxf3uopi3vrib5dpt6u2u7ckyd.onion:8333
+zkjnuuenigzhs6d5y62jct4tira6fzijqx2k3yzsdsyulut6ywp5muid.onion:8333
+zkjoev53w4e547zot35onpmij4fiube4aomnysttqtv576zdr7wex4qd.onion:8333
+zkl2fsiisu3cyhhsua7qlr5afhyvmfh4qmapgubioyhoepqdb46jceqd.onion:8333
+zkl7x3u7365zj6opig53dxtty7ctw2ijidwa4lbdbhcv3wkld22bvxad.onion:8333
+zknqouk6z7g7h5y7rmycqb6sgzykylbbfpvf5efmzibww377iminltyd.onion:8333
+zkq4fgcc4bxksbsi74pjwjfby5tdwn26yhjnmewy2qy6a3l5p6bnaaad.onion:8333
+zkr66xkrvecgu6jkyan6nxvtefynf2mpsls5csvf6lt6ltqvoscw5yqd.onion:8333
+zkxe2fnm4tsmbu4bdge7i7j2cesfrq5oznfzobf4mwtejbhenp7ubxqd.onion:8333
+zkzj45moxjhjvrzqweh5g3iyucdb2qaqby7vdtmlqbvxmm5u337aglid.onion:8333
+zkzj4uhvvpav6ee7djkfj2uem6tyswi7idzupkozspbgr2kfvrk5biid.onion:8333
+zl27cum3gly7nfhwl7ulnob6pyichpxglnss4ffqv3terkquhf3dm7id.onion:8333
+zl3dx4nswje7l5p2fgvypve5wugfqtcru2ud55qo77tqdp2btm6kp3qd.onion:8333
+zl4gt6uafawn452rlqb4w2mujut5tjcnq4ahdr6ucdyeu2gtzlsk2jid.onion:8333
+zl5voqvgyf7deglpxamz6hpg4bierfngqsmmu72wpeut7toja47v6bid.onion:8333
+zliat4frxeuirx3nbijcljvgr5wembicg26fdpgda4pnps4oguaobmid.onion:8333
+zliy5o4uqgpqj2nbgyadqnlomnjtmdlwoxcuduwcfavzsguj4z4iwzqd.onion:8333
+zlkwqytpxbhkg4umwpqiynz6niefzqjbiwzryg2zpwwmvmw6pmssngqd.onion:8333
+zlpztcqey4osd3omtpsm7micrh6jrxuqzeeendpngk25iyfhleieekqd.onion:8333
+zlx2jkuv2iuzffo35hc264rnvoimzccvtlljdbmut4es76qe5pnvs6yd.onion:8333
+zlzhg5hipy7nc4ulsaprgro53f63mjj7je7m5xptgkksibgvbc6r2fyd.onion:8333
+zm2j2k2nl7pug2amadjkrcgs5omdnxctyl7b6kmlywsphcfl6c22gtad.onion:8333
+zmfmdmzlsyy7owe6vpgugvdq664vjhluqura3skjlm6fzpgqe6udm7ad.onion:8333
+zmfmmn72dg5jjkovy4jt56c6btg7pgp7wmeh547zlvavwmlbrbsl5yyd.onion:8333
+zmjncrrwtui476nyn6sqbp67bvgdhotllq33vzwygasumv6d2us64iad.onion:8333
+zmmtddrew2mjtghs7zjiyi2eelmyss7miyj2axzwfgnmvzthx7phevad.onion:8333
+zmn3jyv5a2rod2udnreygi6uan4zq5ul4mhewyfyrf7a3ury72bycuid.onion:8333
+zmqvv2cdxjj3vbclq7l6rfdmjegmixwkxsnzzd6qezwp32vxkr2cbiad.onion:8333
+zmt7psgtnnqxk6tibhvwkdfuhtgtjatz6bpoyyl4ptuv3u6ko2b5o5yd.onion:8333
+zmtd72b4nsa22ocez2hbjsxxrdfuxxyghg3zjtqjob5sgnjpustat4qd.onion:8333
+zmuuhwxhoa6h53jijpb6mczcvtxhw6zyjymm53dwzsbmkc3kkv5v64yd.onion:8333
+zmvriguathsanquofxml7kgcda4tkihm5qked7a6ntbqk7rmz7qadkad.onion:8333
+zmvritlexdmgatfqjlexl7wsx3lmf7y3qxe2kqeergb7ntkfu4nky5ad.onion:8333
+zmyavuyz774c2fo3eb55yokivpr7qfxdpjy2t5wpeygunhulck7yxzid.onion:8333
+zmzjx42yxlpepdgya34rvwb3wc2peggturiedmn4sfjltgy6gjtspsid.onion:8333
+zn3gjkpqkajav76kaem2espqt2bw6ggfvmn4u3gmkonds7pqd5heqkid.onion:8333
+zn3mj2tggwpbzzkvtsovkrbdshbsvac7n676hbi76r72de2b4gknpdyd.onion:8333
+zn5purhx3rnikkks5tx4scnjlhewwll3uzcs4pgde3qeqawof3jefhid.onion:8333
+znaiehv3qrtloxdi5rkbs4eqpmuveazuftob3sqzw3ta5pyakuwhx7qd.onion:8333
+znbv4cupk7rrdk4rqi6xncbouhscxnqdlbxtltp7564isfv5vtbyu7yd.onion:8333
+znc4xhwywjqejoioap3ssxvtsdilsc6i5o5s2rnp2ecmxqe6xe2nh5yd.onion:8333
+znea5ol7qgniizv3og2gfcbxw2wi4qhk7dfkdlt7bbxpy5aflljygbqd.onion:8333
+zngxgkdgkqpfyepa5cvxlaxvlyluzdryhzmviar4ojzaduxw37hhdmqd.onion:8333
+zni7kioacgsy5haqiftnexr74sv7rzvgy5o6lmz6dy26vvwg5lffioad.onion:8333
+znlvmmj4dvpju46kbb6mob4kufyf5a4qivyygmjj36kymbaa4nzi42ad.onion:8333
+znmgbi6qlwwwdlizjxsc6eujnfwgytufu6guo67b54av4y6inwgxllad.onion:8333
+znmwoazdkcffprail6h4p4opy7i4zqomhpdxe5l5nc6ejqagvt4i7yyd.onion:8333
+znt2jb6nivjgl47s2gdcgac3merqjfq5h2n6x6mbjegx6fumtl2ownid.onion:8333
+znvkqu376ienu62x5hprstn36jfqxospcnfhpc3kq5quwcd6436pzuid.onion:8333
+znwekshd4os5a2n222xrllgjuyvsw7hsb2y6br7pkwjatywk5lerbtid.onion:8333
+znxkxyd564sfftgjscsmi3a73jsazxwhsneix3bgto4suyjx356xewid.onion:8333
+zo4fczw4drgcbsumtgmigjkiso4miz34ltauajaawqmqoa6oxmzy4nad.onion:8333
+zo5jasvz5qo7pkgrgn4r45twdic4zake6zpjfemj6x2ioxcwvs7yzlid.onion:8333
+zobj27bempyxsigdvawc7foivyyuek73hemep7zf2tajof54353ok2yd.onion:8333
+zodjfmegrevmjbppq2t46iluruefbgh3b46tbrl2s5qkprvbetk3euyd.onion:8333
+zofseltpp23n2xb6fsmfgkwgqggwhrelxmt7zq7toazybgehbs7d5fad.onion:8333
+zohxazkomcr5ggqlj2edu23zs6xiay7wfsrxuetrn2k2s5gwhwhcngad.onion:8333
+zokmgys3gsgs5oivjcqp3xiki25iexezy33ekzuratdz3j5unqpxrzad.onion:8333
+zosjvclhqzwklml43hvsdmupglajj5lfdb5h5frgym7hsqo25rwrbdad.onion:8333
+zosk6fx2a3mxkfaeayziiuizq3y3j3azzp4ylwyh76wq2sqtaenuwdad.onion:8333
+zovm6wkattzmxc755cgqqd4sxugn3jaxw44izlm4yfpot2ucfeqnukqd.onion:8333
+zowc7rklhd6xhje724xomkftwimuihacwcnxkt7vhbjpvpkdahvlhxid.onion:8333
+zp3vpkpcfdx5lxvnuellqaf5qdvhu4luf4zqfx5xjo2dge7cqsxhsxyd.onion:8333
+zpgobpk2j2suauhuzfmh4iiz3y2zhj3xvb3g2t4a775t72stt3majryd.onion:8333
+zpgybnbaxfvzjeus7qna45zchxdkekjpk5webdkeqtxfwcglgogm2vad.onion:8333
+zphjbml3fqtbez63bjvd4s552yc2xebitadkpw2jon2qkbapbiltijyd.onion:8333
+zpnoo3qordv4xj5hjynkssu6wechvup6to7pamrgbi4ljmfugjyzwwad.onion:8333
+zppmhj76a6dyjch5qtubosxcyvtwjnb6zndsfywxci7dy3vc6lbfusyd.onion:8333
+zpq2nzcnlasmy3rmwtmaybav6t7xfrvorqqdwntnbgbxqujyy3dkwlid.onion:8333
+zpqvo25bxu4n2u3mh2pdzax7wmpsitd3qsszgw2ye3mpfdpjbg52kgid.onion:8333
+zpx2tq27yviwzbpc4nyjfqtlhigoa5k7cwl676nft7bkajo6jq224hid.onion:8333
+zqlwzzfzdoacgngtsnofmyqetag6o44f5r72opj733y434b7npnb4oyd.onion:8333
+zqq4g2eikcfgls64ffstsylfbqrfstm6n2otvrsbtvvjpqwgyqdnmbyd.onion:8333
+zqrj4fhhp4mq5eh5xptzcxjzpae37brkdn3voz32qsohl6noijygdkad.onion:8333
+zqrwah6dn3t5fuj7ohlyka27zzopduhxy4wyknfrtqpx4sykece65fqd.onion:8333
+zqtyvr7h277x5rxin6rhsrsbhwcfsyyiqgghpk6jlbewej2v3tn27yad.onion:8333
+zqv5nepyrwezkym2ba5s2sskmi2qck22snw2rygeke45bxg2o4vckuid.onion:8333
+zqvbnqwwhtoux2sxicng2blfiowk5mvty7c5xnssxwtlsjzalhg3zqqd.onion:8333
+zr222c3ybuqxn6a6piydvfos4zjnaklfgh6kofmujmolpiprfw4z6vqd.onion:8333
+zr6ffisxxo4gelmkoyb7izfm7ehjrbqbnzuguw34to34bqhxeeqzzjad.onion:8333
+zr7sqclimv46jdnmmeazqrhflhiqkhhrz5i3ed7yvyue63swk3qkjnad.onion:8333
+zrrfr5sr5wrgdt6rn44cxnotlvwe7cl67rgssw5dwsax42evokdaw6id.onion:8333
+zrrhgs52ftlylshuwp5e2uesgqnwct7h6cqhzofdduwoi4sz3shmxxad.onion:8333
+zrt3rg4paxmo24ucd56eehl7apindhbubq3ej3q5nhr6i72jv2eznryd.onion:8333
+zrvsjjrb3lgvmeftz2vfjva4pl63htmv5qyviq7zhnfmlk42evrxdpid.onion:8333
+zry2rqlcqf5p5e46wc6nmtcbt5vd45mf4hyf4nxlqogckoniufdjklid.onion:8333
+zs47b66pljpz4ahompanciv73xtztnnzkx4wjklt6hh4drsge4m26iad.onion:8333
+zsalwutefh6m6x6yxccbhulzrz2bmo7dzu2ggu4hxp5zv3xx2j642dyd.onion:8333
+zsbzferezmnyxhpktxtccn2xxuggmdzdnrza7pqjlnwjorgx57y2acyd.onion:8333
+zsgtoyy2svehhfba345dx3dazp7tfdio6o34zxlcgylq6pi67gjq7nqd.onion:8333
+zsi55x2nvjc4oqrpzzopkneukb5fudnm4e6drao4x73lf4zshhcvllqd.onion:8333
+zsipwsjpm4f3p6ueczh7lqei5rp3cusl6t4d6nntnwxq72hori5f7jqd.onion:8333
+zsisadra7jlxp5nhec2vsjwspvvnk6jemjxk7zn7arypl6cm6dy7mwqd.onion:8333
+zsr43xqj6nsrqh6qgxghadctltwytnaw4zmlvx6exqybt2qdt72f5yad.onion:8333
+zsxgefpkofjc3nti4qusk3pdqcfinkljajlwcb2cee2tduxltxbmrpad.onion:8333
+zszufrszpweaoysubpdnqparmyotjnev6nhhcnejhjjftu5sb55kesid.onion:8333
+zt6gkop3n6aggrxucnaqp4yrjeu6htwvuy2nyn3vadjjrodwxfhfv3id.onion:8333
+zt6hvzyoalzm4a576drn7yfvdetdvzwwouvfz435wzrf5pcnxqxplaad.onion:8333
+zt6v7eqh7vvlwy5kjzbdfgkw3syj3nnhckyghlzgmwwfccxvyfusuzqd.onion:8333
+ztcmlrstdkp7coheeolpwj75gp3imzgiw26xnoiucquwhxxcofao63ad.onion:8333
+zthmey4ueoutf7q36nwgujxu7hq76s5ifbtanvze4mxq2s2xq2cmjwad.onion:8333
+ztmwsyo35zkogpftujm2o7oilhucjxe3w6bjagsaiwtb2bu62vgjptid.onion:8333
+ztou4ytvgvpcakjaje2c6l5j53rxcxes7qhkerszi4haffxfpj3kdnyd.onion:8333
+ztwryklhcnfoeck4qntt2aitoilit2cmmr2geyqo6cjc4nwr7jlludid.onion:8333
+zu3ekh3vtqjfnxqjqlmnq3jbqlg2zum4ehgirz5cggwe2thjmgkz4cqd.onion:8333
+zu3yh7mvqw342e7qt5amwtwe2btjubi6t75k7wgcpsyoicsnpgbgj5ad.onion:8333
+zu76ecbahyc6ofjiiutna6myxmfdcsuhcrhtgpifbw3vfo7njd4b5tyd.onion:8333
+zuaotutv2ngbf5ot5kvz75uehbh5e2j726fglhqw7omk3b7xnaastpad.onion:8333
+zubmiztmnfy2vqowqmpyzbqtf2a43jgazsex6zlxokhfmnzmi3rht6yd.onion:8333
+zuc7sobx6ttj7lswk32raexasfbxc5kd6a3l6td35srqzkj3emsv4uid.onion:8333
+zunmnr7czrxvfjgxtvkwk6ziti5kskx4fi3j4dzahhdljfsqtz7yeqyd.onion:8333
+zuoml3m3jdkoh5bdrwfecnew5f4mrlcwhmhkn456qsa72cp274pbgtqd.onion:8333
+zutyd7pzkyejctriyr2lqlrex3arkunntsdjo3kgw2qj5u3fj5uyusyd.onion:8333
+zuzdl7nnjhy6inyqwsc5i7fae2nregm7wnyrtolaxhi6oiufyc7l26qd.onion:8333
+zv2nusexbcrncbutlcprevwhvbtqlyri3stjwmgl23x7fdqkmae6owqd.onion:8333
+zv63heoa7jstwhq3wg2nibip36bw4icd7jphccy3li3nut7gp2gojqqd.onion:8333
+zvbhycudpglrdi3sk7yixe64eknydwzzisc4n6xmxwhb7xyyzevc4nqd.onion:8333
+zvgutw2u7tu4dx7t25leghdp6j5n44u464mmoypafwstayp6ggabtkad.onion:8333
+zvjn5jscn7jncqss44uh53gvi6b4eycjqp42t6pv46bsr7gine5cbrqd.onion:8333
+zvmxfy5z7nxeknglvpbh7rveoppkyvvzvnpwxon2kgkepafnq4igheyd.onion:8333
+zvpcm7eemfvlklgqio3fgzcwa2vukg3n7caov5itik36kdua6mvm43qd.onion:8333
+zvzirfk3h4hk52j4u254y2np6ve2xttd2nugiccsqw2liiw7aqmglkyd.onion:8333
+zw4olgpxujj6iydkmhuxbx37b52syl5bm6embyebesysep2ignp2dgid.onion:8333
+zwbnovgpo4qxidylubpdrhxm34t23iwaniawfshiqrilttwqjnnlohid.onion:8333
+zwbqgh5le73aurfmbwf5ivjb7ycemwnjiq2jnq4sqz6epl7rdtd6rtid.onion:8333
+zweiy44ngrkfzhnaoqov3fopwqd3uhwsen4v6sdyf3ynmhlpuluvzeyd.onion:8333
+zwg2cvvkm37u2hicwbjasqzdqdhcblwvtzsulmz4kpbebf77jheiaaid.onion:8333
+zwrp2kb2covbrr3xdz2pxr6gg6ndnhpcgfvjkjr43eudnl5aswxgvbqd.onion:8333
+zwsapfrsxzsomsoty652jifwii56st6fg7bs2crr6boveh5o6npl7vyd.onion:8333
+zwtjkx5blzs4i6e7hwfeekcwufdl2lba4j65243tvkajder5iodkavad.onion:8333
+zwu3ep3zqki62b7ldjbsxk4dm4rlppkxpzzqfwsfvkoihxltm3y4qaid.onion:8333
+zwwpbfpymszcmkwlfozzl26m66r6n7xzgnw6bs4nf3pypqh36ya2w6yd.onion:8333
+zx37fw5b4eatt3dekaefun3ln67agpt7oqobeacvyq4keurbj26azwid.onion:8333
+zxaujdps5ce6wvk6ykbfquygtbli4ecvpokj7oyfxjqiionn3u3fdsid.onion:8333
+zxbq3k7hwswo2f374ahsmlgkpdj7ju7pyygurkvzqaoh35vmxleewsad.onion:8333
+zxc2bzuqdkippxthxbg7n7e3lznbcnx7zyitlhwvjusbwr5v32oxueid.onion:8333
+zxcnzlo2eigfig66vxyx43znm66a5i4ieuiosycgddgzdff4vhn6zhqd.onion:8333
+zxk4bqrede3tnlb7ymjlsoyupc37r2vqe647otr3nczqmgfeoyiu75id.onion:8333
+zxqdpu4gmvn5vz2kdld6c2swqdzknwh2czwsw55vx323orvtk6a6igyd.onion:8333
+zxqe6efq4odzd2mvyeglqto2cfggagoicgcvlvca4mxycg47jei4uxad.onion:8333
+zxzfz3z4nbb7u3ifcv2p5xenzpbnzuuezelbbjcfrmupxtqyoh7uhyqd.onion:8333
+zxzqhfwi3gdheuxmzagp4aw4aks6cii2llljapcvqhtqrxlksxddo5id.onion:8333
+zy4jeshnpx3i3wjcqrb27qcea4qetpez65wpocat5sqncz24xeo6sxyd.onion:8333
+zyccgvzokepone36ulu74l54ad4dtqv7a2bjzcvopj6rg5xhbc7ihjad.onion:8333
+zydziohabauwybhbqkegn4d5r4257bmfain36fatcxdbj2nw5zoa5vid.onion:8333
+zyetfkanxicfp6tt5tegkxlkoz5rl2i3zsc6hyyqizahywbktezfuwid.onion:8333
+zyjfoui3hrpsw3fo4owxrztclffqhr26wdedizvz5xvlgurgixit2mad.onion:8333
+zyku4bk6pdifla26hympigytlwsx4htajcn43hhobdbrv4tfojv3snqd.onion:8333
+zyl4kfejs3t4vefsvuqrqopboxrmztuun62jick4uh3wpu4mw7dpqlyd.onion:8333
+zyphknlr4ogrknj5t64qya246kdaasgirn4iercvesggqplzzxsisbid.onion:8333
+zyrodumrgvgpinhygbi5molpbhl6ndfs3lwtt55pumd6wy5k7nb3esqd.onion:8333
+zyvgumk5pcanh4zk3z72glefxgbd4dpyhsbzvqlsp2gspaw37lrhjyad.onion:8333
+zyyefl5unnw7lnrjlgfyvnytw4iy4n4cy5bbs2nudjh7wp7psvefmfid.onion:8333
+zznngqwcp6g55wkjg52rzeogk3fcdpopyl3zprh2fz266nykv4sqveyd.onion:8333
+zzntdfpcb3spf5pb3g2gczw2njmhwwksgxt3twbzjhbaisihg7h2ywqd.onion:8333
+zzsi7brufwylb52w3bcbqvp5jx6vribh6geiqfy5jhxpihqjjaox7vad.onion:8333
+zzthz644hdjxn3d54xrfe7snnuyhsx2cguy4kqb6dpc5u7aun5lflbad.onion:8333
+zzuipjogcfvs7uyfhfgesehon6viegga3sc6c6265n235pqmkwyqfmyd.onion:8333
+zzul2xvyhqvajnd6zfs2dzljoppx5lsp2xt4qad7256kpxrv3wzyiuyd.onion:8333
+zzx4r2yrkxul2kg2ojoeijwce3skll4wbkkjw5xprstn2o2xw6n74wid.onion:8333
+zzyp22x6ryzyin43pltkup6jki5ynboh6cwpucscx5a3md2tooqn52yd.onion:8333
+zzzzzzzz5bs2qnoijxlhxd3ibxipajesgprqlrxtpfbygw4zcaf6oaad.onion:8333
# manually updated 2023-04 for minimal cjdns bootstrap support
[fc32:17ea:e415:c3bf:9808:149d:b5a2:c9aa]:8333
diff --git a/contrib/seeds/nodes_main_manual.txt b/contrib/seeds/nodes_main_manual.txt
index 91a64c6e51..a3f00ad52e 100644
--- a/contrib/seeds/nodes_main_manual.txt
+++ b/contrib/seeds/nodes_main_manual.txt
@@ -1,93 +1,1027 @@
-
-# manually updated 2023-04 for minimal torv3 bootstrap support
-
-2bqghnldu6mcug4pikzprwhtjjnsyederctvci6klcwzepnjd46ikjyd.onion:8333
-4lr3w2iyyl5u5l6tosizclykf5v3smqroqdn2i4h3kq6pfbbjb2xytad.onion:8333
-5g72ppm3krkorsfopcm2bi7wlv4ohhs4u4mlseymasn7g7zhdcyjpfid.onion:8333
-5sbmcl4m5api5tqafi4gcckrn3y52sz5mskxf3t6iw4bp7erwiptrgqd.onion:8333
-776aegl7tfhg6oiqqy76jnwrwbvcytsx2qegcgh2mjqujll4376ohlid.onion:8333
-77mdte42srl42shdh2mhtjr7nf7dmedqrw6bkcdekhdvmnld6ojyyiad.onion:8333
-azbpsh4arqlm6442wfimy7qr65bmha2zhgjg7wbaji6vvaug53hur2qd.onion:8333
-b64xcbleqmwgq2u46bh4hegnlrzzvxntyzbmucn3zt7cssm7y4ubv3id.onion:8333
-bsqbtcparrfihlwolt4xgjbf4cgqckvrvsfyvy6vhiqrnh4w6ghixoid.onion:8333
-bsqbtctulf2g4jtjsdfgl2ed7qs6zz5wqx27qnyiik7laockryvszqqd.onion:8333
-cwi3ekrwhig47dhhzfenr5hbvckj7fzaojygvazi2lucsenwbzwoyiqd.onion:8333
-devinbtcmwkuitvxl3tfi5of4zau46ymeannkjv6fpnylkgf3q5fa3id.onion:8333
-devinbtctu7uctl7hly2juu3thbgeivfnvw3ckj3phy6nyvpnx66yeyd.onion:8333
-devinbtcyk643iruzfpaxw3on2jket7rbjmwygm42dmdyub3ietrbmid.onion:8333
-dtql5vci4iaml4anmueftqr7bfgzqlauzfy4rc2tfgulldd3ekyijjyd.onion:8333
-emzybtc25oddoa2prol2znpz2axnrg6k77xwgirmhv7igoiucddsxiad.onion:8333
-emzybtc3ewh7zihpkdvuwlgxrhzcxy2p5fvjggp7ngjbxcytxvt4rjid.onion:8333
-emzybtc454ewbviqnmgtgx3rgublsgkk23r4onbhidcv36wremue4kqd.onion:8333
-emzybtc5bnpb2o6gh54oquiox54o4r7yn4a2wiiwzrjonlouaibm2zid.onion:8333
-fpz6r5ppsakkwypjcglz6gcnwt7ytfhxskkfhzu62tnylcknh3eq6pad.onion:8333
-hanvo3hzqbhcqm5vahhi5a3czxxdwc7vt56p5gr7bifcvelaqurv6iid.onion:8333
-hz7oqntvj4adrwtqappcgaxfribg5u4rvfkpwlo3xup5fcuyvylkxlqd.onion:8333
-ityrxhidvjnjnf6imzyuqqnkkwridjnebkbokx25so3suq3fzezmksid.onion:8333
-jto2jfbsxhb6yvhcrrjddrgbakte6tgsy3c3z3prss64gndgvovvosyd.onion:8333
-k7nb3r7hxi5exvr4xmvnilhfw6hei7sw4rwz2t6onh4py6wbora6tuyd.onion:8333
-kpgvmscirrdqpekbqjsvw5teanhatztpp2gl6eee4zkowvwfxwenqaid.onion:8333
-l7kw3vjs4cf5mnuejjgqcxrw6wwsjmabllq3h3amy4f5q33d6cgo2kyd.onion:8333
-m7cbpjolo662uel7rpaid46as2otcj44vvwg3gccodnvaeuwbm3anbyd.onion:8333
-mowb2qwpjgs2a6q3yj3xa7nxklfssul4w7ynonyycw3uyopfu3x6ujad.onion:8333
-mwmfluek4au6mxxpw6fy7sjhkm65bdfc7izc7lpz3trewfdghyrzsbid.onion:8333
-rfqmn3qe36uaptkxhdvi74p4hyrzhir6vhmzb2hqryxodig4gue2zbyd.onion:8333
-rsgwtnousfc7zyg4qsm3gvczjx7cihh2njyjbjl3qvcj3xg7wmvhddqd.onion:8333
-s2d52bbttuwcl3pdrwzhxpmhtxn3jg23havjqg5eygwhtiw6lgyelpqd.onion:8333
-upvthy74hgvgbqi6w3zd2mlchoi5tvvw7b5hpmmhcddd5fnnwrixneid.onion:8333
-who3qs4eqlqzoxhqqgan4mg54ua5uz3mk4lj33ag53ei4orvnznrjbad.onion:8333
-wizbit5555bsslwv4ctronnsgk5vh2w2pdx7v7eyuivlyuoteejk7lid.onion:8333
-yrmedr35tt4wqfnwgilltxh5bnukeukxjpgg3jzmmsyld5lgsn5amvyd.onion:8333
-
-# manually updated 2023-04 for minimal i2p bootstrap support
-255fhcp6ajvftnyo7bwz3an3t4a4brhopm3bamyh2iu5r3gnr2rq.b32.i2p:0
-27yrtht5b5bzom2w5ajb27najuqvuydtzb7bavlak25wkufec5mq.b32.i2p:0
-3gocb7wc4zvbmmebktet7gujccuux4ifk3kqilnxnj5wpdpqx2hq.b32.i2p:0
-4fcc23wt3hyjk3csfzcdyjz5pcwg5dzhdqgma6bch2qyiakcbboa.b32.i2p:0
-4osyqeknhx5qf3a73jeimexwclmt42cju6xdp7icja4ixxguu2hq.b32.i2p:0
-4umsi4nlmgyp4rckosg4vegd2ysljvid47zu7pqsollkaszcbpqq.b32.i2p:0
-6j2ezegd3e2e2x3o3pox335f5vxfthrrigkdrbgfbdjchm5h4awa.b32.i2p:0
-6n36ljyr55szci5ygidmxqer64qr24f4qmnymnbvgehz7qinxnla.b32.i2p:0
-72yjs6mvlby3ky6mgpvvlemmwq5pfcznrzd34jkhclgrishqdxva.b32.i2p:0
-a5qsnv3maw77mlmmzlcglu6twje6ttctd3fhpbfwcbpmewx6fczq.b32.i2p:0
-aovep2pco7v2k4rheofrgytbgk23eg22dczpsjqgqtxcqqvmxk6a.b32.i2p:0
-bitcoi656nll5hu6u7ddzrmzysdtwtnzcnrjd4rfdqbeey7dmn5a.b32.i2p:0
-brifkruhlkgrj65hffybrjrjqcgdgqs2r7siizb5b2232nruik3a.b32.i2p:0
-c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p:0
-day3hgxyrtwjslt54sikevbhxxs4qzo7d6vi72ipmscqtq3qmijq.b32.i2p:0
-du5kydummi23bjfp6bd7owsvrijgt7zhvxmz5h5f5spcioeoetwq.b32.i2p:0
-e55k6wu46rzp4pg5pk5npgbr3zz45bc3ihtzu2xcye5vwnzdy7pq.b32.i2p:0
-eciohu5nq7vsvwjjc52epskuk75d24iccgzmhbzrwonw6lx4gdva.b32.i2p:0
-ejlnngarmhqvune74ko7kk55xtgbz5i5ncs4vmnvjpy3l7y63xaa.b32.i2p:0
-fhzlp3xroabohnmjonu5iqazwhlbbwh5cpujvw2azcu3srqdceja.b32.i2p:0
-fx6np3oheacr3t7gluftrqo2qxldbbatgw4hepp7ulb4j5ry57ca.b32.i2p:0
-gehtac45oaghz54ypyopim64mql7oad2bqclla74l6tfeolzmodq.b32.i2p:0
-hhfi4yqkg2twqiwezrfksftjjofbyx3ojkmlnfmcwntgnrjjhkya.b32.i2p:0
-jz3s4eurm5vzjresf4mwo7oni4bk36daolwxh4iqtewakylgkxmq.b32.i2p:0
+iy7go4454pb4p2zmnkwrgsi6v6oqv53zxnmalz6rnfjemxftapfa.b32.i2p:0
+j225nrmndwviihpe7ib6mm5h723cg62wrb7vnwofopv472ue3zwa.b32.i2p:0
+j2m526lqsujvt6b6xl4ipzbjkvkuecrye3vkggwo6jadvzqu7f7q.b32.i2p:0
+j2pyenyhoppsjexenznxvgqrcs4buv4nssctowgpg6czdoo3nyiq.b32.i2p:0
+j3usxovx7ukl645u77jud2mpmrk7ryh5yaxno6rceu77hqlxkuta.b32.i2p:0
+j42dsnjlg4vv33tshgs5jyham6plf3suj2sn2k6ew4tmcz3fpaqq.b32.i2p:0
+j4tjrfxnwcmbhkixmqlnotginhfxgfdvjahr6yn7j7rkbdqngh4a.b32.i2p:0
+jb3iui7grnljdjmsz7qbustrl5vn3ip3upnkzbaegaiklric7cha.b32.i2p:0
+jbmqtghha7hscwbwpi7ps2dnghq2bvxjnfeb5glngnvgjmeackaq.b32.i2p:0
+jd43pc2l73ek6hk2tp6hiyada7ed7vshqo2fvxbga2daylcghfyq.b32.i2p:0
+jd63whebd5yuls7r34mi3lnnuuhqxxr4lns672tzliru4vk7hwrq.b32.i2p:0
+je6ju6ihybxm5wkw5daeqjet74lscvi4ls5wn5wf7kiaczfggafq.b32.i2p:0
+jeidstlwdlt63lju7cnj2mh4fofysjnc2wcvilphynprd7jw64ma.b32.i2p:0
+jeox5nruuoopedsfpuoi6kwewmhbbsnhf7kib2q6oafvchxvmnnq.b32.i2p:0
+jex3ykw2nmw7owhgbtio5flv7us624bxwp46nr7rhmteujrmtvvq.b32.i2p:0
+jfdh65i4nhpg4obnoe4aqi3vzvbi6fyzjj2ee7s3qm2gbcnllkvq.b32.i2p:0
+jh2qxkjqngj2m5tn2ecaidfqac4awgnmkgsajntoqs5qqyjtp5yq.b32.i2p:0
+jh7ev4a5zfzmeyekinhtbqfi6c7xhvc4msdpyi67j3sxl6r44ukq.b32.i2p:0
+jibaw7ynbnxueqsy7k7jyvoj6ldzbuckppfx5wozt7mftihy5vcq.b32.i2p:0
+jicc5kwy4tv4j2nn6gfbis7e6dxy2kdvet3zpxdbyp74h5gpnxuq.b32.i2p:0
+jimdydczt6e2lceezopnl4fgz7q2jeqqhlqaxrgen33ouxk57xiq.b32.i2p:0
+jjangl6h4py2pd2gwamhqlsymyuocmpioneinzf5bb5qvvdjzzqa.b32.i2p:0
+jk56z3febpco6rbkpzzv3jszf4px5uztmoxzkpss7mxnzqlpsdla.b32.i2p:0
+jkfuajo4ayvo2rbv5qdj443q6adqmnormbhsf2f7rlp5t24xomda.b32.i2p:0
+jkvey2vfdto2ucudi4jlgsbpmlls3uwmlkjonfhk5yminkwzwi2q.b32.i2p:0
+jl4vr5kac7njyltivn7ut5afyq5ipzc5woxl4523emodxixci3zq.b32.i2p:0
+jmebfluhrl6ad5pt4ipevf3g3a4trcu7axalpubpkir6zlwovm5q.b32.i2p:0
+jndr5i4qhxs6aa2bqvufrgttq6enavyghi54dqfuku2qnstdqa5a.b32.i2p:0
+jopiw2tup5h5xh2hwef4oflgskawbpfmswub2iosmqocejijd4fa.b32.i2p:0
+jrert3o2rhbkpquybwg7tq4bdvlxeh6lnlcr5ddexkuguvi2l2pq.b32.i2p:0
+jrobuecgmuuqmpdsbxwbqeldt2735cgcemngoasnbbkdz2ufdlmq.b32.i2p:0
+jrvg22xvbmjyrkqg7mr622zhnda3ijtua65cqngwrven7sf5zd7q.b32.i2p:0
+jsg4dsxvgjcqz3c2qgtwi4ip3l4n4hlxodbvgukwaipycwo26zua.b32.i2p:0
+jt35uwbl5wx7ponyxomksrjjs7zy5yymvtud3nmogt7ci7xxlm2q.b32.i2p:0
+jvaoh33cpczp626ldwr4azh4hb5cjmxlbz3dq3cxisdlzn7z25eq.b32.i2p:0
+jvlj7qyxcmolf76wneyvmdxrpiezsxkiimapwxbdbiw2phvlyjba.b32.i2p:0
+jwqlvqmfvodnrslde2idqt25qxiyvgqdlr2q4uod5s6lkmlempya.b32.i2p:0
+jxjc7oe24vxdepkfvl365qfwrxcad2f3j43fnfuchtvqqkqd2rzq.b32.i2p:0
+k4mch53m72zv7jdda3poa2zn7bi3jacqwfb45peealxbhysdozcq.b32.i2p:0
+k4pjt6m25dcxno3udek6rasooz5ztqnywa3f2owpvcjzvisg7nga.b32.i2p:0
+k5ars7hsrfubadroe5h7oypjnqwi6v2vxxy6rmns7zubf66aivbq.b32.i2p:0
+k6eeshsk4vf34b5gfnraz4p5qb6scv4kw6eiltebel5exw6keppq.b32.i2p:0
+k6gt64xby5igmln5hfcuzspt2tndimzrdvj65yo76h22g5yhlvja.b32.i2p:0
+k7kcnrqe3ybqu2w3fali7zext6na7o5o65rx6f5oqza2lonsry6a.b32.i2p:0
+kbawcieyelwwitrjow537zpmdkncwiq42rhjgayw5o7u562mk23a.b32.i2p:0
+kcqkothplemakipfpeajxmu4xsszpaxpprgtuv5tgfdaqejg2sqq.b32.i2p:0
+kdrcbr6wg2bj6oipsbeqy6bp3v7dqpth6cheviysmvo4bdta7fda.b32.i2p:0
+kehosmgk76fxnjywqjj6nqs4ohg4hsutljdzjo4sswhxlj5l5tca.b32.i2p:0
+khxruoaom7juockko2tbxqo3bnrjmoqjhdoady3yyr4qacz4somq.b32.i2p:0
+kjaa3zlp4sipfxikketgvlx4oxq5ok57ifxenbiewmsrew6lcw7q.b32.i2p:0
+kjvrzgckasb57yqhluvjblx2ngxstumfg6uufz5mc7zyetkjlr7a.b32.i2p:0
+kkihsh2faw2gxil6it4glol4u37ccruuzsusyikquzmkffj3wn6q.b32.i2p:0
+km3b5j6cqrcqewdpuveibptw5gguwktwan36jlow4xykpg2dgr6a.b32.i2p:0
+kppcor54kkge6cgq47nzevlfrhbxingcjfmk2emkrdaejpixkqdq.b32.i2p:0
+kskidltmbigp2etp4pdl67ke2qzjjw66wqairzr4wn2apq4o7bka.b32.i2p:0
+ksxxinje357zctkobwnxsy44ddivq7yp2n3n5gopk4okir2vghaa.b32.i2p:0
+ktua3j43ijxhhhfeljsp32kdiuic5nlnfnkx3ealy7ojva4vwkoq.b32.i2p:0
+kuzu73gzvlnog4cdtdk7edbusxr4pigknvwg2bjo6l46ugsgmrtq.b32.i2p:0
+kw3v6gq5semgt4gg6itum3qtaylanyof7wn6bnbngdeby4xixuoa.b32.i2p:0
+l364nudwoj63fe5nsjmniiun63e3ycdqrjyknbfixxtre5spx7ga.b32.i2p:0
+l3ach5wbdx3n5nq53sv6tagijrbse3nwa2gkqz5oj7aifyaizpcq.b32.i2p:0
+l5fita4r7niir3hxmu7mzcwrigxinkrn4oqeembdkgao7k2yztha.b32.i2p:0
+l5obkk7zzop3nztnt6ijugz4okqsyhhb5o6gkbqottgqzzzcgvla.b32.i2p:0
+lai3534z6zs2tukzixdagrciezum2bkyuask2srxjrn67yu4c57a.b32.i2p:0
+lbif3mgg2b2ir5dkz7u6iatdrui2h2a64vlmffcfgqnpjuvwzaxa.b32.i2p:0
+leu37bptuuu5377mi7cb5t2vsu4hesblyxl5zptnnk4vodhovwea.b32.i2p:0
+lfuvzzzceuik5u5pnd2i67amegel5ua2rrnncxkyyc7bhteq73aa.b32.i2p:0
+lgpojpoix7zd6dhpo5hdrnwm4ueyjvi7tbot4qsqybk3upuocnpa.b32.i2p:0
+lh7qjombcmiekvv6niz5eflr55cnd3oxx7nuus6vmehqfodr67za.b32.i2p:0
+lhupu3owhuc7qwvyfazgkbcmr7sjp5qqxps732vy52v67fsn5guq.b32.i2p:0
+li4vuovafxjrf54kvfg3mjrg2mebs6edpl5yrr2dohddvgmxjyvq.b32.i2p:0
liu75cvktv4icbctg72w7nxbk4eibt7wamizfdii4omz7gcke5vq.b32.i2p:0
+lmlf3yjyg4djrb7wtzmrb4fbkorqba7k4lvk7ax4omay4mbytupa.b32.i2p:0
+lpal67whroip3c2yj4fxbayj46d3tr5osyqog6el5n6ctktdnakq.b32.i2p:0
+lpektonr2uyiohuzi35shtj3oaa77rklmqsivuydxkcxkea2dwuq.b32.i2p:0
+lpffyejskwwap2go7ommmryex2autlkmcnnpk2tm6aitxcalwrha.b32.i2p:0
+lpqkgbek3ci3w4qobpeqepjor3bukz555rzlmghck4o7wwb7ajza.b32.i2p:0
+lprgmkc45te7skx7rffpz72ca5c3zdg3tabiksdboao5w4wceu5a.b32.i2p:0
+lqn32kgic4cincyqlybpwbywcrowcxmscfcm4mqt4fgp24qs3y3q.b32.i2p:0
lrah7acdsgopybg43shadwwiv6igezaw64i6jb5muqdg7dmhj3la.b32.i2p:0
+ls52j74gwtsrqhlgqcai2cjl2rcivfib7jzovc4454h6tq3i6k7q.b32.i2p:0
+ls5otp5mybmxqsaeaid7wlori2ukieehr644adjfwdxux7jxlvga.b32.i2p:0
+lttdnbluvybzbjq52t5vbdkk3pvzc6zyi2oji7yjdpcgtgz732bq.b32.i2p:0
+lunkwblewltvq4spt7j5u2nfpqyndvgepl7edkiru322mmtpy2lq.b32.i2p:0
+lvdbqavgdom5h5denwkmdwslfzxckf6eddwflelbog7tgo2m7usa.b32.i2p:0
+lwjrapkfexjyjqf2rrdr4ghhxmlr3jdygsonetgtheglvmru5x6q.b32.i2p:0
+lyg26sjkcx5ied5a4a7jdxmfeplfcnux3fux5rsxzkm5mgbbsllq.b32.i2p:0
+lyqmygrc6gujxa4xlnwqku3vtfkbrszdiirsagn6xd2yw4kvodrq.b32.i2p:0
lzuu6mjtu7vd55d2biphicihufipoa7vyym6xfnkmmlra3tiziia.b32.i2p:0
+m2k7ajij2wvgfpsbg32zuorbsjt72iye3ozz6dbyxtj57fx7xsqq.b32.i2p:0
+m3hlmj2gz2co5gu4ss3wj4b7ebeg2xbkrr65ogxvhn76uxna5qma.b32.i2p:0
+m4o2kndr75clxemwbq5m6vnok7eiqshf42wjjvag7dtwxtafxhra.b32.i2p:0
m6bpynxkv2ktwxkg6p2gyudjfhdupb6kuzabeqdnckkdkf4kxjla.b32.i2p:0
-m6v454xd6p3bt5swujgmveklsp7lzbkqlqqfc2p36cjlwv5dbucq.b32.i2p:0
-mlgeizrroynuhpxbzeosajt5u4ddcvynxfmcbm6kwjpaufilxigq.b32.i2p:0
+me6x2p4m6jw3cxi2xl4a37u4orzmv3xdopr5t2vgwjmauiuqrmzq.b32.i2p:0
+mf6tmlegp7uga66cdael5376uaz4qd3wacuh44yvepa3kbu4fk3a.b32.i2p:0
+mhgxec57s6h7eixgemsghlcuhmgh7m7p7phqd5kzmm4wovrp2pqq.b32.i2p:0
+mjpulaafdyuanouslfpjcsvumi4edtckfu3ffn3ipabkxj4sn35q.b32.i2p:0
+mlakhs4ixcqwvk4vo4ce3loa54wmdlfingk73jookrkbra6ppq4q.b32.i2p:0
+mnkqn3r4jmg6vrmlprabenndyft2z2jw6g4nsnolt434coiklmyq.b32.i2p:0
+mnrbc3qi4zuk2tzghmy55kplawncih6jkmt75qczfu27enu3gcea.b32.i2p:0
+mnrrefebq3yxr2avprp3ay7w42sx27ijv6stjljzpwohnfnkg26a.b32.i2p:0
+mo27t6wym666b3wfauhndqocbetdsssxksep6x4dcpuh5dxe76oa.b32.i2p:0
+mo6mp2tymma5l2swob6kqzzb25ccmgccfj5pic6omjkktv4wve2q.b32.i2p:0
+mpi7bivbr2pywsgasslw5we766m757os2667h3hqnhcftaszdv3a.b32.i2p:0
+mpqb3jdmdibarrflyiik5wj3ekitxpe2oqieztlax3uomxspgsvq.b32.i2p:0
+mqocuhx3qwcwfuuin42yuhtqgm76drlmfvzikf7urot75qw3ykpa.b32.i2p:0
+mrbhw6ow77bjqmb67rurbkcl4xs2ocj4pti6hnz4wcsg6bduwtya.b32.i2p:0
+mrypjr2fagjhg6z4ixr73f5npkeyoxsjamcdv5uc6oj5oi2ylsvq.b32.i2p:0
+msjl4a7mdp7x2bcllmbxurhfmtxvolykonz45psmh7j6pptfyy5a.b32.i2p:0
+mtlznxqya5nbuyorybzul4cpdlrnvlrhalx2eogwjce5j32js5wa.b32.i2p:0
+mv7b44duaxqpzbdztnrdvnj6ypsp7yhs4z3dc2q64jov6pritmja.b32.i2p:0
+mvs5a3s6rgfbvvgq44wzyd57vf5pr3jcthc5qdo75xgj4slsm7tq.b32.i2p:0
+mwcqoe2lu7u6ogwo77kr5sr4wx6pxnotkdeck3yyjfh4uklytj2a.b32.i2p:0
+mwevh5r5dkzddlo2ol6bojpdds3kno4xqoy6p6ulid3paamgrtla.b32.i2p:0
+mwyjzdrgtypbwjyulw4ifetejz6xusqstvzylztsphpg2r2zf7ua.b32.i2p:0
+my66tuvzfyy6kkbdeqvgfpk3xuoxerucxt73tw6wxv3ian2p2snq.b32.i2p:0
+n3f4ngbs2igvp3j27vsi7thguqxoyvbfenaqhgypuqdz5iovek2a.b32.i2p:0
+n3fa2yuf3i3opdktiwyxzhbpudcut73valxdrlre2xs2ooepddaa.b32.i2p:0
+n47e4gkf5xujcamnsarfuy7435hfsgs4zhndcxaw2evafn6r2rma.b32.i2p:0
+n4n7bivjb2mffgll2ulpwyb4m2oomv5roxtdj6bmlb4cgpf3wdja.b32.i2p:0
+n4zwusew5coibur4p2g436ktc3cyogz3sklztu6ruulag3je6ita.b32.i2p:0
+n7ykk3cxcqzcoeipo7ghzb62ko4d6bxzfgenzxistvg6fuclebva.b32.i2p:0
+nazasriqoa6qoxdlgzjwsggubxl6i4nge5q7om7nijaqi24ulgua.b32.i2p:0
+ncdjjthck6v6phz4laddyc7a7czoujys55melfcoptvl2h4izqlq.b32.i2p:0
+ndtoi53fz7e6ml6v6jn33675nwciw7mu5msn7afzbhebprusqg7a.b32.i2p:0
+ndunnsjyp6l4w3jebow4zgsfrdsy2lrapjgslb3tv7dg6oypfbwq.b32.i2p:0
+ndx23xqvt4qezezih4wlj7mqtwc4nzbvmgseq6fc6e2ddywrmkwq.b32.i2p:0
+nejmippeopyo75wd3gjrhca3fr5mo2g37owzwdezxmg7uhx6ygxa.b32.i2p:0
+nfsi3fenzrzoccj7bpzuvjbxnij7dmzuprg7ia4geuortoquja7q.b32.i2p:0
+ngn5elnvbm234yyun5kbjyr76oy5nhrvyckn33cqcbx25hw4lfoq.b32.i2p:0
+nhpbv2ravt6t5fhxyvuhrxyma37wph6dzuzpddlw3uoivzl6tx4a.b32.i2p:0
+ni4ns3ou7v6zh5qrawvkwnmshnrzcyc5zojkw647rrniplmurrba.b32.i2p:0
+nigrfbou3zt6wxegn5im4cyminjcjmbsqror7ntcr5i7yv6chwvq.b32.i2p:0
+nij7pzb6mhrra5glb3dyghjt55sngwrikzdlagmpsf7jn2onvoaa.b32.i2p:0
+nisd4was4gm3pkvuwjh3sbaoo35jtxop6y2d7ug4iol4cffkrk5q.b32.i2p:0
+niyz7v5fdhqqtlr4y3tcgdoeu3myntub4trzvgixlgjbmowccgja.b32.i2p:0
+nloq52novup3cawccvaakmbudooatwkw7dqltnr6q3j4qy7r6oia.b32.i2p:0
+nn7p4y7pun3m3txaqbkeptkxykzwrf75ru2zimadnewj7g3r4una.b32.i2p:0
+noj7le7kkj54umo6mdftagvvk327cuir7q75bnvuphrxa7kjujna.b32.i2p:0
+npcmehkhh4z2wtk3f5426izrytvqvyf6aa7hyx6hf6jdbxveqima.b32.i2p:0
+nrrg4p7tztllzthlkqzomqi3dejfcak7t63n7zzuomt5atzz5m4a.b32.i2p:0
+nt3ysas4wpjgkft5pohrfstm2vgj7t2vx34u32voy7rqon7dlbga.b32.i2p:0
+nu2ao72zway2ponkhrf322wyfrrn4mdmyp7n5q5xzmjhcge5odma.b32.i2p:0
+nufliiw3uav3tzdalit224yhbfpcjtgfrm5ic7ob6l3mmsay6cpa.b32.i2p:0
+numilh7hhhf6inzkzway3hzif4kiroqstxqbz7hzvoy2ctgpaqda.b32.i2p:0
+nuwphtuudfrswids22qjq63zgxh5wu7erafl36jyniuxhz75ikyq.b32.i2p:0
+nvmuuajhaw74g565l3a7dpezs4rkzm22ub5jhh6mdvzu43j4a6dq.b32.i2p:0
+nz4lq7pmswngaevv2uqyainqzutfxlkavxgde2w2slo2p6e2kcfq.b32.i2p:0
+o5ijpzor3en5xnndm3ntti7o4fxvv24t3veh4g7mahk7ogesb67a.b32.i2p:0
+o6b747qkpgu6gvsem7leylvmxsaaqby67pu55fmqn52dgazuvbxa.b32.i2p:0
o6t4fr5ayfadzieutstgwcllvwxeuzjlxmzsmpj3hpkvefhzfaea.b32.i2p:0
-ofubxr2ir7u2guzjwyrvujicivzmvinwa36nuzlrg7tnsmebal7a.b32.i2p:0
+o6vbupdnpd5bwvcx7ivaecgyo7x5vdu5em4va6cmx5iwcf5tyaca.b32.i2p:0
+oaeqbkgpek4qnm3nly76x2tfrad2tun2xefliez7a3uxddeq4i4a.b32.i2p:0
+obf5kfk5n4nnsw7ez6ls6chqu4lz4wlck7utwvmjnlin4nzfnspq.b32.i2p:0
+oeydvkjoeqy3473wxkkbmoc6zz5m6zcmf6ov2hfkci54efsityua.b32.i2p:0
+of2gy2vblht57tn6yfczslnmp2xybdiazzta43y24w76tl6tu2xa.b32.i2p:0
+oggn6qbpmbag224gumagzgno53mgozb65tpzt5lezjbfbbiqky4q.b32.i2p:0
+ognn4mwwtmtjbrnq2kur7spcfohivxlrvz3sfamt3t46pk2e2ibq.b32.i2p:0
+ogqdcq2igslh3n5jn3utz2vpevttul366bt2246vilfnowuyvova.b32.i2p:0
+okjamsyd4wutvhfhsffejwk6ioru4mmvwagfssoy5hcocg2gj76a.b32.i2p:0
+om32whhwvcsbrf4g6uh5hupsl67oapccourkxyr7uf5zwaqxtxbq.b32.i2p:0
+ommky7qetuh45h4lk3raili27fnbhsgxv3zucinoaymnymo5735q.b32.i2p:0
+omngcjfwtiyqwbfqqggzbkttqgm3blywu43kpto2py2e4gp7fhra.b32.i2p:0
+opnpvz7mzfw6nypgmnn5zgtlzx7xuc4w7vat5bsr4mdtp77kz7eq.b32.i2p:0
+oqrl573nw6my2o5mup6uq6pm5immw3gnviahig5cceges4wfnyhq.b32.i2p:0
+orvshryqq24l24e4dvockx2ekj4hu42otqxsvyvy7tm7hhdjsz7a.b32.i2p:0
+oukeldqgovavh3npgb2by7w6hug575uae24z6uqfdl6flh7ma6rq.b32.i2p:0
+ovnk3wfbrkvvute6vkn5glhdtlxr6nyvebiflvr5l6ws6sorpa2q.b32.i2p:0
+owexluejb3eszx4p3b6zuxyggsxxtkxfgxoylkagfecs3bgfnpja.b32.i2p:0
oz2ia3flpm3du2tyusulrn7h7e2eo3juzkrmn34bvnrlcrugv7ia.b32.i2p:0
-pohfcrfc7prn4bvn4xstw6nt3e7hjmb7kuj4djtsfqsskwhmhnna.b32.i2p:0
-qd6jlsevsexww3wefpqs7iglxb3f63y4e6ydulfzrvwflpicmdqa.b32.i2p:0
-rfjkzdzv4cwpxo6hzuncicvuyui76wxqx3a23lynq72ktwqs7aja.b32.i2p:0
-rizfinyses2r3or4iubs5wx66gdy6mpf73w7uobfacm2l5cral3q.b32.i2p:0
-sedndhv5vpcgdmykyi5st4yqhdxl3hpdtglta4do435wupahhx6q.b32.i2p:0
-tugq6wa2ls2bv27pr2iy3da3k5ow3fzefbcvjcr22uc7w5vmevja.b32.i2p:0
-usztavbib756k5vqggzgkyswoj6mttihjvp3c2pa642t2mb4pvsa.b32.i2p:0
+oznpphdisfvlcjgkvny6ma62wy637nh4vtpxww47ifpmlqkjv3ba.b32.i2p:0
+p3au2w5jnkqugxnkukj4rusvynvz3oxawdf4ajzeyxvfvyzhmetq.b32.i2p:0
+p4tsqwvdpaitvlgaujfr2m2qbr36qiwusas5zkiut7w2wjcp3sqa.b32.i2p:0
+p6o3tzllswm2j4wah35niry4tcdu6lq5b67ehevcx45sae7pb6da.b32.i2p:0
+p7ifeij3vhds3diihx5qimucyzgck5omfkqxc4pkbbjtfu4hp6wq.b32.i2p:0
+pbag76x5yyo5d3wypvtohxmgbtdrjjb35ljnq4w5fpoguyt5mj6q.b32.i2p:0
+pbftrtdthbj5qcecraden3hdvwomqrgseec6ib5h24n2zcivdqaa.b32.i2p:0
+pc4d5v74tr4vz54pbr57ejga765ep6vwk5kox55gfobi5572apta.b32.i2p:0
+pcc6cnry4maul7zlbd32khalaavkcbw5hdjuk4zjwposaorjicca.b32.i2p:0
+pcdlqw2awppohbiued4rffgs6n3lv3thhon3r67jmx2652qx2khq.b32.i2p:0
+peteksofgwgndsdh6ovh2ydkrgpyqgttit4ususs4bzksvdqkbea.b32.i2p:0
+phendyytrqdr2vfsw3kil6yui5vb2p4v5xuddezg57wsdw5uyquq.b32.i2p:0
+plhoz53xhplmyuejnsg5bkfe24ow3pbldysoovuupu6qwb3nttca.b32.i2p:0
+pm4nukrzndd2lvd3shivpjrcbjlontmxhag2xzdf572snwbr3p6a.b32.i2p:0
+pn5cx32ljrvzj6x7hpgyff3rlftextqpp4zn3nkfufrrpnpuimzq.b32.i2p:0
+pnhspu3rloczdbzsysa2iftsgoiy3zgcd22jodmk7zdjanhiemla.b32.i2p:0
+ppe2jfsb2xrmgwugbq7agy44ucb6yq4qbufaf2sh76b4kwpa4jcq.b32.i2p:0
+ppez53yrs6lanyvyxuxblqxiuvhnqvvtafmwaid2kgp2dx2v5iaq.b32.i2p:0
+pqnqwxl7jsrok7vgpgcvlxwlkg6yckx33n3g4xf5lvuntwn63b6a.b32.i2p:0
+pri376r6uuwgnbnevki7c363h4ryfwjza7pcbfswqqxk6hnrkhja.b32.i2p:0
+pscw5yzaj5js2fn7gzrzoj6teonlsohlbnvdco65ubdefpnpwhpa.b32.i2p:0
+pt3mqmvkv7aleja7vattlysu6x7gjnbwqvwtu4skzabvkjztfi2q.b32.i2p:0
+pu6e2b5bz75qnmp2rox252aksllnitv2grnn7qfyzjkfio7w5h6a.b32.i2p:0
+punslpht6pysnlteht24rgvrkmzdd437lnpflojwakl5dy6mbema.b32.i2p:0
+pv6g7uin653rerdiivdgtoirjvokjowi4b3fwatszdlteyos3i2a.b32.i2p:0
+pvqyvn2lpvoeyhgcgunoqtetkrkp76iegyoii2af4crnlto6gb2q.b32.i2p:0
+pw42656k2vbwxmvrc2qbsz3jslvcxahln7rehsbia5jdio2knh3q.b32.i2p:0
+pxbyhv62tcdqqpl6pbp3og7ajzzcnbximv5kyt3hid3djd3uwkdq.b32.i2p:0
+pyf2csixjugwp6ad3bkry2ulkzj7inc747dsmpk7iebuidk4l3ra.b32.i2p:0
+pyole4gslrmenfcmd4ilqyzvsuyrjyffjbw7angentqjkkljitqq.b32.i2p:0
+q3ueujd332k5qjxdqkjtjlgkm3ktvdy7ats4c2ogcvokog4wm3vq.b32.i2p:0
+q4o7bf37e6afx7evwdyovsqptjwo6td3c6qtjh4rtdngp3trwi3a.b32.i2p:0
+q55g5g6s47hi7pcuomug3vrcd67vji7us2gqmfe7qn2nkq5vz52a.b32.i2p:0
+q6lzsezu4idxpdwro4x6svwz7j6h6gso6enidcxv7jhc2gbepuzq.b32.i2p:0
+q6o3eqnyg44uzjzqeudsankgdouylshkhdhl7b4bqxkbmdnm4iaq.b32.i2p:0
+q76g4lkosb2sxenh47eutqgwwzjyph52rirc635wkwnxsejrzdda.b32.i2p:0
+q7ntdwy6xueyvghbjamfrh62aqtuu3ikwg622em44pa3czomrdjq.b32.i2p:0
+qa77lz7dl64qwtj4fxxlz6otkuvv42dciggnmx62eobs2xqi3vlq.b32.i2p:0
+qaqvxmyvq2m4wombmtaz3our3qmp7eet3qle5flnrs3a5wgfhxba.b32.i2p:0
+qawed5ou5vb42ugi42goxr2s6cqzpyh3s5atkhvfvyhyc6anxyaa.b32.i2p:0
+qddg7myylinn4tw6kdjmmp6fsyetkosnrbp2gsjx77tmkqyqv6ua.b32.i2p:0
+qelsaseevnmz2unpovh4nbpjpshjg45iudiaf5zbngealwwuxe2a.b32.i2p:0
+qfbughfr5hhgoomasyviwk3zin24uerpl6urz5smzxc2div5ixxa.b32.i2p:0
+qfl3i45ipgugo7ueswy3ynnbaet77xawiplvmm3kp4fj72qvzc6a.b32.i2p:0
+qhuk5zq5v7h5p7o62gsxgtqqo7va4i77o5vei6wttxqcgaw47h7a.b32.i2p:0
+qivuqkrr3pv3rul4wgx4o4zon5wegidt5auylv3bhebfuj6oqauq.b32.i2p:0
+qjdftbhcaghdslzxjqx3nmem4z5p5jt7e7ou5bdz5llnqlxshe5a.b32.i2p:0
+qk3iq3wr6emttdilvdqbv6vnqjshuzz6mylwyfo3z6vpjywvnfca.b32.i2p:0
+qkohzoxigef43ro7mf2bd76eyneuuj2vfyremufvufssksbvj3jq.b32.i2p:0
+qksthizqtfdjjxcrahqxkl3bev75k24blagrkoszxen45zelijpa.b32.i2p:0
+qlhklv3q3rrszbrkxw755lpdburxwcj5dkxwicas46flztlkdcja.b32.i2p:0
+qmtg5ukzxemsktsxw2brwmohehyehwlleky3kuzeqzy4ledcou3a.b32.i2p:0
+qndgqhj3cpbxrktu6r7ysaooccqzvselvn2tphu3plx2z5ouocgq.b32.i2p:0
+qnqojlthym7z4gwizcblhpd2thy7v4a6ifme57bzyl3nxzkj6ica.b32.i2p:0
+qorzdjceszf432obxa73tnwhqb7ltxrxlfkkqmw2flmfjhoyv36a.b32.i2p:0
+qp5ppgozzbkuingg22zgamf4ozpe2n5hjlu4i25r6pjqw2ngrhoq.b32.i2p:0
+qpddavnflr5tdmeypeu5lrjjwsgtdhz7hw5emxiyjkcp7m7xysca.b32.i2p:0
+qpo3u565rmgeioruszadbc4vmpgjyoh7qorv4lyefl7geewyyz7a.b32.i2p:0
+qqiakw24obfwz375gfb6muzaz7tr6ani3od6leoox7jwzrizyxkq.b32.i2p:0
+qqmxvujwi4ktgj2cuqmw4kiujkf7ukrkoe5ryy4bjb7tyleplsja.b32.i2p:0
+qrpz67rcwrbpcockid5ml24dtdhhhekty3xd66ekkyatpfjd2wka.b32.i2p:0
+quzkrgzb5pmn4465647ke5lsfbseqnorr6ljvfsxcagj7rzl7hcq.b32.i2p:0
+qv5e4jlcmmkdlmh5spkvv2wgj343vm4yoty2hofuzi4lornn3hzq.b32.i2p:0
+qwhvlprhk3ntswr5xntnc2hhgmvd3bbgzgkbombiibhrsj7k6gyq.b32.i2p:0
+qykavpjbecssape77mrxjxwxces2gbjd6gzewd6zys32uhmnnw3a.b32.i2p:0
+qyqwn5xs24h65rldrle5msyarmqof3lb33uz7sutauwdg5qiuhoq.b32.i2p:0
+r2p5kqr7xjo4ncz7l6ekdx2ge6su2j22j2tdsoxu4jw3u67z7poa.b32.i2p:0
+r4ukdj7c2k557k7qd6siauhhqucshwy2rrkm66twzyh4jiucimaq.b32.i2p:0
+r5d5jgscvs6ix5v646ohwa64vutu7umfeknrc2hrezdjtlr4lm6a.b32.i2p:0
+r6d4moarp22wnnsnmsxqt3s32gzyscaccackcazvimrep7sa26ma.b32.i2p:0
+r6hd3knqi2p6kaw7hybrcf2q5lcarulcczs3sgcuz4yc2saj3gya.b32.i2p:0
+r7bug6wbhevqqlbavouj3ggpa7e57sbd3oivkzqeyagrtxshmjpa.b32.i2p:0
+ra7ztq7oq7jcozpui7c4zv76gh7rjwhq5fkpxp7dvw7ritick66q.b32.i2p:0
+rb7tyjd6gi7evmt5mzvtboramqip43sh72zjxnwhj5k72zfi3g6a.b32.i2p:0
+rb7x26lmepfbcd7wtxu42pf4tdxbe5p5zsf3cwuukd4fs4zhxtba.b32.i2p:0
+rd2cw3iukuth2lwe44q7fipawrne2io6y3fyyv5xew6vd3hos2qa.b32.i2p:0
+refo4v727jmff6ylrpbkvd5emlfr2hamaeh7zho6oval5dmnwlta.b32.i2p:0
+refrtydbdslzcgcsmmph3435qigyajh4q2nvl756f5yojouln4yq.b32.i2p:0
+rfgsjhyvqbunef5b5r2emjuoxx2i7rcsl7gathy2n4gwjyyat6bq.b32.i2p:0
+rg677vpfzyhsckzzcvoyvqdbwtdkqig7lxv4unmxcz63vtr6tgza.b32.i2p:0
+rgbq36syjadm2ex2gftc6xztivckrqzcjszla3jacwfo5hqutzqa.b32.i2p:0
+rizuiypjfhukt3bqnetppoauovuaqq5e6jzgd7tgy24zrwa2ydxq.b32.i2p:0
+rkhb3463btvfozwta37itlkt37iyncpkzak2xhoe4kg7tqafqria.b32.i2p:0
+rl4b3r5h5xodo7kiw4nykd4rhoc4j37kxizzyb6ukgcomyc2qrya.b32.i2p:0
+rnsjgirap5lfhxpb2xczuawgoztb4ptgdwt5rcb2bz72vhtai2jq.b32.i2p:0
+rrm2pems425buhonptp7lbtbprmwwjhbftey4ujvk25nclx7rerq.b32.i2p:0
+rvjzxak3jvwwti7klfb64wrsmlfcs6ceiqhzbbmjynokn5tz3egq.b32.i2p:0
+rwgf2wj2x66xtnjx3dggxhkuy6gvihvur42tbkoej6bd7iukoqiq.b32.i2p:0
+rxatc4b7obgosvznpqrmyrl6ty2yixhi7rpbh45sopqwzglyimga.b32.i2p:0
+ry3iuaabf5ek73otfvchwrqryez3nsgq57bpmzkyzumqhfbhgtaq.b32.i2p:0
+rypsyqod2yq3zagcvvc2643vydtv4zm2ew5r3w5kjzyq2snvzv2a.b32.i2p:0
+s35hlnmumkgdsvj2gepnwro4wo2h7ts7ddjhhihqggywn7qcym2a.b32.i2p:0
+s3rbe5n7lyy6smerpkgr4ictzbvkciu7gxyj6zqw3xyw62rmivha.b32.i2p:0
+s43w4tsmzmddvu2cxugh2lx4o5mup3rkvjhm455u2qqpg4bqlhyq.b32.i2p:0
+s4qlly4iwzevejk4ex5zfqhb4t666o73mvdmy4gpu47tpb775nja.b32.i2p:0
+s5ls42vzfaqzgrjr6cvgkmgifei2rtvj7uzaljkpsmt62jwtmvxq.b32.i2p:0
+s6umfzwe27x7az2yjsgqftjzawoj5lrcrgxldkfwfq2qwobml2ma.b32.i2p:0
+s6vsdby2liaahn2fh7qvrehqfus7gaz3p3u3rpjtfjhm4ahvz46q.b32.i2p:0
+sa3k2xipbuwm62bb5n2mwaqyyjcvxzb53kmzinoojgnjpnqurzeq.b32.i2p:0
+sadnlzguaa4k6kvpiky27izp36er3i5h74l452povbnajqullpca.b32.i2p:0
+saj5uchj7dzmxjv3kdzalgtbqzw6wu4wzxxdiobc23m452ehk3zq.b32.i2p:0
+sbalp2doxyedtr52kj57va2rmbi5npspv4drk4vxnujag72gtpiq.b32.i2p:0
+sdxfzbgwxpf6hbik7k4bqm63wm4xld7qgo3hjlhknnehzxyyeu5a.b32.i2p:0
+sh5hww42vwlsl57cdropaeqmmwozinnr2tg6wq4prg5wrkusvxja.b32.i2p:0
+shpd3cifcjoebw6pskj4pfmrm7lwecrygjnje55heorhsxm2lnrq.b32.i2p:0
+si5x3fon3ew644friidc5o3syrf5v6kk4pxxjvhibev3odxk7nyq.b32.i2p:0
+sikkmrxv6wat265rpay2tk7jywyvlzkekpolmwyp2el5g7iihsvq.b32.i2p:0
+sjpqyf3rq7ojcalldlybvyyh5lqiq5j3ade5w6txe3473ybhk3sa.b32.i2p:0
+sk7aivked563g6g2ri2saggni7jqzxmucuqa6xkudcgjvpbjsyda.b32.i2p:0
+slbbsiq2pmouqht3hznafnowq7sxzlidmwghfch7iiq64rzdhwra.b32.i2p:0
+sle3cbbdom6rknc3drqtawctpy635ica5d5gerjjdahfymkok4ma.b32.i2p:0
+slnmute5o6h23ldim34wro4zh4qa2pchnskmdpek2nzc7u5oz7jq.b32.i2p:0
+snfinsblh4j4wsv2n5kmkfxbvqzcei2ryfyu4heqy6u73mosep6q.b32.i2p:0
+snsw3ewf7wjtwspiuj33h3vtxnybllurzcwm7u62iutf5phoitkq.b32.i2p:0
+sooo7ajo74ajo6m2yomcc6jcofdgkdoyjcbrpl3nyvvusr6fw7ta.b32.i2p:0
+sorobw22rerrhpx5t67joyqai3ou6xsvqxb7wdomtnwnqztm4sga.b32.i2p:0
+sotpvcqqzzmty6llimwlvknqsdcypn4wsnwk677kepzmy76w2gqa.b32.i2p:0
+spbb34lslk2tldwzr4ydi2culk7sxgl3imb2gg746xbxqqcj7vzq.b32.i2p:0
+spuaa2y6qsaywypklz7itcb5klesogef2x66m4flws2r574qjc5a.b32.i2p:0
+sqjjqyrhh45jpgfp66idiirgh5ck7f4s76ee2l5bli4obsotu7zq.b32.i2p:0
+sqjorsqambyienumg5qpw3foftkp44vpsd4lwklgbl4lag4mm6gq.b32.i2p:0
+sqr66feh2g3f6bknt2tnltmnhqdkzoq3jhdaatfusshrv6v2zhma.b32.i2p:0
+stltasmf4b54srrjb3mf7hjtjvmvvms26btxakccdtllgrm2qzgq.b32.i2p:0
+su7d4biurihkyr3qeea7makkxzikxr5zi4znvryh3bjespppfhxq.b32.i2p:0
+swmtaospvaup7me3dvzlw5xoeohhj4zn5q6agivif7kxtseweriq.b32.i2p:0
+syhxehvl6rublw6k5ysmzcsqrzdsnd7eqrbwalfkvhgfccpu2osq.b32.i2p:0
+sykjw3jnb7n6bo574wnpiaxhp2nm4gc6hc4jh4v6trsbpboysooa.b32.i2p:0
+syqxyl67b4hdo5u3jtkkzsabccvtjaerpushov7nrc2f42x67fja.b32.i2p:0
+t2e45js4dn4cfsyyevm26z5ltvmu6lftxziji4fm3v4v2t3ykaoa.b32.i2p:0
+t32qcc2tbjgqxrydr2txgm4ahhhae3zkkojmguehw5gsbtrdvxsa.b32.i2p:0
+t43qqzux7ik7kki2rxtillcgbxrznuhjac7wtqh52sqovk5ay3xq.b32.i2p:0
+t4notlid4bejwz2tzucpvednkeuskenpnu5sqcbdhh3lqouigqxa.b32.i2p:0
+t5cd7q36no6doxduuvk5psdx47zl7ousnckjgw7c6zr3o3ke7ffa.b32.i2p:0
+t7gbmefspnynaezmvx445fjapp24pjjf7wx3evpwlmolzyu3wi5q.b32.i2p:0
+tanmhvkoyd35kf6a2nhj5rmbwpt3shc6thypsle45my565womjya.b32.i2p:0
+tbqehmm3nuuf2spwsjobrc4hg6uxji4mdelivhywz4b7f5lv6rka.b32.i2p:0
+tbrjczwl76v7ob6hon36z6f35otpv5g467q33pgzyyakp525wwfq.b32.i2p:0
+tcx3ftsdl36ukysuuewydapdzuu4alewyg22squei2wda4a74tba.b32.i2p:0
+tetoqjagsf7fpejajiwm4rosqscy5huqbz5hcqgfuha5tdfnlrnq.b32.i2p:0
+tf4tozh5unsgyzpdsmrdcpbgekw2agu7tp5jvyclzcs5kjudwwpa.b32.i2p:0
+tfuvti7yonn5pjptzzvpshh23x4rqjvm2usolrbnlu42laj4mhyq.b32.i2p:0
+tg6goh3flzmcer5voft2nf3tudm7ikyez334zry66vqxmc4ieixa.b32.i2p:0
+tgt7rdhywtlwob47flp6ccq7prrbh4ipnwm3xszuykq7be2pksyq.b32.i2p:0
+th3dj5sqw75lga3tnffbsywajxafv7cvlb7sed6w7q3w3sxuqo6a.b32.i2p:0
+tj2upmck47iktfh4vncmyajnkbatqglqzy4coqef7wioor4hbsjq.b32.i2p:0
+tk63xbzug7def6esivofwq2h2c53ar3ot7hsezdq3amxqqaoyr5a.b32.i2p:0
+tkzuysa4lkad53cywbt6sgpcndvvvdkjeatpkwyfweorx7rfe3ba.b32.i2p:0
+tl3xkknuukvyinyhvt7saz3tvz24ptgyqtzy3igygyfapcf2o3lq.b32.i2p:0
+tl66bkfoqu6eameaqtlwrvfttyc6xj3s57za3hd7omnfnjg3i44a.b32.i2p:0
+tlfttkbshrcixu6i6syntl5xjsoh6mtgfpix54knahyeuhlju4ga.b32.i2p:0
+tmmjmcrwegjke5fzv2hha2wkis7l6xdaa7fkq24ge5rbvqpwxzpa.b32.i2p:0
+tobdew6554c76jhrulcd2ssgvef7dryini2xjxem2zushe37ycua.b32.i2p:0
+trucvlawpufrszky4zzhhxtddnhio4mnqawzc47n7kik6i444m2q.b32.i2p:0
+tsfr6zvcgsmw2ekaxqqtkdrnbib5uio7lgmrtmscrvwe2d46g7jq.b32.i2p:0
+tsrlbxayhihugr723z6rkyafglnhcyzi2zhojzsyfdjsqkkd53bq.b32.i2p:0
+tv3x4kddbu753tnlghgh3txogp26tlydt47rl5scx7eoxgnocf4a.b32.i2p:0
+tvbutrv73xhwqbtosmbp3cesdyc5bbtslay4gjsf7rzdx4ztgzaq.b32.i2p:0
+tvotv5p3emxxnti2bnvucbfy4to7gxptwvh4qznuhy62hghnju4a.b32.i2p:0
+txpr56jvbf3lmqgaozqdqzgckfpugzyd4cwplkjootvf3hk42ibq.b32.i2p:0
+tyfkhz6ggpi2rykez3v3j5f3evnjxfoau7ve7m2heaukrcqiui4a.b32.i2p:0
+tyvsuqy36cx2yvf7jhnkd5ojc52g6vxl2rw5qshqwpk63ptovdda.b32.i2p:0
+tz5txdipkxcnydzcsuqw47qxdvpob644u3cttlbrbfg3zp75vl7q.b32.i2p:0
+tzudbbctweb7rpnf2vswuw26j63ysqztsbt7lfpfj6xautueiklq.b32.i2p:0
+u2tnrysboqqwjn73awg4hfxtfjgbqab6vrdgyu43s672jdcanhca.b32.i2p:0
+u5ixxcd6slvzxouj532njusx7ec4wemrfwmg6gwltlnkruubi63q.b32.i2p:0
+u635477uxqs7z4uvwx224u6ojn3c3ewcb66f3j7qlbzqyrrevxja.b32.i2p:0
+u6wrw47yfjdzk6a7nc6c6scvfokwuqmvuhxehqvymrv7owiajxia.b32.i2p:0
+u7uklnwthbrynr3z2gc3yxfmi5yoemsugjbb4nm44x26f25vxp5q.b32.i2p:0
+u7ygn3heosxu6l2die34y7wteexfp6h2w5j3nhr424yoblysigyq.b32.i2p:0
+uags6hm646f2qsyqfhzjt2xlnjqbiopiodghywosdgz7bwtbggta.b32.i2p:0
+uc52rzz4xu5ikx6hl6r6sqxfmiyyxsffpcu5frrtepczidwjwuha.b32.i2p:0
+udfxh2r5yfu5z7ynzacur7p3g7ug35kfa33ghes2bazpdivxlhsq.b32.i2p:0
+udkwqdo5odg5npn52rueipghn5omhvojthzdmvcvuomgzglum7fa.b32.i2p:0
+udzbx5jyvrp4g3iujlca7jnlaaaa5m3e4jv4sbr7tvp6k6cdjc5q.b32.i2p:0
+ufgoaa6g746zzpphuvxuomuizkyfpz45chqta7skrywqq6cjbqna.b32.i2p:0
+ufittrlr4eautphuqzuotc7b3xx27n4xgy5afm4foc6nsv56q7ka.b32.i2p:0
+ugw5zbhs2pvsgxieklmc6z4z6d5cvyux4pctpf2udhjgxvajot2a.b32.i2p:0
+ujg6b4cyxhi5pf4puwvwupur3iddm23uibapigpwl4bstvlt4cva.b32.i2p:0
+undzufsjeb4qlf7y5llh56tji6zlhtshlsyht4yjdsa2k4ayx7vq.b32.i2p:0
+uobwophnzqq4yhpp54aisud5ojgrxq6pasmq4aq6qw7dhgjcoqpa.b32.i2p:0
+uodycjdscpurlego2nrs7ptoze26p6236t2r2tax5ubdgi6duqaa.b32.i2p:0
+uohuxnjd27cftarbf6kh4czmotwvstpon2sgs2vpffqkgmg7guxa.b32.i2p:0
+up2kudwqomqrwvfognnhz2mjwqvkgpknfyscp4ue5ioev3q4jd5q.b32.i2p:0
+upme7c64dwjgbt7w72yf5ydl3dyp25dtenrkq6z3aw6hbircqzsa.b32.i2p:0
+uppxodf6bz3qibvpzzvtedl5lk3h7fslrwmed2cmqvdpgtvqkv2q.b32.i2p:0
+urqlr3cei7pp2cruga4txxmmvel3bh7nsbqzqzpe7omvmbm4v75a.b32.i2p:0
+usgqijrwhtwgoekjcr26yqcgpncwpsescrr3eek35e3rhkrtptoa.b32.i2p:0
+uu47uxdqqtv2pqorbaxnhhfmcsxmknvpreambqqkosr45b44h5ia.b32.i2p:0
+uv44mjoqrj3m3gzz5wxlnszt5pvgk3iqlc3pmqfe6un6gxays2cq.b32.i2p:0
+uyshm6nokdjyq3l43224at2rigpa4zmiyybuufyq22t4l65ialmq.b32.i2p:0
+uysvdsh2bzicmdqqdl7ezuftxcywzapohbzl5ap5hyiinki354mq.b32.i2p:0
+uyy4dbfyx2i2x3goobc6uxj4nb7ktzsu72zlksypjfisgka3xnta.b32.i2p:0
+uzgfmsjcbjxitt6bed3p3gpdzviyop2rz3cxqyu64ec3z2r5imqa.b32.i2p:0
+vbzp4sjkgqwymn2z4ikbae7rv3clbo7vv4mwv4ft7tu7ubrmbeha.b32.i2p:0
+vcksnyuyw3i6hfviob5yzoynq7okxi677bw7224273fjhsk2kgra.b32.i2p:0
+vdpfoahxse7cjciw5l7ffbwzc6e4xdlf5ulvrk34mzm2gy4mhlwq.b32.i2p:0
+vdv2aitgqica4taqcmjexw5xfbrfbhvf5kuxwvfjf3yiki5a5cjq.b32.i2p:0
+vet6qwwa74jrqrjzcm7ylfprzwpnt3hlzjvkbnaoiv4o2zzkr3sq.b32.i2p:0
+veucihmd74nnumiunvruyjs6kpjs5sqw5dprldlzcf7i3h4igkda.b32.i2p:0
+vewdrismzwnlxlvni7slpq722wlwfami2elghudm2ofcjhpjcs6a.b32.i2p:0
+vf3l3f5unlwrfmr3fiphpomgslxgm6m4chg72itf45yfu3brmy2q.b32.i2p:0
+vfpzasrsrqh3llkudmas5fymwn2ohswqi3vakclgm6fn4nb6s5xq.b32.i2p:0
+vgkou4ysuxvhlxrwf5n2ihn4ffyvvedluun47l6dobi5ycziy3nq.b32.i2p:0
vgu6llqbyjphml25umd5ztvyxrxuplz2g74fzbx75g3kkaetoyiq.b32.i2p:0
-wjrul5jwwb4vqdmkkrjbmly7osj6amecdpsac5xvaoqrti4nb3ha.b32.i2p:0
+vj54d2pkdeqvcuj5ykeggr6jnhhnmq5q6qe7nttvb6yjetweadma.b32.i2p:0
+vlwovj6fxzvtsypnmslocootmphezr5txanyfz2gjhn5lanrn2fa.b32.i2p:0
+vmatpbu2vf5p76k2emzg2tjyqi6p6yj3cl4z32ncdhz37ubprkha.b32.i2p:0
+vmbyttxf6sw6ivdamftxung44mktqb4vphmm4lqzdqqpcmksterq.b32.i2p:0
+vmoogdd5lztt5wpzkwhd67uwnvpupye7ycsbz55jl25sueowcxxq.b32.i2p:0
+vn5rsr26rp7yxrqliq7vo4zb6aoichaybd3urvc5eedaspxjp3la.b32.i2p:0
+vnxjmzogakc2a4xn5w4qormiqt5khnjptnoaro74ehinrv4q3yga.b32.i2p:0
+voi5u3azhajnt7476tcikl5mactxcvtsbnrzixwkj62qhpaw5ujq.b32.i2p:0
+vpevx6tl6ma6mnlj42d4fke57en4v5r76yx6rcmhtvw47guo34uq.b32.i2p:0
+vpmkctqhkdqgkekt72srqm4sqaliug37uq2wp2ywady3p235cpaq.b32.i2p:0
+vptzpxba7oys3w2htjgh4uxogaedursdh2yz5k6e7yh4b3pokuna.b32.i2p:0
+vs67sj5crkcjo7m74tdunzefj6ahgrgohs6egj5jxmneszwaoo7a.b32.i2p:0
+vuqk76jvxfk55bkovqcmmkvycmndee7j3tuv7ezdb2slrfpjyvoa.b32.i2p:0
+vxokhkidetjp4tjrj7idojx45hguhnl2azvqnbulougvdkstf3ma.b32.i2p:0
+vxs2es6f7uw2uuneslb7ipvmg6kqh6ytpjezoj2ptwx7od4jqmxa.b32.i2p:0
+vziy2cbrbvliqpi27feak2hiewovxtlkqppsagtaxeib6nkonknq.b32.i2p:0
+vzqowkd4aoyekapcskylli77aj3e5fomixsjyiawnldzj6c5nxtq.b32.i2p:0
+w2a73mo4grdgwvkzdsh6nyutagd4bmywywacxviodw7xnof72aoa.b32.i2p:0
+w2mgaza75amrvfocl7wt6v7eimprlasuj3bi4xezdr2wyqhkxzwq.b32.i2p:0
+w2zi3xos4jaz3ft5yca2x5zf34esctpmzqlqpdrqntjmi2o3gfba.b32.i2p:0
+w3hyqnlueb4yv5lkzj3wlnrjp7fzpxnig6x6m3w5du2ptfjcm2jq.b32.i2p:0
+w4arykcvc7eckzuqr7kvs2njsjpknzb6vvsodpyzp6tvu27bzoka.b32.i2p:0
+w4k4gm3chiyskfzshilxjchpgtpx2xmc6euvkyzkyjvzvdbqroma.b32.i2p:0
+w55r4ykzu6qt6uhp33exqbqmlt357cts2u2zoi7hkuphqmv5iupa.b32.i2p:0
+w6jl2gubyscdpubizes5bp6s42cito4k27xwcjwh76rvuik2prha.b32.i2p:0
+wacfewi6ehmfxvftxqmracfh7se2t7ozl62u4hsuyd4c5xfzuajq.b32.i2p:0
+weidpvshind3dnblwtb4zpssazeenkf7a63favavkc4crhqdk76a.b32.i2p:0
+wgrbhqemtf7qu4c6acjicb7uyee6rlinafyysvxc2yocq4t2ilca.b32.i2p:0
+wjfukwyohljaxgv4woewdtpoxi3q6hnwcnefpgrtif2kqfrxslnq.b32.i2p:0
+wlepjf4lxs4e553rtpoys6kqp2ozcv4pqjwzoybawcl3zhrdvz2a.b32.i2p:0
+wmly6cz5j54w2g2gibnhlpvuhh3bky26cq3a5jy6dp2hg3hc34oq.b32.i2p:0
+wnp26nyphqfmq3udocgcwenpsgfwk4ssw53st4wvwt6mwf7wm35q.b32.i2p:0
+woanasilvwu3yfurvhvqj3lxd25bzj4fxwy3ef3qjbso3cozvyca.b32.i2p:0
+wpnewole7fofvwvrvkkgf45sgcverlodocu7fstm2axp5jfykraq.b32.i2p:0
+wrqu543ssub7kiwzfug4o7m6lc5ibmaamdc3o4uo6a7ntxiqzd4q.b32.i2p:0
+wsbf5tpo7ecsafusflyym72k6tbyclgvqav56qafvyc4j3spzdoq.b32.i2p:0
+wtfebbwmsxoywu6nw5cowlxqhtokxrxftve2zee6flvrpqg4j6ma.b32.i2p:0
+wtoh5v7xm3wx4rqutbyvqaixybwlprx5ua2yiv2gac3prria5emq.b32.i2p:0
+wuikfwkext6lbl6urhoysr2abcyff5lkm2ojr6mfenqq25nzlluq.b32.i2p:0
+wumjwpr45uhvtggq6jkzfda47e4iqk2onizw6vn5po3bd3uqcduq.b32.i2p:0
+wv335vkr73gsaza4t6foqypnovccubvwfsarkmw3xtc3t3sncmya.b32.i2p:0
+wvktcp7hy4l6immhi5cxyz2dlsbhhvtcmskjemrnqehacnoap23q.b32.i2p:0
+wwbojywnrcf2mci7f3zgbomrukcm4d3nv6pttb3dohjpge2sz27a.b32.i2p:0
wwbw7nqr3ahkqv62cuqfwgtneekvvpnuc4i4f6yo7tpoqjswvcwa.b32.i2p:0
-xfkarmvk43vfkfvhkehy7ioj2b6wtfdlezvmlakblz3q4r7mccfq.b32.i2p:0
+wxfs2ccar4szd66dlmlijh3i3r4muehqjxjmabwbb46cq3gpbsoa.b32.i2p:0
+wy2udklgydh7iknnffbzvldoiwsct6dy3o7fjcsjcdjoq4b65vha.b32.i2p:0
+wzui6sc7667w7aabs6iebiex47o7cysxpryfdaltaklw2z2xgtuq.b32.i2p:0
+wzvki5234ffqhri26fqoxosqq3xengl23eoitkvip4mp7aipo3lq.b32.i2p:0
+x4cetuarbwiqphebitvgv4x4kzh6yhyyvu5c4yjlm4jsyl4bvs5q.b32.i2p:0
+x5qtgyzzgkovoko62l6n54p55xma5pbstbp6t6xc6hbugxz5ck2a.b32.i2p:0
+xasewpiqpzhyggxwsajmnkrppi2ozmapqv6673zuuymoueq67tla.b32.i2p:0
+xbetybs3nyeykskasolpatj4qrfnigz7a2bx7wcsyrniqd3usnaq.b32.i2p:0
+xd2byhr22rqkawocapbxedovmifyk77qrh6br4ctx7ny26hpmusq.b32.i2p:0
+xdoonpwnxhr7sjoyca3lkqsapmefd2puyar22ztocod4drjju6fq.b32.i2p:0
+xdq2g4tkaukzcu6mnvdukchinma7koi6c3noflpjabrzjrgeumfa.b32.i2p:0
+xegcohfrnnnuz3hdmb7r4e6pzxbmtg466n6mty2oz3tcoqutxj7q.b32.i2p:0
+xfyzfugo3qtfpq3s5zccbbqrxfkgy3ttlqhz6t6ovmtgrsuyce7q.b32.i2p:0
+xgbz5vpek6vaeej2zejxrjloqg2sqb67gim72qqpodqfq62rflvq.b32.i2p:0
+xgqzxudkvgbqwosaha7zb26jgza5wb7m66727rk4v2zj72xgg2ia.b32.i2p:0
+xgsk2huqghiftyznr6llr6ztepo523hiwqscxjpawcbme7xtjrta.b32.i2p:0
+xjebyiaydsbb76gqzetsmccgh67oeaxt3c4mkwmt7gjlfym266ea.b32.i2p:0
+xlfxusgnzpmatutaredcvx27zoiecno4tpxm52jicdvn4sr5dyya.b32.i2p:0
+xm55wnfhgmsy4wz24swjs2ziguheut6y72kht4ytwyfdmjsxslnq.b32.i2p:0
+xnb3pxtmai6ofbarycclwwueaarn4r3zt3zgkeepo4pgmswqvfcq.b32.i2p:0
+xnvsgbonlja7cmeokr2msvdelqlasbkwgqndqg7eakw43t3m465q.b32.i2p:0
+xpqubs4ftu7ym4xwrirlz2e36gvyjkil3chvq74bj4lf7djcrw4q.b32.i2p:0
+xrrx2rcpj3zefshtt7kamz3uflnwebpv2gkgd6vlrdazxgln57gq.b32.i2p:0
+xrwuqylcgkr2ovsf4pziosd27ywd7pfaohnreoyzm72qlnvoktrq.b32.i2p:0
+xtxh4wtmbjls76wxnehe57etubuqvsdiunwgve6kwjt4acwswnjq.b32.i2p:0
+xud4fgmeq4hl4cgsbjn3ubz2iyjguogskn7wreesvpsm3ib27kpa.b32.i2p:0
+xuivvnpcj2rhsxmkyyjzmyq6a7gwgusnqwdklgimamvkzu7rnnmq.b32.i2p:0
+xvpzaqftlfx2etqys733mndm7jr3l2j3if3wskfljzaow5s4rrfq.b32.i2p:0
+xvtvmaele7ns725mjaowsajpx4bgfecburyh6pqmdnn37cq7cs2q.b32.i2p:0
+xw6ble42juwkfrjetb3hmk2ep6jnyufhutoenyrou6ieoqiomw4q.b32.i2p:0
+xwlkpubkvsdsyaeylqfmxfk43juk6sz3hxnmwe4zencjq77aznea.b32.i2p:0
+xydzqrwggskdbmeqrhgt6alroglzbkcarzdlhabmvrszm5u6cfuq.b32.i2p:0
+xyhlemqmoeusqbbzr4oqph6kgmvm3a3lrbuanxkmyetwohxoynna.b32.i2p:0
+y365lf3vlh6vg4rs6trnjc4ia2xqplahk26y3tyqjly2q2vpfnqa.b32.i2p:0
+y3equ2tc6zsxqtndugsfzottuenfgxnl7eqgadmnzjkoigxvseka.b32.i2p:0
+y3occl5rqc2mz64esu5mqzoyfzlbxop7tttf2b3gyxjust57txfq.b32.i2p:0
+y45xhqkb43ncokfwhsmr4z6fwykuit6o3p2kbso3emv7stpiwwoq.b32.i2p:0
+y4njm6ftdn562q5thzd3fvb2f5mbi6bglmyupukcmcpt2tuo6slq.b32.i2p:0
+y5wr2bw3rt4rvw7hqqj7qtlf7vdds6zk6cs3mu3myyduasieqoka.b32.i2p:0
+ybjgylnhvk3fzyacxvyh6dwvrh7lk273qh5qws7uquvrhhwr6rka.b32.i2p:0
yc4xwin5ujenvcr6ynwkz7lnmmq3nmzxvfguele6ovqqpxgjvonq.b32.i2p:0
-zdoabsg7ugzothyawodjhq54nvlofa746rxfkxpnjzj6nukmha6a.b32.i2p:0
-zsxwyo6qcn3chqzwxnseusqgsnuw3maqnztkiypyfxtya4snkoka.b32.i2p:0
-zysrlpii5ftrzivfcyhdrwpeyyqddbrdefnfu5q6otk5gtugmh2a.b32.i2p:0
+yemrkyqmjzwwn2yast2ga6dcnsovnxwip2rjpid56grdg7itugpa.b32.i2p:0
+yfplj67xwcblbiu4ozddmzlmjl4ifa7bhkzzu6fu6jkoyqui6v6q.b32.i2p:0
+ygtc5m4mh3qhi7tct44gxqbenhkasp2y4ydjn5qua4l5vh35osdq.b32.i2p:0
+yj3v3ocgldnackxptsjmwasa4xzxj3it6rtuhmlpxvwlq5kmyytq.b32.i2p:0
+yk2srkdlbm7kebv53dx45ss7q2fjcy56m3gywqvw65eya7co7hgq.b32.i2p:0
+ykppjmwunzqzuuqc6qqsijomfzdgieeq2mkidapc4awrww2ninbq.b32.i2p:0
+ykv62rivlxurq2wkecagzs76tulfor765c237bsjn7jt4436kn2q.b32.i2p:0
+yllvqk2utimxjtoyzk7l24s4n5sqp5dbn5vwsbt3g3dd6h4dxseq.b32.i2p:0
+ylpyfcs24ij67dkl7ighyou4z2gpfhjlt2iellj2ad4ddrxci63a.b32.i2p:0
+ymo2cnldmstzqlsdhx7kurii7aaffrhpgafxlli3s47pzbfe5evq.b32.i2p:0
+yny6zqtb7qve7wwfctsozhzhbq4hyitlqco4uhc5q3rvjex77oaq.b32.i2p:0
+ynzhhxlieigtmj6l7f2dq54ypnsaf723au7o3uhnismlgnkmcqjq.b32.i2p:0
+yof4yvv4agwhfmicj5u2drem47nvfkihnp6bil7ocg65gydyzzcq.b32.i2p:0
+yojuyryq6vfoy2mftrdmybmq2hjefuzrwmpqqfvk2kd5hptgr3qa.b32.i2p:0
+ypbq5aleoqqoxto4tkxlmlxh2hrstjxzpgonj3lk7dzweahs3hhq.b32.i2p:0
+yql2k4zjl64dtybuculjgg4v4u6sje4smnyay3vslv7irrigzxka.b32.i2p:0
+ys36rtuedg44sahelbysqi2mbc2l3rcfdy33zdvhvfkx5uocacba.b32.i2p:0
+ys7np3pmfhiyq3z2rcoeylb7agfbyfuhhp7ky2uzvvuzswad6cia.b32.i2p:0
+yuqb55drzrhxfnvobycxqau47kibaaf4voamk3kxl77xbb42xkqa.b32.i2p:0
+ywfauauaekbrxgwaahcjzifemzdq26xsshw54sg4bpr5z74scwiq.b32.i2p:0
+ywpsgu6nlnf2l4sy44tit2av7hfzwwttbjvwbtsbtqur3awiax2a.b32.i2p:0
+z34pw5tlowwi3gpj3ycb2dptgyuq65bpj7w36xahslgikggo5eaa.b32.i2p:0
+z3j2xshl4tpbxaybcprhzq7cuz6urboqoxvvpnfriv4n2lq72jsq.b32.i2p:0
+z3pgyfiwfzcd2g7v4rs6el5tvc55y7a3tai4gcbpso6flaejckea.b32.i2p:0
+z6mlyrxcjddpcaoumxnw5peulnkvj56hgwqmnc5adoutp7piujaa.b32.i2p:0
+z6xsstyq4zynzvagwv3wr7htz4vxttrotzb5izefotlwqm7kjtua.b32.i2p:0
+z7cjxpy4taui2ka3ekfqtoumsb7pg2sok3wfey3m2roeuppcrzhq.b32.i2p:0
+z7cjzfmv6wadjguzaavu7pfsqhujbczspbf5sxxrqndeovu3lt3a.b32.i2p:0
+z7gkesbkbl27lpcpbnhgfofjz5fhnvljzfvyydu7ky3odzdqs4lq.b32.i2p:0
+zafd45c2hzd4w2t24qtjqqbqm3z4hayb6vadj6sd5oukjyij2ara.b32.i2p:0
+zbkqcqtiiw4nwsds5pjel6alr5i4hgiyqf5giwurdygfysacru2a.b32.i2p:0
+zbz722dh7rvu6ugdydmlmtgfyc7rnpeslae525c7mhr7rgsekjba.b32.i2p:0
+zcwgqw7hlw7437a7au6n6obljdb4arnshoibdqo6voree4xiznoq.b32.i2p:0
+zd4ns4zcyvgpwkioftiiftgj74n6mf4m4ieq6aedqaznmdi6rhdq.b32.i2p:0
+zgwseerxwqnid3zhculzuqbkhghthsbvsbnqowredostfqlvawsq.b32.i2p:0
+ziehuxdpyg5dvvnzedmcqxszdcflsrx6fqmgzb7odefqwqaxrs7q.b32.i2p:0
+zk2r7kzzigzu5kz67xnrbe56u5walngylcsk756bkmt66cmeeydq.b32.i2p:0
+zkbjgfp4ouockpsmpbdyli4ilo7f3lbfjsboay3nf47ymir2ldrq.b32.i2p:0
+zki6halesukhfel76pziutgica4zrp5qtbmlmgyqf6dnnomk7hja.b32.i2p:0
+zkij473aummp6rvwvi7wbr5iio6xu2uh4rophbhyot37uxhrygiq.b32.i2p:0
+zpvqqdrcnagad5ayutf7hkp6prtvrbmknhqdul3qweft7oa5ikzq.b32.i2p:0
+zqft7c6riv7aux62qwe5xfqki3dcb4urvbfy6m4wz7f46j2us3la.b32.i2p:0
+zqhoqgf3enj2pv74sjov6dthpr6jqafw5qqzzsvnfdqzycychxpq.b32.i2p:0
+zrrki54mn56fytizkfmhx7eubea37padxa3zliwq6gtknrsxv2aa.b32.i2p:0
+zsfpcnbk4g2bwxl7yy5ebrcvlxd5gpcxatewdrgpige7oqykunwq.b32.i2p:0
+zszq7enaxbz5p3f3idhfkkd2u2ygpeqwj3o6hkofffcmllnymwqa.b32.i2p:0
+ztr3c7qz6v4hrnegmkzjsr52wyi4u6ery4m74sk3m77oup2ws4ka.b32.i2p:0
+ztyxbjae7ucfyupxpy75jwpzdktg4gbvhl43nh2crwqrx2uhveda.b32.i2p:0
+zuamj63ad73jmnw7xnxrmjsbjg7vg23j46w3mpc2udpcgjfkcqcq.b32.i2p:0
+zvchlrjuzqdlx37fhibhnym4y6p56vtlymujjuzhh2cp34yqfrtq.b32.i2p:0
+zxsd3fqczh6ddgejc24nnmb3ww7nalieq3a7cs2mqiy6tmff3wia.b32.i2p:0
+zy2ywvyqds5bgdoo4tgbu3bwjp3ygyn3zfuby44jemc6xa6fbwta.b32.i2p:0
+zzre44vh766jgfordw2ehu2r6p44j23uyovgvm7iwuhp3g5iz4ca.b32.i2p:0
+ycdw2e4ufgfwhcqna4g3m2qsvaly23ozaexawcj3x4gtgcehgwujjgid.onion:8333
+ycfvedulkprd5bmivqejur5aptcs47daqtcvzotnnhfvwu3o6gcp5cyd.onion:8333
+yck6l5ffw6oszgtoc7et4fytvp3sqdf5awyky4tlpgem2n4y6icxqoqd.onion:8333
+ycnepnzktkhfysqijlgbjk5awivls3eiqb5kjudotjvnvlbe6ah2k5yd.onion:8333
+ycwrrabomoixkxggkxldyxkqoc7qqy2t5wxcsxjgodlvuydwch6dqoyd.onion:8333
+ycwwrwkqibvkftpc5kyqs6nf7hrzetrmqgwo4yae7bq5otvubkfsread.onion:8333
+ycxjdh4jr4vun447cdszcoge26pbdnqblfi2osmk5e4uqmrigw7y4byd.onion:8333
+yd2ami3rem3i24q2b76l4ujyq343ycrowrthwqycvpcsofgpwlxyryqd.onion:8333
+yd4nyusqking6tkcwmmopznlxhyfhk3gsw265alz7vpo6toqg3kwn6yd.onion:8333
+yd6b3wtmu6bz5km7hw645omyv65one627xech7f3vnlwkblsvqdtmiyd.onion:8333
+ydforbx54mnz7g5u2mu2ulkomvakdbwxoad6araknijb2i47gkfeh7qd.onion:8333
+ydiqekqpcf536w5uwsdclw5pt4n2fkz52fo4vwdducc5t5l4ghqaxnad.onion:8333
+ydl5kqr2auvie5mtjkm37hzkqh43pobibty4msfzkbu4junpg5gak6yd.onion:8333
+ydojumivjpins2lwgql5xaywbngrmw56nvmtalvfiy7sr42ksvr6apyd.onion:8333
+ydvbxdzs6w5wefifiqsqntpbd7tliofenqih5hlnz34546fvy4ab7iid.onion:8333
+yeat6ea4esvd4nimhg2rcb3ghpusoqzjb44alb3hhdj4d2nimn2vpoad.onion:8333
+yeficzguf443sojjdcmh7lzk7l6y43a6v2jbyk3x2w4n7xokjs4crnqd.onion:8333
+yefjaylovpdhbb5b5bhjx37digt5u62lmzyc54ygtabwdphm3zwd77id.onion:8333
+yeghpcuryadlbxzk6o3ujebmfuumkpoi32dr2ctfmql6vqn5wjioehqd.onion:8333
+yenw26f3i6kf5u2nad6xligxk5iyizjvl7msx3pzjcatiesogdef4zqd.onion:8333
+yeoadueo3ukf6s3fetywtbvgmpvrtkja5rlp7wcp4aich6tfhh35giyd.onion:8333
+yeqjrnnuf4fbgzik74qfhrohcymj7ccbze6ndky4pe673chfsjconfqd.onion:8333
+yernmfgru46g43vsijjv44n7m35tpoznnkd2p2wl3uqzkietukxqxoqd.onion:8333
+yettfzp2vanmkehwxeaugotqcsg3wsomcargvetk4nhwnebrpq7ah2qd.onion:8333
+yfgo33tiu6w3nrvnfyw2nmpcwtfozinctn57566y5l4hfcttuvgff7id.onion:8333
+yfmujam6pa75vm7p5q7gvgkocqzcwm7lgbnodwtmzfw7usy5dvlgqyqd.onion:8333
+yfpqwz4qogg2r5sdweggggz76pmhxtegnisz55urw3egvcq2e3amvkid.onion:8333
+yfpucmv4zspytubs5epnze4xc4joqny52s7ifjk3vu644axwkfyfurad.onion:8333
+yfq3sexjxzuww7tnwc7jj2ethiu5f5r65ewpy66os3ozhoeje7na4hyd.onion:8333
+yftuiua74fspnqanvait246qn6vmab4aoympjd3omppu46jkq777axid.onion:8333
+yfxz53gdbxu5hapg3e5kaa5pyxpbrpiql6j7sfe4i7fqj4blpqpufzyd.onion:8333
+yg5xbesziuiaigwyxjrn5c5hvj6fxef45edl7pir7risnr6un6esjtid.onion:8333
+yg75fc53cicbsarrpfv2s4crpkx6vdjub4va7cvbducwzhsf6qehx5id.onion:8333
+ygczn2llqhks3ohxvfck4ks45ekg4xr3loriyynnejw2jfmi7hjsfead.onion:8333
+ygdfwrg33s3qwiarwxbejalkirmqui3wjz7wfccprjry6bm5la65vhad.onion:8333
+ygh4hx4ugapidwxodkjr6vgl6vkaqvievk2eiie7v3ewuvjvg2mzp5id.onion:8333
+yglvvnb3dk2vh2wwgpcnvm6t4lgbdhnvpy4jfj3ee4ugb4xzvjrrcfqd.onion:8333
+ygospbn7dc5a6haqur4eoe2oj6jttjohs43rhl5m22ltruh4fz5isxyd.onion:8333
+ygowwz67kvvri2lcwknsc5xjdz7ffat5tqkm7fmxrrzfgvqnxoxkvgid.onion:8333
+ygwuwz5autfc4tqluyuoebghc7f6lgjykm6oprynh3h2vfp4xmhiapqd.onion:8333
+yh4edjvpbo55vsankh7e33u77ep7eah5h5gvfgu7t7mbb7kkmjvgirqd.onion:8333
+yh4uoyfzey53dnoj6zm3frihhgwpqfqkw36sjmqsvfnl3rqohs52wqid.onion:8333
+yh5us7dk25ttxkt6miers3bazlm3jiums5nwz6mzd4i6kn5oizjccuqd.onion:8333
+yhddybpp6lgu34i7uurdqg5jznfdajwr7co3twiqf7pgnj4yjgzbnpqd.onion:8333
+yhiswltkrs3upvkrygsuiou5i2njnyxk3gwtsmcr5yn4lfinzifbpkid.onion:8333
+yhjkylctf577degc7ufffvg3gsdxgnx64pdhzfujxjgfhbulmtc7yaad.onion:8333
+yhnzb5pmcbeiqs6bxm3xvzdy2dgblteiswvvtg6vhkum5gjjw7abjzqd.onion:8333
+yhqytulgwdtvozjhuyod2cufnkbh75mgyw43k6w63ah2fzulskfssyid.onion:8333
+yhtxfuf5zxqoqkuodfpmzsnnmtm354y5rtexqplt5l3fkzzksjkkzvyd.onion:8333
+yhvyxjfauptpsjrxrf3oxtv5zlju2gdpitwsabcmj5gdpjr6i4z4ulyd.onion:8333
+yhxcgpy2bwwhhpmgellyghjpkw7cfrjlq6trq2yl3632rxerwbmkvfyd.onion:8333
+yi2k4otmwujg7bi5iw7ewqntnxb26jyplx5xyk7bjvvaut2y2mhcgqid.onion:8333
+yi32omh7hh54oeot4i2ze2tif4l4cwdhzxxn4bzmtqrotfxrepttfead.onion:8333
+yi4gxqy63csutkea3zss2oryz4get22hcfginwcejy65g35ec5t4uzad.onion:8333
+yi4nvghovjd5bzcbhitvezh4uwg32n6r23et633odlacu4eamfym5mad.onion:8333
+yi5x6isngj7pivr5wt6i3drntlqsvbzijpdy254lbjdnihxmfy2cdgad.onion:8333
+yi6umkklbb6vr4j75buoss7kqkgcsdsx5fvgi57h7j5bzuleoe3ae4qd.onion:8333
+yibgffpo7dimyvjlbzfr3dnmnl2r5hbrpxbtcpksthsko6udsrk5uzqd.onion:8333
+yiiyiuwns45zhmkwi3wjumqhnyfkwkahbggd6hrxtnrxfqwn2vdx7pid.onion:8333
+yijdxmlgnfcwrb5zxvchjhgtc5357mecuopminujkono7bwjgqu4acyd.onion:8333
+yise75jksg27th74bxo3a6rcr3huvromhmuhnmy3n3ngcgfpagq445id.onion:8333
+yised7sf3xzsnlggeuioas2of4crrllkpz2gfbdy7c5cysa5sxi23lad.onion:8333
+yisvuvmqtn7wht6dndrqzsdl7vuspxwrmfwwu5o7wldnzn4mbzeb4yad.onion:8333
+yitceyo3wv2mk56omv6mon3n7dcfr7jiggdmzlmtikpoam2otiey64yd.onion:8333
+yiuesqqc73nn7kxadavmlwc7ymciszzk7bxs3bd4fwucaocme6qb7lyd.onion:8333
+yiz7d2lkgk2mftp6i5e2tqhotqkqjgxbdmzbnflwvsioyfydqrvll6qd.onion:8333
+yj3gs4nvumsfztawn7ku4cmner2zlmcn5kke33g4j2vywxsrqmbd7kyd.onion:8333
+yj3q4iustxfcq4bisbuw3jvqc7ph2ggld56mvyxqvgw2tmsinbwlnzyd.onion:8333
+yj666fxjddvz4xzkhtzhh53wvkiobvildczzxb3mixjipqqiqaz3bzid.onion:8333
+yjdhdurh6vqxuykgmuskpabjzjni3ehxxh3zq5redu5hqdmhdw5b5jyd.onion:8333
+yjkojvjsg6yhfj2ln2bpcrh2e6fr42ul3yzsebbz2kkytg7pf2zzjzid.onion:8333
+yjudzsswyvfqyeth2eghfvegxg6z6ubnx72kmqjljhdewrckw56lggyd.onion:8333
+yk2foofoifxgbrp5a45okwbelrsvycgqgw24xv56hmuqxlpmw6msndad.onion:8333
+yk4sercvyzvqxgbgn7srm6eeivlzoa3t4sz363aygcyciubcieihhxqd.onion:8333
+ykh3t44zjojpj76ouqeo662ljhyc2t6e3mike76iqpelcdztgaxuw5id.onion:8333
+ykkhln6x6hcmhyrx5rxaf3c5auh5k4plrpaisits63r33ecwkmtexhqd.onion:8333
+ykqehwl47hwypuhhuuxkpoexocldvllixqhplpsy6ym65vbjfa3yfbid.onion:8333
+yku2clwr3x3ndzfjdk3o4spoztoqy6ndatken5wopgapg7qkvypuqoid.onion:8333
+ykwrwuffwvaxlwivt3hlhyz2yo5xde7dw4x67ygc4xh2t6m4i5cftkid.onion:8333
+yl2preaby2yqyhmviyq46roapupmnijt2g3mzmvwtxptvybz7rbs32ad.onion:8333
+yl2stshaozpyqtut7m6ln47z2qhledknuwhij6kvxsuaai4nwy6fp7qd.onion:8333
+yl37nyh3vujz2fyrz3eoqoteixyiz3dj5rfnnmrglcgcswzbeqbjhiid.onion:8333
+yl3bo5zwwsg5dbhrrcjkvoyvwwxp3kbdgprhe6md52ob2lra7ynrbwid.onion:8333
+ylaoywooejvpfosewxmyxjhc2ahfepjbvuyjc4p7bymwirexlkdituid.onion:8333
+ylaprgwti4dsumx5xvlhul3esf3yi3ebyyubb2dwfgwe3zysv3e6nyad.onion:8333
+ylblnrd2jnfjtustl6yt6pix4mgqr5qqoevunmwk32e6fxq6uj3dchqd.onion:8333
+yldtx7o5y5jf2utrrtqf5yf56akol55wars2uwxuvjoubustrtmuqxid.onion:8333
+ylh3vliup6k27pt2thw4xgfguiziaosb5y3ovee4w6dzwcb6hc6czwqd.onion:8333
+ylsvnjqrcgatkzj5gfkwt6cz236z76yvgpeulggzml3xb7tnbsttjnad.onion:8333
+yluwecwlibf5dw2sup64dq4gs4cfdhtkfhoy5cszrvu75wljeqanr7ad.onion:8333
+ylyuglp5b2p65gmiofhe2irpxswlhecdecg7d27qhcwehegr2efmesyd.onion:8333
+ymgyodvztfs4nnijjnwiv6eadetxjm765iv3ryuyhsq4upnjwncpvsqd.onion:8333
+ymiw3d4klephwuwbkgdpllrs6hssb4svcg2um7sdm3hsnnksbnvj2vqd.onion:8333
+ymnypd7xmz2fka2r4yxvq2ibf7rvdyl6eemppo74rfehu2d2oqkclcqd.onion:8333
+ympp5jlakwfhj2bozw6w33qailkrqbroizxm3pdfxvjdbrkwtyx5iiqd.onion:8333
+ymrunm2vhoarw7rpo6jdmq4mev5hz63umljki65q2v327vmnw6wjyvad.onion:8333
+ymt2hdfgdxo2awvj2k4y5tbpvapj75j7v34tvvlrqy44lsvvdcnjx3qd.onion:8333
+ymuufa5br75liswfrb6pgm3hc6o67gnzhyg7vpfo2qsw3oyw7m7nsaqd.onion:8333
+ymxea74sswjyqvv7jsh74dnvimcsq4rnao5x5g7dfjnbfy67oj37l7id.onion:8333
+yn3avowdk5cox7qz34s3qiz2u5j2xg3irxckhzikfjv5ccjqrdiramid.onion:8333
+yna4zorq57ehghewlega7lb4zgx3t4lgv5k24orv7b4qcg27svymosid.onion:8333
+ync7fc7dz24s32kp6opdkbvohb74obme4jgo3rkkvjzywslxegist2id.onion:8333
+ynilvzuulga2tlv2hcic7ayc5qpd4nz7r7snsyejp4vxwnxlonf4gvid.onion:8333
+ynkv7njh6hj5xewxxy3gvtnu6ocyvu4tgrl3gnw5xxkdpfshalppqmyd.onion:8333
+ynqgzojvdwv2rui2rlechb22e5hwqipltusdnfkv7s65iz6fgrnybnyd.onion:8333
+yo4ykt7hngppavow7f2sz36ajl6w34bw6qrcfee6i3s6jkm6seove7ad.onion:8333
+yoat2b46hzeuhy7n57gjmfxgppei3xnzdxwsl2ipc5ny656j7zp6ovqd.onion:8333
+yobra7r3ketjuhr4g4cfdqumsez4om2eefvmgxrxq7wxnkouzmcemwid.onion:8333
+yogfxdco264tjbbeek22o26lznu2g2kwvs4lmft3ib3xelndagtf3uqd.onion:8333
+yomwxfciljad63gicbd5757og4lypcph5f5mqdou5kj5rowkyotaohid.onion:8333
+yon5gz4q7soici4i7jf2zaciusioym56jo2bat363tr3peoiurransqd.onion:8333
+yoobb72dyt62n5dpsu3aqpqa3lmfj6gfurno46o6vmqdbpwqw32ahjad.onion:8333
+yotcqynj24k2ckilo54hjhftjuvvwiacbzoraqc2kq5vtmsxloswddad.onion:8333
+yp3juo763dmi7ryhkv3kq2l262cllrru6ks5tlzcdlxdakmip3zosuyd.onion:8333
+yp47gud6fjsvjgu54oica4b3ij4zfreactcaon6fx7v7pfbxbrvqhtyd.onion:8333
+yp6klgnrvisq73qg4dk255h7un2k7pbk666jtzc22rxjs2en64ojauqd.onion:8333
+ypaazf2z3t5dqzudlygjjpyb2uvk63guovstzubsohbbeomometn7cad.onion:8333
+ypakyst4bbhh2juqd6r7xymqnrgwx3eajekpg6o5b4fazccy3mwovdqd.onion:8333
+ypkjkt4dnyqy6svecydigttwnsj5x643w6edk6qzhfo2hkxxu4ln6zad.onion:8333
+ypmikts3saaffj2uo5zmkbac5m7xnbblxkbhpw5xtxbamajqf36wgdad.onion:8333
+ypninar2hybv3jdovr7ax7teq6wpzvrw6n74csq7edos3hzumh2h27qd.onion:8333
+ypoinzgql3zo5d3strpmannbkdtndxkxlajwgcpaj4ngbc5mqrzzgpid.onion:8333
+ypp73pv2vcjfq23ltwhojuremxxfknwtgkxsvwe3widlaevyx34pepqd.onion:8333
+yq7s6pe7jzrzj5uxlorytwxd5bs4kljyvp27akdrpang765yd3sexwqd.onion:8333
+yqnal4phy7wz3lsoi23rziyb56bnbzvvypy2mg5ponzrk63qpyvle3qd.onion:8333
+yqoiqt3molj4ygq44zyme5gdbgee7catlf4ndjr4myiicduuwiev3fad.onion:8333
+yqvhbmvc45iy3drl7nceuhugdt2fevwx4x53zafio6h2626kflwtrcqd.onion:8333
+yrambbqlzkm6o5pkc5q563njvrkfallqobvscvpdik5owbdtnhbc5jad.onion:8333
+yrdtnt4lkpysyyrvryqhxw3k427gxwziosdtipf2dcifougwzomdfcqd.onion:8333
+yrlc4r3qfcr4x5wnciutrdvasrpahor3ui25lgdgkxbit3zwtmwfmxad.onion:8333
+yrmpasdjmb77ono4c6rjh24fj5gt7bbjx7nxurytkmxbww2gam6vodyd.onion:8333
+yrqolwaoxpa32cw2zegnaggmniuer66umflznja6dcp7udqpaoanqwqd.onion:8333
+yrwksigpx4foqlwnf6cxwtppx2z2msompig73dkcm34pwsmy5bwwg6yd.onion:8333
+yrybhm2es4siupjnyjffviemvqx24mqj5niwm2wf56spdqlwau44r4id.onion:8333
+yrzwl3rbfjx7eybyjvnjz2y7qmvpnkexkmylqpwsb7ivpg6ch42mmxyd.onion:8333
+ys2muyvcnpdadettzavleh7qrn7t6r7e2tobfp7yxftta7ez2i6rdxad.onion:8333
+yshp2g6b53ndeez34nxnk4bz6cqbzlfxqdggi7btqlwzxzuc7sweqcad.onion:8333
+ysq5rtpfzkz5gt2s62idbsd7secz3jepzlup6hqf5ttdutsdmwg2ryqd.onion:8333
+ysyx5eagwnqpfemz2nhwcxs2c3eueqk5f3jnyvyfqfno3pflcqfw6yqd.onion:8333
+yt2vub6llcegxuucu3iekjqfpmbyz4kreuxx4su2pqcetw7kbkbipzid.onion:8333
+yta7q7v5lkzt4zyp3m44cxcdtymxgmuqdntnagz6h3hwidmqoeavifid.onion:8333
+yti2ofsqg7k4zbln6aqx4zqaor2zpmlsebyljxlu7jczsjqtd4ctd5yd.onion:8333
+ytkkqeik77zjjwabsdlctuum37jr3r2rg6ckxudza7y7tialqr2wfeqd.onion:8333
+ytq4uowr6vwyjmrjvac7aimjjlzylfmhqhn3z4ecenm5dd6u2ccsijyd.onion:8333
+ytqhsolk7pqur5cu2faxruehvx72yiiwb33p4szdnzidjqksanps3nyd.onion:8333
+ytqzrm7fke3kqgh5b62taq7yyejgtd3yxwaifj2pimoqbfq4p7xi7sid.onion:8333
+ytrhvysmp4iq2qumdrpgp54q3ushkf53b6i4oxpddg4rmlk7hbayusqd.onion:8333
+ytyn2e3bkmgavrygpk5rzydfdmhpkercccqcaks3xtnbgq5qsyg4euyd.onion:8333
+ytz6ov6l5ofhjudlfi5k26lsg4v36p7xwciafy2sdau4cn6ozxgmefyd.onion:8333
+ytznm6jwapg5h3firimqb7ao2g7uihakg3gt6hcpfqkkgcyemklfufid.onion:8333
+yu6ilgxjfffdb3fq7srwwmz6ymp3fxberstpl6vdocmxbrrf5e3tw2qd.onion:8333
+yu7c5kjgmlci4arofpgq5d2qs5fvbw3zac52nampn2vc6vximc6qovqd.onion:8333
+yufe3o5x7spybs5tku64r6hzbrc46uq6izky6z3dyvba2ymblvehyiid.onion:8333
+yuhebtpb6urpsrr3g3vk7tcl5lp5dt7kcaj7zpgox5r4x6ptysxzvgqd.onion:8333
+yuqoihr4p76t2yupxuciurcpzsij5i32enjlsynqor25fhdvidx3djid.onion:8333
+yux32z6r5leyhbdrgdpti4sggxyoy336qb73ia6sk5egfli5qsvkxvyd.onion:8333
+yv2ezeqqfeoprti36q4fds3ckq43vdv7vktqfpn2npv6isnbxay47hid.onion:8333
+yv7ainbyxz6wejjhpjgzx6ghcomdwd3k7fclru4woooxcovyjwrp7dqd.onion:8333
+yv7llcydwvi2m4xpnulhgxcrje6vswtsasu5bbmgxuk3lgln37tdvbyd.onion:8333
+yvgzvmh4ngi36zvn7pe3bocsxj6pccafh7v6wmswkdobbxdzh3b56iyd.onion:8333
+yvhvl5bvjp5ljmooujmw74wdyqnhvwlm44766wwgq5thnzctyni6yeyd.onion:8333
+yvnppv3n3hwexlvugfviwv33ycavxdwnh24dps5vp3y7kw6kze36v3qd.onion:8333
+yvsokw66m7kqqqjxb4mntjvwhnpoovoec6rrpqtdze6fdvpbtvt4iyqd.onion:8333
+yvud2f6wb6puec4xq3a6yruax25jydqepowhz65uvlbvblsyi64skoid.onion:8333
+yvvodwqb3szlgkx4egcyq7qmhpyoqxdyxdnksxl6ppnmagnsu4noemqd.onion:8333
+yw7tqaujnglpjmjak5r7sxvjg4gqeubwetm5h54e7fbfn7yx7kgr4kyd.onion:8333
+ywbprsiodgtlc2qoubvot5qm22logutr2dbizmlond4dcifklaxqlcad.onion:8333
+ywkxlaydopi6ygjeggtv5znptkrldzsh7peg6wabkjmcu4k3hmbjivid.onion:8333
+ywmh5zcx3r2rd7zmkyx5kymgxk43lsamie52kbhayqwqyod5togs6aqd.onion:8333
+ywq6oxdfdvlict3cuasd3akvcl47iw6bxykrvkalemrcyqzyzclbf6id.onion:8333
+ywqkdkihpzr3hx6la2lzqsguoqbuwkn36qcrbkhvltd62zdrguprljad.onion:8333
+ywqp3kjwchkto24so4nn4ofq5m5c454btnkux5jxftkkqz66ducu3mad.onion:8333
+ywqygs72qzxbkjekezlhsnrsfnnvm66igkovfoh267ru7ho3qtxtalqd.onion:8333
+ywvpyur4ny6zhfxpsva4mh6cd4htw4q7ylx7tissnxehwg2bid5fumyd.onion:8333
+yx3nnyxy3h4ex22uqdjwephoprte34jelnkpr4ua3d23ks7qxjrqzoqd.onion:8333
+yxa2iu56fp4i4mxzdkmv7xxrluyxtkylqvexuceivx4fqxbjyzme76id.onion:8333
+yxgvp66ll3c6ko7w4hm7xvzofd3cb3ku3jjqc4wihapnyk3wxijafrid.onion:8333
+yxlaxiaatyfnrx3l2vhb4p6d347djzux75gcl2d33aydlwspo5w5wpad.onion:8333
+yxlwpmsjdbpldhi5hlzopision3iqbjzpvyaaeb4yst3z73qbgqy5fad.onion:8333
+yxnuslj7hslwmofh36a37stlm5jjnq46vvvyntf42uw3zuouot3sjaid.onion:8333
+yxq3bjwdrck3lflvwixj2fc2l7pzqnea5l7cucviamoc63a2xozk7iad.onion:8333
+yxreb5ajudnpt3b7z5hyizaj6ufgd46o334wtduuyaakboxwztgji2id.onion:8333
+yy3bnszld2tbbyd45f2j7btrbdz2p5zsuzie27liqr7xgkfh37rcojqd.onion:8333
+yy7rusheh2cq2xghpsdzlrx4gpejgfvsfhq6333d2jttcovhh5jo44ad.onion:8333
+yygxdcvyp6tn46umpmxlsgsi6crg2xjchuhi3okobofsx4dqgwucnnad.onion:8333
+yyo5s4r6wr6p7l5p5umlp7xgb47ugeptugscv4gvpsxvjlwymfpwruyd.onion:8333
+yyr2peqznujer3t63yyhlcasjndbhllvtxxkmcvr7p4yxpuzjrcylcid.onion:8333
+yywmc2hhk7t56e7jun62oidqft6jvtvvlylexihzgcrtkzxe5axsd7id.onion:8333
+yz3izxf6pdtr3ucbriuo4bpgjn2visad4vgocktexnpv3rfgar3kydid.onion:8333
+yz4l7aqcjf3lcdtdcuxoxljedrcrlo3lu6kths2bvjeoil4wqx3d46id.onion:8333
+yz5i6sldywr2mqzh5qmwoqfgsta5f67bgdhqogejjmpengl3llafdjyd.onion:8333
+yzakgornrhzzenpclo4ahyai5lxsg6mjq4zrwlhqt3ff4sblxi42jwad.onion:8333
+yzbka2sygb5eqgrgk2svqin5hl3dfknzfdn6wzwncexsejmrp5wgm4id.onion:8333
+yzh2ineefkzohck7vkwcfe62kvplsly5xn4dmm25fpxbjq2va34bu5id.onion:8333
+yzigosfexpco67cy3e32xehlpwor37fp52my5pwtr2xsnj3mxl7gfoid.onion:8333
+yzijb7pu6mrrdwb7sku2e3epfyrkhl7t2a723vaisqulr3roaxoy4xid.onion:8333
+yzlai35raddd2kdjnukns7u5t4m4ngi5dfrlq72e6lqf2hp5dzkuszqd.onion:8333
+yzo2vz4kuitm53zwynkm7ddfdw5escsp5fp7rgf6uspphe653mvdekqd.onion:8333
+yzqfzw7fgzzs63xpvsgznhnassxcadbfaxxaxbmkffvesgdxizhxkyyd.onion:8333
+yzrw7ukful7rhvlletmabm37wupkhsxwo2esqqotsoh6gxib57ss3tyd.onion:8333
+yzs2bdhwhxfgaozpcic4v66w7wwlxrr3v4xpgzer733qehcwewijipqd.onion:8333
+z23pfizxwpae2sbje722iesvd6rcxntazcaoefabzsudkc4xxmtbqoqd.onion:8333
+z2eky4p4ozlkrrmuq2jqcz6w2k22re6hxrm3um4ypcnmzmpsi4p6l2id.onion:8333
+z2eo4uckd3ymgtsjitag7yqukmjsjpwuf3d3npq4oskeatpkcinxkcad.onion:8333
+z2gnzha7ttijmle75dvqdzaeqz3xyxzjrrqbzribvwbomh74je4xeiad.onion:8333
+z2ihxne7lyodwglkwpvdmz3a6343msirrvjmaf2pytuo3jysabrkiiqd.onion:8333
+z2lhlshxak5owviqqzacj73ioftqmvq5idawmrgt4k347bwr6yubmqad.onion:8333
+z2njilhjl33youet5rbdfmncadpt7tohtconls3qhpvuqfkreoteqfyd.onion:8333
+z2nocd4haqt257cyr6festid7enoe72qpmu27cuvveoon4rcak4femad.onion:8333
+z2yjvxbv3rfpso4cjkxc4i72f55xb5fihthcdbvh6dp7ghxz2q2tabyd.onion:8333
+z33gr6fni32nkhfmkovcbvpuk7s2atoqfbuzdgz2jszh5ua7zdu6uvad.onion:8333
+z36427rantiy4ikleyihwfwh2ga3pyqqz7doezrzkyv52bi3mpcgt2yd.onion:8333
+z3asgzuzdvhrrejqjnkg5qfeynspuwzzrl3sr7seqxlwkiemnrpsrzyd.onion:8333
+z3hdtpvmnaz2izvnlopzmfgdb2synsomzgy62h7vlxvsn3yqhgufqjyd.onion:8333
+z3hgdhj7zxtih2gkjlnex6occtzw3tpd6f5eobwrntrhxtiww6ke43qd.onion:8333
+z3jl2izfxwfmqnbbrac3tustn4bngymj2tia2sn7nuyconbmjskedtyd.onion:8333
+z3m3a6wii62jc37c2fw7huca7mu4eywnssindvhn3hrh3t4y4kwj7dyd.onion:8333
+z3od23fobhkvypxarneq3fqsdsksjt3hmujnlaiwb65hdwa2n5xdjiyd.onion:8333
+z42np5zjd3thnd54h5n45ibynz5vb3flbgypt4me2c3bnvntn4rsgryd.onion:8333
+z4d7f4dvqutzvvqkmj35znzpyorroqg53jhbft34gyk2h34wzorv2rqd.onion:8333
+z4gvqymmj5jmg3dnao7k3vc245pzepqcrevzyh4s5xn5fcc6ape22sqd.onion:8333
+z4mmpbj7md2ljj2nzbk5b6stdromp2sxhysdexiq6kjqp2go2yfhlwyd.onion:8333
+z4pyvdupcieuqtzvhh47sbiahdyegvpgtwgfmlvfsrm4yj6g5mt6cgad.onion:8333
+z4qgvajgk3tr6aomi7zkpiilx5xb6tvavupvw42sgjf3bfqrgwk4tjyd.onion:8333
+z4rgrsudz3wjx7uykg2kmcadwixklibr5b4k5nulwrpxcjkasu6gnjqd.onion:8333
+z4s6g5bqdmo445vu2i6tcm54zjypfhl5uwnxqjq764bbu5h37gkp5gqd.onion:8333
+z4zr3v232rayjy7e4wuxxez2blz6p6apyv4souxjztqnv3mvaytb4nid.onion:8333
+z52bx6657mva3yjtrutjhxojkbwmrmndk3r3nptxc5xqz3nd62frfoqd.onion:8333
+z5ecnh7crpgo54nfll6qbwl4ybvfbq3izazsdu3pp6zqkam47nuux5ad.onion:8333
+z5v63i7lvhkfdqcex3ioeny62glxhptowtrfof54qbl545mlchkul5qd.onion:8333
+z62kddfut74o5njyehkdlj4caa6yg5orz5lznaccpbloqq2siiwbtayd.onion:8333
+z62r52qegmgv4otygobjdsubc6jffaei23he6n553akc4wnf5ryur4ad.onion:8333
+z63d77gd7artekfeamkqycni7tzrkvbc54fqr733veuoaqx45jwmytyd.onion:8333
+z63fpitzdw3ot62wtxtindh5334uatz2flxg6ronyy6jwx2ztjs4meqd.onion:8333
+z642d45aauehr2ycmv4ewv6zkwjlvlhwf5wlueuy5ynpu4qmffc7utyd.onion:8333
+z65lbxuvo5x36vuv5rgwgyoplqjzzciwvb2whvo3tlghzhp6zij6grad.onion:8333
+z6gr5c5yrp5seqsw73b2pkn3i4aqd5idmzgidjchjjm7f2hdgfkl4fad.onion:8333
+z6n3h75u5kkd5xkqfwbqasd2rekxams3jinrrqaj7p33qdxq7fdlmdqd.onion:8333
+z6n5kkyabl2huqtcp332n6xbo7kpilcw4b64govztw3swtzulgtxcjyd.onion:8333
+z6nq6lkmjoyjhqp5j3tg2gcjq4e3hgduo74unmtmnybd7a777hp4asad.onion:8333
+z6nuvxnjicev3v47o4vxjwakfz6g3jvyo3l4rds5qqfjptqie5re27qd.onion:8333
+z6okjxmclwc55pbwioqx5wyua7rjobcmbttpte525tlt2gexjcjtr4qd.onion:8333
+z6qmf32mld7uqjmx6hroqnkieerstp3vle3u3do6odxig3ubmv557qid.onion:8333
+z6s6t6bi4llpuod6rnakc344wn3h6ejpfejxrkjohjjy246shwfd34yd.onion:8333
+z6soa5spkni5ze6p2xg6lnehu3d7hnqn5ddiy34jtedwegf4syqnnaad.onion:8333
+z6t6fxwhgndvi36vra6d5duaryx2m75v6a5yoz3cqjlj53ko4wm7fhyd.onion:8333
+z6tmafvqwf2sd4rchnafg4urcug4xpkylwls2owruyifaduaeneyqkqd.onion:8333
+z6u4s3uz6bxke3tyibyccbg7uaxt4cb4dued3cu3pbjw6frqc5nil5yd.onion:8333
+z72rd3arkarr6eehucg7rrkjmvqnzdbjmppfk7zcvzd7jqrvisf7rpyd.onion:8333
+z745wkcll7vkkrx7zamibvbyqjtcp3y7wdz5kd33gijxfz54cxzg3mad.onion:8333
+z7eb2xkiigjdfay4ch4pubeqxb2jwyzdb5fo5owkbteyhefek76qoqyd.onion:8333
+z7f7lrvup632wkbzinvbkyyrhmguaf4fzt6zleiynk2vuvwdwt6ysnqd.onion:8333
+z7g3tx3nucmd5ozvs7wgq4i2riiufxlutv2usowr3p4lixfbx54fc3yd.onion:8333
+z7g4iekn3i7nliiowlt3ek7o6xlhi5tv2hofycacjqkpeoijghmiyxqd.onion:8333
+z7j2lcfj5b3isqznsb44ivi66lwmidcfspmvdrmhbfuyub2h3wbmnkid.onion:8333
+z7jbbwkyza6e37iqos6u7ln3nedom5i3dcnowdscr7wfj2xygre47aqd.onion:8333
+z7jtpaghm4na5po5p27fwbdh2aq3z4rkpwhhzemlrhsoefru2z5eyvyd.onion:8333
+z7m7rmzhol6swqnk6l4sadrjgxwnggt5zwgp2jx6tadca74o5puyuyid.onion:8333
+z7mcuih5vw5qob6o5qg27jhozuczpqx5lmzl2ghfxra53tov2h5xtmqd.onion:8333
+z7rxmrmvtsbgrrwwh4k37bpkk6dtu3aq7f5d442ys75nepy6r2q2xaad.onion:8333
+z7u326iowflnv6tvy6uiwwkusx4vat5gdaxwamcp6jd2we35ih6zplqd.onion:8333
+za6k2u2t22ohdrpqbirjhl75eadxcjvnqfkl4bzeygbnliqsc45gplyd.onion:8333
+zabx7shizdfchrfthsjcuyypqy473ni23ebi4aedow4bg5c4tl4cxbqd.onion:8333
+zac6qhbqbb5yo4rvcsmbilp33odkzfwrftwma4yo5hor4brj4d3ksiad.onion:8333
+zad5dkykkoelu5tdj7l7mr24pdf6eos4o7cbs5nvx6bcg5443eqwaiid.onion:8333
+zafdafmd2h6ue2pmuj25chhmkqad3jdcxwtaess2opxkrroopwdqfvyd.onion:8333
+zagkhagdzvkgpuo5znflvxcqxal5tweg3vsaoaonsvsl7r7orhlwshqd.onion:8333
+zahrvinucuxpxu56h6nkiiw7cvutxrua65l4jynvwkzt2bzmeuvdpuqd.onion:8333
+zalrhwuj5j47tntffl77xrdehzfwq7c7duhaq4jwnq5vdtdtajwiucad.onion:8333
+zaw7gnlyeqrlpgcmsp3e63anveudschhifaaezu3web3z6pjjdtvviqd.onion:8333
+zayfuym6j35mxprdsm2x7pvws2vyaoinsomdbgrqbe22rcc77j7jtnqd.onion:8333
+zb226sk3eljxccaswfgouu6mitu43sf2dan4feygrqnlvrot6z65oxad.onion:8333
+zb2qixzmsethowd6fqnwikvp3yeeeo3zvhgjmq2yb27tfslscgkp2zid.onion:8333
+zb62u4o5qzst7rzjaq6tafgzoybi2ncogcjp3sf7zbto7b2xmicwvyad.onion:8333
+zbci2c2pkku7hwg64ek4z4cbyn6o5bnzpzyriqwjckzgs34xmu62szid.onion:8333
+zbmhiorqlldelgniyhwogswpvrlcdjqxxcfm6vulenrpwiadvv37anad.onion:8333
+zbnovu66ikceaodzrkpwww4vop6iwvtebbeznngo2mtjkikwknqzgrid.onion:8333
+zbwbqxytihkvupc5zhezoh7oibfb7bopfcw6y4qbhh2kugnsw6zur4qd.onion:8333
+zbwpgu4z2lfuto566v6duz2qw5kkyvor37rpihk244bfjzqiuohdcyid.onion:8333
+zc2c56k7hcdux5wrlpixrx6lfutylfamr676tu2nr5z2vf5gwoyzrnid.onion:8333
+zc4l45jx3txlag7hduov4su5kl633sykaw7guioejg5pq2qyuescabqd.onion:8333
+zcc4wsaenndkzqdp4xsfzn6ilsdhwzpqiswumdc22dv5ejejec3o7qyd.onion:8333
+zcdv7z3vetrpeo7souyie7u3vyy6w43cuautaogldhs4n2fitytsihyd.onion:8333
+zcezifa7mmgv4voul4jf4wbqmr24djgrskwszktkt5hihywblltpahid.onion:8333
+zcif26i4yzp53k3uedswyrqkdmsmkflpmclmasdo6hat57pqjpm2omqd.onion:8333
+zcnl5vojc5aufydmssv4yxeotzeqpvyoxyae4kmoskty77j4dx4aykqd.onion:8333
+zctnwv5ln3yktcyqsbgie3qcee33x44b5quhjdq4zwjprl75r3snduid.onion:8333
+zcugrsfyxb3y5ucbdndifvt5ilp47a2233sv42ryf2cvzoncrgo2mrid.onion:8333
+zcw6xk4bfnl46fx3mkrmlnknbwnpssxsp7hlllj34fdrkutzts6yepyd.onion:8333
+zcyumipuaiotm5fhffmhit3ajzrgqihhibh73lvjo5hdt4aituudguyd.onion:8333
+zd2mgisets23i4mslxjl75froqjygtue4lnoq56qk3ohd4qcxpop7pqd.onion:8333
+zd3fxn7nwlj76qyjseubm4o2gs73jv2g22px6t24z7p5oeogqe3icyid.onion:8333
+zd7irysta3wti4efbjq3di2jfv237nhwotupj3rtufvvav4e5umtkfqd.onion:8333
+zd7uq75dlcseq546lmbqymh37cninokajwkixpvupillb7fgpqgbwjid.onion:8333
+zdi46azujxcjqa2wnvdecld3bdkps5erbodcvw2mn424gk2by5mterad.onion:8333
+zdm5zxotwdsma3jvij3jmlke5wmblwy7qa2kikfctlzltexx6l35u2id.onion:8333
+zdn24r3iovbxfkp5qx5ng7ribn4cqm4v5ers4olnbzugyp2gbhd56yid.onion:8333
+zdovdneke7oxtxdnee7f43vcu5mjzoa5m4bexpxgvopa5kaxyrcwa4qd.onion:8333
+zdovy6gcj6nrmxaygnjqf3ym5hbd3s7h3irznsbrjmgdywd2rkj2m6ad.onion:8333
+zdoyjklv576u3w4paxyjb4jmdhx2id7xoqkd7zn3sspodasmmazbbpqd.onion:8333
+zdqon7u5ofin5gy4rcmkixc7u42xypwklntwceohpektisokskrn5gad.onion:8333
+zdqxfzqxbaa654nsngnaqdz3jfsfe2u4hxs42covbct2dou7z7jpa7id.onion:8333
+zdtchifs5gqldijr7vzcgqqaftlcydhatm57owdwzrgudns5vpdcx3qd.onion:8333
+zdzkcrnoctqhn26hjbngpcl54nmvozbodf4gwf7anfxjrwhjxgurrdad.onion:8333
+zej7mizjlb26qecppzvgyswervt7ov6f4x6fwrot7obvab23xsv5jjid.onion:8333
+zejyatwyaptvvubp6b22cpow3an47bsrve63l6rerkldmuwwb37b74qd.onion:8333
+zepqddw4zaqqawkx7aqezpqwykxmxxeh2opnl3xnq2i6piazcvyb6qid.onion:8333
+zeso2dbskp3curnpgug5mjyvhs7i6rero3zbqo5n534wccstcok6ywad.onion:8333
+zexnlgnfxldyx6leiqvyhuimrfxznjfjoko2ek6rdtu4dvwkvztfysqd.onion:8333
+zf4cm7bgv4qollcjcj7kpx4qrtqzcsa3q7sds2jc3mxu45gvazlts3ad.onion:8333
+zf4k4efdpcwsfyobz444dgdfnsa6tdbd6aor7p2s6mpuol3ladssb6ad.onion:8333
+zf6nwlrrtd6q73svcimgfp54pinn46hbcriqnqqsitz3fbibzmkev3qd.onion:8333
+zf6tbmhchmzo46lmhx6vu3smjj3y4hjjrv4lnwpa3uq7bvtjcwapmqid.onion:8333
+zfhx5nerqkerm3jfoq4763vlmay4pifit5a6a6jtcjxpu7t4galhxwad.onion:8333
+zfo72va3rnioxbhh4kuth4epqwqque74aehlonvde3re6mvhz4uzgaqd.onion:8333
+zfomias3uj7w6sai3ty3coxhnb6voldudbeyldgyedxqo6kfc7rg7sqd.onion:8333
+zg2yslkwabguckkqanyxwbncrtozc2fjivsyesrcd27xxkowkbcwnxqd.onion:8333
+zg7obxhb4c4j3dgzg47zffbetclv2so4foyutdxizfnedhdkhjzo2cid.onion:8333
+zgaubbm4h7qckt4pgtp5zawrcf6aazby2zk7aeo5xsqpgwsc2yrlbiyd.onion:8333
+zgegpxbr7z34gupenib4tuwywyk4nlevo5dkfg3jt6c2jw23len76qad.onion:8333
+zgjrto32gianyp6i4gc73nlilodiqyo2s5dkr5ev73yq4qvcjxkwycad.onion:8333
+zgp3f3dmwbnr7257rouxkgddijr34keobzrtk5gkm2dgfbw2bylcwqyd.onion:8333
+zgrpshddeijmdp34xfyw2kz22la4jxgwce42pupjp3bo6xtchsorrxqd.onion:8333
+zgvklnnz2avqcnyiffw7t6umb3is4tfthnkzbhnyfr76sjtwu5u35pad.onion:8333
+zgwclfbi25s4ta5hfiwylboeitti64xzoan5aewuqimp5j55nye663qd.onion:8333
+zgxg4d4jifuihgozqblrt3kjkrh5zhbr4uyivtrzf2khnbtbe4z3qxad.onion:8333
+zhabxolberrktnga2eixvhe6vmaoxour3ktd6jgjq3emzkgthsmaq3ad.onion:8333
+zhapnpxpk3lmrfsmhluytttodeosmie7yabywa3aaxmtkreh2lmeemqd.onion:8333
+zhdd42th33pv6qnfi7v3w3gddy3tlgu6pjo2bhh5ezuytutxhivbtqqd.onion:8333
+zhea7pvhuzw4cte7pkd7u6lwjyiqczxi7wgvzhfovtjd7qwdc24pleqd.onion:8333
+zhgdvhnh5zymbwrmd2rfjncparbxfiyraqh4imk6kl3tkltgccl5cgqd.onion:8333
+zhhkv5u7pxuu36y7vzu6wlbjpd3wftxfuadsst3ifs3q23eydmako4yd.onion:8333
+zhhxxlz3wvdaj4scdetokkqgs2ndmdvyfwq4qwrn3l3hv2iftlgsucqd.onion:8333
+zhrzks7gkdvyef6s2aogxxuw7iqheixmrdzgkqotpvl5bjz4vq5tkkid.onion:8333
+zhwmsba7q6vn4yfi63p4tc3dobsarso4322ynl5ofggjbyiozefttcid.onion:8333
+zhzpumb4itgdxy53chqowtu43ru23ag3f37r77ydjs3t5o7bookfe3ad.onion:8333
+zi77cxawtknqkjiod4rhf7gsughbvv2z6e7mg5kax465uc4vtg4cwlid.onion:8333
+zike5s7xtcgp6frbjgzjhcz6gsvd3pghkl2jin3sdasrek3vy7l4ibqd.onion:8333
+zip37ysefmcbnyqvt4jiag6dj3h45ie7h56hmw7ktheotkuagippyiyd.onion:8333
+zipzgdr2m6gmjfucup7xpertovt746f57hrgb7lj6m4rxeniem6zdgad.onion:8333
+ziquiv5d3hditb2r2qmt7hn7knosdcokxe3khj3kgn253l6cynl62zyd.onion:8333
+ziyp62u4xfsuljn5ae4n7jea7wfd6vfutket2e73bzrhpstozs5364yd.onion:8333
+zj55khmgsehm24efh4nmye7oao3u3l4tjuk5edghey3mt2ippfste7yd.onion:8333
+zj7jf7o4b3qztdorj2stojv4us7lzqs37fbubqpqq2wu4dxi3cxpa3ad.onion:8333
+zjdf27w3vt4rpyb6usa3r5yi455svyaha4qtsfwvyrmf3hmz5hckbwad.onion:8333
+zjgnxih45rz3kalgxvhyebyavcnohmoa3bcnl5cwkmq5pmbyypavqcyd.onion:8333
+zjx5rmakdzormbwzl27w4xcucehwiat3dnncoqdiwesbmb7dg4fpmgad.onion:8333
+zjy7d5t6rxljc64pvta3hqi6yxzfsnixtbslafamoxiiw6ptcmv3kfyd.onion:8333
+zk3cgisxp3uxevuxmbzbmqyhvkhezspeydo2bmhu72b6mw2kl6v43fqd.onion:8333
+zkc2lid246a5jr2dpxtvmtu2tfiwt5dbry3xybu22b62vguco5a4qvid.onion:8333
+zkisbl3pv7dsz3szdawti4r7mhrhssqxf3uopi3vrib5dpt6u2u7ckyd.onion:8333
+zkjnuuenigzhs6d5y62jct4tira6fzijqx2k3yzsdsyulut6ywp5muid.onion:8333
+zkjoev53w4e547zot35onpmij4fiube4aomnysttqtv576zdr7wex4qd.onion:8333
+zkl2fsiisu3cyhhsua7qlr5afhyvmfh4qmapgubioyhoepqdb46jceqd.onion:8333
+zkl7x3u7365zj6opig53dxtty7ctw2ijidwa4lbdbhcv3wkld22bvxad.onion:8333
+zknqouk6z7g7h5y7rmycqb6sgzykylbbfpvf5efmzibww377iminltyd.onion:8333
+zkq4fgcc4bxksbsi74pjwjfby5tdwn26yhjnmewy2qy6a3l5p6bnaaad.onion:8333
+zkr66xkrvecgu6jkyan6nxvtefynf2mpsls5csvf6lt6ltqvoscw5yqd.onion:8333
+zkxe2fnm4tsmbu4bdge7i7j2cesfrq5oznfzobf4mwtejbhenp7ubxqd.onion:8333
+zkzj45moxjhjvrzqweh5g3iyucdb2qaqby7vdtmlqbvxmm5u337aglid.onion:8333
+zkzj4uhvvpav6ee7djkfj2uem6tyswi7idzupkozspbgr2kfvrk5biid.onion:8333
+zl27cum3gly7nfhwl7ulnob6pyichpxglnss4ffqv3terkquhf3dm7id.onion:8333
+zl3dx4nswje7l5p2fgvypve5wugfqtcru2ud55qo77tqdp2btm6kp3qd.onion:8333
+zl4gt6uafawn452rlqb4w2mujut5tjcnq4ahdr6ucdyeu2gtzlsk2jid.onion:8333
+zl5voqvgyf7deglpxamz6hpg4bierfngqsmmu72wpeut7toja47v6bid.onion:8333
+zliat4frxeuirx3nbijcljvgr5wembicg26fdpgda4pnps4oguaobmid.onion:8333
+zliy5o4uqgpqj2nbgyadqnlomnjtmdlwoxcuduwcfavzsguj4z4iwzqd.onion:8333
+zlkwqytpxbhkg4umwpqiynz6niefzqjbiwzryg2zpwwmvmw6pmssngqd.onion:8333
+zlpztcqey4osd3omtpsm7micrh6jrxuqzeeendpngk25iyfhleieekqd.onion:8333
+zlx2jkuv2iuzffo35hc264rnvoimzccvtlljdbmut4es76qe5pnvs6yd.onion:8333
+zlzhg5hipy7nc4ulsaprgro53f63mjj7je7m5xptgkksibgvbc6r2fyd.onion:8333
+zm2j2k2nl7pug2amadjkrcgs5omdnxctyl7b6kmlywsphcfl6c22gtad.onion:8333
+zmfmdmzlsyy7owe6vpgugvdq664vjhluqura3skjlm6fzpgqe6udm7ad.onion:8333
+zmfmmn72dg5jjkovy4jt56c6btg7pgp7wmeh547zlvavwmlbrbsl5yyd.onion:8333
+zmjncrrwtui476nyn6sqbp67bvgdhotllq33vzwygasumv6d2us64iad.onion:8333
+zmmtddrew2mjtghs7zjiyi2eelmyss7miyj2axzwfgnmvzthx7phevad.onion:8333
+zmn3jyv5a2rod2udnreygi6uan4zq5ul4mhewyfyrf7a3ury72bycuid.onion:8333
+zmqvv2cdxjj3vbclq7l6rfdmjegmixwkxsnzzd6qezwp32vxkr2cbiad.onion:8333
+zmt7psgtnnqxk6tibhvwkdfuhtgtjatz6bpoyyl4ptuv3u6ko2b5o5yd.onion:8333
+zmtd72b4nsa22ocez2hbjsxxrdfuxxyghg3zjtqjob5sgnjpustat4qd.onion:8333
+zmuuhwxhoa6h53jijpb6mczcvtxhw6zyjymm53dwzsbmkc3kkv5v64yd.onion:8333
+zmvriguathsanquofxml7kgcda4tkihm5qked7a6ntbqk7rmz7qadkad.onion:8333
+zmvritlexdmgatfqjlexl7wsx3lmf7y3qxe2kqeergb7ntkfu4nky5ad.onion:8333
+zmyavuyz774c2fo3eb55yokivpr7qfxdpjy2t5wpeygunhulck7yxzid.onion:8333
+zmzjx42yxlpepdgya34rvwb3wc2peggturiedmn4sfjltgy6gjtspsid.onion:8333
+zn3gjkpqkajav76kaem2espqt2bw6ggfvmn4u3gmkonds7pqd5heqkid.onion:8333
+zn3mj2tggwpbzzkvtsovkrbdshbsvac7n676hbi76r72de2b4gknpdyd.onion:8333
+zn5purhx3rnikkks5tx4scnjlhewwll3uzcs4pgde3qeqawof3jefhid.onion:8333
+znaiehv3qrtloxdi5rkbs4eqpmuveazuftob3sqzw3ta5pyakuwhx7qd.onion:8333
+znbv4cupk7rrdk4rqi6xncbouhscxnqdlbxtltp7564isfv5vtbyu7yd.onion:8333
+znc4xhwywjqejoioap3ssxvtsdilsc6i5o5s2rnp2ecmxqe6xe2nh5yd.onion:8333
+znea5ol7qgniizv3og2gfcbxw2wi4qhk7dfkdlt7bbxpy5aflljygbqd.onion:8333
+zngxgkdgkqpfyepa5cvxlaxvlyluzdryhzmviar4ojzaduxw37hhdmqd.onion:8333
+zni7kioacgsy5haqiftnexr74sv7rzvgy5o6lmz6dy26vvwg5lffioad.onion:8333
+znlvmmj4dvpju46kbb6mob4kufyf5a4qivyygmjj36kymbaa4nzi42ad.onion:8333
+znmgbi6qlwwwdlizjxsc6eujnfwgytufu6guo67b54av4y6inwgxllad.onion:8333
+znmwoazdkcffprail6h4p4opy7i4zqomhpdxe5l5nc6ejqagvt4i7yyd.onion:8333
+znt2jb6nivjgl47s2gdcgac3merqjfq5h2n6x6mbjegx6fumtl2ownid.onion:8333
+znvkqu376ienu62x5hprstn36jfqxospcnfhpc3kq5quwcd6436pzuid.onion:8333
+znwekshd4os5a2n222xrllgjuyvsw7hsb2y6br7pkwjatywk5lerbtid.onion:8333
+znxkxyd564sfftgjscsmi3a73jsazxwhsneix3bgto4suyjx356xewid.onion:8333
+zo4fczw4drgcbsumtgmigjkiso4miz34ltauajaawqmqoa6oxmzy4nad.onion:8333
+zo5jasvz5qo7pkgrgn4r45twdic4zake6zpjfemj6x2ioxcwvs7yzlid.onion:8333
+zobj27bempyxsigdvawc7foivyyuek73hemep7zf2tajof54353ok2yd.onion:8333
+zodjfmegrevmjbppq2t46iluruefbgh3b46tbrl2s5qkprvbetk3euyd.onion:8333
+zofseltpp23n2xb6fsmfgkwgqggwhrelxmt7zq7toazybgehbs7d5fad.onion:8333
+zohxazkomcr5ggqlj2edu23zs6xiay7wfsrxuetrn2k2s5gwhwhcngad.onion:8333
+zokmgys3gsgs5oivjcqp3xiki25iexezy33ekzuratdz3j5unqpxrzad.onion:8333
+zosjvclhqzwklml43hvsdmupglajj5lfdb5h5frgym7hsqo25rwrbdad.onion:8333
+zosk6fx2a3mxkfaeayziiuizq3y3j3azzp4ylwyh76wq2sqtaenuwdad.onion:8333
+zovm6wkattzmxc755cgqqd4sxugn3jaxw44izlm4yfpot2ucfeqnukqd.onion:8333
+zowc7rklhd6xhje724xomkftwimuihacwcnxkt7vhbjpvpkdahvlhxid.onion:8333
+zp3vpkpcfdx5lxvnuellqaf5qdvhu4luf4zqfx5xjo2dge7cqsxhsxyd.onion:8333
+zpgobpk2j2suauhuzfmh4iiz3y2zhj3xvb3g2t4a775t72stt3majryd.onion:8333
+zpgybnbaxfvzjeus7qna45zchxdkekjpk5webdkeqtxfwcglgogm2vad.onion:8333
+zphjbml3fqtbez63bjvd4s552yc2xebitadkpw2jon2qkbapbiltijyd.onion:8333
+zpnoo3qordv4xj5hjynkssu6wechvup6to7pamrgbi4ljmfugjyzwwad.onion:8333
+zppmhj76a6dyjch5qtubosxcyvtwjnb6zndsfywxci7dy3vc6lbfusyd.onion:8333
+zpq2nzcnlasmy3rmwtmaybav6t7xfrvorqqdwntnbgbxqujyy3dkwlid.onion:8333
+zpqvo25bxu4n2u3mh2pdzax7wmpsitd3qsszgw2ye3mpfdpjbg52kgid.onion:8333
+zpx2tq27yviwzbpc4nyjfqtlhigoa5k7cwl676nft7bkajo6jq224hid.onion:8333
+zqlwzzfzdoacgngtsnofmyqetag6o44f5r72opj733y434b7npnb4oyd.onion:8333
+zqq4g2eikcfgls64ffstsylfbqrfstm6n2otvrsbtvvjpqwgyqdnmbyd.onion:8333
+zqrj4fhhp4mq5eh5xptzcxjzpae37brkdn3voz32qsohl6noijygdkad.onion:8333
+zqrwah6dn3t5fuj7ohlyka27zzopduhxy4wyknfrtqpx4sykece65fqd.onion:8333
+zqtyvr7h277x5rxin6rhsrsbhwcfsyyiqgghpk6jlbewej2v3tn27yad.onion:8333
+zqv5nepyrwezkym2ba5s2sskmi2qck22snw2rygeke45bxg2o4vckuid.onion:8333
+zqvbnqwwhtoux2sxicng2blfiowk5mvty7c5xnssxwtlsjzalhg3zqqd.onion:8333
+zr222c3ybuqxn6a6piydvfos4zjnaklfgh6kofmujmolpiprfw4z6vqd.onion:8333
+zr6ffisxxo4gelmkoyb7izfm7ehjrbqbnzuguw34to34bqhxeeqzzjad.onion:8333
+zr7sqclimv46jdnmmeazqrhflhiqkhhrz5i3ed7yvyue63swk3qkjnad.onion:8333
+zrrfr5sr5wrgdt6rn44cxnotlvwe7cl67rgssw5dwsax42evokdaw6id.onion:8333
+zrrhgs52ftlylshuwp5e2uesgqnwct7h6cqhzofdduwoi4sz3shmxxad.onion:8333
+zrt3rg4paxmo24ucd56eehl7apindhbubq3ej3q5nhr6i72jv2eznryd.onion:8333
+zrvsjjrb3lgvmeftz2vfjva4pl63htmv5qyviq7zhnfmlk42evrxdpid.onion:8333
+zry2rqlcqf5p5e46wc6nmtcbt5vd45mf4hyf4nxlqogckoniufdjklid.onion:8333
+zs47b66pljpz4ahompanciv73xtztnnzkx4wjklt6hh4drsge4m26iad.onion:8333
+zsalwutefh6m6x6yxccbhulzrz2bmo7dzu2ggu4hxp5zv3xx2j642dyd.onion:8333
+zsbzferezmnyxhpktxtccn2xxuggmdzdnrza7pqjlnwjorgx57y2acyd.onion:8333
+zsgtoyy2svehhfba345dx3dazp7tfdio6o34zxlcgylq6pi67gjq7nqd.onion:8333
+zsi55x2nvjc4oqrpzzopkneukb5fudnm4e6drao4x73lf4zshhcvllqd.onion:8333
+zsipwsjpm4f3p6ueczh7lqei5rp3cusl6t4d6nntnwxq72hori5f7jqd.onion:8333
+zsisadra7jlxp5nhec2vsjwspvvnk6jemjxk7zn7arypl6cm6dy7mwqd.onion:8333
+zsr43xqj6nsrqh6qgxghadctltwytnaw4zmlvx6exqybt2qdt72f5yad.onion:8333
+zsxgefpkofjc3nti4qusk3pdqcfinkljajlwcb2cee2tduxltxbmrpad.onion:8333
+zszufrszpweaoysubpdnqparmyotjnev6nhhcnejhjjftu5sb55kesid.onion:8333
+zt6gkop3n6aggrxucnaqp4yrjeu6htwvuy2nyn3vadjjrodwxfhfv3id.onion:8333
+zt6hvzyoalzm4a576drn7yfvdetdvzwwouvfz435wzrf5pcnxqxplaad.onion:8333
+zt6v7eqh7vvlwy5kjzbdfgkw3syj3nnhckyghlzgmwwfccxvyfusuzqd.onion:8333
+ztcmlrstdkp7coheeolpwj75gp3imzgiw26xnoiucquwhxxcofao63ad.onion:8333
+zthmey4ueoutf7q36nwgujxu7hq76s5ifbtanvze4mxq2s2xq2cmjwad.onion:8333
+ztmwsyo35zkogpftujm2o7oilhucjxe3w6bjagsaiwtb2bu62vgjptid.onion:8333
+ztou4ytvgvpcakjaje2c6l5j53rxcxes7qhkerszi4haffxfpj3kdnyd.onion:8333
+ztwryklhcnfoeck4qntt2aitoilit2cmmr2geyqo6cjc4nwr7jlludid.onion:8333
+zu3ekh3vtqjfnxqjqlmnq3jbqlg2zum4ehgirz5cggwe2thjmgkz4cqd.onion:8333
+zu3yh7mvqw342e7qt5amwtwe2btjubi6t75k7wgcpsyoicsnpgbgj5ad.onion:8333
+zu76ecbahyc6ofjiiutna6myxmfdcsuhcrhtgpifbw3vfo7njd4b5tyd.onion:8333
+zuaotutv2ngbf5ot5kvz75uehbh5e2j726fglhqw7omk3b7xnaastpad.onion:8333
+zubmiztmnfy2vqowqmpyzbqtf2a43jgazsex6zlxokhfmnzmi3rht6yd.onion:8333
+zuc7sobx6ttj7lswk32raexasfbxc5kd6a3l6td35srqzkj3emsv4uid.onion:8333
+zunmnr7czrxvfjgxtvkwk6ziti5kskx4fi3j4dzahhdljfsqtz7yeqyd.onion:8333
+zuoml3m3jdkoh5bdrwfecnew5f4mrlcwhmhkn456qsa72cp274pbgtqd.onion:8333
+zutyd7pzkyejctriyr2lqlrex3arkunntsdjo3kgw2qj5u3fj5uyusyd.onion:8333
+zuzdl7nnjhy6inyqwsc5i7fae2nregm7wnyrtolaxhi6oiufyc7l26qd.onion:8333
+zv2nusexbcrncbutlcprevwhvbtqlyri3stjwmgl23x7fdqkmae6owqd.onion:8333
+zv63heoa7jstwhq3wg2nibip36bw4icd7jphccy3li3nut7gp2gojqqd.onion:8333
+zvbhycudpglrdi3sk7yixe64eknydwzzisc4n6xmxwhb7xyyzevc4nqd.onion:8333
+zvgutw2u7tu4dx7t25leghdp6j5n44u464mmoypafwstayp6ggabtkad.onion:8333
+zvjn5jscn7jncqss44uh53gvi6b4eycjqp42t6pv46bsr7gine5cbrqd.onion:8333
+zvmxfy5z7nxeknglvpbh7rveoppkyvvzvnpwxon2kgkepafnq4igheyd.onion:8333
+zvpcm7eemfvlklgqio3fgzcwa2vukg3n7caov5itik36kdua6mvm43qd.onion:8333
+zvzirfk3h4hk52j4u254y2np6ve2xttd2nugiccsqw2liiw7aqmglkyd.onion:8333
+zw4olgpxujj6iydkmhuxbx37b52syl5bm6embyebesysep2ignp2dgid.onion:8333
+zwbnovgpo4qxidylubpdrhxm34t23iwaniawfshiqrilttwqjnnlohid.onion:8333
+zwbqgh5le73aurfmbwf5ivjb7ycemwnjiq2jnq4sqz6epl7rdtd6rtid.onion:8333
+zweiy44ngrkfzhnaoqov3fopwqd3uhwsen4v6sdyf3ynmhlpuluvzeyd.onion:8333
+zwg2cvvkm37u2hicwbjasqzdqdhcblwvtzsulmz4kpbebf77jheiaaid.onion:8333
+zwrp2kb2covbrr3xdz2pxr6gg6ndnhpcgfvjkjr43eudnl5aswxgvbqd.onion:8333
+zwsapfrsxzsomsoty652jifwii56st6fg7bs2crr6boveh5o6npl7vyd.onion:8333
+zwtjkx5blzs4i6e7hwfeekcwufdl2lba4j65243tvkajder5iodkavad.onion:8333
+zwu3ep3zqki62b7ldjbsxk4dm4rlppkxpzzqfwsfvkoihxltm3y4qaid.onion:8333
+zwwpbfpymszcmkwlfozzl26m66r6n7xzgnw6bs4nf3pypqh36ya2w6yd.onion:8333
+zx37fw5b4eatt3dekaefun3ln67agpt7oqobeacvyq4keurbj26azwid.onion:8333
+zxaujdps5ce6wvk6ykbfquygtbli4ecvpokj7oyfxjqiionn3u3fdsid.onion:8333
+zxbq3k7hwswo2f374ahsmlgkpdj7ju7pyygurkvzqaoh35vmxleewsad.onion:8333
+zxc2bzuqdkippxthxbg7n7e3lznbcnx7zyitlhwvjusbwr5v32oxueid.onion:8333
+zxcnzlo2eigfig66vxyx43znm66a5i4ieuiosycgddgzdff4vhn6zhqd.onion:8333
+zxk4bqrede3tnlb7ymjlsoyupc37r2vqe647otr3nczqmgfeoyiu75id.onion:8333
+zxqdpu4gmvn5vz2kdld6c2swqdzknwh2czwsw55vx323orvtk6a6igyd.onion:8333
+zxqe6efq4odzd2mvyeglqto2cfggagoicgcvlvca4mxycg47jei4uxad.onion:8333
+zxzfz3z4nbb7u3ifcv2p5xenzpbnzuuezelbbjcfrmupxtqyoh7uhyqd.onion:8333
+zxzqhfwi3gdheuxmzagp4aw4aks6cii2llljapcvqhtqrxlksxddo5id.onion:8333
+zy4jeshnpx3i3wjcqrb27qcea4qetpez65wpocat5sqncz24xeo6sxyd.onion:8333
+zyccgvzokepone36ulu74l54ad4dtqv7a2bjzcvopj6rg5xhbc7ihjad.onion:8333
+zydziohabauwybhbqkegn4d5r4257bmfain36fatcxdbj2nw5zoa5vid.onion:8333
+zyetfkanxicfp6tt5tegkxlkoz5rl2i3zsc6hyyqizahywbktezfuwid.onion:8333
+zyjfoui3hrpsw3fo4owxrztclffqhr26wdedizvz5xvlgurgixit2mad.onion:8333
+zyku4bk6pdifla26hympigytlwsx4htajcn43hhobdbrv4tfojv3snqd.onion:8333
+zyl4kfejs3t4vefsvuqrqopboxrmztuun62jick4uh3wpu4mw7dpqlyd.onion:8333
+zyphknlr4ogrknj5t64qya246kdaasgirn4iercvesggqplzzxsisbid.onion:8333
+zyrodumrgvgpinhygbi5molpbhl6ndfs3lwtt55pumd6wy5k7nb3esqd.onion:8333
+zyvgumk5pcanh4zk3z72glefxgbd4dpyhsbzvqlsp2gspaw37lrhjyad.onion:8333
+zyyefl5unnw7lnrjlgfyvnytw4iy4n4cy5bbs2nudjh7wp7psvefmfid.onion:8333
+zznngqwcp6g55wkjg52rzeogk3fcdpopyl3zprh2fz266nykv4sqveyd.onion:8333
+zzntdfpcb3spf5pb3g2gczw2njmhwwksgxt3twbzjhbaisihg7h2ywqd.onion:8333
+zzsi7brufwylb52w3bcbqvp5jx6vribh6geiqfy5jhxpihqjjaox7vad.onion:8333
+zzthz644hdjxn3d54xrfe7snnuyhsx2cguy4kqb6dpc5u7aun5lflbad.onion:8333
+zzuipjogcfvs7uyfhfgesehon6viegga3sc6c6265n235pqmkwyqfmyd.onion:8333
+zzul2xvyhqvajnd6zfs2dzljoppx5lsp2xt4qad7256kpxrv3wzyiuyd.onion:8333
+zzx4r2yrkxul2kg2ojoeijwce3skll4wbkkjw5xprstn2o2xw6n74wid.onion:8333
+zzyp22x6ryzyin43pltkup6jki5ynboh6cwpucscx5a3md2tooqn52yd.onion:8333
+zzzzzzzz5bs2qnoijxlhxd3ibxipajesgprqlrxtpfbygw4zcaf6oaad.onion:8333
# manually updated 2023-04 for minimal cjdns bootstrap support
[fc32:17ea:e415:c3bf:9808:149d:b5a2:c9aa]:8333
diff --git a/contrib/seeds/nodes_test.txt b/contrib/seeds/nodes_test.txt
index 5b04791d60..2def8ae644 100644
--- a/contrib/seeds/nodes_test.txt
+++ b/contrib/seeds/nodes_test.txt
@@ -1,89 +1,29 @@
-# List of fixed seed nodes for testnet
-
-# Onion nodes, last verified 2022-08 for minimal torv3 bootstrap support
-24j74ahq6ed4wmfrghdwroyfzimlkhnrb7zh4zw3vl2allzxbjrhaqid.onion:18333
-2fy74te65gm3c3gv3u5mhwdudvbdfh6k5fdz4gduimrltjjrxftbxrqd.onion:18333
-2lsncqdflwk272dhydrxf7ikfy23ppnmm54dnynyxiym6lqf3wowrmqd.onion:18333
-33o6qaidta7s2pmltet6vynd337vamgcifhh44rehwwxqpflcjt2njid.onion:18333
-3oo6bsc5mvf6a6ypmoaikilta6ka7mbdhdwhrnqhuhjlbaxyedvfvaqd.onion:18333
-3pe3fyklipy4sppkkgnhc22kcxtt57uler5kv72t676bbrwmcseo5qad.onion:18333
-4u4mcz2sfvxs7pwcwncswgmmcdzqtzjx7ztfo332jv4pqucb22ikdhad.onion:18333
-5v3i2kfqiqwp75gznjoptss7qgrcgseceqxpzpqkd34qeqzrg726i7id.onion:18333
-5zlrxk6q24t4vz5k4ie7gtuasdjavhoelhinzimxbfhc77u7vafipsid.onion:18333
-67s3af64ehw7xnxv422axm7tns4d6kutrftc6bjq375n74q3kj4pp7ad.onion:18333
-6a4ony53julvnufo632ktgmwvhupz63wbdwx7n7qudjy32qyq6gm3bqd.onion:18333
-6ftyg3nhc6tn2hyzls6zfdsfbroczhkxtdqumqb5q4yafhy5rdpapbid.onion:18333
-7554uw5djruh34j5ddx3iprzgqgzypcjtptwoldymfbgoywqcw2wiwyd.onion:18333
-766lozlabxaqjpbqsvt6sn3c65n6gkwwhoxyvggj7nfwnmw4cpaoccad.onion:18333
-7blv5abnytdf47yvbhxmykprmvjryqob65i2jmdwq3rrajcn2iiysbqd.onion:18333
-7v2ja4igx4v5y2jr6jrr6gaxohjhlzhvgwe4avlraxchozf7ea3kruqd.onion:18333
-7zgbmtzxow2oevd5aaqtsormw7ujv4zprl3oi2355immhq4gk7cyw5ad.onion:18333
-adstabjz7ec2y3jt4w2dvummowzv7g6m2f3kajeejffuaz7ojwj6epqd.onion:18333
-aesy6tfufadkut6flu2bsqgnw2422ur2ynjalguxlzuzuktg3zehttqd.onion:18333
-alxo32b5edi3bn2e224qrgytgxxpic4knyipvpdvctfsrvcaiq5lgeyd.onion:18333
-aoeart34umoonvd2kbqr3bc4sweu6a4msh2gp4skyqvei3shzcxbgmyd.onion:18333
-aprzvj7hgctsde4mkj3ewq35gvykspjvkqiygg7bpnw5tkvse2n7rhid.onion:18333
-awpk6z3xghx6ozouhodcydaqtr6uzzbnw4creuix7mkupxoxlmhhspad.onion:18333
-ayynqazucyh2jd5rehcfggmhunqpdwzlbhzbqgy6lj4ctz2ocj7chpid.onion:18333
-b2ika53aqckv4gs7wmog3byrea2vfzm5p7ye33digcsmvvnpbyqmzoyd.onion:18333
-be7zx3hh6dlahorlvsrrgqm4oahfrgqm2tbwnbd4u53ntu5f765n6hyd.onion:18333
-bluk62wj24bsvdwh47muo54hhwsatkftiqxevt5kba7hstjoex6ueeyd.onion:18333
-bubm6fiopfzkxqrfx6vqpioe5ahlhyubz57ogsqqy4ha5pnngiqlh6id.onion:18333
-d3czabzjj57lgrsr5gawkjd7v3gznrqa7zyizqmk4lryascavmipnyad.onion:18333
-ddj4cuvb32ve5chtp6jattcdnnmxmpoofjthzi7thgxxht7yqoetj3yd.onion:18333
-dqhhlssfwmh3g6zhwxpcfbw64xz5rfikcglinbhoxv5ajv4qzicjyeid.onion:18333
-drthcyb4x4rdfekw5g7xjogxi7aqoluilgulbgwvsme3nw3oibvchbad.onion:18333
-dwb47cmqa2tjpmvjaear7gdcars2lez6niefhi4qf22qehtyta6577qd.onion:18333
-e7tkrf54ng3q5vcn5gn77zwjwm74lkfav4mwdux3pvon6yvqg3tf46qd.onion:18333
-etuymy47s3quepvdaoo72i5e5mc7uovrzu5m4jf5q6mwlwizoxy4xgid.onion:18333
-fbimesnyhzubbzqc3uaufzkbyfmnkxvypoxaveaub7rzpzh2foxrn2yd.onion:18333
-fzbrwmgwmko7quelrhfuskt3ijabac76zx7g52dfrevmhdkj6ivh7qyd.onion:18333
+2yq4xcwzvb2ktyci5lpmb2q3nl6qqywb7nrf6fkcthha7l3tle2q.b32.i2p:0
+4g5uvbkvi5fvyditekvzajldtzgurorqjupuwtmymrjloq6cjm5q.b32.i2p:0
+f3w7soepsy7jqwf7dlo4ro2qkyapg2lrb2dkkvwfwuymgaqvljqa.b32.i2p:0
+nr7nozlb54xv3ozg4ksvcr3ofzfwfeud2n7xijywvt22ixzal7qa.b32.i2p:0
+o6j3b33bv26vthoqzjy3h7a3qsuqbtbe3ulajmjzsl43vaqyieyq.b32.i2p:0
+ocqipbbxx4paopgkkbnj234ie7opzrtca5gtiwr6oda3h32rzgsa.b32.i2p:0
+r2zdpkcslf7e4t2fmglu45xhfw5zgupthdh5pcewdo6jajumveda.b32.i2p:0
+xgctj4seo3ofstiymoyeuzq74bvddrbr6jtia6erodlf5va3cz5a.b32.i2p:0
+y5e6aqz4jkjjoeipoxwurzc2jrfv6ilvfbdqmjqk574maba5uara.b32.i2p:0
+ye3ajv2tgpq7jvvzzn5wxbtmd3txev3axsdla5bkpobeiwccyjjq.b32.i2p:0
+7ph7mrc24te57mvppajfkfj4mk7zuz4teukymt3wgpdpw6vpndeivtyd.onion:18333
+bkzo7mpxuar7rhsbiwdaxqcymixarcbdmb3sdaqtv6yb2svqttz2s6ad.onion:18333
+d63vf45ta4chrewnruyvypm7ybfxtut327crtq6qfyrvcwx434rli5qd.onion:18333
+efqfw6vjq7gpgyhosu3qf24hsshxpbhay426ccsgz54key4cvwund6yd.onion:18333
gy6nih4pmp5esyvvnhlj6qvk7zkbjuoswkxffyiip3dbkvsfxwz5zcqd.onion:18333
-ha62ziqzqdogd75zg7lfh4fqrg3bim3cpqzyupo43w5pw4fen6nr2pyd.onion:18333
-hacjjgj2mbqqrthzimmi6anvin7dljjhfl3ik6ebg3w3nmgsvr3ymmqd.onion:18333
-hbkp5xwpqo4qm75kpglfrclyiuuvdgv7mtiqfys7oqks4dmpqgpeoeid.onion:18333
-hqgoy62hoqjmz37brdfvoeov3cix5fixbqjoert4ydr6herg5oc3iwyd.onion:18333
-hvbmmzvqrpgps2x5u4ip4ksf3e5m2fneac754gtnhjn2rsevni6cz3ad.onion:18333
-hw3vzp32w4h6giplue6ix445oi6wt7gmeksrznb7tdfwhkgit7gnbbad.onion:18333
-iddr66ewkhenivapgianudjkwqcp6dxtssg7ixrdot5az6uh7m5tmjqd.onion:18333
-imya36iexiiiqrkwuxxcehnv4kg5shtirwd2vg4cnjy6lfjlph3fusqd.onion:18333
-iuhhuocns7entrzlxsxktyz2ibs7hqgiggv6sauzqkzka6laslwz7oqd.onion:18333
-ji5wmshokuc63eiulzlwj2zdvnligvrwfvvc76bice3tu43wfzvpmkyd.onion:18333
+hwipziotclxg3ledn5yj5j6n6pkrgnmlksozzlrtlnlpguvixox7naqd.onion:18333
+i5gphw2d224tniqkjebxdwz5ygbbo5gcushoyevv7x7o454b6qlrzeid.onion:18333
+ipbzs2lbe7lab2xaikvkdkwxian6t3nakaoltwbshpevbszdvoyyjiad.onion:18333
jjfuyj7krgzkmpxvn3b2j2hwlzkmze3ezy3ifwk7dnswwawgmzqhjrqd.onion:18333
-jn2p4sgfphkxpow7kjrubrbqat77kkibzqkvuwhxyalcrazwmcqeaqyd.onion:18333
-jrveyz4us6sog6e6czsvr5mvvhgzjgv4idbe4idrolmqeudvt5a2dgid.onion:18333
-jsc4frvvnl2d3bhzyofsc72xpztgm23nl4fnb4dwkzsxr6fhij2q5iyd.onion:18333
-klymxdvje7kccv3tznabo3udopsftkmjemkbi2urqxjm4hefaudejjyd.onion:18333
-kwjxlauwjtecjfsiwopbl5pvn5n6z5rz76uk6osmlurd3uyuymcw7aid.onion:18333
-lc7upz2srw2yhpcvwg4afy64ylcoo6mfwlttqj5ovuglqnhnohpi5iqd.onion:18333
-lf3mpxfyjuovcqdvinl52pvdmmda6xqyfeiarlfamdjpgy3ouzmmlbyd.onion:18333
-mc7k47ndjvvhcgs54wmjzxvate4rtuybbjoryikdssjhcxlx27psbyqd.onion:18333
-mjbg3ggeuelmc7ixty3zjccyo2urg2uyherfqe7ytkm2ejkwlec7h6ad.onion:18333
-nkyqozv6kdwi423s7s2mezzguf5bafot2a3hv4ed2dbvtblisdmad4qd.onion:18333
-nvvqo4xxiwgb3y246jmcbuuveurfdq2zs3a5y7veqkeqv5jfhang7gyd.onion:18333
-o6vfovqxz3oxszfppczpjejwouobztjrgvfojc3emvhan3bkyskzhuad.onion:18333
-oaiw2lnhzgp5ry7ivzneuufmh7lfploquu2rjv5rozmlbefedsnxe5qd.onion:18333
-oln7ybci53wk4g5n42nipyixvyjxbludsbrfsmhnirb6tk7ovlikd5id.onion:18333
-otmfnhc6wrrbf2tpdy6zkisqc3r3urnsuowsnmatoto6yixaocnkseid.onion:18333
-ovc6sajbqfcbwv3wrq7ylklu6q6prvisz4jr4lyycn4kgukzjfe4mjad.onion:18333
-pm57didyzg5ljuvn5ufr5uun2iencuk3af2gzqc5zvgfh452c3rxtjyd.onion:18333
-pmismhpwug34gnqzbutranvx2wjwbshyqj4un2dyzyuvak2eh55psfyd.onion:18333
-polarisultijjhaku6z6u7jyboho5epdsg44ttebfaxmgau2z5sqolad.onion:18333
-qe2jbe447he6panfvpyqhyntf7346gmuf55bxrmdzggmgwyjsyknhxyd.onion:18333
-qz6yd5lsgdajcteoareeptwnipxsezyx5kks6ukpk5tvqinffzunqmyd.onion:18333
-rp6pn3b3oesyr2giolbysbjhqeugxntsu7crnkth4y33ok4zvcl7yrqd.onion:18333
-ujdchuw3hz5gkbouiv4p6pwbfdn7v4k6gluwvd4wiukqc7y7ow754uad.onion:18333
-vctlwaqgmu53eutz2hewuakcipfgtyljsd7czut4dd62xr3rp6fqezad.onion:18333
-vf5ur53tzmdtotvkndcgochklnuav7quqjvkc6mctqfvef6wnmn26mid.onion:18333
-wnxgjgjgplv5iu4mssyuunycvku4qnqr5t4q6cfdt47k7uwrfifuirad.onion:18333
-wpkbkdr7clw7zk3jkwiult6bf422j54u77ml4rgig2xq7icogyrcspid.onion:18333
-wzpdt24tdark26eugredddorik3tqwcj5ialtt2yim4ceiuiq7phkyqd.onion:18333
-xgapnikkbldoggjh5ewxkyauhuwnvf3xkspxroe3ojvfrk4lswkyx5yd.onion:18333
-xkvzdhcirontixbq6pjhru57bf4sgtqylvphk25csfrsy5p5ay3oc3yd.onion:18333
-xnipauenw5wnjb2zbx6v6umgvbb3g6xhf5kjo7pnyn5tdzvzaxtzicid.onion:18333
-yda7kwpii33j2qpq32ftf6lp22znknswipjwaccvsqj7l337jvfesnid.onion:18333
-z3j5foswuhpmtrg3kb56stkzmuoaesvd5jz3eztq46c4cidapglcyuad.onion:18333
+jnphftehkfstwbko34idxlpo5fdw6lromkmeukxh3xclthlstehpg4ad.onion:18333
+jrhpwqahjrj75gtb7gt23eve65x7bbawy7j4edhmgbo5nj2mkaeghbyd.onion:18333
+jun6gdmbgasr57bhr4zs3dfhc6pzpaw27nqb4dadbai7yrbq55zskeid.onion:18333
+o52y7fadtubr4tuqhix6ymrin3qzn7ubh5tewuuehw5wxcbnfj6yaoad.onion:18333
+rigfm3joif5lsl7b7yr6d6cvddukawykm7kgguzfwi6dplckyz6x7gad.onion:18333
+t6d6epb5ccbo4e66iaanukraxpjmqiqsz6poj5uvxu2ownnhcguygdyd.onion:18333
+test2vozlxfznmfyxzkulf3l6qe6dti5hqfjsxar5lml45cjnyeusmyd.onion:18333
+uxtmtmpkfaxc6zcxaxgydrukyd5jdrcp2m5oubpimijy44rnjuywijad.onion:18333
+xuhmq42du7dckfophyr2rmf75aqkp3bk6y3wyyc6jxw7jmpp66zlm3id.onion:18333
zcep44k7unwjm2wxty4ijh2e4fv5zgbrvwlctzyaqnrqhltjfzrtodad.onion:18333
-zmvizz7fd5hdue6wt3lwqumd6qwt4ijymmmotfzh75curq3mzjm53hyd.onion:18333
-zoaa3x7quyuijggii5zl4uyeioodudsgtr2uyv2qtdsslac5ukiwlxid.onion:18333
-zovauxlorl5eswumbsoxv2m5y3sm3qlk7657dcpr2uld7xf35en46sqd.onion:18333
diff --git a/depends/builders/default.mk b/depends/builders/default.mk
index cc6dec66c2..806d6e7c50 100644
--- a/depends/builders/default.mk
+++ b/depends/builders/default.mk
@@ -5,13 +5,14 @@ default_build_TAR = tar
default_build_RANLIB = ranlib
default_build_STRIP = strip
default_build_NM = nm
+default_build_TOUCH = touch -h -m -t 200001011200
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 TAR RANLIB NM STRIP SHA256SUM DOWNLOAD OTOOL INSTALL_NAME_TOOL DSYMUTIL,$(eval $(call add_build_tool_func,$(var))))
+$(foreach var,CC CXX AR TAR RANLIB NM STRIP SHA256SUM DOWNLOAD OTOOL INSTALL_NAME_TOOL DSYMUTIL TOUCH,$(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)
diff --git a/depends/builders/openbsd.mk b/depends/builders/openbsd.mk
index 44825d106a..9c94c4baae 100644
--- a/depends/builders/openbsd.mk
+++ b/depends/builders/openbsd.mk
@@ -5,3 +5,5 @@ build_openbsd_SHA256SUM = sha256
build_openbsd_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o
build_openbsd_TAR = gtar
+# openBSD touch doesn't understand -h
+build_openbsd_TOUCH = touch -m -t 200001011200
diff --git a/depends/funcs.mk b/depends/funcs.mk
index 24c911b0f7..494ed5d324 100644
--- a/depends/funcs.mk
+++ b/depends/funcs.mk
@@ -147,7 +147,7 @@ $(1)_stage_env+=PATH="$(build_prefix)/bin:$(PATH)"
# config.guess, which is what we set it too here. This also quells autoconf
# warnings, "If you wanted to set the --build type, don't use --host.",
# when using versions older than 2.70.
-$(1)_autoconf=./configure --build=$(BUILD) --host=$($($(1)_type)_host) --prefix=$($($(1)_type)_prefix) $$($(1)_config_opts) CC="$$($(1)_cc)" CXX="$$($(1)_cxx)"
+$(1)_autoconf=./configure --build=$(BUILD) --host=$($($(1)_type)_host) --prefix=$($($(1)_type)_prefix) --with-pic $$($(1)_config_opts) CC="$$($(1)_cc)" CXX="$$($(1)_cxx)"
ifneq ($($(1)_nm),)
$(1)_autoconf += NM="$$($(1)_nm)"
endif
@@ -170,12 +170,19 @@ ifneq ($($(1)_ldflags),)
$(1)_autoconf += LDFLAGS="$$($(1)_ldflags)"
endif
+# We hardcode the library install path to "lib" to match the PKG_CONFIG_PATH
+# setting in depends/config.site.in, which also hardcodes "lib".
+# Without this setting, CMake by default would use the OS library
+# directory, which might be "lib64" or something else, not "lib", on multiarch systems.
$(1)_cmake=env CC="$$($(1)_cc)" \
CFLAGS="$$($(1)_cppflags) $$($(1)_cflags)" \
CXX="$$($(1)_cxx)" \
CXXFLAGS="$$($(1)_cppflags) $$($(1)_cxxflags)" \
LDFLAGS="$$($(1)_ldflags)" \
- cmake -DCMAKE_INSTALL_PREFIX:PATH="$$($($(1)_type)_prefix)" $$($(1)_config_opts)
+ cmake -DCMAKE_INSTALL_PREFIX:PATH="$$($($(1)_type)_prefix)" \
+ -DCMAKE_INSTALL_LIBDIR=lib/ \
+ -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
+ $$($(1)_config_opts)
ifeq ($($(1)_type),build)
$(1)_cmake += -DCMAKE_INSTALL_RPATH:PATH="$$($($(1)_type)_prefix)/lib"
else
@@ -234,7 +241,7 @@ $($(1)_postprocessed): | $($(1)_staged)
$($(1)_cached): | $($(1)_dependencies) $($(1)_postprocessed)
echo Caching $(1)...
cd $$($(1)_staging_dir)/$(host_prefix); \
- find . ! -name '.stamp_postprocessed' -print0 | TZ=UTC xargs -0r touch -h -m -t 200001011200; \
+ find . ! -name '.stamp_postprocessed' -print0 | TZ=UTC xargs -0r $(build_TOUCH); \
find . ! -name '.stamp_postprocessed' | LC_ALL=C sort | $(build_TAR) --numeric-owner --no-recursion -czf $$($(1)_staging_dir)/$$(@F) -T -
mkdir -p $$(@D)
rm -rf $$(@D) && mkdir -p $$(@D)
diff --git a/depends/packages.md b/depends/packages.md
index ad91eaffee..0ffdc66d48 100644
--- a/depends/packages.md
+++ b/depends/packages.md
@@ -162,6 +162,9 @@ From the [Gentoo Wiki entry](https://wiki.gentoo.org/wiki/Project:Quality_Assura
> creates. This leads to massive overlinking, which is toxic to the Gentoo
> ecosystem, as it leads to a massive number of unnecessary rebuilds.
+Where possible, packages are built with Position Independant Code. Either using
+the Autotools `--with-pic` flag, or `CMAKE_POSITION_INDEPENDENT_CODE` with CMake.
+
## Secondary dependencies:
Secondary dependency packages relative to the bitcoin binaries/libraries (i.e.
diff --git a/depends/packages/bdb.mk b/depends/packages/bdb.mk
index 9f5a925015..be82b0d309 100644
--- a/depends/packages/bdb.mk
+++ b/depends/packages/bdb.mk
@@ -9,15 +9,9 @@ $(package)_patches=clang_cxx_11.patch
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
-$(package)_config_opts_netbsd=--with-pic
-$(package)_config_opts_openbsd=--with-pic
-$(package)_config_opts_android=--with-pic
$(package)_cflags+=-Wno-error=implicit-function-declaration -Wno-error=format-security -Wno-error=implicit-int
$(package)_cppflags_freebsd=-D_XOPEN_SOURCE=600 -D__BSD_VISIBLE=1
$(package)_cppflags_netbsd=-D_XOPEN_SOURCE=600
-$(package)_cppflags_openbsd=-D_XOPEN_SOURCE=600
$(package)_cppflags_mingw32=-DUNICODE -D_UNICODE
endef
diff --git a/depends/packages/capnp.mk b/depends/packages/capnp.mk
index 2465c8091b..6d792db711 100644
--- a/depends/packages/capnp.mk
+++ b/depends/packages/capnp.mk
@@ -5,15 +5,10 @@ $(package)_download_file=$(native_$(package)_download_file)
$(package)_file_name=$(native_$(package)_file_name)
$(package)_sha256_hash=$(native_$(package)_sha256_hash)
-# Hardcode library install path to "lib" to match the PKG_CONFIG_PATH
-# setting in depends/config.site.in, which also hardcodes "lib".
-# Without this setting, cmake by default would use the OS library
-# directory, which might be "lib64" or something else, not "lib", on multiarch systems.
define $(package)_set_vars :=
$(package)_config_opts := -DBUILD_TESTING=OFF
$(package)_config_opts += -DWITH_OPENSSL=OFF
$(package)_config_opts += -DWITH_ZLIB=OFF
- $(package)_config_opts += -DCMAKE_INSTALL_LIBDIR=lib/
endef
define $(package)_config_cmds
diff --git a/depends/packages/expat.mk b/depends/packages/expat.mk
index bb203d06f8..2ec660109c 100644
--- a/depends/packages/expat.mk
+++ b/depends/packages/expat.mk
@@ -6,12 +6,11 @@ $(package)_sha256_hash=f79b8f904b749e3e0d20afeadecf8249c55b2e32d4ebb089ae378df47
# -D_DEFAULT_SOURCE defines __USE_MISC, which exposes additional
# definitions in endian.h, which are required for a working
-# endianess check in configure when building with -flto.
+# endianness check in configure when building with -flto.
define $(package)_set_vars
$(package)_config_opts=--disable-shared --without-docbook --without-tests --without-examples
$(package)_config_opts += --disable-dependency-tracking --enable-option-checking
$(package)_config_opts += --without-xmlwf
- $(package)_config_opts_linux=--with-pic
$(package)_cppflags += -D_DEFAULT_SOURCE
endef
diff --git a/depends/packages/freetype.mk b/depends/packages/freetype.mk
index 6f5dbe0f01..c28259ed67 100644
--- a/depends/packages/freetype.mk
+++ b/depends/packages/freetype.mk
@@ -7,7 +7,6 @@ $(package)_sha256_hash=8bee39bd3968c4804b70614a0a3ad597299ad0e824bc8aad5ce8aaf48
define $(package)_set_vars
$(package)_config_opts=--without-zlib --without-png --without-harfbuzz --without-bzip2 --disable-static
$(package)_config_opts += --enable-option-checking --without-brotli
- $(package)_config_opts_linux=--with-pic
endef
define $(package)_config_cmds
diff --git a/depends/packages/libXau.mk b/depends/packages/libXau.mk
index b7e032c0b2..aeb14dcd6e 100644
--- a/depends/packages/libXau.mk
+++ b/depends/packages/libXau.mk
@@ -10,7 +10,6 @@ $(package)_dependencies=xproto
define $(package)_set_vars
$(package)_config_opts=--disable-shared --disable-lint-library --without-lint
$(package)_config_opts += --disable-dependency-tracking --enable-option-checking
- $(package)_config_opts_linux=--with-pic
endef
define $(package)_preprocess_cmds
diff --git a/depends/packages/libevent.mk b/depends/packages/libevent.mk
index 9650f77db9..d764be5d0a 100644
--- a/depends/packages/libevent.mk
+++ b/depends/packages/libevent.mk
@@ -11,11 +11,6 @@ define $(package)_set_vars
$(package)_config_opts=--disable-shared --disable-openssl --disable-libevent-regress --disable-samples
$(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)_config_opts_netbsd=--with-pic
- $(package)_config_opts_openbsd=--with-pic
- $(package)_config_opts_android=--with-pic
$(package)_cppflags_mingw32=-D_WIN32_WINNT=0x0601
ifeq ($(NO_HARDEN),)
diff --git a/depends/packages/libmultiprocess.mk b/depends/packages/libmultiprocess.mk
index d237f52dbb..765d649377 100644
--- a/depends/packages/libmultiprocess.mk
+++ b/depends/packages/libmultiprocess.mk
@@ -8,13 +8,7 @@ ifneq ($(host),$(build))
$(package)_dependencies += native_capnp
endif
-# Hardcode library install path to "lib" to match the PKG_CONFIG_PATH
-# setting in depends/config.site.in, which also hardcodes "lib".
-# Without this setting, cmake by default would use the OS library
-# directory, which might be "lib64" or something else, not "lib", on multiarch systems.
define $(package)_set_vars :=
-$(package)_config_opts += -DCMAKE_INSTALL_LIBDIR=lib/
-$(package)_config_opts += -DCMAKE_POSITION_INDEPENDENT_CODE=ON
ifneq ($(host),$(build))
$(package)_config_opts := -DCAPNP_EXECUTABLE="$$(native_capnp_prefixbin)/capnp"
$(package)_config_opts += -DCAPNPC_CXX_EXECUTABLE="$$(native_capnp_prefixbin)/capnpc-c++"
diff --git a/depends/packages/libxcb_util.mk b/depends/packages/libxcb_util.mk
index 6f1b9cd7c6..6e4c7359b2 100644
--- a/depends/packages/libxcb_util.mk
+++ b/depends/packages/libxcb_util.mk
@@ -8,7 +8,6 @@ $(package)_dependencies=libxcb
define $(package)_set_vars
$(package)_config_opts = --disable-shared --disable-devel-docs --without-doxygen
$(package)_config_opts += --disable-dependency-tracking --enable-option-checking
-$(package)_config_opts += --with-pic
endef
define $(package)_preprocess_cmds
diff --git a/depends/packages/qrencode.mk b/depends/packages/qrencode.mk
index 2afd95d7c4..9ebd2dd85a 100644
--- a/depends/packages/qrencode.mk
+++ b/depends/packages/qrencode.mk
@@ -8,8 +8,6 @@ define $(package)_set_vars
$(package)_config_opts=--disable-shared --without-tools --without-tests --without-png
$(package)_config_opts += --disable-gprof --disable-gcov --disable-mudflap
$(package)_config_opts += --disable-dependency-tracking --enable-option-checking
-$(package)_config_opts_linux=--with-pic
-$(package)_config_opts_android=--with-pic
$(package)_cflags += -Wno-int-conversion -Wno-implicit-function-declaration
endef
diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk
index 5608e5f073..0acf4cf565 100644
--- a/depends/packages/qt.mk
+++ b/depends/packages/qt.mk
@@ -1,9 +1,9 @@
package=qt
-$(package)_version=5.15.11
+$(package)_version=5.15.13
$(package)_download_path=https://download.qt.io/official_releases/qt/5.15/$($(package)_version)/submodules
$(package)_suffix=everywhere-opensource-src-$($(package)_version).tar.xz
$(package)_file_name=qtbase-$($(package)_suffix)
-$(package)_sha256_hash=425ad301acd91ca66c10c0dabee0704e2d0cd2801a6b670115800cbb95f84846
+$(package)_sha256_hash=4cca51dcc1f22ceeee6b3e33cd1c3a60b14e85e24644dca3af89a2c2989ab809
$(package)_linux_dependencies=freetype fontconfig libxcb libxkbcommon libxcb_util libxcb_util_render libxcb_util_keysyms libxcb_util_image libxcb_util_wm
$(package)_qt_libs=corelib network widgets gui plugins testlib
$(package)_linguist_tools = lrelease lupdate lconvert
@@ -15,10 +15,8 @@ $(package)_patches += no-xlib.patch
$(package)_patches += fix_android_jni_static.patch
$(package)_patches += dont_hardcode_pwd.patch
$(package)_patches += qtbase-moc-ignore-gcc-macro.patch
-$(package)_patches += use_android_ndk23.patch
$(package)_patches += rcc_hardcode_timestamp.patch
$(package)_patches += duplicate_lcqpafonts.patch
-$(package)_patches += fast_fixed_dtoa_no_optimize.patch
$(package)_patches += guix_cross_lib_path.patch
$(package)_patches += fix-macos-linker.patch
$(package)_patches += memory_resource.patch
@@ -26,10 +24,10 @@ $(package)_patches += utc_from_string_no_optimize.patch
$(package)_patches += windows_lto.patch
$(package)_qttranslations_file_name=qttranslations-$($(package)_suffix)
-$(package)_qttranslations_sha256_hash=a31785948c640b7c66d9fe2db4993728ca07f64e41c560b3625ad191b276ff20
+$(package)_qttranslations_sha256_hash=24d4c58bc2a40c0f44f59ee64af4192c7d0038c1e45af61646cfc5b65058f271
$(package)_qttools_file_name=qttools-$($(package)_suffix)
-$(package)_qttools_sha256_hash=7cd847ae6ff09416df617136eadcaf0eb98e3bc9b89979219a3ea8111fb8d339
+$(package)_qttools_sha256_hash=57c9794c572c4e02871f2e7581525752b0cf85ea16cfab23a4ac9ba7b39a5d34
$(package)_extra_sources = $($(package)_qttranslations_file_name)
$(package)_extra_sources += $($(package)_qttools_file_name)
@@ -178,6 +176,7 @@ $(package)_config_opts_mingw32 += -xplatform win32-g++
$(package)_config_opts_mingw32 += "QMAKE_CFLAGS = '$($(package)_cflags) $($(package)_cppflags)'"
$(package)_config_opts_mingw32 += "QMAKE_CXX = '$($(package)_cxx)'"
$(package)_config_opts_mingw32 += "QMAKE_CXXFLAGS = '$($(package)_cxxflags) $($(package)_cppflags)'"
+$(package)_config_opts_mingw32 += "QMAKE_LINK = '$($(package)_cxx)'"
$(package)_config_opts_mingw32 += "QMAKE_LFLAGS = '$($(package)_ldflags)'"
$(package)_config_opts_mingw32 += "QMAKE_LIB = '$($(package)_ar) rc'"
$(package)_config_opts_mingw32 += -device-option CROSS_COMPILE="$(host)-"
@@ -246,12 +245,10 @@ define $(package)_preprocess_cmds
patch -p1 -i $($(package)_patch_dir)/fix_android_jni_static.patch && \
patch -p1 -i $($(package)_patch_dir)/no-xlib.patch && \
patch -p1 -i $($(package)_patch_dir)/qtbase-moc-ignore-gcc-macro.patch && \
- patch -p1 -i $($(package)_patch_dir)/use_android_ndk23.patch && \
patch -p1 -i $($(package)_patch_dir)/memory_resource.patch && \
patch -p1 -i $($(package)_patch_dir)/rcc_hardcode_timestamp.patch && \
patch -p1 -i $($(package)_patch_dir)/duplicate_lcqpafonts.patch && \
patch -p1 -i $($(package)_patch_dir)/utc_from_string_no_optimize.patch && \
- patch -p1 -i $($(package)_patch_dir)/fast_fixed_dtoa_no_optimize.patch && \
patch -p1 -i $($(package)_patch_dir)/guix_cross_lib_path.patch && \
patch -p1 -i $($(package)_patch_dir)/windows_lto.patch && \
mkdir -p qtbase/mkspecs/macx-clang-linux &&\
diff --git a/depends/packages/sqlite.mk b/depends/packages/sqlite.mk
index 6809b39113..7d175ec4bb 100644
--- a/depends/packages/sqlite.mk
+++ b/depends/packages/sqlite.mk
@@ -7,10 +7,6 @@ $(package)_sha256_hash=5af07de982ba658fd91a03170c945f99c971f6955bc79df3266544373
define $(package)_set_vars
$(package)_config_opts=--disable-shared --disable-readline --disable-dynamic-extensions --enable-option-checking
$(package)_config_opts+= --disable-rtree --disable-fts4 --disable-fts5
-$(package)_config_opts_linux=--with-pic
-$(package)_config_opts_freebsd=--with-pic
-$(package)_config_opts_netbsd=--with-pic
-$(package)_config_opts_openbsd=--with-pic
# We avoid using `--enable-debug` because it overrides CFLAGS, a behavior we want to prevent.
$(package)_cflags_debug += -g
$(package)_cppflags_debug += -DSQLITE_DEBUG
diff --git a/depends/packages/zeromq.mk b/depends/packages/zeromq.mk
index cc78999dbb..bfa5e97c60 100644
--- a/depends/packages/zeromq.mk
+++ b/depends/packages/zeromq.mk
@@ -11,11 +11,6 @@ define $(package)_set_vars
$(package)_config_opts += --without-libsodium --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-Werror --disable-drafts --enable-option-checking
- $(package)_config_opts_linux=--with-pic
- $(package)_config_opts_freebsd=--with-pic
- $(package)_config_opts_netbsd=--with-pic
- $(package)_config_opts_openbsd=--with-pic
- $(package)_config_opts_android=--with-pic
endef
define $(package)_preprocess_cmds
diff --git a/depends/patches/qt/fast_fixed_dtoa_no_optimize.patch b/depends/patches/qt/fast_fixed_dtoa_no_optimize.patch
deleted file mode 100644
index d4d6539f56..0000000000
--- a/depends/patches/qt/fast_fixed_dtoa_no_optimize.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-Modify the optimisation flags for FastFixedDtoa.
-This fixes a non-determinism issue in the asm produced for
-this function when cross-compiling on x86_64 and aarch64 for
-the arm-linux-gnueabihf HOST.
-
---- a/qtbase/src/3rdparty/double-conversion/fixed-dtoa.h
-+++ b/qtbase/src/3rdparty/double-conversion/fixed-dtoa.h
-@@ -48,9 +48,12 @@ namespace double_conversion {
- //
- // This method only works for some parameters. If it can't handle the input it
- // returns false. The output is null-terminated when the function succeeds.
-+#pragma GCC push_options
-+#pragma GCC optimize ("-O1")
- bool FastFixedDtoa(double v, int fractional_count,
- Vector<char> buffer, int* length, int* decimal_point);
-
-+#pragma GCC pop_options
- } // namespace double_conversion
-
- #endif // DOUBLE_CONVERSION_FIXED_DTOA_H_
diff --git a/depends/patches/qt/fix_android_jni_static.patch b/depends/patches/qt/fix_android_jni_static.patch
index 89c96026fb..79824f244a 100644
--- a/depends/patches/qt/fix_android_jni_static.patch
+++ b/depends/patches/qt/fix_android_jni_static.patch
@@ -15,4 +15,3 @@
QWindowSystemInterfacePrivate::TabletEvent::setPlatformSynthesizesMouse(false);
m_javaVM = vm;
-
diff --git a/depends/patches/qt/memory_resource.patch b/depends/patches/qt/memory_resource.patch
index 650c328528..312f0669f6 100644
--- a/depends/patches/qt/memory_resource.patch
+++ b/depends/patches/qt/memory_resource.patch
@@ -17,7 +17,7 @@ and https://bugreports.qt.io/browse/QTBUG-114316
--- a/qtbase/src/corelib/global/qcompilerdetection.h
+++ b/qtbase/src/corelib/global/qcompilerdetection.h
-@@ -1050,16 +1050,22 @@
+@@ -1055,16 +1055,22 @@
# endif // !_HAS_CONSTEXPR
# endif // !__GLIBCXX__ && !_LIBCPP_VERSION
# endif // Q_OS_QNX
diff --git a/depends/patches/qt/use_android_ndk23.patch b/depends/patches/qt/use_android_ndk23.patch
deleted file mode 100644
index f22367d527..0000000000
--- a/depends/patches/qt/use_android_ndk23.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-Use Android NDK r23 LTS
-
---- old/qtbase/mkspecs/features/android/default_pre.prf
-+++ new/qtbase/mkspecs/features/android/default_pre.prf
-@@ -76,7 +76,7 @@ else: equals(QT_ARCH, x86_64): CROSS_COMPILE = $$NDK_LLVM_PATH/bin/x86_64-linux-
- else: equals(QT_ARCH, arm64-v8a): CROSS_COMPILE = $$NDK_LLVM_PATH/bin/aarch64-linux-android-
- else: CROSS_COMPILE = $$NDK_LLVM_PATH/bin/arm-linux-androideabi-
-
--QMAKE_RANLIB = $${CROSS_COMPILE}ranlib
-+QMAKE_RANLIB = $$NDK_LLVM_PATH/bin/llvm-ranlib
- QMAKE_LINK_SHLIB = $$QMAKE_LINK
- QMAKE_LFLAGS =
-
diff --git a/doc/README.md b/doc/README.md
index 446684b482..7b6dacaf4f 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -59,7 +59,6 @@ The Bitcoin repo's [root README](/README.md) contains relevant information on th
- [Translation Strings Policy](translation_strings_policy.md)
- [JSON-RPC Interface](JSON-RPC-interface.md)
- [Unauthenticated REST Interface](REST-interface.md)
-- [Shared Libraries](shared-libraries.md)
- [BIPS](bips.md)
- [Dnsseed Policy](dnsseed-policy.md)
- [Benchmarking](benchmarking.md)
diff --git a/doc/bips.md b/doc/bips.md
index 952d289daa..8309ee7e92 100644
--- a/doc/bips.md
+++ b/doc/bips.md
@@ -49,7 +49,7 @@ BIPs that are implemented by Bitcoin Core:
* [`BIP 173`](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki): Bech32 addresses for native Segregated Witness outputs are supported as of **v0.16.0** ([PR 11167](https://github.com/bitcoin/bitcoin/pull/11167)). Bech32 addresses are generated by default as of **v0.20.0** ([PR 16884](https://github.com/bitcoin/bitcoin/pull/16884)).
* [`BIP 174`](https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki): RPCs to operate on Partially Signed Bitcoin Transactions (PSBT) are present as of **v0.17.0** ([PR 13557](https://github.com/bitcoin/bitcoin/pull/13557)).
* [`BIP 176`](https://github.com/bitcoin/bips/blob/master/bip-0176.mediawiki): Bits Denomination [QT only] is supported as of **v0.16.0** ([PR 12035](https://github.com/bitcoin/bitcoin/pull/12035)).
-* [`BIP 324`](https://github.com/bitcoin/bips/blob/master/bip-0324.mediawiki): The v2 transport protocol specified by BIP324 and the associated `NODE_P2P_V2` service bit are supported as of **v26.0**, but off by default ([PR 28331](https://github.com/bitcoin/bitcoin/pull/28331)).
+* [`BIP 324`](https://github.com/bitcoin/bips/blob/master/bip-0324.mediawiki): The v2 transport protocol specified by BIP324 and the associated `NODE_P2P_V2` service bit are supported as of **v26.0**, but off by default ([PR 28331](https://github.com/bitcoin/bitcoin/pull/28331)). On by default as of **v27.0** ([PR 29347](https://github.com/bitcoin/bitcoin/pull/29347)).
* [`BIP 325`](https://github.com/bitcoin/bips/blob/master/bip-0325.mediawiki): Signet test network is supported as of **v0.21.0** ([PR 18267](https://github.com/bitcoin/bitcoin/pull/18267)).
* [`BIP 339`](https://github.com/bitcoin/bips/blob/master/bip-0339.mediawiki): Relay of transactions by wtxid is supported as of **v0.21.0** ([PR 18044](https://github.com/bitcoin/bitcoin/pull/18044)).
* [`BIP 340`](https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki)
diff --git a/doc/build-openbsd.md b/doc/build-openbsd.md
index 96ee714341..7ed83853a8 100644
--- a/doc/build-openbsd.md
+++ b/doc/build-openbsd.md
@@ -1,6 +1,6 @@
# OpenBSD Build Guide
-**Updated for OpenBSD [7.3](https://www.openbsd.org/73.html)**
+**Updated for OpenBSD [7.4](https://www.openbsd.org/74.html)**
This guide describes how to build bitcoind, command-line utilities, and GUI on OpenBSD.
@@ -43,6 +43,8 @@ BerkeleyDB is only required to support legacy wallets.
It is recommended to use Berkeley DB 4.8. You cannot use the BerkeleyDB library
from ports. However you can build it yourself, [using depends](/depends).
+Refer to [depends/README.md](/depends/README.md) for detailed instructions.
+
```bash
gmake -C depends NO_BOOST=1 NO_LIBEVENT=1 NO_QT=1 NO_SQLITE=1 NO_NATPMP=1 NO_UPNP=1 NO_ZMQ=1 NO_USDT=1
...
diff --git a/doc/build-unix.md b/doc/build-unix.md
index bf367fc421..de54fb4eeb 100644
--- a/doc/build-unix.md
+++ b/doc/build-unix.md
@@ -30,7 +30,7 @@ tuned to conserve memory with additional CXXFLAGS:
Alternatively, or in addition, debugging information can be skipped for compilation. The default compile flags are
`-g -O2`, and can be changed with:
- ./configure CXXFLAGS="-O2"
+ ./configure CXXFLAGS="-g0"
Finally, clang (often less resource hungry) can be used instead of gcc, which is used by default:
@@ -81,7 +81,7 @@ To build without GUI pass `--without-gui`.
To build with Qt 5 you need the following:
- sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools
+ sudo apt-get install qtbase5-dev qttools5-dev qttools5-dev-tools
Additionally, to support Wayland protocol for modern desktop environments:
diff --git a/doc/dependencies.md b/doc/dependencies.md
index e992b50b06..1e48d225b0 100644
--- a/doc/dependencies.md
+++ b/doc/dependencies.md
@@ -9,7 +9,7 @@ You can find installation instructions in the `build-*.md` file for your platfor
| [Autoconf](https://www.gnu.org/software/autoconf/) | [2.69](https://github.com/bitcoin/bitcoin/pull/17769) |
| [Automake](https://www.gnu.org/software/automake/) | [1.13](https://github.com/bitcoin/bitcoin/pull/18290) |
| [Clang](https://clang.llvm.org) | [14.0](https://github.com/bitcoin/bitcoin/pull/29208) |
-| [GCC](https://gcc.gnu.org) | [10.1](https://github.com/bitcoin/bitcoin/pull/28348) |
+| [GCC](https://gcc.gnu.org) | [11.1](https://github.com/bitcoin/bitcoin/pull/29091) |
| [Python](https://www.python.org) (scripts, tests) | [3.9](https://github.com/bitcoin/bitcoin/pull/28211) |
| [systemtap](https://sourceware.org/systemtap/) ([tracing](tracing.md))| N/A |
@@ -30,7 +30,7 @@ You can find installation instructions in the `build-*.md` file for your platfor
| [Fontconfig](../depends/packages/fontconfig.mk) | [link](https://www.freedesktop.org/wiki/Software/fontconfig/) | [2.12.6](https://github.com/bitcoin/bitcoin/pull/23495) | 2.6 | Yes |
| [FreeType](../depends/packages/freetype.mk) | [link](https://freetype.org) | [2.11.0](https://github.com/bitcoin/bitcoin/commit/01544dd78ccc0b0474571da854e27adef97137fb) | 2.3.0 | Yes |
| [qrencode](../depends/packages/qrencode.mk) | [link](https://fukuchi.org/works/qrencode/) | [4.1.1](https://github.com/bitcoin/bitcoin/pull/27312) | | No |
-| [Qt](../depends/packages/qt.mk) | [link](https://download.qt.io/official_releases/qt/) | [5.15.11](https://github.com/bitcoin/bitcoin/pull/28769) | [5.11.3](https://github.com/bitcoin/bitcoin/pull/24132) | No |
+| [Qt](../depends/packages/qt.mk) | [link](https://download.qt.io/official_releases/qt/) | [5.15.13](https://github.com/bitcoin/bitcoin/pull/29732) | [5.11.3](https://github.com/bitcoin/bitcoin/pull/24132) | No |
### Networking
| Dependency | Releases | Version used | Minimum required | Runtime |
diff --git a/doc/design/assumeutxo.md b/doc/design/assumeutxo.md
index 66962a629d..a4980729d0 100644
--- a/doc/design/assumeutxo.md
+++ b/doc/design/assumeutxo.md
@@ -16,12 +16,12 @@ load it.
A pruned node can load a snapshot. To save space, it's possible to delete the
snapshot file as soon as `loadtxoutset` finishes.
-The minimum `-dbcache` setting is 550 MiB, but this functionality ignores that
+The minimum `-prune` setting is 550 MiB, but this functionality ignores that
minimum and uses at least 1100 MiB.
As the background sync continues there will be temporarily two chainstate
directories, each multiple gigabytes in size (likely growing larger than the
-the downloaded snapshot).
+downloaded snapshot).
### Indexes
@@ -51,18 +51,12 @@ The utility script
## Design notes
-- A new block index `nStatus` flag is introduced, `BLOCK_ASSUMED_VALID`, to mark block
- index entries that are required to be assumed-valid by a chainstate created
- from a UTXO snapshot. This flag is used as a way to modify certain
- CheckBlockIndex() logic to account for index entries that are pending validation by a
- chainstate running asynchronously in the background.
-
- The concept of UTXO snapshots is treated as an implementation detail that lives
behind the ChainstateManager interface. The external presentation of the changes
required to facilitate the use of UTXO snapshots is the understanding that there are
- now certain regions of the chain that can be temporarily assumed to be valid (using
- the nStatus flag mentioned above). In certain cases, e.g. wallet rescanning, this is
- very similar to dealing with a pruned chain.
+ now certain regions of the chain that can be temporarily assumed to be valid.
+ In certain cases, e.g. wallet rescanning, this is very similar to dealing with
+ a pruned chain.
Logic outside ChainstateManager should try not to know about snapshots, instead
preferring to work in terms of more general states like assumed-valid.
@@ -145,7 +139,7 @@ sequentially.
Once the tip of the background chainstate hits the base block of the snapshot
chainstate, we stop use of the background chainstate by setting `m_disabled`, in
-`CompleteSnapshotValidation()`, which is checked in `ActivateBestChain()`). We hash the
+`MaybeCompleteSnapshotValidation()`, which is checked in `ActivateBestChain()`). We hash the
background chainstate's UTXO set contents and ensure it matches the compiled value in
`CMainParams::m_assumeutxo_data`.
diff --git a/doc/design/libraries.md b/doc/design/libraries.md
index 7cda64e713..3346c8e81b 100644
--- a/doc/design/libraries.md
+++ b/doc/design/libraries.md
@@ -4,10 +4,9 @@
|--------------------------|-------------|
| *libbitcoin_cli* | RPC client functionality used by *bitcoin-cli* executable |
| *libbitcoin_common* | Home for common functionality shared by different executables and libraries. Similar to *libbitcoin_util*, but higher-level (see [Dependencies](#dependencies)). |
-| *libbitcoin_consensus* | Stable, backwards-compatible consensus functionality used by *libbitcoin_node* and *libbitcoin_wallet* and also exposed as a [shared library](../shared-libraries.md). |
-| *libbitcoinconsensus* | Shared library build of static *libbitcoin_consensus* library |
-| *libbitcoin_kernel* | Consensus engine and support library used for validation by *libbitcoin_node* and also exposed as a [shared library](../shared-libraries.md). |
-| *libbitcoinqt* | GUI functionality used by *bitcoin-qt* and *bitcoin-gui* executables |
+| *libbitcoin_consensus* | Stable, backwards-compatible consensus functionality used by *libbitcoin_node* and *libbitcoin_wallet*. |
+| *libbitcoin_kernel* | Consensus engine and support library used for validation by *libbitcoin_node*. |
+| *libbitcoinqt* | GUI functionality used by *bitcoin-qt* and *bitcoin-gui* executables. |
| *libbitcoin_ipc* | IPC functionality used by *bitcoin-node*, *bitcoin-wallet*, *bitcoin-gui* executables to communicate when [`--enable-multiprocess`](multiprocess.md) is used. |
| *libbitcoin_node* | P2P and RPC server functionality used by *bitcoind* and *bitcoin-qt* executables. |
| *libbitcoin_util* | Home for common functionality shared by different executables and libraries. Similar to *libbitcoin_common*, but lower-level (see [Dependencies](#dependencies)). |
@@ -17,7 +16,7 @@
## Conventions
-- Most libraries are internal libraries and have APIs which are completely unstable! There are few or no restrictions on backwards compatibility or rules about external dependencies. Exceptions are *libbitcoin_consensus* and *libbitcoin_kernel* which have external interfaces documented at [../shared-libraries.md](../shared-libraries.md).
+- Most libraries are internal libraries and have APIs which are completely unstable! There are few or no restrictions on backwards compatibility or rules about external dependencies. An exception is *libbitcoin_kernel*, which, at some future point, will have a documented external interface.
- Generally each library should have a corresponding source directory and namespace. Source code organization is a work in progress, so it is true that some namespaces are applied inconsistently, and if you look at [`libbitcoin_*_SOURCES`](../../src/Makefile.am) lists you can see that many libraries pull in files from outside their source directory. But when working with libraries, it is good to follow a consistent pattern like:
diff --git a/doc/developer-notes.md b/doc/developer-notes.md
index ece36cb088..89c13600eb 100644
--- a/doc/developer-notes.md
+++ b/doc/developer-notes.md
@@ -113,6 +113,8 @@ code.
between integer types, use functional casts such as `int(x)` or `int{x}`
instead of `(int) x`. When casting between more complex types, use `static_cast`.
Use `reinterpret_cast` and `const_cast` as appropriate.
+ - Prefer [`list initialization ({})`](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Res-list) where possible.
+ For example `int x{0};` instead of `int x = 0;` or `int x(0);`
For function calls a namespace should be specified explicitly, unless such functions have been declared within it.
Otherwise, [argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl), also known as ADL, could be
@@ -138,7 +140,7 @@ int main()
Block style example:
```c++
-int g_count = 0;
+int g_count{0};
namespace foo {
class Class
@@ -150,7 +152,7 @@ public:
{
// Comment summarising what this section of code does
for (int i = 0; i < n; ++i) {
- int total_sum = 0;
+ int total_sum{0};
// When something fails, return early
if (!Something()) return false;
...
@@ -356,7 +358,7 @@ produce better debugging builds.
### Show sources in debugging
If you have ccache enabled, absolute paths are stripped from debug information
-with the -fdebug-prefix-map and -fmacro-prefix-map options (if supported by the
+with the `-fdebug-prefix-map` and `-fmacro-prefix-map` options (if supported by the
compiler). This might break source file detection in case you move binaries
after compilation, debug from the directory other than the project root or use
an IDE that only supports absolute paths for debugging.
@@ -575,13 +577,6 @@ export UBSAN_OPTIONS="suppressions=$(pwd)/test/sanitizer_suppressions/ubsan:prin
See the CI config for more examples, and upstream documentation for more information
about any additional options.
-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
diff --git a/doc/fuzzing.md b/doc/fuzzing.md
index a4b0198dd9..c9fb918c8f 100644
--- a/doc/fuzzing.md
+++ b/doc/fuzzing.md
@@ -127,11 +127,6 @@ The default Clang/LLVM version supplied by Apple on macOS does not include
fuzzing libraries, so macOS users will need to install a full version, for
example using `brew install llvm`.
-Should you run into problems with the address sanitizer, it is possible you
-may need to run `./configure` with `--disable-asm` to avoid errors
-with certain assembly code from Bitcoin Core's code. See [developer notes on sanitizers](https://github.com/bitcoin/bitcoin/blob/master/doc/developer-notes.md#sanitizers)
-for more information.
-
You may also need to take care of giving the correct path for `clang` and
`clang++`, like `CC=/path/to/clang CXX=/path/to/clang++` if the non-systems
`clang` does not come first in your path.
@@ -139,7 +134,7 @@ You may also need to take care of giving the correct path for `clang` and
Full configure that was tested on macOS with `brew` installed `llvm`:
```sh
-./configure --enable-fuzz --with-sanitizers=fuzzer,address,undefined --disable-asm CC=$(brew --prefix llvm)/bin/clang CXX=$(brew --prefix llvm)/bin/clang++
+./configure --enable-fuzz --with-sanitizers=fuzzer,address,undefined CC=$(brew --prefix llvm)/bin/clang CXX=$(brew --prefix llvm)/bin/clang++
```
Read the [libFuzzer documentation](https://llvm.org/docs/LibFuzzer.html) for more information. This [libFuzzer tutorial](https://github.com/google/fuzzing/blob/master/tutorial/libFuzzerTutorial.md) might also be of interest.
diff --git a/doc/offline-signing-tutorial.md b/doc/offline-signing-tutorial.md
index 4761cf256b..401ee52c1c 100644
--- a/doc/offline-signing-tutorial.md
+++ b/doc/offline-signing-tutorial.md
@@ -114,7 +114,7 @@ At this point, it's important to understand that both the `offline_wallet` and o
tb1qtu5qgc6ddhmqm5yqjvhg83qgk2t4ewajg0h6yh
```
-2. Visit a faucet like https://signet.bc-2.jp and enter your address from the previous command to receive a small amount of signet coins to this address.
+2. Visit a faucet like https://signetfaucet.com and enter your address from the previous command to receive a small amount of signet coins to this address.
3. Confirm that coins were received using the online `watch_only_wallet`. Note that the transaction may take a few moments before being received on your local node, depending on its connectivity. Just re-run the command periodically until the transaction is received.
@@ -252,4 +252,4 @@ You can also show transactions related to the wallet using `listtransactions`
{
...
}
-``` \ No newline at end of file
+```
diff --git a/doc/policy/mempool-replacements.md b/doc/policy/mempool-replacements.md
index 96ab4112e2..3fd7ff2ad2 100644
--- a/doc/policy/mempool-replacements.md
+++ b/doc/policy/mempool-replacements.md
@@ -12,7 +12,7 @@ other consensus and policy rules, each of the following conditions are met:
1. The directly conflicting transactions all signal replaceability explicitly. A transaction is
signaling BIP125 replaceability if any of its inputs have an nSequence number less than (0xffffffff - 1).
- A transaction also signals replaceibility if its nVersion field is set to 3.
+ A transaction also signals replaceability if its nVersion field is set to 3.
*Rationale*: See [BIP125
explanation](https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki#motivation).
diff --git a/doc/release-notes-27114.md b/doc/release-notes-27114.md
new file mode 100644
index 0000000000..980ffd78a4
--- /dev/null
+++ b/doc/release-notes-27114.md
@@ -0,0 +1,2 @@
+- Additional flags "in" and "out" have been added to `-whitelist` to control whether
+ permissions apply to incoming connections and/or manual (default: incoming only). \ No newline at end of file
diff --git a/doc/release-notes-27375.md b/doc/release-notes-27375.md
new file mode 100644
index 0000000000..e3f4ebdf77
--- /dev/null
+++ b/doc/release-notes-27375.md
@@ -0,0 +1,6 @@
+P2P
+---
+
+UNIX domain sockets can now be used for proxy connections. Set `-onion` or `-proxy`
+to the local socket path with the prefix `unix:` (e.g. `-onion=unix:/home/me/torsocket`).
+(#27375) \ No newline at end of file
diff --git a/doc/release-notes-28207.md b/doc/release-notes-28207.md
deleted file mode 100644
index 56b88da16a..0000000000
--- a/doc/release-notes-28207.md
+++ /dev/null
@@ -1,7 +0,0 @@
-mempool.dat compatibility
-========================
-
-The `mempool.dat` file created by -persistmempool or the savemempool RPC will
-be written in a new format, which can not be read by previous software
-releases. To allow for a downgrade, a temporary setting `-persistmempoolv1` has
-been added to fall back to the legacy format.
diff --git a/doc/release-notes-29189.md b/doc/release-notes-29189.md
deleted file mode 100644
index f75e450217..0000000000
--- a/doc/release-notes-29189.md
+++ /dev/null
@@ -1,15 +0,0 @@
-libbitcoinconsensus
-========================
-
-This library is deprecated and will be removed for v28.
-
-It has existed for nearly 10 years with very little known uptake or impact. It
-has become a maintenance burden.
-
-The underlying functionality does not change between versions, so any users of
-the library can continue to use the final release indefinitely, with the
-understanding that Taproot is its final consensus update.
-
-In the future, libbitcoinkernel will provide a much more useful API that is
-aware of the UTXO set, and therefore be able to fully validate transactions and
-blocks.
diff --git a/doc/release-notes/release-notes-26.1.md b/doc/release-notes/release-notes-26.1.md
new file mode 100644
index 0000000000..b5c6e63007
--- /dev/null
+++ b/doc/release-notes/release-notes-26.1.md
@@ -0,0 +1,106 @@
+26.1 Release Notes
+==================
+
+Bitcoin Core version 26.1 is now available from:
+
+ <https://bitcoincore.org/bin/bitcoin-core-26.1/>
+
+This release includes various bug fixes and performance
+improvements, as well as updated translations.
+
+Please report bugs using the issue tracker at GitHub:
+
+ <https://github.com/bitcoin/bitcoin/issues>
+
+To receive security and update notifications, please subscribe to:
+
+ <https://bitcoincore.org/en/list/announcements/join/>
+
+How to Upgrade
+==============
+
+If you are running an older version, shut it down. Wait until it has completely
+shut down (which might take a few minutes in some cases), then run the
+installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on macOS)
+or `bitcoind`/`bitcoin-qt` (on Linux).
+
+Upgrading directly from a version of Bitcoin Core that has reached its EOL is
+possible, but it might take some time if the data directory needs to be migrated. Old
+wallet versions of Bitcoin Core are generally supported.
+
+Compatibility
+==============
+
+Bitcoin Core is supported and extensively tested on operating systems
+using the Linux kernel, macOS 11.0+, and Windows 7 and newer. Bitcoin
+Core should also work on most other Unix-like systems but is not as
+frequently tested on them. It is not recommended to use Bitcoin Core on
+unsupported systems.
+
+Notable changes
+===============
+
+### Wallet
+
+- #28994 wallet: skip BnB when SFFO is enabled
+- #28920 wallet: birth time update during tx scanning
+- #29176 wallet: Fix use-after-free in WalletBatch::EraseRecords
+- #29510 wallet: getrawchangeaddress and getnewaddress failures should not affect keypools for descriptor wallets
+
+### RPC
+
+- #29003 rpc: fix getrawtransaction segfault
+- #28784 rpc: keep .cookie file if it was not generated
+
+### Logs
+
+- #29227 log mempool loading progress
+
+### P2P and network changes
+
+- #29200 net: create I2P sessions using both ECIES-X25519 and ElGamal encryption
+- #29412 p2p: Don't process mutated blocks
+- #29524 p2p: Don't consider blocks mutated if they don't connect to known prev block
+
+### Build
+
+- #29127 Use hardened runtime on macOS release builds.
+- #29195 build: Fix -Xclang -internal-isystem option
+
+### CI
+
+- #28992 ci: Use Ubuntu 24.04 Noble for asan,tsan,tidy,fuzz
+- #29080 ci: Set HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK to avoid unrelated failures
+- #29610 ci: Fix "macOS native" job
+
+### Miscellaneous
+
+- #28391 refactor: Simplify CTxMempool/BlockAssembler fields, remove some external mapTx access
+- #29179 test: wallet rescan with reorged parent + IsFromMe child in mempool
+- #28791 snapshots: don't core dump when running -checkblockindex after loadtxoutset
+- #29357 test: Drop x modifier in fsbridge::fopen call for MinGW builds
+- #29529 fuzz: restrict fopencookie usage to Linux & FreeBSD
+
+Credits
+=======
+
+Thanks to everyone who directly contributed to this release:
+
+- dergoegge
+- fanquake
+- furszy
+- glozow
+- Greg Sanders
+- Hennadii Stepanov
+- Jon Atack
+- MarcoFalke
+- Mark Friedenbach
+- Martin Zumsande
+- Murch
+- Roman Zeyde
+- stickies-v
+- UdjinM6
+
+As well as to everyone that helped with translations on
+[Transifex](https://www.transifex.com/bitcoin/bitcoin/).
+
diff --git a/doc/shared-libraries.md b/doc/shared-libraries.md
deleted file mode 100644
index 3a448c6556..0000000000
--- a/doc/shared-libraries.md
+++ /dev/null
@@ -1,78 +0,0 @@
-Shared Libraries
-================
-
-## bitcoinconsensus
-***This library is deprecated and will be removed in v28***
-
-The purpose of this library is to make the verification functionality that is critical to Bitcoin's consensus available to other applications, e.g. to language bindings.
-
-### API
-
-The interface is defined in the C header `bitcoinconsensus.h` located in `src/script/bitcoinconsensus.h`.
-
-#### Version
-
-`bitcoinconsensus_version` returns an `unsigned int` with the API version *(currently `2`)*.
-
-#### Script Validation
-
-`bitcoinconsensus_verify_script`, `bitcoinconsensus_verify_script_with_amount` and `bitcoinconsensus_verify_script_with_spent_outputs` return an `int` with the status of the verification. It will be `1` if the input script correctly spends the previous output `scriptPubKey`.
-
-##### Parameters
-###### bitcoinconsensus_verify_script
-- `const unsigned char *scriptPubKey` - The previous output script that encumbers spending.
-- `unsigned int scriptPubKeyLen` - The number of bytes for the `scriptPubKey`.
-- `const unsigned char *txTo` - The transaction with the input that is spending the previous output.
-- `unsigned int txToLen` - The number of bytes for the `txTo`.
-- `unsigned int nIn` - The index of the input in `txTo` that spends the `scriptPubKey`.
-- `unsigned int flags` - The script validation flags *(see below)*.
-- `bitcoinconsensus_error* err` - Will have the error/success code for the operation *(see below)*.
-
-###### bitcoinconsensus_verify_script_with_amount
-- `const unsigned char *scriptPubKey` - The previous output script that encumbers spending.
-- `unsigned int scriptPubKeyLen` - The number of bytes for the `scriptPubKey`.
-- `int64_t amount` - The amount spent in the input
-- `const unsigned char *txTo` - The transaction with the input that is spending the previous output.
-- `unsigned int txToLen` - The number of bytes for the `txTo`.
-- `unsigned int nIn` - The index of the input in `txTo` that spends the `scriptPubKey`.
-- `unsigned int flags` - The script validation flags *(see below)*.
-- `bitcoinconsensus_error* err` - Will have the error/success code for the operation *(see below)*.
-
-###### bitcoinconsensus_verify_script_with_spent_outputs
-- `const unsigned char *scriptPubKey` - The previous output script that encumbers spending.
-- `unsigned int scriptPubKeyLen` - The number of bytes for the `scriptPubKey`.
-- `int64_t amount` - The amount spent in the input
-- `const unsigned char *txTo` - The transaction with the input that is spending the previous output.
-- `unsigned int txToLen` - The number of bytes for the `txTo`.
-- `UTXO *spentOutputs` - Previous outputs spent in the transaction. `UTXO` is a struct composed by `const unsigned char *scriptPubKey`, `unsigned int scriptPubKeySize` (the number of bytes for the `scriptPubKey`) and `unsigned int value`.
-- `unsigned int spentOutputsLen` - The number of bytes for the `spentOutputs`.
-- `unsigned int nIn` - The index of the input in `txTo` that spends the `scriptPubKey`.
-- `unsigned int flags` - The script validation flags *(see below)*.
-- `bitcoinconsensus_error* err` - Will have the error/success code for the operation *(see below)*.
-
-##### Script Flags
-- `bitcoinconsensus_SCRIPT_FLAGS_VERIFY_NONE`
-- `bitcoinconsensus_SCRIPT_FLAGS_VERIFY_P2SH` - Evaluate P2SH ([BIP16](https://github.com/bitcoin/bips/blob/master/bip-0016.mediawiki)) subscripts
-- `bitcoinconsensus_SCRIPT_FLAGS_VERIFY_DERSIG` - Enforce strict DER ([BIP66](https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki)) compliance
-- `bitcoinconsensus_SCRIPT_FLAGS_VERIFY_NULLDUMMY` - Enforce NULLDUMMY ([BIP147](https://github.com/bitcoin/bips/blob/master/bip-0147.mediawiki))
-- `bitcoinconsensus_SCRIPT_FLAGS_VERIFY_CHECKLOCKTIMEVERIFY` - Enable CHECKLOCKTIMEVERIFY ([BIP65](https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki))
-- `bitcoinconsensus_SCRIPT_FLAGS_VERIFY_CHECKSEQUENCEVERIFY` - Enable CHECKSEQUENCEVERIFY ([BIP112](https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki))
-- `bitcoinconsensus_SCRIPT_FLAGS_VERIFY_WITNESS` - Enable WITNESS ([BIP141](https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki))
-- `bitcoinconsensus_SCRIPT_FLAGS_VERIFY_TAPROOT` - Enable TAPROOT ([BIP340](https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki), [BIP341](https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki), [BIP342](https://github.com/bitcoin/bips/blob/master/bip-0342.mediawiki))
-
-##### Errors
-- `bitcoinconsensus_ERR_OK` - No errors with input parameters *(see the return value of `bitcoinconsensus_verify_script` for the verification status)*
-- `bitcoinconsensus_ERR_TX_INDEX` - An invalid index for `txTo`
-- `bitcoinconsensus_ERR_TX_SIZE_MISMATCH` - `txToLen` did not match with the size of `txTo`
-- `bitcoinconsensus_ERR_DESERIALIZE` - An error deserializing `txTo`
-- `bitcoinconsensus_ERR_AMOUNT_REQUIRED` - Input amount is required if WITNESS is used
-- `bitcoinconsensus_ERR_INVALID_FLAGS` - Script verification `flags` are invalid (i.e. not part of the libconsensus interface)
-- `bitcoinconsensus_ERR_SPENT_OUTPUTS_REQUIRED` - Spent outputs are required if TAPROOT is used
-- `bitcoinconsensus_ERR_SPENT_OUTPUTS_MISMATCH` - Spent outputs size doesn't match tx inputs size
-
-### Example Implementations
-- [NBitcoin](https://github.com/MetacoSA/NBitcoin/blob/5e1055cd7c4186dee4227c344af8892aea54faec/NBitcoin/Script.cs#L979-#L1031) (.NET Bindings)
-- [node-libbitcoinconsensus](https://github.com/bitpay/node-libbitcoinconsensus) (Node.js Bindings)
-- [java-libbitcoinconsensus](https://github.com/dexX7/java-libbitcoinconsensus) (Java Bindings)
-- [bitcoinconsensus-php](https://github.com/Bit-Wasp/bitcoinconsensus-php) (PHP Bindings)
-- [rust-bitcoinconsensus](https://github.com/rust-bitcoin/rust-bitcoinconsensus) (Rust Bindings) \ No newline at end of file
diff --git a/doc/translation_process.md b/doc/translation_process.md
index 97a8fbfff2..e5ed7f4e0a 100644
--- a/doc/translation_process.md
+++ b/doc/translation_process.md
@@ -44,21 +44,7 @@ Visit the [Transifex Signup](https://www.transifex.com/signup/) page to create a
You can find the Bitcoin translation project at [https://www.transifex.com/bitcoin/bitcoin/](https://www.transifex.com/bitcoin/bitcoin/).
### Installing the Transifex client command-line tool
-The client is used to fetch updated translations. If you are having problems, or need more details, see [https://docs.transifex.com/client/installing-the-client](https://docs.transifex.com/client/installing-the-client)
-
-`pip install transifex-client`
-
-Setup your Transifex client config as follows. Please *ignore the token field*.
-
-```ini
-nano ~/.transifexrc
-
-[https://www.transifex.com]
-hostname = https://www.transifex.com
-password = PASSWORD
-token =
-username = USERNAME
-```
+The client is used to fetch updated translations. Please check installation instructions and any other details at https://developers.transifex.com/docs/cli.
The Transifex Bitcoin project config file is included as part of the repo. It can be found at `.tx/config`, however you shouldn’t need to change anything.
diff --git a/libbitcoinconsensus.pc.in b/libbitcoinconsensus.pc.in
deleted file mode 100644
index 1ceab280bb..0000000000
--- a/libbitcoinconsensus.pc.in
+++ /dev/null
@@ -1,10 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: @PACKAGE_NAME@ consensus library
-Description: Library for the Bitcoin consensus protocol.
-Version: @PACKAGE_VERSION@
-Libs: -L${libdir} -lbitcoinconsensus
-Cflags: -I${includedir}
diff --git a/src/.clang-tidy b/src/.clang-tidy
index bfaa5ab8e7..e4b789dcaa 100644
--- a/src/.clang-tidy
+++ b/src/.clang-tidy
@@ -12,6 +12,7 @@ modernize-use-noexcept,
modernize-use-nullptr,
performance-*,
-performance-avoid-endl,
+-performance-enum-size,
-performance-inefficient-string-concatenation,
-performance-no-int-to-ptr,
-performance-noexcept-move-constructor,
diff --git a/src/Makefile.am b/src/Makefile.am
index 3e8870c828..11b8f6e4c3 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -10,6 +10,7 @@ DIST_SUBDIRS = secp256k1
AM_LDFLAGS = $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) $(GPROF_LDFLAGS) $(SANITIZER_LDFLAGS) $(CORE_LDFLAGS)
AM_CXXFLAGS = $(CORE_CXXFLAGS) $(DEBUG_CXXFLAGS) $(HARDENED_CXXFLAGS) $(WARN_CXXFLAGS) $(NOWARN_CXXFLAGS) $(ERROR_CXXFLAGS) $(GPROF_CXXFLAGS) $(SANITIZER_CXXFLAGS)
+AM_OBJCXXFLAGS = $(AM_CXXFLAGS)
AM_CPPFLAGS = $(DEBUG_CPPFLAGS) $(HARDENED_CPPFLAGS) $(CORE_CPPFLAGS)
AM_LIBTOOLFLAGS = --preserve-dup-deps
PTHREAD_FLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
@@ -38,9 +39,6 @@ LIBSECP256K1=secp256k1/libsecp256k1.la
if ENABLE_ZMQ
LIBBITCOIN_ZMQ=libbitcoin_zmq.a
endif
-if BUILD_BITCOIN_LIBS
-LIBBITCOINCONSENSUS=libbitcoinconsensus.la
-endif
if BUILD_BITCOIN_KERNEL_LIB
LIBBITCOINKERNEL=libbitcoinkernel.la
endif
@@ -50,10 +48,6 @@ LIBBITCOIN_WALLET_TOOL=libbitcoin_wallet_tool.a
endif
LIBBITCOIN_CRYPTO = $(LIBBITCOIN_CRYPTO_BASE)
-if USE_ASM
-LIBBITCOIN_CRYPTO_SSE4 = crypto/libbitcoin_crypto_sse4.la
-LIBBITCOIN_CRYPTO += $(LIBBITCOIN_CRYPTO_SSE4)
-endif
if ENABLE_SSE41
LIBBITCOIN_CRYPTO_SSE41 = crypto/libbitcoin_crypto_sse41.la
LIBBITCOIN_CRYPTO += $(LIBBITCOIN_CRYPTO_SSE41)
@@ -305,6 +299,7 @@ BITCOIN_CORE_H = \
util/error.h \
util/exception.h \
util/fastrange.h \
+ util/feefrac.h \
util/fees.h \
util/fs.h \
util/fs_helpers.h \
@@ -326,6 +321,7 @@ BITCOIN_CORE_H = \
util/spanparsing.h \
util/string.h \
util/syserror.h \
+ util/task_runner.h \
util/thread.h \
util/threadinterrupt.h \
util/threadnames.h \
@@ -584,6 +580,7 @@ crypto_libbitcoin_crypto_base_la_SOURCES = \
crypto/sha1.h \
crypto/sha256.cpp \
crypto/sha256.h \
+ crypto/sha256_sse4.cpp \
crypto/sha3.cpp \
crypto/sha3.h \
crypto/sha512.cpp \
@@ -593,13 +590,6 @@ crypto_libbitcoin_crypto_base_la_SOURCES = \
# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
# CXXFLAGS above
-crypto_libbitcoin_crypto_sse4_la_LDFLAGS = $(AM_LDFLAGS) -static
-crypto_libbitcoin_crypto_sse4_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
-crypto_libbitcoin_crypto_sse4_la_CPPFLAGS = $(AM_CPPFLAGS)
-crypto_libbitcoin_crypto_sse4_la_SOURCES = crypto/sha256_sse4.cpp
-
-# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
-# CXXFLAGS above
crypto_libbitcoin_crypto_sse41_la_LDFLAGS = $(AM_LDFLAGS) -static
crypto_libbitcoin_crypto_sse41_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
crypto_libbitcoin_crypto_sse41_la_CPPFLAGS = $(AM_CPPFLAGS)
@@ -656,7 +646,6 @@ libbitcoin_consensus_a_SOURCES = \
primitives/transaction.h \
pubkey.cpp \
pubkey.h \
- script/bitcoinconsensus.cpp \
script/interpreter.cpp \
script/interpreter.h \
script/script.cpp \
@@ -749,6 +738,7 @@ libbitcoin_util_a_SOURCES = \
util/check.cpp \
util/error.cpp \
util/exception.cpp \
+ util/feefrac.cpp \
util/fees.cpp \
util/fs.cpp \
util/fs_helpers.cpp \
@@ -975,7 +965,6 @@ libbitcoinkernel_la_SOURCES = \
pubkey.cpp \
random.cpp \
randomenv.cpp \
- scheduler.cpp \
script/interpreter.cpp \
script/script.cpp \
script/script_error.cpp \
@@ -992,7 +981,7 @@ libbitcoinkernel_la_SOURCES = \
util/batchpriority.cpp \
util/chaintype.cpp \
util/check.cpp \
- util/exception.cpp \
+ util/feefrac.cpp \
util/fs.cpp \
util/fs_helpers.cpp \
util/hasher.cpp \
@@ -1003,7 +992,6 @@ libbitcoinkernel_la_SOURCES = \
util/strencodings.cpp \
util/string.cpp \
util/syserror.cpp \
- util/thread.cpp \
util/threadnames.cpp \
util/time.cpp \
util/tokenpipe.cpp \
@@ -1018,21 +1006,6 @@ libbitcoinkernel_la-clientversion.l$(OBJEXT): obj/build.h
endif # BUILD_BITCOIN_KERNEL_LIB
#
-# bitcoinconsensus library #
-if BUILD_BITCOIN_LIBS
-lib_LTLIBRARIES += $(LIBBITCOINCONSENSUS)
-
-include_HEADERS = script/bitcoinconsensus.h
-libbitcoinconsensus_la_SOURCES = support/cleanse.cpp $(crypto_libbitcoin_crypto_base_la_SOURCES) $(libbitcoin_consensus_a_SOURCES)
-
-libbitcoinconsensus_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS)
-libbitcoinconsensus_la_LIBADD = $(LIBSECP256K1)
-libbitcoinconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL -DDISABLE_OPTIMIZED_SHA256
-libbitcoinconsensus_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
-
-endif
-#
-
CTAES_DIST = crypto/ctaes/bench.c
CTAES_DIST += crypto/ctaes/ctaes.c
CTAES_DIST += crypto/ctaes/ctaes.h
diff --git a/src/Makefile.bench.include b/src/Makefile.bench.include
index 9e5366f0b4..7ba0111fa6 100644
--- a/src/Makefile.bench.include
+++ b/src/Makefile.bench.include
@@ -34,6 +34,7 @@ bench_bench_bitcoin_SOURCES = \
bench/examples.cpp \
bench/gcs_filter.cpp \
bench/hashpadding.cpp \
+ bench/index_blockfilter.cpp \
bench/load_external.cpp \
bench/lockedpool.cpp \
bench/logging.cpp \
@@ -42,6 +43,7 @@ bench_bench_bitcoin_SOURCES = \
bench/merkle_root.cpp \
bench/nanobench.cpp \
bench/nanobench.h \
+ bench/parse_hex.cpp \
bench/peer_eviction.cpp \
bench/poly1305.cpp \
bench/pool.cpp \
@@ -88,6 +90,8 @@ bench_bench_bitcoin_SOURCES += bench/wallet_balance.cpp
bench_bench_bitcoin_SOURCES += bench/wallet_create.cpp
bench_bench_bitcoin_SOURCES += bench/wallet_loading.cpp
bench_bench_bitcoin_SOURCES += bench/wallet_create_tx.cpp
+bench_bench_bitcoin_SOURCES += bench/wallet_ismine.cpp
+
bench_bench_bitcoin_LDADD += $(BDB_LIBS) $(SQLITE_LIBS)
endif
diff --git a/src/Makefile.qt_locale.include b/src/Makefile.qt_locale.include
index 4712b1e11f..2af9fd01af 100644
--- a/src/Makefile.qt_locale.include
+++ b/src/Makefile.qt_locale.include
@@ -1,6 +1,7 @@
QT_TS = \
qt/locale/bitcoin_af.ts \
qt/locale/bitcoin_am.ts \
+ qt/locale/bitcoin_ar.ts \
qt/locale/bitcoin_az.ts \
qt/locale/bitcoin_az@latin.ts \
qt/locale/bitcoin_be.ts \
@@ -86,7 +87,6 @@ QT_TS = \
qt/locale/bitcoin_pt_BR.ts \
qt/locale/bitcoin_ro.ts \
qt/locale/bitcoin_ru.ts \
- qt/locale/bitcoin_ru_RU.ts \
qt/locale/bitcoin_sc.ts \
qt/locale/bitcoin_sd.ts \
qt/locale/bitcoin_si.ts \
@@ -103,7 +103,6 @@ QT_TS = \
qt/locale/bitcoin_szl.ts \
qt/locale/bitcoin_ta.ts \
qt/locale/bitcoin_te.ts \
- qt/locale/bitcoin_th.ts \
qt/locale/bitcoin_tk.ts \
qt/locale/bitcoin_tl.ts \
qt/locale/bitcoin_tr.ts \
diff --git a/src/Makefile.test.include b/src/Makefile.test.include
index 9f9bdbbd0c..cf88a02b95 100644
--- a/src/Makefile.test.include
+++ b/src/Makefile.test.include
@@ -93,6 +93,7 @@ BITCOIN_TESTS =\
test/denialofservice_tests.cpp \
test/descriptor_tests.cpp \
test/disconnected_transactions.cpp \
+ test/feefrac_tests.cpp \
test/flatfile_tests.cpp \
test/fs_tests.cpp \
test/getarg_tests.cpp \
@@ -313,7 +314,9 @@ test_fuzz_fuzz_SOURCES = \
test/fuzz/descriptor_parse.cpp \
test/fuzz/deserialize.cpp \
test/fuzz/eval_script.cpp \
+ test/fuzz/feefrac.cpp \
test/fuzz/fee_rate.cpp \
+ test/fuzz/feeratediagram.cpp \
test/fuzz/fees.cpp \
test/fuzz/flatfile.cpp \
test/fuzz/float.cpp \
@@ -362,7 +365,6 @@ test_fuzz_fuzz_SOURCES = \
test/fuzz/rpc.cpp \
test/fuzz/script.cpp \
test/fuzz/script_assets_test_minimizer.cpp \
- test/fuzz/script_bitcoin_consensus.cpp \
test/fuzz/script_descriptor_cache.cpp \
test/fuzz/script_flags.cpp \
test/fuzz/script_format.cpp \
diff --git a/src/addrdb.cpp b/src/addrdb.cpp
index 8cf932bcb6..14dc314c36 100644
--- a/src/addrdb.cpp
+++ b/src/addrdb.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <addrdb.h>
#include <addrman.h>
@@ -40,7 +44,8 @@ bool SerializeDB(Stream& stream, const Data& data)
hashwriter << Params().MessageStart() << data;
stream << hashwriter.GetHash();
} catch (const std::exception& e) {
- return error("%s: Serialize or I/O error - %s", __func__, e.what());
+ LogError("%s: Serialize or I/O error - %s\n", __func__, e.what());
+ return false;
}
return true;
@@ -60,7 +65,8 @@ bool SerializeFileDB(const std::string& prefix, const fs::path& path, const Data
if (fileout.IsNull()) {
fileout.fclose();
remove(pathTmp);
- return error("%s: Failed to open file %s", __func__, fs::PathToString(pathTmp));
+ LogError("%s: Failed to open file %s\n", __func__, fs::PathToString(pathTmp));
+ return false;
}
// Serialize
@@ -72,14 +78,16 @@ bool SerializeFileDB(const std::string& prefix, const fs::path& path, const Data
if (!FileCommit(fileout.Get())) {
fileout.fclose();
remove(pathTmp);
- return error("%s: Failed to flush file %s", __func__, fs::PathToString(pathTmp));
+ LogError("%s: Failed to flush file %s\n", __func__, fs::PathToString(pathTmp));
+ return false;
}
fileout.fclose();
// replace existing file, if any, with new file
if (!RenameOver(pathTmp, path)) {
remove(pathTmp);
- return error("%s: Rename-into-place failed", __func__);
+ LogError("%s: Rename-into-place failed\n", __func__);
+ return false;
}
return true;
@@ -136,7 +144,7 @@ bool CBanDB::Write(const banmap_t& banSet)
}
for (const auto& err : errors) {
- error("%s", err);
+ LogError("%s\n", err);
}
return false;
}
@@ -185,7 +193,9 @@ void ReadFromStream(AddrMan& addr, DataStream& ssPeers)
util::Result<std::unique_ptr<AddrMan>> LoadAddrman(const NetGroupManager& netgroupman, const ArgsManager& args)
{
auto check_addrman = std::clamp<int32_t>(args.GetIntArg("-checkaddrman", DEFAULT_ADDRMAN_CONSISTENCY_CHECKS), 0, 1000000);
- auto addrman{std::make_unique<AddrMan>(netgroupman, /*deterministic=*/false, /*consistency_check_ratio=*/check_addrman)};
+ bool deterministic = HasTestOption(args, "addrman"); // use a deterministic addrman only for tests
+
+ auto addrman{std::make_unique<AddrMan>(netgroupman, deterministic, /*consistency_check_ratio=*/check_addrman)};
const auto start{SteadyClock::now()};
const auto path_addr{args.GetDataDirNet() / "peers.dat"};
@@ -194,7 +204,7 @@ util::Result<std::unique_ptr<AddrMan>> LoadAddrman(const NetGroupManager& netgro
LogPrintf("Loaded %i addresses from peers.dat %dms\n", addrman->Size(), Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
} catch (const DbNotFoundError&) {
// Addrman can be in an inconsistent state after failure, reset it
- addrman = std::make_unique<AddrMan>(netgroupman, /*deterministic=*/false, /*consistency_check_ratio=*/check_addrman);
+ addrman = std::make_unique<AddrMan>(netgroupman, deterministic, /*consistency_check_ratio=*/check_addrman);
LogPrintf("Creating peers.dat because the file was not found (%s)\n", fs::quoted(fs::PathToString(path_addr)));
DumpPeerAddresses(args, *addrman);
} catch (const InvalidAddrManVersionError&) {
@@ -202,7 +212,7 @@ util::Result<std::unique_ptr<AddrMan>> LoadAddrman(const NetGroupManager& netgro
return util::Error{strprintf(_("Failed to rename invalid peers.dat file. Please move or delete it and try again."))};
}
// Addrman can be in an inconsistent state after failure, reset it
- addrman = std::make_unique<AddrMan>(netgroupman, /*deterministic=*/false, /*consistency_check_ratio=*/check_addrman);
+ addrman = std::make_unique<AddrMan>(netgroupman, deterministic, /*consistency_check_ratio=*/check_addrman);
LogPrintf("Creating new peers.dat because the file version was not compatible (%s). Original backed up to peers.dat.bak\n", fs::quoted(fs::PathToString(path_addr)));
DumpPeerAddresses(args, *addrman);
} catch (const std::exception& e) {
diff --git a/src/addrman.cpp b/src/addrman.cpp
index 5b2375bc9a..ef8ed92bb5 100644
--- a/src/addrman.cpp
+++ b/src/addrman.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <addrman.h>
#include <addrman_impl.h>
diff --git a/src/bench/bench.cpp b/src/bench/bench.cpp
index 84b66bc4b2..a13a693ad7 100644
--- a/src/bench/bench.cpp
+++ b/src/bench/bench.cpp
@@ -23,6 +23,8 @@ const std::function<void(const std::string&)> G_TEST_LOG_FUN{};
const std::function<std::vector<const char*>()> G_TEST_COMMAND_LINE_ARGUMENTS{};
+const std::function<std::string()> G_TEST_GET_FULL_NAME{};
+
namespace {
void GenerateTemplateResults(const std::vector<ankerl::nanobench::Result>& benchmarkResults, const fs::path& file, const char* tpl)
diff --git a/src/bench/index_blockfilter.cpp b/src/bench/index_blockfilter.cpp
new file mode 100644
index 0000000000..5e0bfbfea6
--- /dev/null
+++ b/src/bench/index_blockfilter.cpp
@@ -0,0 +1,43 @@
+// Copyright (c) 2023-present The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or https://www.opensource.org/licenses/mit-license.php.
+
+#include <bench/bench.h>
+
+#include <addresstype.h>
+#include <index/blockfilterindex.h>
+#include <node/chainstate.h>
+#include <node/context.h>
+#include <test/util/setup_common.h>
+#include <util/strencodings.h>
+
+// Very simple block filter index sync benchmark, only using coinbase outputs.
+static void BlockFilterIndexSync(benchmark::Bench& bench)
+{
+ const auto test_setup = MakeNoLogFileContext<TestChain100Setup>();
+
+ // Create more blocks
+ int CHAIN_SIZE = 600;
+ CPubKey pubkey{ParseHex("02ed26169896db86ced4cbb7b3ecef9859b5952825adbeab998fb5b307e54949c9")};
+ CScript script = GetScriptForDestination(WitnessV0KeyHash(pubkey));
+ std::vector<CMutableTransaction> noTxns;
+ for (int i = 0; i < CHAIN_SIZE - 100; i++) {
+ test_setup->CreateAndProcessBlock(noTxns, script);
+ SetMockTime(GetTime() + 1);
+ }
+ assert(WITH_LOCK(::cs_main, return test_setup->m_node.chainman->ActiveHeight() == CHAIN_SIZE));
+
+ bench.minEpochIterations(5).run([&] {
+ BlockFilterIndex filter_index(interfaces::MakeChain(test_setup->m_node), BlockFilterType::BASIC,
+ /*n_cache_size=*/0, /*f_memory=*/false, /*f_wipe=*/true);
+ assert(filter_index.Init());
+ assert(!filter_index.BlockUntilSyncedToCurrentChain());
+ filter_index.Sync();
+
+ IndexSummary summary = filter_index.GetSummary();
+ assert(summary.synced);
+ assert(summary.best_block_hash == WITH_LOCK(::cs_main, return test_setup->m_node.chainman->ActiveTip()->GetBlockHash()));
+ });
+}
+
+BENCHMARK(BlockFilterIndexSync, benchmark::PriorityLevel::HIGH);
diff --git a/src/bench/parse_hex.cpp b/src/bench/parse_hex.cpp
new file mode 100644
index 0000000000..db3ead043c
--- /dev/null
+++ b/src/bench/parse_hex.cpp
@@ -0,0 +1,36 @@
+// Copyright (c) 2024- The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <bench/bench.h>
+#include <random.h>
+#include <stddef.h>
+#include <util/strencodings.h>
+#include <cassert>
+#include <optional>
+#include <vector>
+
+std::string generateHexString(size_t length) {
+ const auto hex_digits = "0123456789ABCDEF";
+ FastRandomContext rng(/*fDeterministic=*/true);
+
+ std::string data;
+ while (data.size() < length) {
+ auto digit = hex_digits[rng.randbits(4)];
+ data.push_back(digit);
+ }
+ return data;
+}
+
+static void HexParse(benchmark::Bench& bench)
+{
+ auto data = generateHexString(130); // Generates 678B0EDA0A1FD30904D5A65E3568DB82DB2D918B0AD8DEA18A63FECCB877D07CAD1495C7157584D877420EF38B8DA473A6348B4F51811AC13C786B962BEE5668F9 by default
+
+ bench.batch(data.size()).unit("base16").run([&] {
+ auto result = TryParseHex(data);
+ assert(result != std::nullopt); // make sure we're measuring the successful case
+ ankerl::nanobench::doNotOptimizeAway(result);
+ });
+}
+
+BENCHMARK(HexParse, benchmark::PriorityLevel::HIGH);
diff --git a/src/bench/verify_script.cpp b/src/bench/verify_script.cpp
index 3682b33518..ee750bc1f8 100644
--- a/src/bench/verify_script.cpp
+++ b/src/bench/verify_script.cpp
@@ -4,9 +4,6 @@
#include <bench/bench.h>
#include <key.h>
-#if defined(HAVE_CONSENSUS_LIB)
-#include <script/bitcoinconsensus.h>
-#endif
#include <script/script.h>
#include <script/interpreter.h>
#include <streams.h>
@@ -59,17 +56,6 @@ static void VerifyScriptBench(benchmark::Bench& bench)
&err);
assert(err == SCRIPT_ERR_OK);
assert(success);
-
-#if defined(HAVE_CONSENSUS_LIB)
- DataStream stream;
- stream << TX_WITH_WITNESS(txSpend);
- int csuccess = bitcoinconsensus_verify_script_with_amount(
- txCredit.vout[0].scriptPubKey.data(),
- txCredit.vout[0].scriptPubKey.size(),
- txCredit.vout[0].nValue,
- (const unsigned char*)stream.data(), stream.size(), 0, flags, nullptr);
- assert(csuccess == 1);
-#endif
});
ECC_Stop();
}
diff --git a/src/bench/wallet_balance.cpp b/src/bench/wallet_balance.cpp
index bf2195293e..7a10b167a6 100644
--- a/src/bench/wallet_balance.cpp
+++ b/src/bench/wallet_balance.cpp
@@ -39,7 +39,8 @@ static void WalletBalance(benchmark::Bench& bench, const bool set_dirty, const b
generatetoaddress(test_setup->m_node, address_mine.value_or(ADDRESS_WATCHONLY));
generatetoaddress(test_setup->m_node, ADDRESS_WATCHONLY);
}
- SyncWithValidationInterfaceQueue();
+ // Calls SyncWithValidationInterfaceQueue
+ wallet.chain().waitForNotificationsIfTipChanged(uint256::ZERO);
auto bal = GetBalance(wallet); // Cache
diff --git a/src/bench/wallet_create.cpp b/src/bench/wallet_create.cpp
index 993c4c4b3f..32f55f51e1 100644
--- a/src/bench/wallet_create.cpp
+++ b/src/bench/wallet_create.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <bench/bench.h>
#include <node/context.h>
#include <random.h>
diff --git a/src/bench/wallet_ismine.cpp b/src/bench/wallet_ismine.cpp
new file mode 100644
index 0000000000..3f922e18a5
--- /dev/null
+++ b/src/bench/wallet_ismine.cpp
@@ -0,0 +1,77 @@
+// Copyright (c) 2022 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif // HAVE_CONFIG_H
+#include <bench/bench.h>
+#include <interfaces/chain.h>
+#include <key.h>
+#include <key_io.h>
+#include <node/context.h>
+#include <test/util/setup_common.h>
+#include <util/translation.h>
+#include <validationinterface.h>
+#include <wallet/context.h>
+#include <wallet/test/util.h>
+#include <wallet/wallet.h>
+#include <wallet/walletutil.h>
+
+namespace wallet {
+static void WalletIsMine(benchmark::Bench& bench, bool legacy_wallet, int num_combo = 0)
+{
+ const auto test_setup = MakeNoLogFileContext<TestingSetup>();
+
+ WalletContext context;
+ context.args = &test_setup->m_args;
+ context.chain = test_setup->m_node.chain.get();
+
+ // Setup the wallet
+ // Loading the wallet will also create it
+ uint64_t create_flags = 0;
+ if (!legacy_wallet) {
+ create_flags = WALLET_FLAG_DESCRIPTORS;
+ }
+ auto database = CreateMockableWalletDatabase();
+ auto wallet = TestLoadWallet(std::move(database), context, create_flags);
+
+ // For a descriptor wallet, fill with num_combo combo descriptors with random keys
+ // This benchmarks a non-HD wallet migrated to descriptors
+ if (!legacy_wallet && num_combo > 0) {
+ LOCK(wallet->cs_wallet);
+ for (int i = 0; i < num_combo; ++i) {
+ CKey key;
+ key.MakeNewKey(/*fCompressed=*/true);
+ FlatSigningProvider keys;
+ std::string error;
+ std::unique_ptr<Descriptor> desc = Parse("combo(" + EncodeSecret(key) + ")", keys, error, /*require_checksum=*/false);
+ WalletDescriptor w_desc(std::move(desc), /*creation_time=*/0, /*range_start=*/0, /*range_end=*/0, /*next_index=*/0);
+ auto spkm = wallet->AddWalletDescriptor(w_desc, keys, /*label=*/"", /*internal=*/false);
+ assert(spkm);
+ }
+ }
+
+ const CScript script = GetScriptForDestination(DecodeDestination(ADDRESS_BCRT1_UNSPENDABLE));
+
+ bench.run([&] {
+ LOCK(wallet->cs_wallet);
+ isminetype mine = wallet->IsMine(script);
+ assert(mine == ISMINE_NO);
+ });
+
+ TestUnloadWallet(std::move(wallet));
+}
+
+#ifdef USE_BDB
+static void WalletIsMineLegacy(benchmark::Bench& bench) { WalletIsMine(bench, /*legacy_wallet=*/true); }
+BENCHMARK(WalletIsMineLegacy, benchmark::PriorityLevel::LOW);
+#endif
+
+#ifdef USE_SQLITE
+static void WalletIsMineDescriptors(benchmark::Bench& bench) { WalletIsMine(bench, /*legacy_wallet=*/false); }
+static void WalletIsMineMigratedDescriptors(benchmark::Bench& bench) { WalletIsMine(bench, /*legacy_wallet=*/false, /*num_combo=*/2000); }
+BENCHMARK(WalletIsMineDescriptors, benchmark::PriorityLevel::LOW);
+BENCHMARK(WalletIsMineMigratedDescriptors, benchmark::PriorityLevel::LOW);
+#endif
+} // namespace wallet
diff --git a/src/bench/wallet_loading.cpp b/src/bench/wallet_loading.cpp
index b17c7fe05a..6305126c7d 100644
--- a/src/bench/wallet_loading.cpp
+++ b/src/bench/wallet_loading.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <bench/bench.h>
#include <interfaces/chain.h>
#include <node/context.h>
diff --git a/src/bitcoin-chainstate.cpp b/src/bitcoin-chainstate.cpp
index c1a71ed749..642af06e82 100644
--- a/src/bitcoin-chainstate.cpp
+++ b/src/bitcoin-chainstate.cpp
@@ -23,11 +23,10 @@
#include <node/caches.h>
#include <node/chainstate.h>
#include <random.h>
-#include <scheduler.h>
#include <script/sigcache.h>
#include <util/chaintype.h>
#include <util/fs.h>
-#include <util/thread.h>
+#include <util/task_runner.h>
#include <validation.h>
#include <validationinterface.h>
@@ -68,16 +67,7 @@ int main(int argc, char* argv[])
Assert(InitSignatureCache(validation_cache_sizes.signature_cache_bytes));
Assert(InitScriptExecutionCache(validation_cache_sizes.script_execution_cache_bytes));
-
- // SETUP: Scheduling and Background Signals
- CScheduler scheduler{};
- // Start the lightweight task scheduler thread
- scheduler.m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { scheduler.serviceQueue(); });
-
- // Gather some entropy once per minute.
- scheduler.scheduleEvery(RandAddPeriodic, std::chrono::minutes{1});
-
- GetMainSignals().RegisterBackgroundSignalScheduler(scheduler);
+ ValidationSignals validation_signals{std::make_unique<util::ImmediateTaskRunner>()};
class KernelNotifications : public kernel::Notifications
{
@@ -99,14 +89,13 @@ int main(int argc, char* argv[])
{
std::cout << "Warning: " << warning.original << std::endl;
}
- void flushError(const std::string& debug_message) override
+ void flushError(const bilingual_str& message) override
{
- std::cerr << "Error flushing block data to disk: " << debug_message << std::endl;
+ std::cerr << "Error flushing block data to disk: " << message.original << std::endl;
}
- void fatalError(const std::string& debug_message, const bilingual_str& user_message) override
+ void fatalError(const bilingual_str& message) override
{
- std::cerr << "Error: " << debug_message << std::endl;
- std::cerr << (user_message.empty() ? "A fatal internal error occurred." : user_message.original) << std::endl;
+ std::cerr << "Error: " << message.original << std::endl;
}
};
auto notifications = std::make_unique<KernelNotifications>();
@@ -118,6 +107,7 @@ int main(int argc, char* argv[])
.chainparams = *chainparams,
.datadir = abs_datadir,
.notifications = *notifications,
+ .signals = &validation_signals,
};
const node::BlockManager::Options blockman_opts{
.chainparams = chainman_opts.chainparams,
@@ -235,9 +225,9 @@ int main(int argc, char* argv[])
bool new_block;
auto sc = std::make_shared<submitblock_StateCatcher>(block.GetHash());
- RegisterSharedValidationInterface(sc);
+ validation_signals.RegisterSharedValidationInterface(sc);
bool accepted = chainman.ProcessNewBlock(blockptr, /*force_processing=*/true, /*min_pow_checked=*/true, /*new_block=*/&new_block);
- UnregisterSharedValidationInterface(sc);
+ validation_signals.UnregisterSharedValidationInterface(sc);
if (!new_block && accepted) {
std::cerr << "duplicate" << std::endl;
break;
@@ -287,10 +277,9 @@ int main(int argc, char* argv[])
epilogue:
// Without this precise shutdown sequence, there will be a lot of nullptr
// dereferencing and UB.
- scheduler.stop();
if (chainman.m_thread_load.joinable()) chainman.m_thread_load.join();
- GetMainSignals().FlushBackgroundCallbacks();
+ validation_signals.FlushBackgroundCallbacks();
{
LOCK(cs_main);
for (Chainstate* chainstate : chainman.GetAll()) {
@@ -300,5 +289,4 @@ epilogue:
}
}
}
- GetMainSignals().UnregisterBackgroundSignalScheduler();
}
diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp
index f0e27cb675..129deeec60 100644
--- a/src/bitcoin-cli.cpp
+++ b/src/bitcoin-cli.cpp
@@ -827,7 +827,10 @@ static UniValue CallRPC(BaseRequestHandler* rh, const std::string& strMethod, co
if (response.error != -1) {
responseErrorMessage = strprintf(" (error code %d - \"%s\")", response.error, http_errorstring(response.error));
}
- throw CConnectionFailed(strprintf("Could not connect to the server %s:%d%s\n\nMake sure the bitcoind server is running and that you are connecting to the correct RPC port.", host, port, responseErrorMessage));
+ throw CConnectionFailed(strprintf("Could not connect to the server %s:%d%s\n\n"
+ "Make sure the bitcoind server is running and that you are connecting to the correct RPC port.\n"
+ "Use \"bitcoin-cli -help\" for more info.",
+ host, port, responseErrorMessage));
} else if (response.status == HTTP_UNAUTHORIZED) {
if (failedToGetAuthCookie) {
throw std::runtime_error(strprintf(
diff --git a/src/chain.h b/src/chain.h
index fa165a4aa7..bb70dbd8bc 100644
--- a/src/chain.h
+++ b/src/chain.h
@@ -98,16 +98,20 @@ enum BlockStatus : uint32_t {
/**
* Only first tx is coinbase, 2 <= coinbase input script length <= 100, transactions valid, no duplicate txids,
- * sigops, size, merkle root. Implies all parents are at least TREE but not necessarily TRANSACTIONS. When all
- * parent blocks also have TRANSACTIONS, CBlockIndex::nChainTx will be set.
+ * sigops, size, merkle root. Implies all parents are at least TREE but not necessarily TRANSACTIONS.
+ *
+ * If a block's validity is at least VALID_TRANSACTIONS, CBlockIndex::nTx will be set. If a block and all previous
+ * blocks back to the genesis block or an assumeutxo snapshot block are at least VALID_TRANSACTIONS,
+ * CBlockIndex::nChainTx will be set.
*/
BLOCK_VALID_TRANSACTIONS = 3,
//! Outputs do not overspend inputs, no double spends, coinbase output ok, no immature coinbase spends, BIP30.
- //! Implies all parents are either at least VALID_CHAIN, or are ASSUMED_VALID
+ //! Implies all previous blocks back to the genesis block or an assumeutxo snapshot block are at least VALID_CHAIN.
BLOCK_VALID_CHAIN = 4,
- //! Scripts & signatures ok. Implies all parents are either at least VALID_SCRIPTS, or are ASSUMED_VALID.
+ //! Scripts & signatures ok. Implies all previous blocks back to the genesis block or an assumeutxo snapshot block
+ //! are at least VALID_SCRIPTS.
BLOCK_VALID_SCRIPTS = 5,
//! All validity bits.
@@ -124,21 +128,8 @@ enum BlockStatus : uint32_t {
BLOCK_OPT_WITNESS = 128, //!< block data in blk*.dat was received with a witness-enforcing client
- /**
- * If ASSUMED_VALID is set, it means that this block has not been validated
- * and has validity status less than VALID_SCRIPTS. Also that it may have
- * descendant blocks with VALID_SCRIPTS set, because they can be validated
- * based on an assumeutxo snapshot.
- *
- * When an assumeutxo snapshot is loaded, the ASSUMED_VALID flag is added to
- * unvalidated blocks at the snapshot height and below. Then, as the background
- * validation progresses, and these blocks are validated, the ASSUMED_VALID
- * flags are removed. See `doc/design/assumeutxo.md` for details.
- *
- * This flag is only used to implement checks in CheckBlockIndex() and
- * should not be used elsewhere.
- */
- BLOCK_ASSUMED_VALID = 256,
+ BLOCK_STATUS_RESERVED = 256, //!< Unused flag that was previously set on assumeutxo snapshot blocks and their
+ //!< ancestors before they were validated, and unset when they were validated.
};
/** The block chain is a tree shaped structure starting with the
@@ -173,21 +164,16 @@ public:
//! (memory only) Total amount of work (expected number of hashes) in the chain up to and including this block
arith_uint256 nChainWork{};
- //! Number of transactions in this block.
+ //! Number of transactions in this block. This will be nonzero if the block
+ //! reached the VALID_TRANSACTIONS level, and zero otherwise.
//! Note: in a potential headers-first mode, this number cannot be relied upon
- //! Note: this value is faked during UTXO snapshot load to ensure that
- //! LoadBlockIndex() will load index entries for blocks that we lack data for.
- //! @sa ActivateSnapshot
unsigned int nTx{0};
//! (memory only) Number of transactions in the chain up to and including this block.
- //! This value will be non-zero only if and only if transactions for this block and all its parents are available.
+ //! This value will be non-zero if this block and all previous blocks back
+ //! to the genesis block or an assumeutxo snapshot block have reached the
+ //! VALID_TRANSACTIONS level.
//! Change to 64-bit type before 2024 (assuming worst case of 60 byte transactions).
- //!
- //! Note: this value is faked during use of a UTXO snapshot because we don't
- //! have the underlying block data available during snapshot load.
- //! @sa AssumeutxoData
- //! @sa ActivateSnapshot
unsigned int nChainTx{0};
//! Verification status of this block. See enum BlockStatus
@@ -262,15 +248,14 @@ public:
}
/**
- * Check whether this block's and all previous blocks' transactions have been
- * downloaded (and stored to disk) at some point.
+ * Check whether this block and all previous blocks back to the genesis block or an assumeutxo snapshot block have
+ * reached VALID_TRANSACTIONS and had transactions downloaded (and stored to disk) at some point.
*
* Does not imply the transactions are consensus-valid (ConnectTip might fail)
* Does not imply the transactions are still stored on disk. (IsBlockPruned might return true)
*
- * Note that this will be true for the snapshot base block, if one is loaded (and
- * all subsequent assumed-valid blocks) since its nChainTx value will have been set
- * manually based on the related AssumeutxoData entry.
+ * Note that this will be true for the snapshot base block, if one is loaded, since its nChainTx value will have
+ * been set manually based on the related AssumeutxoData entry.
*/
bool HaveNumChainTxs() const { return nChainTx != 0; }
@@ -318,14 +303,6 @@ public:
return ((nStatus & BLOCK_VALID_MASK) >= nUpTo);
}
- //! @returns true if the block is assumed-valid; this means it is queued to be
- //! validated by a background chainstate.
- bool IsAssumedValid() const EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
- {
- AssertLockHeld(::cs_main);
- return nStatus & BLOCK_ASSUMED_VALID;
- }
-
//! Raise the validity level of this block index entry.
//! Returns true if the validity was changed.
bool RaiseValidity(enum BlockStatus nUpTo) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
@@ -335,12 +312,6 @@ public:
if (nStatus & BLOCK_FAILED_MASK) return false;
if ((nStatus & BLOCK_VALID_MASK) < nUpTo) {
- // If this block had been marked assumed-valid and we're raising
- // its validity to a certain point, there is no longer an assumption.
- if (nStatus & BLOCK_ASSUMED_VALID && nUpTo >= BLOCK_VALID_SCRIPTS) {
- nStatus &= ~BLOCK_ASSUMED_VALID;
- }
-
nStatus = (nStatus & ~BLOCK_VALID_MASK) | nUpTo;
return true;
}
diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h
index dca6028c63..554d0cae5a 100644
--- a/src/chainparamsseeds.h
+++ b/src/chainparamsseeds.h
@@ -7,983 +7,1783 @@
* Each line contains a BIP155 serialized (networkID, addr, port) tuple.
*/
static const uint8_t chainparams_seed_main[] = {
- 0x01,0x04,0x01,0x41,0xc3,0x62,0x20,0x8d,
- 0x01,0x04,0x02,0x3b,0xec,0x38,0x20,0x8d,
- 0x01,0x04,0x02,0x53,0x72,0x14,0x20,0x8d,
- 0x01,0x04,0x02,0xf8,0xc2,0x10,0x20,0x8d,
- 0x01,0x04,0x05,0x02,0x9a,0x06,0x20,0x8d,
- 0x01,0x04,0x05,0x65,0x8c,0x1e,0x20,0x8d,
+ 0x01,0x04,0x01,0xfd,0x9f,0x13,0x20,0x8d,
+ 0x01,0x04,0x02,0x98,0x4a,0xd3,0x20,0x8d,
+ 0x01,0x04,0x05,0x02,0x17,0xe2,0x20,0x8d,
0x01,0x04,0x05,0x80,0x57,0x7e,0x20,0x8d,
- 0x01,0x04,0x05,0x90,0x15,0x31,0x20,0x8d,
- 0x01,0x04,0x05,0xac,0x84,0x68,0x20,0x8d,
+ 0x01,0x04,0x05,0x9d,0x67,0xca,0x20,0x8d,
0x01,0x04,0x05,0xbc,0x3e,0x12,0x20,0x8d,
- 0x01,0x04,0x05,0xc8,0x02,0xb4,0x20,0x8d,
+ 0x01,0x04,0x05,0xfd,0x12,0xda,0x20,0x8d,
+ 0x01,0x04,0x05,0xff,0x6d,0xa0,0x20,0x8d,
0x01,0x04,0x08,0x81,0xb8,0xff,0x20,0x8d,
- 0x01,0x04,0x08,0xd1,0x69,0x8a,0x20,0x8d,
+ 0x01,0x04,0x08,0xd1,0x46,0x4d,0x20,0x8d,
+ 0x01,0x04,0x08,0xd2,0x12,0x38,0x20,0x8d,
0x01,0x04,0x0c,0x22,0x62,0x94,0x20,0x8d,
- 0x01,0x04,0x0e,0xc7,0x66,0x97,0x20,0x8d,
0x01,0x04,0x12,0x1b,0x4f,0x11,0x20,0x8d,
- 0x01,0x04,0x12,0x1b,0x7c,0xe7,0x20,0x8d,
- 0x01,0x04,0x12,0xd8,0xf9,0x97,0x20,0x8d,
- 0x01,0x04,0x17,0x58,0x9b,0x3a,0x20,0x8d,
- 0x01,0x04,0x17,0x5d,0x65,0x9e,0x20,0x8d,
- 0x01,0x04,0x17,0x6d,0x9c,0x4c,0x20,0x8d,
- 0x01,0x04,0x17,0xaf,0x00,0xdc,0x20,0x8d,
+ 0x01,0x04,0x17,0x5d,0xaa,0x76,0x20,0x8d,
+ 0x01,0x04,0x17,0x9a,0x88,0x90,0x20,0x8d,
+ 0x01,0x04,0x17,0xaf,0x00,0xd4,0x20,0x8d,
0x01,0x04,0x17,0xaf,0x00,0xde,0x20,0x8d,
- 0x01,0x04,0x18,0xe8,0x24,0xe1,0x20,0x8d,
+ 0x01,0x04,0x18,0x54,0xa4,0x32,0x20,0x8d,
+ 0x01,0x04,0x18,0x56,0x5a,0x7f,0x20,0x8d,
+ 0x01,0x04,0x18,0x65,0x7e,0xc2,0x20,0x8d,
+ 0x01,0x04,0x18,0xb7,0x4b,0x9a,0x20,0x8d,
0x01,0x04,0x1b,0x7c,0x6c,0x13,0x20,0x8d,
0x01,0x04,0x1b,0x94,0xce,0x8c,0x20,0x8d,
- 0x01,0x04,0x1f,0x07,0x46,0xc3,0x20,0x8d,
0x01,0x04,0x1f,0x19,0x62,0x10,0x20,0x8d,
0x01,0x04,0x1f,0x29,0x17,0xf9,0x20,0x8d,
- 0x01,0x04,0x1f,0x2f,0x66,0x5c,0x20,0x8d,
0x01,0x04,0x1f,0x2f,0xca,0x70,0x20,0x8d,
- 0x01,0x04,0x1f,0xa5,0x4e,0x92,0x20,0x8d,
- 0x01,0x04,0x1f,0xa5,0xe4,0x8a,0x20,0x8d,
- 0x01,0x04,0x22,0x40,0x65,0x04,0x20,0x8d,
- 0x01,0x04,0x22,0x69,0x13,0x61,0x20,0x8d,
- 0x01,0x04,0x22,0x7e,0x6b,0xb3,0x20,0x8d,
- 0x01,0x04,0x22,0x7e,0x73,0x23,0x20,0x8d,
- 0x01,0x04,0x23,0xf5,0xba,0x75,0x20,0x8d,
+ 0x01,0x04,0x1f,0x9c,0x80,0xf8,0x20,0x8d,
+ 0x01,0x04,0x1f,0xa4,0xa0,0xa2,0x20,0x8d,
+ 0x01,0x04,0x1f,0xc9,0xbe,0x86,0x20,0x8d,
+ 0x01,0x04,0x1f,0xd0,0x22,0x3d,0x20,0x8d,
+ 0x01,0x04,0x22,0x4e,0x0e,0x19,0x20,0x8d,
+ 0x01,0x04,0x22,0x50,0x86,0x44,0x20,0x8d,
+ 0x01,0x04,0x23,0x89,0x85,0xe1,0x20,0x8d,
+ 0x01,0x04,0x23,0xc1,0xc0,0x30,0x20,0x8d,
+ 0x01,0x04,0x23,0xc2,0x27,0xfa,0x20,0x8d,
0x01,0x04,0x25,0x0f,0x3c,0x90,0x20,0x8d,
- 0x01,0x04,0x25,0x10,0x69,0x3f,0x20,0x8d,
- 0x01,0x04,0x25,0x78,0x9b,0x22,0x20,0x8d,
+ 0x01,0x04,0x25,0x3c,0xe4,0xfb,0x20,0x8d,
+ 0x01,0x04,0x25,0x3c,0xe5,0x75,0x20,0x8d,
+ 0x01,0x04,0x25,0x6e,0x84,0x5e,0x20,0x8d,
0x01,0x04,0x25,0x78,0xb3,0x1d,0x20,0x8d,
0x01,0x04,0x25,0x8b,0x66,0x49,0x20,0x8d,
- 0x01,0x04,0x25,0xc1,0xe3,0x10,0x20,0x8d,
+ 0x01,0x04,0x25,0x9d,0xc0,0x5e,0x20,0x8d,
0x01,0x04,0x25,0xdc,0x87,0x97,0x20,0x8d,
- 0x01,0x04,0x26,0x35,0x81,0x43,0x20,0x8d,
+ 0x01,0x04,0x26,0x09,0x51,0xa0,0x20,0x8d,
+ 0x01,0x04,0x26,0x15,0xdd,0xfc,0x20,0x8d,
0x01,0x04,0x26,0x36,0x0e,0x59,0x20,0x8d,
- 0x01,0x04,0x26,0x8d,0x86,0x8c,0x20,0x8d,
- 0x01,0x04,0x26,0x91,0x97,0x96,0x20,0x8d,
- 0x01,0x04,0x29,0x48,0x9a,0x42,0x20,0x8d,
- 0x01,0x04,0x2b,0x8f,0xcb,0xc6,0x20,0x8d,
- 0x01,0x04,0x2d,0x0f,0x7c,0x75,0x20,0x8d,
- 0x01,0x04,0x2d,0x2b,0x61,0x67,0x20,0x8d,
- 0x01,0x04,0x2d,0x2c,0xd5,0x74,0x20,0x8d,
- 0x01,0x04,0x2d,0x3a,0xbb,0x65,0x20,0x8d,
- 0x01,0x04,0x2d,0x4f,0xc0,0xec,0x20,0x8d,
- 0x01,0x04,0x2d,0x51,0xf1,0x61,0x20,0x8d,
- 0x01,0x04,0x2d,0x53,0xdc,0x66,0x20,0x8d,
- 0x01,0x04,0x2d,0x53,0xf1,0x2e,0x20,0x8d,
- 0x01,0x04,0x2d,0x57,0x6a,0x39,0x20,0x8d,
- 0x01,0x04,0x2d,0x81,0x26,0x05,0x20,0x8d,
- 0x01,0x04,0x2d,0x82,0x14,0xb1,0x20,0x8d,
- 0x01,0x04,0x2d,0x86,0x8e,0x28,0x20,0x8d,
- 0x01,0x04,0x2d,0x87,0x04,0x8f,0x20,0x8d,
- 0x01,0x04,0x2d,0x87,0x5c,0x7f,0x20,0x8d,
- 0x01,0x04,0x2d,0x91,0xbc,0x70,0x20,0x8d,
- 0x01,0x04,0x2e,0x17,0x57,0xda,0x20,0x8d,
- 0x01,0x04,0x2e,0x20,0x32,0x62,0x20,0x8d,
- 0x01,0x04,0x2e,0x20,0x4e,0x11,0x20,0x8d,
- 0x01,0x04,0x2e,0x3b,0x28,0x5b,0x20,0x8d,
- 0x01,0x04,0x2e,0x8a,0xf6,0x4d,0x20,0x8d,
+ 0x01,0x04,0x26,0x5b,0x6a,0x6f,0x20,0x8d,
+ 0x01,0x04,0x26,0x66,0x55,0x24,0x20,0x8d,
+ 0x01,0x04,0x2a,0x02,0xa2,0xda,0x20,0x8d,
+ 0x01,0x04,0x2b,0x81,0x4b,0x14,0x20,0x8d,
+ 0x01,0x04,0x2b,0x9f,0x3d,0x10,0x20,0x8d,
+ 0x01,0x04,0x2b,0xe1,0x3e,0x6b,0x20,0x8d,
+ 0x01,0x04,0x2b,0xf5,0xc4,0xd6,0x20,0x8d,
+ 0x01,0x04,0x2d,0x0d,0x07,0xdd,0x20,0x8d,
+ 0x01,0x04,0x2d,0x2c,0xd5,0x7b,0x20,0x8d,
+ 0x01,0x04,0x2d,0x30,0x4b,0xe0,0x20,0x8d,
+ 0x01,0x04,0x2d,0x4f,0x4c,0x0c,0x20,0x8d,
+ 0x01,0x04,0x2d,0x5e,0xd1,0x7f,0x20,0x8d,
+ 0x01,0x04,0x2d,0x82,0x17,0x39,0x20,0x8d,
+ 0x01,0x04,0x2d,0x84,0x76,0x19,0x20,0x8d,
+ 0x01,0x04,0x2d,0x90,0xf9,0xcf,0x20,0x8d,
+ 0x01,0x04,0x2d,0x91,0x28,0x2b,0x20,0x8d,
+ 0x01,0x04,0x2d,0x9b,0xa9,0x1e,0x20,0x8d,
+ 0x01,0x04,0x2e,0x11,0x63,0x0d,0x20,0x8d,
+ 0x01,0x04,0x2e,0x11,0x63,0x1a,0x20,0x8d,
+ 0x01,0x04,0x2e,0x15,0xfa,0x19,0x20,0x8d,
+ 0x01,0x04,0x2e,0x1c,0xcc,0xa1,0x20,0x8d,
+ 0x01,0x04,0x2e,0x80,0xc7,0x1a,0x20,0x8d,
+ 0x01,0x04,0x2e,0xa4,0x3b,0x8b,0x20,0x8d,
0x01,0x04,0x2e,0xa6,0x8e,0x02,0x20,0x8d,
- 0x01,0x04,0x2e,0xa6,0xa2,0x3b,0x20,0x8d,
- 0x01,0x04,0x2e,0xaf,0xb2,0x03,0x20,0x8d,
- 0x01,0x04,0x2e,0xbc,0x0f,0x06,0x20,0x8d,
- 0x01,0x04,0x2e,0xbc,0x1e,0x76,0x20,0x8d,
- 0x01,0x04,0x2e,0xdf,0xdf,0xd8,0x20,0x8d,
- 0x01,0x04,0x2e,0xe2,0x12,0x87,0x20,0x8d,
- 0x01,0x04,0x2f,0x58,0x56,0x4f,0x20,0x8d,
- 0x01,0x04,0x2f,0x94,0x07,0x45,0x20,0x8d,
- 0x01,0x04,0x2f,0xc6,0xdf,0x3c,0x20,0x8d,
- 0x01,0x04,0x32,0x02,0x0d,0xa4,0x20,0x8d,
- 0x01,0x04,0x32,0x04,0x87,0x54,0x20,0x8d,
- 0x01,0x04,0x32,0x35,0x27,0xed,0x20,0x8d,
+ 0x01,0x04,0x2e,0xac,0xe9,0xf1,0x20,0x8d,
+ 0x01,0x04,0x2e,0xfc,0x05,0x70,0x20,0x8d,
+ 0x01,0x04,0x2f,0x1c,0x55,0x47,0x20,0x8d,
+ 0x01,0x04,0x2f,0xb0,0xf8,0xfa,0x20,0x8d,
+ 0x01,0x04,0x2f,0xc6,0x3c,0xb4,0x20,0x8d,
+ 0x01,0x04,0x32,0x1b,0x16,0x8d,0x20,0x8d,
+ 0x01,0x04,0x32,0x27,0xaa,0x95,0x20,0x8d,
0x01,0x04,0x32,0x35,0xfa,0xa2,0x20,0x8d,
- 0x01,0x04,0x32,0x44,0x79,0x2c,0x20,0x8d,
- 0x01,0x04,0x32,0x75,0x84,0xb2,0x20,0x8d,
0x01,0x04,0x33,0x9a,0x3e,0x67,0x20,0x8d,
0x01,0x04,0x33,0x9e,0x96,0x9b,0x20,0x8d,
- 0x01,0x04,0x33,0xfa,0x2e,0xd7,0x20,0x8d,
- 0x01,0x04,0x36,0xb0,0x3f,0x10,0x20,0x8d,
- 0x01,0x04,0x3a,0x9e,0x00,0x56,0x20,0x8d,
+ 0x01,0x04,0x33,0xae,0xce,0x4c,0x20,0x8d,
+ 0x01,0x04,0x36,0xd9,0x88,0x7a,0x20,0x8d,
+ 0x01,0x04,0x36,0xfd,0x0f,0x21,0x20,0x8d,
+ 0x01,0x04,0x39,0x80,0x60,0x73,0x20,0x8d,
+ 0x01,0x04,0x39,0x80,0x94,0xa9,0x20,0x8d,
+ 0x01,0x04,0x3a,0x06,0x2e,0xab,0x20,0x8d,
+ 0x01,0x04,0x3a,0x60,0x4d,0x72,0x20,0x8d,
+ 0x01,0x04,0x3a,0x60,0x7b,0x78,0x20,0x8d,
+ 0x01,0x04,0x3a,0xa8,0xfd,0x23,0x20,0x8d,
+ 0x01,0x04,0x3b,0xa7,0xbf,0x3c,0x20,0x8d,
0x01,0x04,0x3c,0xcd,0xcd,0x77,0x20,0x8d,
+ 0x01,0x04,0x3c,0xd4,0xbd,0x97,0x20,0x8d,
0x01,0x04,0x3d,0x4a,0x63,0xc1,0x20,0x8d,
- 0x01,0x04,0x3d,0x5c,0x3b,0x68,0x20,0x8d,
- 0x01,0x04,0x3e,0x7a,0xad,0xab,0x20,0x8d,
+ 0x01,0x04,0x3e,0x18,0x4c,0x7a,0x20,0x8d,
+ 0x01,0x04,0x3e,0x6a,0x46,0xf9,0x20,0x8d,
+ 0x01,0x04,0x3e,0xa8,0x41,0x2a,0x20,0x8d,
0x01,0x04,0x3e,0xab,0x81,0x20,0x20,0x8d,
- 0x01,0x04,0x3e,0xb2,0x1b,0xef,0x20,0x8d,
- 0x01,0x04,0x3e,0xd1,0xd2,0x03,0x20,0x8d,
- 0x01,0x04,0x3e,0xd7,0x7f,0x49,0x20,0x8d,
- 0x01,0x04,0x3e,0xee,0x94,0x68,0x20,0x8d,
- 0x01,0x04,0x3e,0xf5,0x99,0x08,0x20,0x8d,
- 0x01,0x04,0x40,0x92,0x88,0x2d,0x20,0x8d,
- 0x01,0x04,0x41,0x15,0x86,0xb8,0x20,0x8d,
- 0x01,0x04,0x42,0x12,0x0d,0x92,0x20,0x8d,
- 0x01,0x04,0x42,0x17,0xe9,0x2b,0x20,0x8d,
- 0x01,0x04,0x42,0x1b,0x62,0xd8,0x20,0x8d,
- 0x01,0x04,0x42,0x1d,0x81,0xda,0x20,0x8d,
- 0x01,0x04,0x42,0x26,0x5e,0x0d,0x20,0x8d,
+ 0x01,0x04,0x3e,0xf5,0x4b,0x46,0x20,0x8d,
+ 0x01,0x04,0x3e,0xf8,0x08,0xa7,0x20,0x8d,
+ 0x01,0x04,0x40,0x17,0x96,0xd3,0x20,0x8d,
+ 0x01,0x04,0x40,0x62,0x77,0x88,0x20,0x8d,
+ 0x01,0x04,0x41,0x18,0x4b,0x22,0x20,0x8d,
+ 0x01,0x04,0x41,0xaf,0xb9,0x65,0x20,0x8d,
0x01,0x04,0x42,0x2d,0x8d,0x2e,0x20,0x8d,
- 0x01,0x04,0x42,0x3a,0xf3,0xd7,0x20,0x8d,
- 0x01,0x04,0x42,0x72,0x21,0x31,0x20,0x8d,
- 0x01,0x04,0x42,0xc6,0xd3,0xa7,0x20,0x8d,
- 0x01,0x04,0x42,0xd0,0x40,0x80,0x20,0x8d,
- 0x01,0x04,0x42,0xdb,0xc4,0xaa,0x20,0x8d,
+ 0x01,0x04,0x42,0x3a,0xa3,0xb9,0x20,0x8d,
+ 0x01,0x04,0x42,0x55,0x85,0xb6,0x20,0x8d,
+ 0x01,0x04,0x42,0xce,0x16,0x1a,0x20,0x8d,
+ 0x01,0x04,0x43,0x28,0x66,0x21,0x20,0x8d,
+ 0x01,0x04,0x43,0x2b,0xd2,0x3e,0x20,0x8d,
+ 0x01,0x04,0x43,0x52,0x88,0xb1,0x20,0x8d,
+ 0x01,0x04,0x43,0xc1,0x57,0x32,0x20,0x8d,
0x01,0x04,0x43,0xd2,0xe4,0xcb,0x20,0x8d,
- 0x01,0x04,0x44,0xb7,0x4b,0xfb,0x20,0x8d,
- 0x01,0x04,0x44,0xc2,0x7d,0x8c,0x20,0x8d,
- 0x01,0x04,0x44,0xc7,0x78,0x11,0x20,0x8d,
+ 0x01,0x04,0x43,0xd3,0xd3,0x76,0x20,0x8d,
+ 0x01,0x04,0x43,0xe7,0xf6,0x3a,0x20,0x8d,
+ 0x01,0x04,0x44,0x06,0x54,0xde,0x20,0x8d,
+ 0x01,0x04,0x44,0x30,0x88,0xd8,0x20,0x8d,
+ 0x01,0x04,0x44,0x45,0xaa,0x5c,0x20,0x8d,
0x01,0x04,0x45,0x04,0x5e,0xe2,0x20,0x8d,
0x01,0x04,0x45,0x08,0xaf,0xc9,0x20,0x8d,
- 0x01,0x04,0x45,0x3b,0x12,0x16,0x20,0x8d,
+ 0x01,0x04,0x45,0x39,0xa0,0x31,0x20,0x8d,
+ 0x01,0x04,0x45,0x70,0x67,0x7c,0x20,0x8d,
0x01,0x04,0x45,0xc4,0x98,0x21,0x20,0x8d,
- 0x01,0x04,0x45,0xe4,0xdb,0x7c,0x20,0x8d,
- 0x01,0x04,0x46,0x40,0x1b,0x0c,0x20,0x8d,
- 0x01,0x04,0x46,0xa0,0xf0,0x84,0x20,0x8d,
- 0x01,0x04,0x47,0x4f,0x6d,0x80,0x20,0x8d,
- 0x01,0x04,0x47,0xb8,0xc1,0x4b,0x20,0x8d,
- 0x01,0x04,0x48,0x0f,0x3b,0xad,0x20,0x8d,
- 0x01,0x04,0x48,0x30,0xfd,0xa8,0x20,0x8d,
- 0x01,0x04,0x48,0xcf,0xab,0xd2,0x20,0x8d,
- 0x01,0x04,0x49,0x75,0x84,0x8a,0x20,0x8d,
- 0x01,0x04,0x49,0xd4,0xe2,0x3b,0x20,0x8d,
- 0x01,0x04,0x4a,0x4c,0x97,0x6e,0x20,0x8d,
- 0x01,0x04,0x4a,0x5b,0x73,0xe5,0x20,0x8d,
+ 0x01,0x04,0x47,0x13,0x94,0xb4,0x20,0x8d,
+ 0x01,0x04,0x49,0xe3,0x99,0xd5,0x20,0x8d,
+ 0x01,0x04,0x4a,0x32,0x51,0x5d,0x20,0x8d,
+ 0x01,0x04,0x4a,0x65,0xcd,0xd6,0x20,0x8d,
0x01,0x04,0x4a,0x76,0x89,0x77,0x20,0x8d,
0x01,0x04,0x4a,0xd5,0xaf,0x6c,0x20,0x8d,
0x01,0x04,0x4a,0xd5,0xfb,0xef,0x20,0x8d,
0x01,0x04,0x4a,0xdc,0xff,0xbe,0x20,0x8d,
- 0x01,0x04,0x4a,0xdd,0xbd,0x6d,0x20,0x8d,
- 0x01,0x04,0x4b,0x53,0xcb,0xe1,0x20,0x8d,
- 0x01,0x04,0x4b,0xac,0x34,0xba,0x20,0x8d,
- 0x01,0x04,0x4c,0x18,0x8f,0x16,0x20,0x8d,
- 0x01,0x04,0x4c,0x45,0xca,0xf7,0x20,0x8d,
- 0x01,0x04,0x4c,0x49,0xc6,0xf2,0x20,0x8d,
- 0x01,0x04,0x4c,0x77,0xf8,0xf0,0x20,0x8d,
0x01,0x04,0x4d,0x14,0x30,0x90,0x20,0x8d,
- 0x01,0x04,0x4d,0x16,0x98,0xef,0x20,0x8d,
- 0x01,0x04,0x4d,0x25,0xe0,0xde,0x20,0x8d,
- 0x01,0x04,0x4d,0x30,0xc4,0xea,0x20,0x8d,
- 0x01,0x04,0x4d,0x46,0x10,0xf5,0x20,0x8d,
+ 0x01,0x04,0x4d,0x15,0x95,0xa0,0x20,0x8d,
+ 0x01,0x04,0x4d,0x25,0xf0,0xd1,0x20,0x8d,
+ 0x01,0x04,0x4d,0x2b,0x0e,0x44,0x20,0x8d,
+ 0x01,0x04,0x4d,0x6f,0x39,0x6d,0x20,0x8d,
0x01,0x04,0x4d,0xa2,0xbe,0x5a,0x20,0x8d,
- 0x01,0x04,0x4e,0x14,0xe3,0xf9,0x20,0x8d,
- 0x01,0x04,0x4e,0x15,0xa7,0x08,0x20,0x8d,
+ 0x01,0x04,0x4d,0xad,0x84,0x8c,0x20,0x8d,
+ 0x01,0x04,0x4d,0xca,0x0a,0xdc,0x20,0x8d,
+ 0x01,0x04,0x4e,0x1b,0x8b,0x0d,0x20,0x8d,
+ 0x01,0x04,0x4e,0x1f,0x47,0xbe,0x20,0x8d,
0x01,0x04,0x4e,0x23,0x93,0xcb,0x20,0x8d,
- 0x01,0x04,0x4e,0x6c,0x6c,0x19,0x20,0x8d,
- 0x01,0x04,0x4e,0x9a,0xed,0x3c,0x20,0x8d,
- 0x01,0x04,0x4f,0x0b,0x1f,0x4c,0x20,0x8d,
- 0x01,0x04,0x4f,0x57,0x58,0xeb,0x20,0x8d,
- 0x01,0x04,0x4f,0x65,0x01,0x19,0x20,0x8d,
- 0x01,0x04,0x4f,0x7c,0x07,0xf1,0x20,0x8d,
+ 0x01,0x04,0x4e,0x2a,0x90,0x18,0x20,0x8d,
+ 0x01,0x04,0x4e,0x2b,0x99,0xb9,0x20,0x8d,
+ 0x01,0x04,0x4e,0x38,0x59,0x92,0x20,0x8d,
+ 0x01,0x04,0x4e,0x46,0xd0,0x35,0x20,0x8d,
+ 0x01,0x04,0x4f,0x6d,0x78,0x26,0x20,0x8d,
+ 0x01,0x04,0x4f,0x74,0x38,0x59,0x20,0x8d,
0x01,0x04,0x4f,0x7c,0x07,0xfd,0x20,0x8d,
- 0x01,0x04,0x4f,0x96,0x44,0x2a,0x20,0x8d,
- 0x01,0x04,0x4f,0xf9,0x0a,0x35,0x20,0x8d,
- 0x01,0x04,0x50,0x52,0x15,0x4d,0x20,0x8d,
- 0x01,0x04,0x50,0x52,0x4c,0x3b,0x20,0x8d,
- 0x01,0x04,0x50,0x58,0xac,0xe3,0x20,0x8d,
- 0x01,0x04,0x50,0x5d,0xd5,0xf6,0x20,0x8d,
- 0x01,0x04,0x50,0x6f,0x8e,0xd5,0x20,0x8d,
- 0x01,0x04,0x50,0xd0,0xe3,0x86,0x20,0x8d,
- 0x01,0x04,0x50,0xd0,0xe4,0x09,0x20,0x8d,
- 0x01,0x04,0x50,0xd1,0x40,0x56,0x20,0x8d,
+ 0x01,0x04,0x4f,0x88,0xfa,0xa2,0x20,0x8d,
+ 0x01,0x04,0x50,0x53,0xba,0x19,0x20,0x8d,
+ 0x01,0x04,0x50,0x62,0x4b,0xf8,0x20,0x8d,
0x01,0x04,0x50,0xe5,0x1c,0x3c,0x20,0x8d,
- 0x01,0x04,0x51,0x07,0x10,0xb6,0x20,0x8d,
+ 0x01,0x04,0x50,0xf4,0x1a,0xc0,0x20,0x8d,
+ 0x01,0x04,0x51,0x04,0x6e,0xa8,0x20,0x8d,
+ 0x01,0x04,0x51,0x07,0x11,0xca,0x20,0x8d,
0x01,0x04,0x51,0x13,0x0a,0x02,0x20,0x8d,
- 0x01,0x04,0x51,0xa2,0xc4,0x2b,0x20,0x8d,
+ 0x01,0x04,0x51,0x53,0xd6,0x86,0x20,0x8d,
+ 0x01,0x04,0x51,0xaa,0x8e,0x64,0x20,0x8d,
0x01,0x04,0x51,0xab,0x16,0x8f,0x20,0x8d,
- 0x01,0x04,0x51,0xac,0xdd,0x04,0x20,0x8d,
- 0x01,0x04,0x51,0xe0,0x2c,0xa4,0x20,0x8d,
- 0x01,0x04,0x51,0xf5,0x60,0x24,0x20,0x8d,
- 0x01,0x04,0x52,0x01,0x44,0x36,0x20,0x8d,
+ 0x01,0x04,0x51,0xf2,0xef,0x8b,0x20,0x8d,
0x01,0x04,0x52,0x42,0x0a,0x0b,0x20,0x8d,
- 0x01,0x04,0x52,0x42,0xd3,0x1f,0x20,0x8d,
- 0x01,0x04,0x52,0x47,0x04,0x9a,0x20,0x8d,
+ 0x01,0x04,0x52,0x42,0xcc,0xb1,0x20,0x8d,
0x01,0x04,0x52,0x60,0x60,0x28,0x20,0x8d,
- 0x01,0x04,0x52,0x74,0x32,0x65,0x20,0x8d,
- 0x01,0x04,0x52,0x88,0x62,0xf9,0x20,0x8d,
- 0x01,0x04,0x52,0xc3,0xed,0xfd,0x20,0x8d,
- 0x01,0x04,0x53,0x89,0x29,0x0a,0x20,0x8d,
- 0x01,0x04,0x53,0xab,0xaf,0x05,0x20,0x8d,
+ 0x01,0x04,0x52,0x95,0xe1,0xf9,0x20,0x8d,
+ 0x01,0x04,0x52,0x9b,0x94,0xd3,0x20,0x8d,
+ 0x01,0x04,0x52,0xb5,0xda,0x85,0x20,0x8d,
+ 0x01,0x04,0x53,0x63,0xf7,0x19,0x20,0x8d,
+ 0x01,0x04,0x53,0x88,0xe8,0x15,0x20,0x8d,
+ 0x01,0x04,0x53,0xc0,0xe2,0x42,0x20,0x8d,
0x01,0x04,0x53,0xd0,0xc1,0xf2,0x20,0x8d,
- 0x01,0x04,0x53,0xe9,0x4c,0xa5,0x20,0x8d,
- 0x01,0x04,0x53,0xf0,0x59,0xc4,0x20,0x8d,
- 0x01,0x04,0x54,0x26,0x03,0xf9,0x20,0x8d,
- 0x01,0x04,0x54,0x36,0x17,0x30,0x20,0x8d,
- 0x01,0x04,0x54,0x7e,0xd8,0x4d,0x20,0x8d,
+ 0x01,0x04,0x53,0xf0,0x76,0xc4,0x20,0x8d,
+ 0x01,0x04,0x54,0x07,0xdb,0x82,0x20,0x8d,
+ 0x01,0x04,0x54,0x34,0x40,0x52,0x20,0x8d,
+ 0x01,0x04,0x54,0x40,0x63,0x4e,0x20,0x8d,
+ 0x01,0x04,0x54,0x70,0x3c,0x10,0x20,0x8d,
+ 0x01,0x04,0x54,0x71,0x81,0xc3,0x20,0x8d,
0x01,0x04,0x54,0xd3,0xbb,0xd3,0x20,0x8d,
- 0x01,0x04,0x54,0xf6,0xc8,0x7a,0x20,0x8d,
- 0x01,0x04,0x54,0xff,0xf4,0x3d,0x20,0x8d,
- 0x01,0x04,0x55,0xa5,0x2a,0x73,0x20,0x8d,
- 0x01,0x04,0x55,0xc2,0xee,0x86,0x20,0x8d,
- 0x01,0x04,0x55,0xd0,0x45,0x15,0x20,0x8d,
- 0x01,0x04,0x55,0xd0,0x47,0x24,0x20,0x8d,
- 0x01,0x04,0x55,0xd1,0xf0,0x5b,0x20,0x8d,
+ 0x01,0x04,0x54,0xd9,0x86,0xd5,0x20,0x8d,
+ 0x01,0x04,0x54,0xf7,0x80,0x0f,0x20,0x8d,
+ 0x01,0x04,0x54,0xf7,0x84,0x1b,0x20,0x8d,
+ 0x01,0x04,0x54,0xf7,0xad,0x75,0x20,0x8d,
+ 0x01,0x04,0x54,0xf7,0xb3,0x33,0x20,0x8d,
+ 0x01,0x04,0x54,0xff,0xf5,0xc2,0x20,0x8d,
+ 0x01,0x04,0x55,0x91,0x4f,0x1a,0x20,0x8d,
+ 0x01,0x04,0x55,0xad,0xa5,0x42,0x20,0x8d,
+ 0x01,0x04,0x55,0xc3,0xc4,0x56,0x20,0x8d,
0x01,0x04,0x55,0xd6,0x76,0x47,0x20,0x8d,
- 0x01,0x04,0x55,0xd6,0xa1,0xfc,0x20,0x8d,
- 0x01,0x04,0x55,0xec,0xbe,0xfc,0x20,0x8d,
- 0x01,0x04,0x55,0xf3,0x73,0x88,0x20,0x8d,
0x01,0x04,0x56,0x16,0x14,0x0d,0x20,0x8d,
- 0x01,0x04,0x56,0x31,0x22,0x5c,0x20,0x8d,
- 0x01,0x04,0x56,0x5f,0x08,0xf9,0x20,0x8d,
- 0x01,0x04,0x56,0x68,0xe4,0x0a,0x20,0x8d,
- 0x01,0x04,0x56,0x68,0xe4,0x17,0x20,0x8d,
+ 0x01,0x04,0x56,0x2d,0xee,0x73,0x20,0x8d,
+ 0x01,0x04,0x56,0xb6,0xdf,0xbd,0x20,0x8d,
+ 0x01,0x04,0x56,0xd7,0xa8,0x73,0x20,0x8d,
0x01,0x04,0x57,0x4f,0x5e,0xdd,0x20,0x8d,
- 0x01,0x04,0x58,0x0a,0x59,0x17,0x20,0x8d,
+ 0x01,0x04,0x57,0x5a,0x5e,0x78,0x20,0x8d,
+ 0x01,0x04,0x57,0x5c,0xab,0x35,0x20,0x8d,
+ 0x01,0x04,0x57,0xec,0xc3,0xc6,0x20,0x8d,
+ 0x01,0x04,0x57,0xec,0xc7,0xc5,0x20,0x8d,
+ 0x01,0x04,0x58,0x06,0x1f,0x42,0x20,0x8d,
+ 0x01,0x04,0x58,0x09,0x49,0xfc,0x20,0x8d,
0x01,0x04,0x58,0x54,0xdf,0x1e,0x20,0x8d,
- 0x01,0x04,0x58,0x56,0x7d,0x32,0x20,0x8d,
- 0x01,0x04,0x58,0x5a,0x4d,0x64,0x20,0x8d,
- 0x01,0x04,0x58,0x61,0x28,0x32,0x20,0x8d,
- 0x01,0x04,0x58,0x89,0x6d,0x3e,0x20,0x8d,
- 0x01,0x04,0x58,0x93,0xf4,0xfa,0x20,0x8d,
- 0x01,0x04,0x58,0xd0,0x73,0x46,0x20,0x8d,
- 0x01,0x04,0x58,0xd4,0x35,0xf6,0x20,0x8d,
- 0x01,0x04,0x59,0x23,0x8e,0xa8,0x20,0x8d,
- 0x01,0x04,0x59,0x4e,0x6f,0xc5,0x20,0x8d,
- 0x01,0x04,0x59,0x75,0x3b,0x81,0x20,0x8d,
- 0x01,0x04,0x59,0x93,0x6c,0xc8,0x20,0x8d,
- 0x01,0x04,0x59,0xa3,0x84,0xb4,0x20,0x8d,
+ 0x01,0x04,0x58,0x92,0x72,0xad,0x20,0x8d,
+ 0x01,0x04,0x59,0x23,0x8e,0xb1,0x20,0x8d,
+ 0x01,0x04,0x59,0x2c,0x29,0x8e,0x20,0x8d,
+ 0x01,0x04,0x59,0x74,0x19,0xea,0x20,0x8d,
+ 0x01,0x04,0x59,0x75,0x3a,0x71,0x20,0x8d,
+ 0x01,0x04,0x59,0x75,0xac,0x79,0x20,0x8d,
0x01,0x04,0x59,0xa5,0xe8,0xf2,0x20,0x8d,
- 0x01,0x04,0x59,0xd8,0x15,0x60,0x20,0x8d,
- 0x01,0x04,0x5a,0x32,0xac,0xb6,0x20,0x8d,
- 0x01,0x04,0x5a,0x92,0x82,0xd6,0x20,0x8d,
- 0x01,0x04,0x5a,0x92,0xd0,0xa2,0x20,0x8d,
+ 0x01,0x04,0x59,0xbe,0x8e,0x38,0x20,0x8d,
+ 0x01,0x04,0x59,0xd8,0x5b,0x78,0x20,0x8d,
+ 0x01,0x04,0x59,0xf7,0xe0,0x1c,0x20,0x8d,
+ 0x01,0x04,0x5a,0x92,0xcf,0x43,0x20,0x8d,
0x01,0x04,0x5a,0x9c,0x1a,0x94,0x20,0x8d,
- 0x01,0x04,0x5a,0xa3,0xac,0x8b,0x20,0x8d,
- 0x01,0x04,0x5a,0xb1,0xa3,0x4d,0x20,0x8d,
- 0x01,0x04,0x5b,0x43,0x91,0x6e,0x20,0x8d,
- 0x01,0x04,0x5b,0x5d,0xc2,0x9a,0x20,0x8d,
+ 0x01,0x04,0x5a,0xa3,0xac,0x4e,0x20,0x8d,
+ 0x01,0x04,0x5a,0xc0,0x76,0xca,0x20,0x8d,
+ 0x01,0x04,0x5a,0xd0,0x9f,0x0b,0x20,0x8d,
+ 0x01,0x04,0x5a,0xf7,0x46,0x1f,0x20,0x8d,
+ 0x01,0x04,0x5b,0x56,0x19,0xcf,0x20,0x8d,
0x01,0x04,0x5b,0x7b,0xb6,0xa4,0x20,0x8d,
0x01,0x04,0x5b,0x7b,0xb7,0xdb,0x20,0x8d,
+ 0x01,0x04,0x5b,0x86,0x91,0xca,0x20,0x8d,
0x01,0x04,0x5b,0x87,0x00,0xbb,0x20,0x8d,
- 0x01,0x04,0x5b,0x93,0xe8,0x62,0x20,0x8d,
- 0x01,0x04,0x5b,0xb8,0xa8,0xf9,0x20,0x8d,
- 0x01,0x04,0x5b,0xc1,0xed,0x74,0x20,0x8d,
- 0x01,0x04,0x5b,0xc7,0x29,0x2d,0x20,0x8d,
+ 0x01,0x04,0x5b,0x98,0x7a,0x24,0x20,0x8d,
+ 0x01,0x04,0x5b,0xb8,0xae,0xbf,0x20,0x8d,
0x01,0x04,0x5b,0xcc,0x95,0x05,0x20,0x8d,
+ 0x01,0x04,0x5b,0xce,0x11,0xc3,0x20,0x8d,
+ 0x01,0x04,0x5b,0xd1,0x33,0x83,0x20,0x8d,
0x01,0x04,0x5b,0xd7,0x5b,0xfe,0x20,0x8d,
- 0x01,0x04,0x5b,0xdb,0x19,0xe8,0x20,0x8d,
+ 0x01,0x04,0x5b,0xe7,0xb6,0x35,0x20,0x8d,
+ 0x01,0x04,0x5b,0xec,0xfb,0x89,0x20,0x8d,
+ 0x01,0x04,0x5b,0xec,0xfb,0x8b,0x20,0x8d,
0x01,0x04,0x5b,0xed,0x58,0xda,0x20,0x8d,
0x01,0x04,0x5c,0x1b,0x96,0x2e,0x20,0x8d,
0x01,0x04,0x5c,0x1b,0x96,0x2f,0x20,0x8d,
- 0x01,0x04,0x5c,0xdd,0x14,0xe8,0x20,0x8d,
- 0x01,0x04,0x5c,0xdd,0x7e,0x41,0x20,0x8d,
- 0x01,0x04,0x5d,0x21,0xc0,0xcc,0x20,0x8d,
- 0x01,0x04,0x5d,0x29,0xed,0x4e,0x20,0x8d,
- 0x01,0x04,0x5d,0x5f,0x58,0x0d,0x20,0x8d,
- 0x01,0x04,0x5d,0x5f,0xe3,0x7d,0x20,0x8d,
+ 0x01,0x04,0x5c,0x2a,0x6e,0xdb,0x20,0x8d,
+ 0x01,0x04,0x5c,0x2b,0xbb,0x22,0x20,0x8d,
+ 0x01,0x04,0x5c,0xce,0x69,0x1f,0x20,0x8d,
+ 0x01,0x04,0x5c,0xe9,0x02,0x3b,0x20,0x8d,
+ 0x01,0x04,0x5c,0xf0,0xb5,0x2d,0x20,0x8d,
+ 0x01,0x04,0x5d,0x33,0x0d,0x78,0x20,0x8d,
+ 0x01,0x04,0x5d,0x39,0x51,0xa2,0x20,0x8d,
+ 0x01,0x04,0x5d,0x47,0x13,0x82,0x20,0x8d,
+ 0x01,0x04,0x5d,0x51,0xfe,0x9f,0x20,0x8d,
+ 0x01,0x04,0x5d,0x5a,0x52,0xe3,0x20,0x8d,
+ 0x01,0x04,0x5d,0x64,0x23,0xbd,0x20,0x8d,
0x01,0x04,0x5d,0x67,0x0d,0x01,0x20,0x8d,
- 0x01,0x04,0x5d,0x73,0x56,0xef,0x20,0x8d,
0x01,0x04,0x5d,0x7b,0xb4,0xa4,0x20,0x8d,
- 0x01,0x04,0x5d,0xba,0xc9,0xad,0x20,0x8d,
- 0x01,0x04,0x5d,0xbe,0x75,0x1a,0x20,0x8d,
+ 0x01,0x04,0x5d,0xb1,0xbc,0x4a,0x20,0x8d,
+ 0x01,0x04,0x5d,0xbc,0x66,0x35,0x20,0x8d,
0x01,0x04,0x5e,0x13,0x07,0x37,0x20,0x8d,
- 0x01,0x04,0x5e,0x17,0x15,0x50,0x20,0x8d,
- 0x01,0x04,0x5e,0x17,0xcd,0x6e,0x20,0x8d,
- 0x01,0x04,0x5e,0x83,0x00,0x49,0x20,0x8d,
- 0x01,0x04,0x5e,0x8e,0xed,0x04,0x20,0x8d,
- 0x01,0x04,0x5e,0x9a,0x9f,0x63,0x20,0x8d,
- 0x01,0x04,0x5e,0xca,0x32,0xc8,0x20,0x8d,
+ 0x01,0x04,0x5e,0x3f,0x4b,0x4a,0x20,0x8d,
+ 0x01,0x04,0x5e,0x48,0x8d,0x3d,0x20,0x8d,
+ 0x01,0x04,0x5e,0x48,0x8f,0x2f,0x20,0x8d,
+ 0x01,0x04,0x5e,0x69,0x35,0x7c,0x20,0x8d,
+ 0x01,0x04,0x5e,0xb5,0x2e,0x6a,0x20,0x8d,
0x01,0x04,0x5e,0xe7,0xfd,0x12,0x20,0x8d,
0x01,0x04,0x5f,0x2a,0x8c,0x8e,0x20,0x8d,
- 0x01,0x04,0x5f,0x43,0x12,0x64,0x20,0x8d,
- 0x01,0x04,0x5f,0x46,0xee,0xb0,0x20,0x8d,
- 0x01,0x04,0x5f,0x53,0x49,0x1f,0x20,0x8d,
- 0x01,0x04,0x5f,0x5a,0x80,0x03,0x20,0x8d,
+ 0x01,0x04,0x5f,0x52,0x82,0xdf,0x20,0x8d,
+ 0x01,0x04,0x5f,0x58,0x3d,0xb0,0x20,0x8d,
+ 0x01,0x04,0x5f,0x69,0xac,0xab,0x20,0x8d,
0x01,0x04,0x5f,0x6e,0xea,0x5d,0x20,0x8d,
- 0x01,0x04,0x5f,0xa1,0x0c,0x2d,0x20,0x8d,
- 0x01,0x04,0x5f,0xac,0x3e,0xa7,0x20,0x8d,
- 0x01,0x04,0x5f,0xb3,0x80,0x57,0x20,0x8d,
+ 0x01,0x04,0x5f,0xa4,0xb6,0x2c,0x20,0x8d,
0x01,0x04,0x5f,0xbf,0x82,0x64,0x20,0x8d,
- 0x01,0x04,0x5f,0xd6,0x35,0x9a,0x20,0x8d,
0x01,0x04,0x60,0x03,0x35,0xfe,0x20,0x8d,
- 0x01,0x04,0x61,0x4b,0x91,0x0c,0x20,0x8d,
- 0x01,0x04,0x61,0x51,0xc6,0xb4,0x20,0x8d,
- 0x01,0x04,0x61,0x57,0xd8,0x6e,0x20,0x8d,
- 0x01,0x04,0x63,0xe5,0xd2,0x6f,0x20,0x8d,
+ 0x01,0x04,0x61,0x4b,0x90,0x09,0x20,0x8d,
+ 0x01,0x04,0x62,0x11,0x5f,0x5d,0x20,0x8d,
+ 0x01,0x04,0x62,0x80,0xe6,0xba,0x20,0x8d,
+ 0x01,0x04,0x62,0xa3,0xf2,0x95,0x20,0x8d,
+ 0x01,0x04,0x62,0xe5,0x7e,0x17,0x20,0x8d,
+ 0x01,0x04,0x63,0xe9,0x14,0xd7,0x20,0x8d,
0x01,0x04,0x63,0xf6,0x57,0x02,0x20,0x8d,
- 0x01,0x04,0x65,0x2b,0x7c,0xc3,0x20,0x8d,
- 0x01,0x04,0x66,0x84,0xc0,0x8d,0x20,0x8d,
- 0x01,0x04,0x67,0x15,0x03,0x59,0x20,0x8d,
- 0x01,0x04,0x67,0x23,0x79,0x48,0x20,0x8d,
- 0x01,0x04,0x67,0x63,0xa8,0x64,0x20,0x8d,
- 0x01,0x04,0x67,0x63,0xa8,0x8c,0x20,0x8d,
+ 0x01,0x04,0x65,0x33,0x8a,0xc2,0x20,0x8d,
+ 0x01,0x04,0x66,0x82,0x71,0x5e,0x20,0x8d,
0x01,0x04,0x67,0x63,0xaa,0xd2,0x20,0x8d,
0x01,0x04,0x67,0x63,0xaa,0xdc,0x20,0x8d,
- 0x01,0x04,0x67,0x69,0xca,0x32,0x20,0x8d,
- 0x01,0x04,0x68,0xee,0xdc,0xc7,0x20,0x8d,
- 0x01,0x04,0x68,0xf3,0x21,0xa5,0x20,0x8d,
+ 0x01,0x04,0x67,0x9c,0xa5,0xab,0x20,0x8d,
+ 0x01,0x04,0x67,0xdb,0xa9,0x31,0x20,0x8d,
+ 0x01,0x04,0x68,0xab,0xca,0xf4,0x20,0x8d,
+ 0x01,0x04,0x68,0xe1,0xdc,0x21,0x20,0x8d,
0x01,0x04,0x68,0xf4,0x49,0x06,0x20,0x8d,
- 0x01,0x04,0x6c,0x1a,0x7d,0xd6,0x20,0x8d,
+ 0x01,0x04,0x68,0xf4,0x4f,0x83,0x20,0x8d,
+ 0x01,0x04,0x6c,0x31,0x41,0x84,0x20,0x8d,
0x01,0x04,0x6d,0x56,0x3c,0x21,0x20,0x8d,
+ 0x01,0x04,0x6d,0x5b,0x8d,0x91,0x20,0x8d,
0x01,0x04,0x6d,0x63,0x3f,0x9f,0x20,0x8d,
0x01,0x04,0x6d,0x78,0xc2,0x88,0x20,0x8d,
- 0x01,0x04,0x6d,0x7b,0xe9,0x8a,0x20,0x8d,
- 0x01,0x04,0x6d,0x7b,0xf0,0x35,0x20,0x8d,
- 0x01,0x04,0x6d,0x99,0x5e,0x23,0x20,0x8d,
- 0x01,0x04,0x6d,0xad,0x7e,0x9d,0x20,0x8d,
- 0x01,0x04,0x6d,0xc1,0x4c,0xc8,0x20,0x8d,
- 0x01,0x04,0x6d,0xdd,0xe5,0xc5,0x20,0x8d,
- 0x01,0x04,0x6d,0xec,0x5a,0x75,0x20,0x8d,
- 0x01,0x04,0x6d,0xf8,0xce,0x0d,0x20,0x8d,
- 0x01,0x04,0x6f,0x5a,0x8c,0x17,0x20,0x8d,
+ 0x01,0x04,0x6d,0xc4,0x7c,0xb6,0x20,0x8d,
+ 0x01,0x04,0x6d,0xc9,0xa8,0x20,0x20,0x8d,
+ 0x01,0x04,0x6d,0xe0,0x54,0x95,0x20,0x8d,
0x01,0x04,0x6f,0x5a,0x8c,0x2e,0x20,0x8d,
- 0x01,0x04,0x6f,0x5a,0x91,0x25,0x20,0x8d,
- 0x01,0x04,0x72,0xad,0x9f,0xd1,0x20,0x8d,
+ 0x01,0x04,0x70,0x8b,0x0a,0x19,0x20,0x8d,
+ 0x01,0x04,0x72,0x22,0x82,0xce,0x20,0x8d,
0x01,0x04,0x74,0x3a,0xab,0x43,0x20,0x8d,
+ 0x01,0x04,0x74,0x56,0xc3,0xc0,0x20,0x8d,
0x01,0x04,0x77,0x1f,0xb3,0xca,0x20,0x8d,
0x01,0x04,0x77,0x2a,0x37,0xcb,0x20,0x8d,
- 0x01,0x04,0x7a,0xde,0xa0,0xbe,0x20,0x8d,
+ 0x01,0x04,0x78,0xe2,0x27,0x64,0x20,0x8d,
+ 0x01,0x04,0x78,0xe2,0x27,0x67,0x20,0x8d,
+ 0x01,0x04,0x79,0x06,0x45,0x49,0x20,0x8d,
+ 0x01,0x04,0x79,0x63,0xf0,0x57,0x20,0x8d,
+ 0x01,0x04,0x7a,0x94,0x93,0x88,0x20,0x8d,
+ 0x01,0x04,0x7a,0xc7,0x28,0x15,0x20,0x8d,
0x01,0x04,0x7b,0x3c,0xd5,0xc0,0x20,0x8d,
+ 0x01,0x04,0x7b,0xca,0xc1,0x79,0x20,0x8d,
+ 0x01,0x04,0x7c,0xaa,0xb6,0xc2,0x20,0x8d,
0x01,0x04,0x7c,0xc5,0x36,0x71,0x20,0x8d,
- 0x01,0x04,0x7d,0xa8,0x8c,0x6c,0x20,0x8d,
+ 0x01,0x04,0x7d,0xa8,0x6e,0x1c,0x20,0x8d,
+ 0x01,0x04,0x7d,0xe3,0xb2,0x44,0x20,0x8d,
0x01,0x04,0x80,0x00,0xbe,0x1a,0x20,0x8d,
- 0x01,0x04,0x80,0x41,0xc2,0x88,0x20,0x8d,
- 0x01,0x04,0x81,0x0d,0xbd,0xd4,0x20,0x8d,
0x01,0x04,0x81,0x0d,0xbd,0xd7,0x20,0x8d,
- 0x01,0x04,0x81,0xe2,0xd8,0x94,0x20,0x8d,
- 0x01,0x04,0x83,0xbc,0x28,0xbf,0x20,0x8d,
- 0x01,0x04,0x86,0x41,0x09,0x3f,0x20,0x8d,
- 0x01,0x04,0x86,0x7a,0xc8,0xa0,0x20,0x8d,
- 0x01,0x04,0x86,0xc3,0xb9,0x34,0x20,0x8d,
+ 0x01,0x04,0x82,0x2c,0xb0,0x6f,0x20,0x8d,
+ 0x01,0x04,0x82,0xcc,0xa1,0x03,0x20,0x8d,
+ 0x01,0x04,0x83,0x99,0xe8,0x8b,0x20,0x8d,
+ 0x01,0x04,0x83,0xbc,0x28,0x2f,0x20,0x8d,
+ 0x01,0x04,0x86,0x41,0xc1,0x95,0x20,0x8d,
+ 0x01,0x04,0x87,0x13,0x29,0xd0,0x20,0x8d,
0x01,0x04,0x87,0x13,0xfd,0x65,0x20,0x8d,
- 0x01,0x04,0x88,0x1d,0x6d,0x3a,0x20,0x8d,
- 0x01,0x04,0x88,0x20,0xee,0x06,0x20,0x8d,
- 0x01,0x04,0x88,0x31,0xc9,0x18,0x20,0x8d,
+ 0x01,0x04,0x87,0x17,0xcc,0x62,0x20,0x8d,
+ 0x01,0x04,0x87,0xb5,0xd7,0xed,0x20,0x8d,
+ 0x01,0x04,0x88,0x37,0x2e,0x0f,0x20,0x8d,
+ 0x01,0x04,0x88,0x3e,0x3a,0xe0,0x20,0x8d,
+ 0x01,0x04,0x88,0xaf,0x08,0xaf,0x20,0x8d,
+ 0x01,0x04,0x88,0xf4,0x13,0x7e,0x20,0x8d,
0x01,0x04,0x89,0xe2,0x22,0x2e,0x20,0x8d,
- 0x01,0x04,0x8a,0xcf,0xd3,0xbd,0x20,0x8d,
- 0x01,0x04,0x8b,0x82,0x29,0x52,0x20,0x8d,
+ 0x01,0x04,0x8a,0x3b,0x14,0xd1,0x20,0x8d,
+ 0x01,0x04,0x8b,0x3b,0x46,0xa3,0x20,0x8d,
0x01,0x04,0x8c,0xee,0xdc,0x63,0x20,0x8d,
+ 0x01,0x04,0x8d,0xc1,0x44,0x0b,0x20,0x8d,
0x01,0x04,0x8e,0x36,0xb5,0xda,0x20,0x8d,
- 0x01,0x04,0x8e,0xa6,0x13,0x17,0x20,0x8d,
- 0x01,0x04,0x8e,0xfe,0x57,0x73,0x20,0x8d,
- 0x01,0x04,0x8f,0xb1,0xe5,0x95,0x20,0x8d,
- 0x01,0x04,0x90,0x02,0x65,0x15,0x20,0x8d,
+ 0x01,0x04,0x8e,0x73,0x8c,0x02,0x20,0x8d,
+ 0x01,0x04,0x8e,0xbc,0x7d,0xc8,0x20,0x8d,
+ 0x01,0x04,0x8f,0x6e,0xfc,0x7c,0x20,0x8d,
0x01,0x04,0x90,0x18,0xec,0x40,0x20,0x8d,
- 0x01,0x04,0x91,0x28,0x33,0x34,0x20,0x8d,
+ 0x01,0x04,0x90,0x89,0x1d,0xb5,0x20,0x8d,
0x01,0x04,0x92,0x47,0x45,0x67,0x20,0x8d,
- 0x01,0x04,0x92,0x78,0xf1,0xad,0x20,0x8d,
- 0x01,0x04,0x93,0x32,0xee,0x35,0x20,0x8d,
- 0x01,0x04,0x94,0x67,0x65,0x84,0x20,0x8d,
- 0x01,0x04,0x95,0x4b,0x30,0x5c,0x20,0x8d,
+ 0x01,0x04,0x95,0x1c,0x9f,0x8d,0x20,0x8d,
+ 0x01,0x04,0x95,0x8f,0x20,0x1a,0x20,0x8d,
+ 0x01,0x04,0x95,0xca,0x4f,0xc7,0x20,0x8d,
+ 0x01,0x04,0x95,0xf8,0x01,0xfe,0x20,0x8d,
+ 0x01,0x04,0x97,0xf8,0xdd,0xc5,0x20,0x8d,
0x01,0x04,0x98,0x2c,0x89,0x53,0x20,0x8d,
- 0x01,0x04,0x9a,0x00,0x03,0xc2,0x20,0x8d,
+ 0x01,0x04,0x98,0xe6,0xb4,0x73,0x20,0x8d,
0x01,0x04,0x9a,0x1a,0x89,0x69,0x20,0x8d,
- 0x01,0x04,0x9a,0x1a,0x9a,0x49,0x20,0x8d,
- 0x01,0x04,0x9a,0x39,0x05,0x0b,0x20,0x8d,
- 0x01,0x04,0x9b,0x04,0x37,0x15,0x20,0x8d,
- 0x01,0x04,0x9c,0x92,0x89,0x8e,0x20,0x8d,
- 0x01,0x04,0x9c,0x92,0xb1,0xdd,0x20,0x8d,
- 0x01,0x04,0x9d,0x16,0x48,0xaf,0x20,0x8d,
- 0x01,0x04,0x9d,0x61,0x00,0x76,0x20,0x8d,
- 0x01,0x04,0x9e,0x8c,0x8d,0x45,0x20,0x8d,
- 0x01,0x04,0x9e,0xb5,0x84,0x54,0x20,0x8d,
- 0x01,0x04,0x9f,0x02,0xd7,0x62,0x20,0x8d,
- 0x01,0x04,0x9f,0xc4,0x03,0xef,0x20,0x8d,
- 0x01,0x04,0x9f,0xe0,0xbd,0xfa,0x20,0x8d,
- 0x01,0x04,0xa0,0x50,0x0c,0x10,0x20,0x8d,
- 0x01,0x04,0xa1,0xe6,0x26,0xa0,0x20,0x8d,
- 0x01,0x04,0xa1,0xf6,0x0b,0xe6,0x20,0x8d,
- 0x01,0x04,0xa2,0x00,0xd2,0x98,0x20,0x8d,
- 0x01,0x04,0xa2,0x3e,0x12,0xe2,0x20,0x8d,
- 0x01,0x04,0xa2,0xfe,0x76,0x14,0x20,0x8d,
- 0x01,0x04,0xa3,0x9e,0xa8,0xb5,0x20,0x8d,
- 0x01,0x04,0xa5,0xad,0x13,0x21,0x20,0x8d,
- 0x01,0x04,0xa5,0xe4,0xae,0x75,0x20,0x8d,
+ 0x01,0x04,0x9a,0x5c,0x6f,0x64,0x20,0x8d,
+ 0x01,0x04,0x9d,0x83,0x14,0xae,0x20,0x8d,
+ 0x01,0x04,0x9e,0x81,0x8c,0xc9,0x20,0x8d,
+ 0x01,0x04,0x9e,0xb5,0x72,0xc4,0x20,0x8d,
+ 0x01,0x04,0x9e,0xdc,0x55,0x52,0x20,0x8d,
+ 0x01,0x04,0x9e,0xdc,0x79,0x5d,0x20,0x8d,
+ 0x01,0x04,0x9f,0x02,0xbf,0xaf,0x20,0x8d,
+ 0x01,0x04,0x9f,0xe0,0xee,0x91,0x20,0x8d,
+ 0x01,0x04,0xa1,0x61,0xa7,0x0a,0x20,0x8d,
+ 0x01,0x04,0xa2,0xd5,0x77,0x0c,0x20,0x8d,
+ 0x01,0x04,0xa2,0xe2,0x3d,0x08,0x20,0x8d,
+ 0x01,0x04,0xa2,0xfe,0xab,0xd1,0x20,0x8d,
+ 0x01,0x04,0xa3,0x72,0x9f,0xcd,0x20,0x8d,
+ 0x01,0x04,0xa3,0xac,0x54,0x86,0x20,0x8d,
0x01,0x04,0xa5,0xff,0xf1,0xb8,0x20,0x8d,
- 0x01,0x04,0xa7,0x58,0x0b,0xcb,0x20,0x8d,
0x01,0x04,0xa7,0xb3,0x93,0x9b,0x20,0x8d,
+ 0x01,0x04,0xa9,0x96,0xce,0xce,0x20,0x8d,
0x01,0x04,0xaa,0x11,0x97,0xeb,0x20,0x8d,
- 0x01,0x04,0xaa,0x40,0xae,0xe6,0x20,0x8d,
+ 0x01,0x04,0xaa,0xfe,0x93,0x74,0x20,0x8d,
0x01,0x04,0xac,0x5c,0x66,0x73,0x20,0x8d,
0x01,0x04,0xac,0x69,0x15,0xd8,0x20,0x8d,
- 0x01,0x04,0xac,0x6f,0xb0,0xf4,0x20,0x8d,
- 0x01,0x04,0xac,0xff,0x62,0x6c,0x20,0x8d,
- 0x01,0x04,0xad,0x52,0x05,0xca,0x20,0x8d,
+ 0x01,0x04,0xac,0xdb,0xe5,0xfc,0x20,0x8d,
+ 0x01,0x04,0xac,0xfb,0x65,0x1b,0x20,0x8d,
+ 0x01,0x04,0xad,0x0c,0x77,0x85,0x20,0x8d,
+ 0x01,0x04,0xad,0x13,0xb0,0xe4,0x20,0x8d,
0x01,0x04,0xad,0xb5,0x23,0x32,0x20,0x8d,
- 0x01,0x04,0xad,0xd4,0xfd,0x89,0x20,0x8d,
- 0x01,0x04,0xad,0xeb,0x49,0x57,0x20,0x8d,
- 0x01,0x04,0xae,0x1e,0x1d,0x55,0x20,0x8d,
- 0x01,0x04,0xae,0x8d,0xd1,0x28,0x20,0x8d,
+ 0x01,0x04,0xad,0xd4,0x62,0x00,0x20,0x8d,
+ 0x01,0x04,0xad,0xf1,0xe3,0xf3,0x20,0x8d,
+ 0x01,0x04,0xad,0xf6,0x1f,0x72,0x20,0x8d,
+ 0x01,0x04,0xae,0x14,0x39,0x1e,0x20,0x8d,
+ 0x01,0x04,0xaf,0x1b,0xf7,0x68,0x20,0x8d,
+ 0x01,0x04,0xaf,0x88,0xae,0xae,0x20,0x8d,
0x01,0x04,0xb0,0x09,0x11,0x79,0x20,0x8d,
- 0x01,0x04,0xb0,0x0c,0x10,0x87,0x20,0x8d,
+ 0x01,0x04,0xb0,0x25,0x52,0x53,0x20,0x8d,
0x01,0x04,0xb0,0x4a,0x88,0xed,0x20,0x8d,
- 0x01,0x04,0xb0,0x4a,0x8b,0x78,0x20,0x8d,
- 0x01,0x04,0xb0,0x7a,0x7a,0x86,0x20,0x8d,
- 0x01,0x04,0xb0,0x7e,0xa7,0x0a,0x20,0x8d,
- 0x01,0x04,0xb0,0x97,0xf4,0x82,0x20,0x8d,
- 0x01,0x04,0xb0,0xba,0x13,0x6a,0x20,0x8d,
- 0x01,0x04,0xb0,0xd4,0xb9,0x99,0x20,0x8d,
- 0x01,0x04,0xb1,0x8e,0x92,0xc1,0x20,0x8d,
+ 0x01,0x04,0xb0,0x76,0xdc,0x1d,0x20,0x8d,
+ 0x01,0x04,0xb0,0x8a,0xe9,0xa6,0x20,0x8d,
+ 0x01,0x04,0xb1,0x20,0x32,0xa7,0x20,0x8d,
0x01,0x04,0xb2,0x15,0x76,0xb2,0x20,0x8d,
- 0x01,0x04,0xb2,0x3d,0x8d,0xc6,0x20,0x8d,
- 0x01,0x04,0xb2,0x7c,0xa2,0xd1,0x20,0x8d,
- 0x01,0x04,0xb2,0x8f,0x19,0xc2,0x20,0x8d,
- 0x01,0x04,0xb2,0x9a,0xe9,0xc5,0x20,0x8d,
+ 0x01,0x04,0xb2,0x29,0x0b,0xfe,0x20,0x8d,
+ 0x01,0x04,0xb2,0x4f,0x53,0x93,0x20,0x8d,
+ 0x01,0x04,0xb2,0x58,0xbd,0xfe,0x20,0x8d,
+ 0x01,0x04,0xb2,0x9a,0xde,0x68,0x20,0x8d,
0x01,0x04,0xb2,0x9f,0x62,0x85,0x20,0x8d,
- 0x01,0x04,0xb2,0xe8,0xba,0xbf,0x20,0x8d,
- 0x01,0x04,0xb2,0xec,0x89,0x3f,0x20,0x8d,
- 0x01,0x04,0xb3,0x3c,0x95,0x04,0x20,0x8d,
- 0x01,0x04,0xb8,0xa0,0x6e,0x68,0x20,0x8d,
- 0x01,0x04,0xb8,0xae,0x25,0x8b,0x20,0x8d,
- 0x01,0x04,0xb9,0x08,0x68,0xb3,0x20,0x8d,
- 0x01,0x04,0xb9,0x0e,0x1e,0x19,0x20,0x8d,
+ 0x01,0x04,0xb2,0xc6,0x17,0x78,0x20,0x8d,
+ 0x01,0x04,0xb2,0xfa,0xe8,0x6f,0x20,0x8d,
+ 0x01,0x04,0xb6,0xe5,0x91,0xa1,0x20,0x8d,
+ 0x01,0x04,0xb7,0x58,0xdf,0xd0,0x20,0x8d,
+ 0x01,0x04,0xb7,0x81,0xb2,0xcd,0x20,0x8d,
0x01,0x04,0xb9,0x19,0x30,0xb8,0x20,0x8d,
+ 0x01,0x04,0xb9,0x1a,0x63,0xab,0x20,0x8d,
+ 0x01,0x04,0xb9,0x1f,0x88,0xf6,0x20,0x8d,
0x01,0x04,0xb9,0x34,0x5d,0x2d,0x20,0x8d,
- 0x01,0x04,0xb9,0x40,0x74,0x0f,0x20,0x8d,
- 0x01,0x04,0xb9,0x45,0x69,0x75,0x20,0x8d,
- 0x01,0x04,0xb9,0x62,0x36,0x14,0x20,0x8d,
+ 0x01,0x04,0xb9,0x45,0x35,0x99,0x20,0x8d,
+ 0x01,0x04,0xb9,0x54,0xe0,0x74,0x20,0x8d,
0x01,0x04,0xb9,0x6b,0x53,0x37,0x20,0x8d,
- 0x01,0x04,0xb9,0x84,0x6d,0x7a,0x20,0x8d,
- 0x01,0x04,0xb9,0x87,0x51,0x32,0x20,0x8d,
- 0x01,0x04,0xb9,0x8c,0xfd,0xa9,0x20,0x8d,
+ 0x01,0x04,0xb9,0x74,0x5e,0xef,0x20,0x8d,
+ 0x01,0x04,0xb9,0x8c,0xd1,0x9f,0x20,0x8d,
0x01,0x04,0xb9,0x94,0x03,0xe3,0x20,0x8d,
- 0x01,0x04,0xb9,0x9a,0x02,0x03,0x20,0x8d,
- 0x01,0x04,0xb9,0xa2,0x5c,0x24,0x20,0x8d,
- 0x01,0x04,0xb9,0xa3,0x2c,0x24,0x20,0x8d,
+ 0x01,0x04,0xb9,0x98,0x8a,0x4a,0x20,0x8d,
+ 0x01,0x04,0xb9,0x99,0xc4,0x0e,0x20,0x8d,
+ 0x01,0x04,0xb9,0x99,0xc4,0xa2,0x20,0x8d,
+ 0x01,0x04,0xb9,0x9c,0x25,0x1e,0x20,0x8d,
+ 0x01,0x04,0xb9,0x9c,0x9a,0x81,0x20,0x8d,
+ 0x01,0x04,0xb9,0x9e,0x71,0xac,0x20,0x8d,
0x01,0x04,0xb9,0xa5,0xaa,0x13,0x20,0x8d,
- 0x01,0x04,0xb9,0xa7,0x71,0x3b,0x20,0x8d,
- 0x01,0x04,0xb9,0xb9,0x3b,0x0c,0x20,0x8d,
+ 0x01,0x04,0xb9,0xbe,0x18,0x48,0x20,0x8d,
+ 0x01,0x04,0xb9,0xc7,0xd1,0x34,0x20,0x8d,
0x01,0x04,0xb9,0xcb,0x29,0x94,0x20,0x8d,
0x01,0x04,0xb9,0xd1,0x0c,0x4c,0x20,0x8d,
- 0x01,0x04,0xb9,0xd1,0x46,0x11,0x20,0x8d,
0x01,0x04,0xb9,0xd2,0x7d,0x21,0x20,0x8d,
0x01,0x04,0xb9,0xe9,0xbd,0xd2,0x20,0x8d,
- 0x01,0x04,0xb9,0xee,0x83,0x13,0x20,0x8d,
- 0x01,0x04,0xb9,0xef,0xdc,0xd2,0x20,0x8d,
- 0x01,0x04,0xb9,0xef,0xdd,0x05,0x20,0x8d,
- 0x01,0x04,0xb9,0xfa,0x5a,0xf6,0x20,0x8d,
- 0x01,0x04,0xba,0xf9,0xd9,0x19,0x20,0x8d,
- 0x01,0x04,0xba,0xfa,0x5f,0x84,0x20,0x8d,
+ 0x01,0x04,0xb9,0xfa,0x24,0x42,0x20,0x8d,
+ 0x01,0x04,0xb9,0xfe,0x61,0xa4,0x20,0x8d,
+ 0x01,0x04,0xba,0xeb,0x56,0xf9,0x20,0x8d,
+ 0x01,0x04,0xbc,0x1b,0x4f,0xeb,0x20,0x8d,
0x01,0x04,0xbc,0x23,0xa7,0x0e,0x20,0x8d,
0x01,0x04,0xbc,0x44,0x35,0x2c,0x20,0x8d,
- 0x01,0x04,0xbc,0x78,0xff,0x73,0x20,0x8d,
- 0x01,0x04,0xbd,0x06,0xc3,0x6f,0x20,0x8d,
- 0x01,0x04,0xbe,0x02,0x82,0x2c,0x20,0x8d,
- 0x01,0x04,0xbe,0x0d,0x7a,0x59,0x20,0x8d,
- 0x01,0x04,0xbe,0x7b,0x1b,0x0b,0x20,0x8d,
- 0x01,0x04,0xbe,0x91,0x7f,0xfe,0x20,0x8d,
- 0x01,0x04,0xbf,0xdc,0x9c,0x40,0x20,0x8d,
- 0x01,0x04,0xc0,0x1f,0x88,0x5a,0x20,0x8d,
- 0x01,0x04,0xc0,0x45,0x35,0x2b,0x20,0x8d,
+ 0x01,0x04,0xbc,0x77,0x43,0x89,0x20,0x8d,
+ 0x01,0x04,0xbc,0x7f,0xf3,0x29,0x20,0x8d,
+ 0x01,0x04,0xbc,0x8a,0x70,0x3c,0x20,0x8d,
+ 0x01,0x04,0xbc,0x8e,0xc7,0x11,0x20,0x8d,
+ 0x01,0x04,0xbc,0x9b,0x48,0xa0,0x20,0x8d,
+ 0x01,0x04,0xbc,0xd6,0x81,0x34,0x20,0x8d,
+ 0x01,0x04,0xbc,0xd6,0x81,0x8b,0x20,0x8d,
+ 0x01,0x04,0xbc,0xd7,0x3e,0x7a,0x20,0x8d,
+ 0x01,0x04,0xbc,0xed,0xa7,0x33,0x20,0x8d,
+ 0x01,0x04,0xbc,0xf6,0xe0,0x0c,0x20,0x8d,
+ 0x01,0x04,0xbd,0x06,0xdd,0x25,0x20,0x8d,
+ 0x01,0x04,0xbe,0x02,0x92,0x5a,0x20,0x8d,
+ 0x01,0x04,0xbe,0x11,0x12,0xbe,0x20,0x8d,
+ 0x01,0x04,0xbe,0xd2,0x62,0xfd,0x20,0x8d,
+ 0x01,0x04,0xc0,0x03,0x0b,0x18,0x20,0x8d,
+ 0x01,0x04,0xc0,0x45,0x35,0x12,0x20,0x8d,
0x01,0x04,0xc0,0x92,0x89,0x2c,0x20,0x8d,
- 0x01,0x04,0xc0,0xae,0x79,0x21,0x20,0x8d,
- 0x01,0x04,0xc0,0xde,0x93,0xaf,0x20,0x8d,
- 0x01,0x04,0xc1,0xc6,0x22,0x18,0x20,0x8d,
- 0x01,0x04,0xc1,0xde,0x82,0x0e,0x20,0x8d,
- 0x01,0x04,0xc2,0x23,0xb9,0xa7,0x20,0x8d,
- 0x01,0x04,0xc2,0x36,0x53,0xea,0x20,0x8d,
- 0x01,0x04,0xc2,0xe9,0x54,0x64,0x20,0x8d,
- 0x01,0x04,0xc3,0x02,0x49,0x58,0x20,0x8d,
- 0x01,0x04,0xc3,0x30,0x0c,0x08,0x20,0x8d,
- 0x01,0x04,0xc3,0x9a,0xc8,0x9d,0x20,0x8d,
- 0x01,0x04,0xc5,0xd3,0x85,0x0f,0x20,0x8d,
- 0x01,0x04,0xc6,0x54,0x92,0x08,0x20,0x8d,
- 0x01,0x04,0xc6,0x62,0x37,0x56,0x20,0x8d,
- 0x01,0x04,0xc7,0xf7,0x07,0xd0,0x20,0x8d,
- 0x01,0x04,0xc8,0x74,0x9a,0x83,0x20,0x8d,
- 0x01,0x04,0xc9,0xbf,0x06,0x67,0x20,0x8d,
- 0x01,0x04,0xc9,0xdd,0xea,0xc8,0x20,0x8d,
- 0x01,0x04,0xca,0x2f,0xe1,0xf2,0x20,0x8d,
- 0x01,0x04,0xca,0x6b,0xdb,0x82,0x20,0x8d,
- 0x01,0x04,0xca,0x6c,0xd3,0x87,0x20,0x8d,
- 0x01,0x04,0xca,0x8a,0x0d,0x7a,0x20,0x8d,
- 0x01,0x04,0xcb,0x56,0xc3,0x20,0x20,0x8d,
- 0x01,0x04,0xcb,0xb8,0x34,0xf7,0x20,0x8d,
- 0x01,0x04,0xcc,0x6f,0xa3,0x72,0x20,0x8d,
- 0x01,0x04,0xcd,0xb2,0x29,0x7c,0x20,0x8d,
+ 0x01,0x04,0xc1,0x16,0x80,0x0c,0x20,0x8d,
+ 0x01,0x04,0xc1,0x27,0x8e,0x59,0x20,0x8d,
+ 0x01,0x04,0xc1,0x2e,0x4a,0xfc,0x20,0x8d,
+ 0x01,0x04,0xc1,0x2e,0x4a,0xfe,0x20,0x8d,
+ 0x01,0x04,0xc1,0x5f,0xf9,0x03,0x20,0x8d,
+ 0x01,0x04,0xc1,0x95,0xb0,0xc8,0x20,0x8d,
+ 0x01,0x04,0xc1,0x97,0x9b,0x7a,0x20,0x8d,
+ 0x01,0x04,0xc1,0xbb,0x5a,0x7a,0x20,0x8d,
+ 0x01,0x04,0xc1,0xc4,0x25,0x3e,0x20,0x8d,
+ 0x01,0x04,0xc2,0x23,0xb8,0x5f,0x20,0x8d,
+ 0x01,0x04,0xc2,0xa5,0x1e,0x14,0x20,0x8d,
+ 0x01,0x04,0xc2,0xbf,0xe8,0x99,0x20,0x8d,
+ 0x01,0x04,0xc3,0x20,0x6c,0xa4,0x20,0x8d,
+ 0x01,0x04,0xc3,0x38,0x3f,0x0b,0x20,0x8d,
+ 0x01,0x04,0xc3,0x38,0x3f,0x0c,0x20,0x8d,
+ 0x01,0x04,0xc3,0x7b,0xd9,0x3f,0x20,0x8d,
+ 0x01,0x04,0xc3,0x80,0xf8,0x99,0x20,0x8d,
+ 0x01,0x04,0xc3,0x8c,0xe2,0x9a,0x20,0x8d,
+ 0x01,0x04,0xc3,0xa0,0xde,0x51,0x20,0x8d,
+ 0x01,0x04,0xc3,0xce,0x69,0x07,0x20,0x8d,
+ 0x01,0x04,0xc7,0x24,0xfd,0xfc,0x20,0x8d,
+ 0x01,0x04,0xc7,0x3a,0x64,0x73,0x20,0x8d,
+ 0x01,0x04,0xca,0x5a,0xf2,0x5d,0x20,0x8d,
+ 0x01,0x04,0xca,0x70,0xee,0x80,0x20,0x8d,
+ 0x01,0x04,0xca,0xba,0x26,0x63,0x20,0x8d,
+ 0x01,0x04,0xcb,0x0c,0x00,0xa7,0x20,0x8d,
+ 0x01,0x04,0xcb,0x0c,0x0a,0xe0,0x20,0x8d,
+ 0x01,0x04,0xcb,0xd2,0xc1,0x15,0x20,0x8d,
+ 0x01,0x04,0xcc,0xe4,0x8e,0xd3,0x20,0x8d,
+ 0x01,0x04,0xcd,0xb2,0xb6,0x85,0x20,0x8d,
+ 0x01,0x04,0xce,0x37,0xb2,0x9d,0x20,0x8d,
0x01,0x04,0xce,0xc0,0xcb,0x00,0x20,0x8d,
- 0x01,0x04,0xcf,0xe5,0x2e,0x50,0x20,0x8d,
- 0x01,0x04,0xcf,0xf4,0xf8,0x51,0x20,0x8d,
+ 0x01,0x04,0xcf,0x62,0xfd,0x58,0x20,0x8d,
+ 0x01,0x04,0xcf,0x73,0x54,0x2f,0x20,0x8d,
0x01,0x04,0xcf,0xff,0xc1,0x2f,0x20,0x8d,
- 0x01,0x04,0xd0,0x3b,0x85,0x3f,0x20,0x8d,
- 0x01,0x04,0xd1,0x3a,0x91,0x9d,0x20,0x8d,
- 0x01,0x04,0xd1,0x61,0xbd,0xf9,0x20,0x8d,
- 0x01,0x04,0xd1,0xb1,0x8a,0xf5,0x20,0x8d,
+ 0x01,0x04,0xd0,0x68,0x5c,0x4a,0x20,0x8d,
+ 0x01,0x04,0xd1,0x26,0xf4,0x57,0x20,0x8d,
+ 0x01,0x04,0xd1,0xcc,0x1d,0x12,0x20,0x8d,
+ 0x01,0x04,0xd1,0xcd,0xcc,0xda,0x20,0x8d,
0x01,0x04,0xd1,0xed,0x85,0x36,0x20,0x8d,
- 0x01,0x04,0xd2,0x36,0x25,0xbe,0x20,0x8d,
- 0x01,0x04,0xd2,0x36,0x27,0xee,0x20,0x8d,
- 0x01,0x04,0xd4,0x22,0xe1,0x76,0x20,0x8d,
- 0x01,0x04,0xd4,0x29,0x09,0x1e,0x20,0x8d,
- 0x01,0x04,0xd4,0x33,0x84,0xb0,0x20,0x8d,
- 0x01,0x04,0xd4,0x45,0x3c,0x4d,0x20,0x8d,
+ 0x01,0x04,0xd2,0x06,0x5f,0x7f,0x20,0x8d,
+ 0x01,0x04,0xd2,0xcd,0x92,0x72,0x20,0x8d,
+ 0x01,0x04,0xd3,0xdd,0x2a,0x8f,0x20,0x8d,
+ 0x01,0x04,0xd4,0x05,0x9d,0x28,0x20,0x8d,
+ 0x01,0x04,0xd4,0x33,0x88,0x32,0x20,0x8d,
0x01,0x04,0xd4,0x56,0x20,0x6a,0x20,0x8d,
- 0x01,0x04,0xd5,0x2f,0x40,0x69,0x20,0x8d,
+ 0x01,0x04,0xd4,0xa2,0x98,0x95,0x20,0x8d,
+ 0x01,0x04,0xd4,0xe3,0x96,0x93,0x20,0x8d,
+ 0x01,0x04,0xd4,0xe3,0x9b,0xaa,0x20,0x8d,
+ 0x01,0x04,0xd4,0xfb,0xa2,0xbe,0x20,0x8d,
+ 0x01,0x04,0xd5,0x6d,0xec,0x81,0x20,0x8d,
0x01,0x04,0xd5,0x8d,0x9a,0xc9,0x20,0x8d,
- 0x01,0x04,0xd5,0x8e,0x94,0xa9,0x20,0x8d,
- 0x01,0x04,0xd5,0xb8,0xf4,0x18,0x20,0x8d,
- 0x01,0x04,0xd5,0xe3,0x93,0xf4,0x20,0x8d,
- 0x01,0x04,0xd5,0xfa,0x15,0x70,0x20,0x8d,
- 0x01,0x04,0xd8,0x92,0xfb,0x08,0x20,0x8d,
- 0x01,0x04,0xd8,0xe8,0x9d,0x68,0x20,0x8d,
- 0x01,0x04,0xd9,0x0f,0xb2,0x0b,0x20,0x8d,
- 0x01,0x04,0xd9,0x1a,0x20,0x0a,0x20,0x8d,
+ 0x01,0x04,0xd5,0xc1,0x53,0xfb,0x20,0x8d,
+ 0x01,0x04,0xd5,0xc1,0x53,0xfc,0x20,0x8d,
+ 0x01,0x04,0xd5,0xca,0xe1,0x7a,0x20,0x8d,
+ 0x01,0x04,0xd8,0x53,0x96,0x8e,0x20,0x8d,
+ 0x01,0x04,0xd8,0xba,0xec,0x62,0x20,0x8d,
+ 0x01,0x04,0xd8,0xe8,0x21,0x18,0x20,0x8d,
+ 0x01,0x04,0xd9,0x40,0x2f,0x8a,0x20,0x8d,
0x01,0x04,0xd9,0x40,0x2f,0xc8,0x20,0x8d,
- 0x01,0x04,0xd9,0x4c,0x33,0x19,0x20,0x8d,
+ 0x01,0x04,0xd9,0x4c,0x3d,0x4e,0x20,0x8d,
0x01,0x04,0xd9,0x5c,0x37,0xf6,0x20,0x8d,
+ 0x01,0x04,0xd9,0x71,0x79,0xa9,0x20,0x8d,
+ 0x01,0x04,0xd9,0x9b,0xf4,0xaa,0x20,0x8d,
0x01,0x04,0xd9,0xaa,0x7c,0xaa,0x20,0x8d,
+ 0x01,0x04,0xd9,0xad,0xec,0x19,0x20,0x8d,
+ 0x01,0x04,0xd9,0xb4,0xc0,0x74,0x20,0x8d,
0x01,0x04,0xd9,0xb4,0xdd,0xa2,0x20,0x8d,
- 0x01,0x04,0xd9,0xb4,0xee,0x89,0x20,0x8d,
- 0x01,0x04,0xdc,0x54,0xe8,0x2e,0x20,0x8d,
- 0x01,0x04,0xdc,0x85,0x27,0x3d,0x20,0x8d,
- 0x01,0x04,0xdc,0xe9,0x5b,0xb6,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x19,0xf0,0x10,0x00,0x1d,0xb3,0x54,0x00,0x04,0xff,0xfe,0x56,0x5a,0x8d,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x19,0xf0,0x00,0x05,0x24,0xda,0x3e,0xec,0xef,0xff,0xfe,0xb9,0xf3,0x6e,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x19,0xf0,0x00,0x05,0x24,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x19,0xf0,0x00,0x05,0x45,0x35,0x3e,0xec,0xef,0xff,0xfe,0xb9,0x87,0xe4,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x19,0xf0,0x00,0x05,0x45,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x01,0x04,0xda,0x2b,0x7b,0xec,0x20,0x8d,
+ 0x01,0x04,0xdb,0x4d,0x4f,0x80,0x20,0x8d,
+ 0x01,0x04,0xdf,0x12,0xde,0xd2,0x20,0x8d,
+ 0x01,0x04,0xdf,0xa7,0x4b,0xa5,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x16,0x20,0x55,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x2c,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x16,0x20,0x0a,0x21,0x00,0x00,0xda,0x5e,0xd3,0xff,0xfe,0xe3,0x68,0xa0,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0x44,0x01,0x0e,0x8a,0x54,0x00,0x04,0xff,0xfe,0x8e,0xd3,0x98,0x20,0x8d,
0x02,0x10,0x20,0x01,0x1b,0xc0,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x1c,0x04,0x40,0x08,0x63,0x00,0x8a,0x5f,0x26,0x78,0x11,0x4b,0xa6,0x60,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x02,0x03,0x37,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x02,0x03,0x8f,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x02,0x03,0xbb,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x02,0xbf,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x03,0x03,0xde,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x40,0x60,0x44,0x19,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x02,0x03,0x8f,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x03,0x0e,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
0x02,0x10,0x20,0x01,0x41,0xd0,0x04,0x03,0x3d,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x04,0x05,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x04,0x05,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x08,0x83,0xcf,0x19,0x5b,0xb2,0x02,0x92,0x71,0xcc,0x5b,0x20,0x8d,
0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x08,0xed,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x0a,0x69,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xf0,0x00,0x00,0x00,0x00,0x00,0x62,0x69,0x74,0x63,0x6f,0x69,0x6e,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x0a,0x6b,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1b,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
0x02,0x10,0x20,0x01,0x04,0x70,0x1b,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x05,0x04,0x3b,0x28,0x31,0x85,0x30,0x71,0x79,0x58,0x64,0x20,0x8d,
0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x09,0x0b,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x15,0x01,0x06,0xe2,0xd5,0x5e,0xff,0xfe,0x42,0x7a,0xe5,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x1b,0x03,0x65,0xaa,0x20,0x66,0xff,0xfe,0x3f,0x19,0x09,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x0a,0x08,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x1b,0x05,0xa6,0x02,0x16,0x3e,0xff,0xfe,0x24,0x11,0x62,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x6a,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
0x02,0x10,0x20,0x01,0x04,0x70,0x75,0xe9,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x8c,0xa0,0x00,0x02,0x4e,0x72,0xb9,0xff,0xfe,0x56,0xf8,0xb8,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0xdb,0xc7,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x4b,0xa0,0xca,0xfe,0x14,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x4b,0xa0,0xff,0xff,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x88,0xff,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x8c,0xa0,0x00,0x02,0x76,0x46,0xa0,0xff,0xfe,0x9b,0xe6,0x62,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x00,0x0a,0x0c,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x00,0x0c,0x10,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x00,0x30,0xb7,0x1d,0x7b,0x6f,0xec,0x4c,0x5c,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x00,0x08,0x8e,0xb4,0xff,0x2a,0xd0,0x69,0x9b,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x00,0x9c,0x1c,0xcc,0x31,0x9f,0xe8,0x55,0x05,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x00,0xa0,0xc4,0xd4,0x1f,0x04,0xc4,0x1b,0xb0,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x00,0xfd,0x76,0xc1,0xd3,0x18,0x54,0x5b,0xd9,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x01,0x00,0x00,0x00,0x00,0x76,0x76,0x80,0x90,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x01,0xb9,0x77,0xbd,0x71,0x46,0x12,0x8e,0x40,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0xaf,0x0e,0x35,0x64,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x01,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0xaf,0x0e,0x35,0x64,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x90,0x20,0x8d,
0x02,0x10,0x20,0x01,0x05,0x60,0x44,0x1f,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x06,0x38,0xa0,0x00,0x41,0x40,0x00,0x00,0x00,0x00,0xff,0xff,0x01,0x91,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x06,0x7c,0x25,0xdc,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x05,0xa8,0x40,0xc7,0xf5,0x00,0x7a,0x0d,0x0d,0x50,0x25,0x5e,0xdb,0xac,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x38,0xa0,0x00,0x41,0x40,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x47,0x20,0x8d,
0x02,0x10,0x20,0x01,0x06,0x7c,0x26,0xb4,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x06,0x7c,0x2d,0xb8,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x7c,0x04,0x40,0x06,0x88,0x00,0x91,0x02,0x36,0x02,0x51,0x01,0x37,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x7c,0x04,0x40,0x06,0x88,0x00,0x91,0x02,0x36,0x02,0x51,0x01,0x39,0x20,0x8d,
0x02,0x10,0x20,0x01,0x07,0xc0,0x23,0x10,0x00,0x00,0xf8,0x16,0x3e,0xff,0xfe,0x6c,0x4f,0x58,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x08,0x61,0x32,0x42,0x84,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x08,0xb0,0x13,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0xb0,0x30,0x24,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0x07,0x02,0xef,0x6e,0x4a,0x00,0x3d,0x97,0x4e,0x78,0x4a,0x68,0x4b,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0x07,0x5d,0x32,0xb1,0x42,0x8f,0x77,0x3c,0x7d,0xa2,0xfd,0xed,0x2e,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x08,0x61,0x0c,0x62,0x2f,0xd0,0xca,0x7f,0x54,0xff,0xfe,0xce,0x06,0xd9,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x08,0x71,0x02,0x3d,0xd5,0xd1,0x5a,0x47,0xca,0xff,0xfe,0x71,0x0c,0x8d,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x09,0x10,0x10,0x9d,0x2c,0x03,0xd2,0x17,0xc2,0xff,0xfe,0x07,0x2c,0xd9,0x20,0x8d,
0x02,0x10,0x20,0x01,0x0b,0x07,0x64,0x61,0x78,0x11,0x04,0x89,0xd2,0xda,0x0e,0x07,0x1a,0xf7,0x20,0x8d,
0x02,0x10,0x20,0x01,0x0b,0x07,0x64,0x6b,0x80,0x74,0x32,0xe8,0x92,0x43,0xa3,0x37,0xe6,0x0a,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0x07,0x64,0x6b,0x80,0x74,0x4c,0xc6,0x79,0xa5,0x3a,0xf7,0x71,0x32,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0x07,0x0a,0xd4,0xca,0x4b,0x7d,0xd5,0x84,0x71,0x50,0xc3,0x53,0x63,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x12,0x01,0x07,0x15,0xca,0x1f,0x66,0xff,0xfe,0xc9,0x5f,0xf0,0x20,0x8d,
0x02,0x10,0x20,0x01,0x0b,0xc8,0x12,0x01,0x07,0x1a,0x2e,0x59,0xe5,0xff,0xfe,0x42,0x52,0xf4,0x20,0x8d,
0x02,0x10,0x20,0x01,0x0b,0xc8,0x16,0x00,0x00,0x00,0x02,0x08,0xa2,0xff,0xfe,0x0c,0x8a,0x2e,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0xc8,0x32,0x3c,0x00,0xff,0xa6,0x34,0x38,0x4f,0x18,0x49,0xf4,0xbc,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0xc8,0x32,0x3c,0x00,0xff,0xd2,0x17,0xc2,0xff,0xfe,0x07,0x2c,0xd9,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0xc8,0x07,0x00,0x2b,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0xc8,0x07,0x00,0x8d,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0e,0x68,0x54,0x00,0x58,0xd0,0xbd,0x15,0xea,0x8c,0x5b,0x20,0x75,0x23,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x24,0x11,0xa3,0xe1,0x49,0x00,0x72,0x98,0xf5,0x50,0x67,0xe7,0xb9,0x9b,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0x2b,0x5c,0x0b,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0x5a,0x68,0x5c,0x20,0x8d,
+ 0x02,0x10,0x20,0x03,0x00,0xdc,0x2f,0x4a,0xeb,0x00,0x4e,0xcc,0x6a,0xff,0xfe,0x25,0xc9,0xa3,0x20,0x8d,
+ 0x02,0x10,0x20,0x03,0x00,0xf6,0x3f,0x31,0x06,0x00,0x4c,0x9f,0x76,0x20,0x83,0x24,0xd4,0xa7,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x08,0x48,0x50,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x09,0x40,0x40,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x09,0x53,0x80,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x02,0x20,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x0f,0x90,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x3d,0xb0,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x3f,0x10,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x49,0xa0,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x56,0xd0,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x56,0xe0,0x01,0x20,0x8d,
0x02,0x10,0x24,0x01,0xb1,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x10,0x20,0x8d,
0x02,0x10,0x24,0x01,0xb1,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x20,0x20,0x8d,
- 0x02,0x10,0x24,0x01,0xd0,0x02,0x39,0x02,0x07,0x00,0xd7,0x2c,0x5e,0x22,0x4e,0x95,0x38,0x9d,0x20,0x8d,
- 0x02,0x10,0x24,0x04,0x44,0x08,0x63,0xa4,0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x50,0x20,0x8d,
+ 0x02,0x10,0x24,0x02,0xe2,0x80,0x3d,0x17,0x09,0x45,0x18,0x89,0xd3,0xc6,0x8e,0x85,0xd3,0xc4,0x20,0x8d,
+ 0x02,0x10,0x24,0x03,0x62,0x00,0x88,0x21,0x2f,0xdf,0x39,0x03,0xa2,0xb1,0x00,0x9f,0xc8,0x97,0x20,0x8d,
0x02,0x10,0x24,0x06,0x34,0x00,0x02,0x16,0x8b,0x00,0x02,0x11,0x32,0xff,0xfe,0xca,0x33,0x6b,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0x8c,0x00,0x00,0x00,0x34,0x22,0x01,0x33,0x00,0x18,0x02,0x28,0x01,0x08,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0xda,0x11,0x01,0x69,0x0b,0x03,0x32,0xb5,0xf9,0x01,0x9f,0x7c,0x3e,0x4b,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0xda,0x18,0x09,0xf1,0xf3,0x01,0x7d,0x2e,0xc2,0x56,0xc1,0x12,0xf2,0xbe,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0xda,0x18,0x09,0xf1,0xf3,0x03,0xc1,0xc9,0xc5,0x69,0xb7,0x99,0x20,0x57,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0xda,0x1e,0x0a,0x4e,0x8a,0x00,0x20,0xdb,0xdd,0x8d,0x36,0x70,0x28,0xf0,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0xda,0x1e,0x0a,0x4e,0x8a,0x03,0x2a,0xad,0x49,0x6b,0x76,0x8d,0xe4,0x97,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x14,0x03,0x35,0xb6,0x00,0xeb,0x14,0x05,0xfd,0x20,0x72,0x36,0x53,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x1c,0x05,0x0b,0xcd,0x00,0x3c,0xae,0x17,0x28,0xec,0xfc,0x43,0x34,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x1c,0x05,0x0b,0xcd,0x03,0x36,0xd6,0x13,0xfa,0xeb,0xa8,0x65,0x43,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x1e,0x0a,0x4e,0x8a,0x03,0xd9,0x0a,0xfb,0xb0,0x23,0xd3,0xcc,0xb4,0x20,0x8d,
0x02,0x10,0x24,0x07,0x36,0x40,0x21,0x07,0x12,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x07,0x36,0x40,0x30,0x10,0x40,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x07,0x88,0x00,0xbc,0x61,0x22,0x02,0xd6,0x3d,0x7e,0xff,0xfe,0x6c,0xdc,0x36,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x17,0x00,0x5c,0x5b,0x00,0xb0,0xaa,0xa1,0x59,0xff,0xfe,0x5f,0x61,0x5a,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x17,0x00,0xec,0x7b,0x57,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x00,0x4c,0xc4,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x00,0x4c,0xc4,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x00,0x4c,0xc4,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x00,0x4c,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x30,0xa2,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x1f,0x14,0x04,0x0e,0xe3,0x01,0xaf,0xdd,0xad,0x00,0xe5,0x68,0xd2,0x20,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x1f,0x1c,0x02,0xd3,0x24,0x00,0xf1,0x5e,0x2f,0x2a,0x76,0x0d,0xa3,0x3d,0x20,0x8d,
+ 0x02,0x10,0x24,0x07,0x70,0x00,0x9f,0x71,0x2d,0x00,0x1c,0x5a,0x52,0x92,0x51,0x08,0xc7,0x34,0x20,0x8d,
+ 0x02,0x10,0x24,0x08,0x82,0x07,0x26,0x55,0xfa,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0b,0x20,0x8d,
+ 0x02,0x10,0x24,0x08,0x82,0x07,0x54,0x56,0xd8,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xc6,0x20,0x8d,
+ 0x02,0x10,0x24,0x09,0x02,0x50,0x60,0xa0,0x26,0x00,0xa9,0x71,0x1c,0xdd,0x3d,0x5b,0x65,0x4d,0x20,0x8d,
+ 0x02,0x10,0x24,0x0d,0x00,0x1a,0x04,0xb1,0xe7,0x00,0x00,0x19,0xd9,0xef,0x07,0xf3,0x8e,0x75,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x39,0x48,0x08,0x2f,0xce,0x04,0xd3,0x82,0x52,0x26,0x4c,0xac,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x16,0x0a,0x08,0xb9,0x00,0x4b,0xfe,0x2f,0x81,0xae,0x31,0x05,0xf5,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x1c,0x02,0xd3,0x24,0x01,0x69,0x89,0xb1,0xfd,0xd2,0xa6,0xfb,0xc8,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x1e,0x02,0xfe,0x36,0x01,0x63,0xa8,0xeb,0xf6,0x83,0xe4,0x19,0x32,0x20,0x8d,
0x02,0x10,0x26,0x00,0x21,0x04,0x10,0x03,0xc5,0xab,0xdc,0x5e,0x90,0xff,0xfe,0x18,0x1d,0x08,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x92,0xff,0xfe,0x92,0x27,0x45,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x92,0xff,0xfe,0xcf,0x61,0xb6,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x00,0xe0,0x02,0x2e,0x32,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x14,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0x2a,0x52,0x66,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0x74,0x5f,0x59,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0xe6,0x21,0x46,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x92,0xff,0xfe,0x5d,0x09,0xfb,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x40,0x40,0x20,0x04,0x32,0x01,0x45,0x9f,0x8f,0xe8,0x44,0x4d,0xba,0xf1,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x40,0x40,0x45,0x41,0x49,0x00,0x04,0xe1,0xb5,0x8a,0x84,0x38,0x45,0x0e,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x4b,0x0c,0x52,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x3c,0x00,0xe0,0x02,0x2e,0x32,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xc8,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x94,0xff,0xfe,0xcc,0xc9,0x9c,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x6c,0x4e,0x0a,0x00,0x0c,0xd0,0x42,0x8d,0x5c,0xff,0xfe,0x58,0x48,0x84,0x20,0x8d,
0x02,0x10,0x26,0x00,0x6c,0x54,0x71,0x00,0x1a,0xd1,0xc9,0x2e,0x03,0x6d,0x06,0x51,0xbd,0x18,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x88,0x01,0x2f,0x80,0x04,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x1c,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x88,0x01,0x8d,0x00,0x3e,0xb0,0x02,0x0c,0x29,0xff,0xfe,0xc3,0xd7,0x99,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x88,0x05,0x24,0x00,0x01,0x4e,0x12,0xdd,0xb1,0xff,0xfe,0xf2,0x30,0x13,0x20,0x8d,
0x02,0x10,0x26,0x01,0x01,0x84,0x03,0x00,0x15,0x6c,0xba,0x4c,0x00,0x30,0x09,0xda,0x6c,0x06,0x20,0x8d,
- 0x02,0x10,0x26,0x01,0x03,0x46,0x0d,0x7f,0xff,0xf7,0x18,0xc6,0x48,0x56,0xef,0x75,0x74,0x4c,0x20,0x8d,
- 0x02,0x10,0x26,0x01,0x04,0x05,0x4a,0x00,0x08,0x76,0xc8,0xd3,0xf0,0x81,0x2c,0xe8,0xba,0x8e,0x20,0x8d,
- 0x02,0x10,0x26,0x02,0x02,0x4c,0x0b,0x8f,0xcd,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x40,0x20,0x8d,
- 0x02,0x10,0x26,0x02,0xfe,0xc3,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x20,0x8d,
- 0x02,0x10,0x26,0x02,0xff,0x16,0x00,0x01,0x00,0x00,0x00,0x01,0x04,0x12,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x30,0x01,0x26,0x18,0xc0,0x00,0x2e,0xc1,0xdf,0x1f,0xa4,0x63,0x91,0x19,0x20,0x8d,
+ 0x02,0x10,0x26,0x01,0x01,0x85,0x83,0x02,0x12,0xf0,0x1a,0xb2,0x28,0x40,0x9d,0xe4,0x15,0x50,0x20,0x8d,
0x02,0x10,0x26,0x03,0x30,0x03,0x01,0x1b,0xe1,0x00,0x02,0x0c,0x29,0xff,0xfe,0x38,0xbb,0xc0,0x20,0x8d,
0x02,0x10,0x26,0x03,0x30,0x04,0x06,0xa1,0x38,0x00,0x85,0x1f,0x58,0x4d,0x7a,0xba,0xaf,0xfb,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x30,0x04,0x06,0xa1,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0xba,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x30,0x04,0x06,0xa1,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x67,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x30,0x24,0x16,0x06,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0xec,0x20,0x8d,
0x02,0x10,0x26,0x03,0x30,0x24,0x18,0xee,0x80,0x00,0x02,0x0e,0xc4,0xff,0xfe,0xd1,0xef,0x15,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x60,0x00,0xa4,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x60,0x10,0x70,0x01,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x20,0x8d,
0x02,0x10,0x26,0x03,0x80,0x80,0x1f,0x07,0x6f,0xdd,0x7d,0xe2,0xd9,0x69,0x78,0xc9,0xb7,0xea,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x80,0x80,0xd6,0x00,0x18,0x00,0x7c,0xe1,0x74,0xa2,0x6a,0x8a,0x46,0x43,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x80,0x81,0x6c,0x00,0x30,0x6e,0x02,0x15,0x5d,0xff,0xfe,0x02,0x15,0x0a,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0x3d,0x09,0x71,0x82,0x87,0x00,0xbb,0xa9,0xcd,0xe6,0x5b,0x37,0xa8,0xdf,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0x40,0x80,0x10,0x36,0x80,0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xbe,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0x0a,0x00,0x00,0x03,0x12,0x23,0x02,0x16,0x3e,0xff,0xfe,0x27,0x76,0xe0,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x26,0x1f,0x60,0x01,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0xa8,0x80,0x00,0x04,0x01,0xd0,0x00,0x00,0x00,0x00,0x01,0x3e,0xf0,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0xa8,0x80,0x00,0x04,0x01,0xd0,0x00,0x00,0x00,0x00,0x01,0x7a,0x70,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0xa8,0x80,0x00,0x04,0x01,0xd0,0x00,0x00,0x00,0x00,0x00,0xc1,0x30,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0xa8,0x80,0x00,0x04,0x01,0xd0,0x00,0x00,0x00,0x00,0x00,0xe5,0xb0,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x05,0x4a,0x80,0xa3,0x02,0x79,0x40,0x72,0x54,0x1e,0xd4,0x90,0xd7,0x4f,0x39,0x20,0x8d,
- 0x02,0x10,0x26,0x05,0x4a,0x80,0xa3,0x02,0x79,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0x40,0x80,0x10,0x36,0x80,0xb1,0x50,0xe1,0x43,0xff,0xfe,0x0e,0x9d,0xf5,0x20,0x8d,
0x02,0x10,0x26,0x05,0x64,0x00,0x00,0x30,0xf2,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x05,0xa1,0x40,0x30,0x10,0x40,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x26,0x05,0xae,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x20,0x8d,
- 0x02,0x10,0x26,0x05,0x0b,0x40,0x14,0xd0,0x5b,0x00,0x79,0x88,0x0e,0xb8,0x6b,0xb6,0x66,0xe2,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x64,0x00,0x00,0x30,0xfd,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x8d,
0x02,0x10,0x26,0x05,0xc0,0x00,0x2a,0x0a,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x06,0x6d,0x00,0x01,0x00,0x51,0x02,0x03,0xd2,0xf0,0x6a,0xc2,0xe8,0x0a,0x54,0x20,0x8d,
+ 0x02,0x10,0x26,0x07,0x53,0x00,0x00,0x60,0x2e,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
0x02,0x10,0x26,0x07,0x53,0x00,0x00,0x61,0x08,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x14,0x25,0xb5,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x21,0x9c,0x2f,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x21,0xbf,0x32,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x33,0x4d,0x1b,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x3d,0x04,0x01,0x20,0x8d,
- 0x02,0x10,0x26,0x20,0x00,0x6e,0xa0,0x00,0x00,0x01,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x20,0x8d,
- 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x05,0x16,0x01,0x20,0x8d,
- 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x09,0x90,0x0b,0x20,0x8d,
- 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x0b,0x30,0x0e,0x20,0x8d,
- 0x02,0x10,0x28,0x00,0x01,0x50,0x01,0x1d,0x0d,0x2f,0xbd,0xac,0x78,0x07,0x02,0xf5,0x4a,0xa0,0x20,0x8d,
- 0x02,0x10,0x28,0x03,0x98,0x00,0xa0,0x07,0x82,0xba,0x65,0x0b,0x82,0xb8,0x83,0x77,0x00,0xd0,0x20,0x8d,
- 0x02,0x10,0x28,0x04,0x01,0x4c,0x01,0x55,0x45,0xe0,0x1e,0x86,0x15,0xa3,0xef,0xd9,0x72,0x87,0x20,0x8d,
- 0x02,0x10,0x28,0x04,0x01,0x4c,0x65,0x7d,0x40,0x30,0x28,0xb4,0x0e,0xff,0xfe,0x9b,0x88,0x94,0x20,0x8d,
- 0x02,0x10,0x28,0x04,0x01,0x4d,0x10,0x87,0x94,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x20,0x8d,
- 0x02,0x10,0x28,0x04,0x09,0x54,0x00,0x24,0x00,0x02,0xb3,0x90,0xd8,0x3b,0x35,0x8a,0xdb,0x53,0x20,0x8d,
- 0x02,0x10,0x28,0x04,0x0d,0x57,0x55,0x4d,0xde,0x00,0x3e,0x7c,0x3f,0xff,0xfe,0x7b,0x80,0xaa,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x10,0x28,0x83,0x8c,0x56,0x3a,0xfd,0x25,0x87,0xb6,0x5a,0x54,0x08,0x11,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x0d,0x30,0x15,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x03,0x26,0x6c,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x09,0x93,0x0b,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x0b,0x30,0x11,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x01,0x50,0x01,0x1d,0x24,0x26,0x06,0x2b,0xb1,0x64,0x70,0x4a,0x69,0x62,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x03,0x00,0x82,0x51,0x0b,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x03,0x00,0x82,0x51,0x0b,0x50,0x0e,0x92,0x64,0xf5,0x22,0xaf,0xc3,0x1e,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x00,0x40,0x00,0x15,0x06,0xad,0x48,0xe8,0x22,0x00,0xa8,0x82,0xe0,0x8e,0x20,0x8d,
+ 0x02,0x10,0x28,0x03,0x51,0x80,0x41,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x28,0x03,0x98,0x00,0x94,0x47,0x84,0xbb,0xca,0xb8,0xd2,0xf5,0x38,0x8c,0x9a,0x57,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x01,0x4d,0x7e,0x33,0x83,0xb0,0x6e,0x41,0x1c,0xcc,0xcf,0x20,0xaf,0xf9,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x04,0x31,0xe0,0x38,0xcd,0x01,0xaa,0xa1,0x59,0xff,0xfe,0x0d,0x44,0xb8,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x0d,0x57,0x45,0x0d,0x0f,0x00,0xa4,0x22,0x98,0x28,0xb0,0x0e,0x91,0xe9,0x20,0x8d,
+ 0x02,0x10,0x28,0x06,0x02,0xf0,0x50,0x20,0xd2,0x87,0x4d,0xcd,0x62,0x04,0x90,0x9b,0x41,0x25,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x12,0x98,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x42,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x13,0x98,0x00,0x04,0x2a,0x03,0x02,0x15,0x5d,0xff,0xfe,0xd6,0x10,0x33,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x12,0xe0,0x01,0x01,0x00,0x99,0x02,0x0c,0x29,0xff,0xfe,0x29,0xd0,0x3f,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x13,0x98,0x00,0x04,0x2a,0x03,0x3e,0xec,0xef,0xff,0xfe,0x05,0xd9,0x3e,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x13,0x98,0x00,0x04,0x2a,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x03,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x17,0x68,0x20,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x6a,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x1f,0x40,0x50,0x01,0x01,0x08,0x5d,0x17,0x77,0x03,0xb0,0xf5,0x41,0x33,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x23,0xc5,0xfe,0x80,0x73,0x01,0xd6,0xae,0x52,0xff,0xfe,0xd5,0x56,0xa5,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x60,0x20,0x13,0xdc,0xbc,0x00,0x55,0x59,0x02,0x58,0x02,0x7d,0xb5,0x2b,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x60,0x20,0x45,0x03,0x37,0x00,0x02,0x0c,0x29,0xff,0xfe,0x61,0x4a,0x4c,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x60,0x20,0xb4,0x34,0xeb,0x00,0xde,0xa6,0x32,0xff,0xfe,0x0d,0xa5,0xc0,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x23,0xc6,0x5c,0x8a,0x5c,0x00,0xc0,0x5a,0x4d,0xff,0xfe,0x65,0x9d,0x69,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x60,0x20,0x45,0x03,0x37,0x00,0x50,0x54,0x00,0xff,0xfe,0x90,0x64,0x0e,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x60,0x20,0xb4,0x89,0x20,0x00,0x50,0x54,0x00,0xff,0xfe,0xfc,0x5e,0xd8,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x7c,0x80,0x00,0x00,0x01,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x7c,0x80,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x7a,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x8a,0x60,0xe0,0x12,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0xbb,0xe0,0x00,0xcc,0x00,0x00,0x5a,0x11,0x22,0xff,0xfe,0xb4,0x8f,0x5c,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0xbb,0xe0,0x00,0xcc,0x00,0x00,0x62,0xa4,0x4c,0xff,0xfe,0x23,0x75,0x10,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x0c,0xa8,0x0a,0x15,0x9a,0x5b,0x8b,0x42,0xa8,0x86,0x7d,0x48,0x7a,0x21,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x0c,0xa8,0x0a,0x1f,0xf9,0xb7,0xcb,0x55,0x57,0x66,0x52,0x4b,0xac,0xaa,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0xd4,0xe0,0x00,0xff,0xfc,0x02,0x5e,0x55,0x4a,0x7c,0xb8,0x3b,0xe5,0xa1,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0xbb,0xe0,0x00,0x00,0x22,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x46,0x20,0x8d,
0x02,0x10,0x2a,0x00,0xd5,0x20,0x00,0x09,0x93,0x00,0x42,0x0b,0x54,0x4e,0x80,0x19,0x6d,0x3a,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0xd8,0x80,0x00,0x05,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x29,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x0e,0xe2,0x12,0x00,0x19,0x00,0x08,0xd3,0xd2,0xff,0xfe,0xb1,0xbc,0x58,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x01,0x73,0x23,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0xfd,0x40,0x00,0x0c,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x01,0x71,0x1f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x00,0x72,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x02,0x03,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x21,0x44,0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x31,0x09,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x61,0x2b,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x61,0x3c,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x02,0x42,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x42,0x20,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x61,0x42,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x72,0x4c,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x1a,0xa9,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x1a,0xaf,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x2b,0x02,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x3a,0x2d,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x5a,0x44,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x07,0xa7,0x00,0x02,0x28,0x04,0xae,0x1f,0x6b,0xff,0xfe,0x9d,0x6c,0x94,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x07,0xc8,0xaa,0xc2,0x01,0x80,0x50,0x54,0x00,0xff,0xfe,0x56,0x8d,0x10,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x07,0xc8,0xaa,0xc9,0x00,0xc9,0x50,0x54,0x00,0xff,0xfe,0xdf,0xff,0x95,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x7e,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0x49,0x2f,0x5b,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x87,0x40,0x00,0x01,0x07,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0xcb,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x87,0x40,0x00,0x01,0xff,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x28,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x87,0x40,0x00,0x01,0xff,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x6a,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0xcb,0x00,0x0b,0x63,0xc0,0x00,0x02,0x27,0x0e,0xff,0xfe,0x28,0xc5,0x65,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0xcb,0x19,0x06,0x88,0xe9,0x00,0xaa,0x60,0xb6,0xff,0xfe,0x29,0xbb,0xae,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x01,0x63,0xc0,0xb0,0x9d,0xa5,0x16,0x90,0xa1,0x2b,0xbe,0xde,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x02,0x82,0x67,0xb0,0xb4,0xf4,0xaa,0xff,0xfe,0x7c,0x44,0xa6,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0xcb,0x00,0x07,0x90,0xf5,0x00,0x11,0x0b,0xb4,0x46,0x22,0x60,0x7d,0x2c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0xcb,0x10,0x03,0x36,0xcb,0x00,0x61,0xac,0xd1,0x5d,0x4a,0xc0,0x2c,0xbd,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0xcb,0x10,0x03,0x36,0xcb,0x00,0xd2,0x37,0x45,0xff,0xfe,0xc5,0x2c,0xd0,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0xcb,0x15,0x80,0x4c,0x80,0x00,0x02,0x1e,0x06,0xff,0xfe,0x51,0x2c,0x32,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x01,0x85,0x55,0xf0,0xa0,0xba,0x9e,0xaf,0x98,0x53,0x92,0xb7,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x0e,0x0a,0x03,0x01,0x70,0x10,0xb8,0x7d,0xe1,0x4b,0xce,0xa9,0xb9,0x98,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x03,0x20,0x39,0xa0,0x32,0x5a,0x3a,0xff,0xfe,0x02,0x31,0x80,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x03,0x51,0x9f,0xb0,0x6b,0xf2,0x95,0xd6,0xb7,0xbd,0xb8,0x46,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x05,0xfa,0xa0,0xa0,0xca,0x1f,0x66,0xff,0xfe,0xce,0xb8,0xa2,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x08,0x3d,0xdd,0x30,0x36,0x76,0x5d,0x8e,0x8a,0x6f,0x11,0x5a,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x09,0xe9,0xc2,0x40,0x7b,0x44,0xf3,0x2a,0x6e,0xc0,0xa8,0xaf,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x03,0xb3,0x14,0x20,0x7c,0xa0,0x3a,0x9a,0x5c,0xc3,0xb6,0x44,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x00,0x05,0x93,0x90,0xbf,0x35,0x4d,0x41,0x8a,0x2a,0x05,0x70,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x09,0xe9,0xc2,0x40,0x8e,0x3a,0xaf,0x64,0x04,0xf0,0x8f,0x79,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x0b,0x0f,0x37,0xe0,0xa1,0x3f,0x0e,0x65,0xac,0x42,0x8e,0x36,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x0e,0x0a,0x00,0xb5,0x7f,0x50,0xc2,0x57,0xa5,0x5b,0x48,0x46,0x97,0xe1,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x11,0x10,0x0c,0x00,0x70,0xcb,0xc8,0x9e,0x31,0x4b,0x77,0x16,0x26,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x12,0x10,0x2c,0xdf,0x46,0x00,0x02,0xbc,0xe0,0x3e,0x43,0xe8,0x47,0x18,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x0b,0xf6,0x8d,0x70,0x02,0x0c,0x29,0xff,0xfe,0x30,0x4f,0xd2,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x11,0x10,0x0c,0x00,0x70,0x39,0xf3,0xe3,0xc9,0x83,0x2f,0x03,0x7a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x34,0xec,0x1d,0x71,0x00,0x8a,0xae,0xdd,0xff,0xfe,0x02,0x41,0x59,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x7c,0x92,0x51,0x00,0x02,0x11,0x32,0xff,0xfe,0xae,0x15,0x2d,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x12,0x10,0x86,0xbf,0xf1,0x00,0xa9,0xac,0xd0,0x41,0x1f,0x8e,0x69,0x25,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x12,0x10,0x94,0xc3,0x34,0x00,0xd8,0xc3,0x74,0x3c,0x90,0xf6,0xa4,0x8a,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x01,0x68,0x20,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x01,0x68,0x42,0x0b,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x01,0x68,0x67,0x6e,0x00,0x00,0xe6,0x5f,0x01,0xff,0xfe,0x09,0x35,0x91,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x17,0x48,0xf3,0x9f,0x58,0x72,0x02,0x16,0x3e,0xff,0xfe,0x21,0x02,0x66,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x01,0x80,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x05,0x17,0x10,0xb6,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x27,0x80,0x90,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x27,0x80,0x90,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x27,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x1a,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x2f,0x05,0x60,0x08,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x22,0xa0,0xbb,0xb3,0xdc,0x10,0x50,0xe1,0x57,0xff,0xfe,0x70,0x94,0x92,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x24,0x7a,0x02,0x15,0x3e,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x2c,0x60,0xf1,0x03,0x07,0xc0,0x1a,0x31,0xbf,0xff,0xfe,0xcc,0x5d,0x91,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x31,0x02,0x4d,0x5c,0xf0,0x00,0xde,0xa6,0x32,0xff,0xfe,0xbb,0xb9,0xcb,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x31,0x02,0xbc,0x00,0x10,0xe9,0x0c,0xa5,0x9d,0xff,0xfe,0xa9,0x1c,0xbb,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x03,0x90,0x90,0x00,0x00,0x00,0xaa,0xa1,0x59,0xff,0xfe,0x43,0xb5,0x7b,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x05,0x78,0x85,0xce,0x16,0x00,0x1e,0x1b,0x0d,0xff,0xfe,0xe3,0x77,0x4b,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x07,0x68,0xf9,0x2b,0xdb,0x46,0x5e,0x46,0x77,0x2b,0x07,0x1d,0x29,0xb7,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x91,0x02,0x28,0x00,0x45,0x01,0x30,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x7b,0x40,0x50,0xd0,0xe3,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x7b,0x40,0x50,0xd1,0xe3,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x7b,0x40,0x59,0x28,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x7b,0x40,0xb9,0x45,0x34,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x7b,0x40,0xd4,0x18,0x6d,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x80,0x70,0x0b,0x84,0x6a,0xe0,0xf9,0xc6,0xfb,0xb9,0x1c,0x41,0x81,0xaa,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x80,0x70,0xf1,0x86,0x38,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0xa6,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x80,0x84,0x01,0x03,0x68,0x10,0x1e,0x69,0x7a,0xff,0xfe,0xa2,0x1a,0xcc,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x83,0x08,0x80,0x81,0xf3,0x00,0x03,0xb8,0x7e,0xc0,0x28,0x37,0x1b,0x57,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x80,0x70,0xf1,0x81,0xf6,0x00,0x0b,0xcb,0x02,0xd1,0xd7,0x90,0x78,0xff,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x80,0x71,0x63,0x80,0xc5,0x00,0x72,0x85,0xc2,0xff,0xfe,0xb5,0xa3,0x9c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x80,0x84,0x20,0x21,0x73,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0xe6,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x83,0x08,0x81,0x88,0x51,0x00,0x6d,0x8b,0x45,0x31,0x43,0x31,0xee,0xe2,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x83,0x88,0xe3,0x02,0x79,0x80,0x6f,0x85,0xa0,0xb3,0x4b,0x4d,0x8b,0x0f,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x83,0x88,0xe5,0xc3,0x4a,0x80,0x02,0x01,0x2e,0xff,0xfe,0x82,0xb3,0xcc,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x84,0x2a,0x01,0xdf,0x8a,0x01,0x1e,0x1b,0x0d,0xff,0xfe,0x0b,0x23,0x6d,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa2,0x10,0x28,0xbe,0x5f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa4,0x4b,0x5c,0xf9,0x00,0x01,0xb6,0x2e,0x99,0xff,0xfe,0x49,0xd4,0x92,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa4,0x4d,0x14,0xd6,0x00,0x01,0x02,0xc0,0x08,0xff,0xfe,0x8f,0xb3,0xb2,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xa3,0x1a,0xe0,0x3d,0x94,0x00,0x3f,0x18,0x27,0x29,0x0c,0x86,0xd7,0x54,0x20,0x8d,
0x02,0x10,0x2a,0x02,0xa4,0x5a,0x94,0xcd,0xf0,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa4,0x5f,0x3b,0x9d,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x99,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa4,0x64,0x3d,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa4,0x6c,0x7f,0x8e,0x00,0x01,0x35,0xbf,0x3a,0xeb,0x13,0x7c,0x1d,0x35,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa4,0x6d,0x03,0x6f,0x00,0x01,0x02,0x0d,0xb9,0xff,0xfe,0x4e,0x63,0x98,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x05,0x20,0x21,0x42,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x06,0x20,0x44,0x98,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x06,0x20,0x75,0x33,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x07,0x00,0x00,0x38,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x07,0x20,0x14,0x41,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x07,0x20,0x14,0x87,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x07,0x20,0x26,0x66,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xa4,0x65,0x80,0xf4,0x00,0x01,0xf3,0x69,0x4e,0xf5,0xaa,0x12,0x75,0x66,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xab,0x88,0x02,0x0b,0xce,0x00,0x02,0x23,0x24,0xff,0xfe,0x56,0x62,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x20,0x16,0x23,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x56,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x56,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x56,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x58,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x73,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x73,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x80,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
0x02,0x10,0x2a,0x02,0xc2,0x07,0x20,0x34,0x73,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x07,0x30,0x02,0x74,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x07,0x30,0x08,0x45,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xcb,0x43,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x78,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x0e,0x5e,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x0e,0x98,0x00,0x20,0x15,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x28,0x00,0x68,0x74,0x11,0x53,0xff,0xfe,0x4c,0x02,0x1d,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x65,0x0f,0xdc,0x34,0x62,0x66,0xff,0xfe,0x05,0xec,0x5c,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0x60,0x00,0x08,0x70,0x00,0x00,0x00,0x46,0x00,0x23,0x00,0x87,0x02,0x18,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0x94,0xe0,0xff,0xff,0x01,0x85,0x02,0x43,0x02,0x18,0x00,0x00,0x00,0x19,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xb0,0xc0,0x00,0x01,0x00,0xe0,0x00,0x00,0x00,0x00,0x03,0x97,0x60,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xb0,0xc0,0x00,0x01,0x00,0xe0,0x00,0x00,0x00,0x00,0x07,0x94,0x90,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xb0,0xc0,0x00,0x02,0x00,0xf0,0x00,0x00,0x00,0x00,0x02,0x88,0xc0,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xb0,0xc0,0x00,0x02,0x00,0xf0,0x00,0x00,0x00,0x00,0x03,0x0c,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x0e,0x3b,0x50,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x5f,0xd6,0x35,0x57,0x20,0x8d,
- 0x02,0x10,0x2a,0x04,0x21,0x80,0xdc,0x05,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x20,0x8d,
- 0x02,0x10,0x2a,0x04,0x21,0x80,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x20,0x8d,
- 0x02,0x10,0x2a,0x04,0x52,0xc0,0x01,0x03,0xc4,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x04,0xbc,0x40,0x1d,0xc3,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x05,0x35,0x80,0xdc,0x0b,0x16,0x00,0xde,0xf4,0x5a,0x62,0xde,0x42,0x32,0x4a,0x20,0x8d,
- 0x02,0x10,0x2a,0x05,0xd0,0x14,0x0a,0x55,0x40,0x00,0x8d,0xde,0x06,0x9f,0x4a,0xc7,0x0b,0x26,0x20,0x8d,
- 0x02,0x10,0x2a,0x05,0xd0,0x16,0x09,0x8f,0x52,0x01,0x6b,0xe0,0xa4,0xde,0x80,0xc7,0x32,0xd5,0x20,0x8d,
- 0x02,0x10,0x2a,0x05,0xd0,0x18,0x0a,0x75,0x6c,0x03,0x07,0x5b,0x2c,0x73,0x8c,0xaa,0x41,0x4b,0x20,0x8d,
- 0x02,0x10,0x2a,0x05,0xf4,0x80,0x18,0x00,0x06,0x97,0x54,0x00,0x02,0xff,0xfe,0xb6,0xc3,0x6d,0x20,0x8d,
- 0x02,0x10,0x2a,0x06,0xe0,0x40,0x76,0x03,0x29,0x18,0xc6,0xef,0x46,0x4e,0x9f,0xe5,0x73,0xec,0x20,0x8d,
- 0x02,0x10,0x2a,0x07,0xab,0xc4,0x00,0x00,0x00,0x00,0x00,0x89,0x02,0x34,0x01,0x80,0x01,0x94,0x20,0x8d,
- 0x02,0x10,0x2a,0x07,0xd8,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x7e,0x20,0x8d,
- 0x02,0x10,0x2a,0x09,0x26,0x81,0x10,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x20,0x8d,
- 0x02,0x10,0x2a,0x09,0x26,0x81,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x20,0x8d,
- 0x02,0x10,0x2a,0x0b,0xf3,0x00,0x00,0x02,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x0d,0x83,0x40,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x0e,0x8f,0x02,0x21,0xd1,0x01,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x0e,0xb7,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xd1,0xf0,0x5b,0x20,0x8d,
- 0x02,0x10,0x2a,0x10,0x37,0x81,0x2c,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x10,0xd2,0x00,0x00,0x01,0x00,0x33,0xa6,0xbf,0x01,0xff,0xfe,0x6a,0x46,0xa9,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2c,0x0f,0xf8,0xf0,0xda,0x51,0x00,0x00,0x3a,0x45,0xfc,0x57,0x5e,0x30,0x25,0x93,0x20,0x8d,
- 0x04,0x20,0xd0,0x60,0x63,0xb5,0x63,0xa7,0x98,0x2a,0x1b,0x8f,0x42,0xb2,0xf8,0xd8,0xf3,0x4a,0x5b,0x2c,0x10,0x64,0x88,0xa7,0x51,0x23,0xca,0x58,0xad,0x92,0x3d,0xa9,0x1f,0x3c,0x20,0x8d,
- 0x04,0x20,0xe2,0xe3,0xbb,0x69,0x18,0xc2,0xfb,0x4e,0xaf,0xd3,0x74,0x91,0x91,0x2f,0x0a,0x2f,0x6b,0xb9,0x32,0x11,0x74,0x06,0xdd,0x23,0x87,0xda,0xa1,0xe7,0x94,0x21,0x48,0x75,0x20,0x8d,
- 0x04,0x20,0xe9,0xbf,0xa7,0xbd,0x9b,0x54,0x54,0xe8,0xc8,0xae,0x78,0x99,0xa0,0xa3,0xf6,0x5d,0x78,0xe3,0x9e,0x5c,0xa7,0x18,0xb9,0x13,0x0c,0x04,0x9b,0xf3,0x7f,0x27,0x18,0xb0,0x20,0x8d,
- 0x04,0x20,0xec,0x82,0xc1,0x2f,0x8c,0xe8,0x1e,0x8e,0xce,0x00,0x2a,0x38,0x61,0x09,0x51,0x6e,0xf1,0xdd,0x4b,0x3d,0x64,0x95,0x72,0xee,0x7e,0x45,0xb8,0x17,0xfc,0x91,0xb2,0x1f,0x20,0x8d,
- 0x04,0x20,0xff,0xfc,0x02,0x19,0x7f,0x99,0x4e,0x6f,0x39,0x10,0x86,0x3f,0xe4,0xb6,0xd1,0xb0,0x6a,0x2c,0x4e,0x57,0xd4,0x08,0x61,0x18,0xfa,0x62,0x61,0x44,0xad,0x7c,0xdf,0xfc,0x20,0x8d,
- 0x04,0x20,0xff,0xd8,0x39,0x93,0x9a,0x94,0x57,0xcd,0x48,0xe3,0x3e,0x98,0x79,0xa6,0x3f,0x69,0x7e,0x36,0x10,0x70,0x8d,0xbc,0x15,0x08,0x64,0x51,0xc7,0x56,0x35,0x63,0xf3,0x93,0x20,0x8d,
- 0x04,0x20,0x06,0x42,0xf9,0x1f,0x80,0x8c,0x16,0xcf,0x73,0x9a,0xb1,0x50,0xcc,0x7e,0x11,0xf7,0x42,0xc3,0x83,0x59,0x39,0x92,0x6f,0xd8,0x20,0x4a,0x3d,0x5a,0x82,0x86,0xee,0xcf,0x20,0x8d,
- 0x04,0x20,0x0f,0xb9,0x71,0x05,0x64,0x83,0x2c,0x68,0x6a,0x9c,0xf0,0x4f,0xc3,0x90,0xcd,0x5c,0x73,0x9a,0xdd,0xb3,0xc6,0x42,0xca,0x09,0xbb,0xcc,0xfe,0x29,0x49,0x9f,0xc7,0x28,0x20,0x8d,
- 0x04,0x20,0x0c,0xa0,0x19,0x89,0xe0,0x8c,0x4a,0x83,0xae,0xce,0x5c,0xf9,0x73,0x24,0x25,0xe0,0x8d,0x01,0x2a,0xb1,0xac,0x8b,0x8a,0xe3,0xd5,0x3a,0x21,0x16,0x9f,0x96,0xf1,0x8e,0x20,0x8d,
- 0x04,0x20,0x0c,0xa0,0x19,0x8a,0x74,0x59,0x74,0x6e,0x26,0x69,0x90,0xca,0x65,0xe8,0x83,0xfc,0x25,0xec,0xe7,0xb6,0x85,0xf5,0xf8,0x37,0x08,0x42,0xbe,0xb0,0x38,0x4a,0x8e,0x2b,0x20,0x8d,
- 0x04,0x20,0x15,0x91,0xb2,0x2a,0x36,0x3a,0x0d,0xcf,0x8c,0xe7,0xc9,0x48,0xd8,0xf4,0xe1,0xa8,0x94,0x9f,0x97,0x20,0x72,0x70,0x6a,0x83,0x28,0xd2,0xe8,0x29,0x11,0xb6,0x0e,0x6c,0x20,0x8d,
- 0x04,0x20,0x19,0x2a,0x86,0x86,0x62,0x65,0x95,0x44,0x4e,0xb7,0x5e,0xe6,0x54,0x75,0xc5,0xe6,0x41,0x4e,0x7b,0x0c,0x20,0x1a,0xd5,0x26,0xbe,0x2b,0xdb,0x85,0xa8,0xc5,0xdc,0x3a,0x20,0x8d,
- 0x04,0x20,0x19,0x2a,0x86,0x86,0x62,0x9d,0x3f,0x41,0x4d,0x7f,0x3a,0xf1,0xa4,0xd2,0x9b,0x99,0xc2,0x62,0x22,0xa5,0x6d,0x6d,0xb1,0x29,0x3b,0x79,0xf1,0xe6,0xe2,0xaf,0x6d,0xfd,0x20,0x8d,
- 0x04,0x20,0x19,0x2a,0x86,0x86,0x62,0xc2,0xbd,0xcd,0xa2,0x34,0xc9,0x5e,0x0b,0xdb,0x6e,0x6e,0x92,0xa2,0x4f,0xf1,0x0a,0x59,0x6c,0x19,0x9c,0xd0,0xd8,0x3c,0x50,0x3b,0x41,0x27,0x20,0x8d,
- 0x04,0x20,0x1c,0xe0,0xbe,0xd4,0x48,0xe2,0x00,0xc5,0xf0,0x0d,0x65,0x08,0x59,0xc2,0x3f,0x09,0x4d,0x98,0x2c,0x14,0xc9,0x71,0xc8,0x8b,0x53,0x29,0xa8,0xb5,0x8c,0x7b,0x22,0xb0,0x20,0x8d,
- 0x04,0x20,0x23,0x33,0x80,0xcc,0x5a,0xeb,0x86,0x37,0x03,0x4f,0x8b,0x97,0xac,0xb5,0xf9,0xd0,0x2e,0xd8,0x9b,0xca,0xff,0xef,0x63,0x22,0x2c,0x3d,0x7e,0x83,0x39,0x14,0x10,0xc7,0x20,0x8d,
- 0x04,0x20,0x23,0x33,0x80,0xcc,0x5b,0x25,0x8f,0xfc,0xa0,0xef,0x50,0xeb,0x4b,0x2c,0xd7,0x89,0xf2,0x2b,0xe3,0x4f,0xe9,0x6a,0x93,0x19,0xff,0x69,0x92,0x1b,0x8b,0x13,0xbd,0x67,0x20,0x8d,
- 0x04,0x20,0x23,0x33,0x80,0xcc,0x5c,0xef,0x09,0x60,0xd5,0x10,0x6b,0x0d,0x33,0x5f,0x71,0x35,0x02,0xb9,0x19,0x4a,0xd6,0xe3,0xc7,0x34,0x27,0x40,0xc5,0x5d,0xfa,0xd1,0x23,0x28,0x20,0x8d,
- 0x04,0x20,0x23,0x33,0x80,0xcc,0x5d,0x0b,0x5e,0x1d,0x3b,0xc6,0x3f,0x78,0xe8,0x51,0x0e,0xbf,0x78,0xee,0x47,0xf8,0x6f,0x01,0xab,0x21,0x16,0xcc,0x52,0xe6,0xad,0xd4,0x02,0x02,0x20,0x8d,
- 0x04,0x20,0x2b,0xf3,0xe8,0xf5,0xef,0x90,0x14,0xab,0x61,0xe9,0x11,0x97,0x9f,0x18,0x4d,0xb4,0xff,0x89,0x94,0xf7,0x92,0x94,0x53,0xe6,0x9e,0xd4,0xdb,0x85,0x89,0x4d,0x3e,0xc9,0x20,0x8d,
- 0x04,0x20,0x38,0x1b,0x57,0x6c,0xf9,0x80,0x4e,0x28,0x33,0xb5,0x01,0xce,0x8e,0x83,0x62,0xcd,0xee,0x3b,0x0b,0xf5,0x9f,0x7c,0xfe,0x9a,0x3f,0x0a,0x0a,0x2a,0x91,0x60,0x85,0x23,0x20,0x8d,
- 0x04,0x20,0x3e,0x7e,0xe8,0x36,0x75,0x4f,0x00,0x38,0xda,0x70,0x03,0xde,0x23,0x02,0xe5,0x8a,0x02,0x6e,0xd3,0x91,0xa9,0x54,0xfb,0x2d,0xdb,0xbd,0x1f,0xd2,0x8a,0x98,0xae,0x16,0x20,0x8d,
- 0x04,0x20,0x44,0xf1,0x1b,0x9d,0x03,0xaa,0x5a,0x96,0x97,0xc8,0x66,0x71,0x48,0x41,0xaa,0x55,0xa2,0x81,0xa5,0xa4,0x0a,0x82,0xe5,0x5f,0x5d,0x93,0xb7,0x2a,0x43,0x65,0xc9,0x32,0x20,0x8d,
- 0x04,0x20,0x4c,0xdd,0xa4,0x94,0x32,0xb9,0xc3,0xec,0x54,0xe2,0x8c,0x52,0x31,0xc4,0xc1,0x02,0xa6,0x4f,0x4c,0xd2,0xc6,0xc5,0xbc,0xed,0xf1,0x94,0xbd,0xc3,0x34,0x66,0xab,0xab,0x20,0x8d,
- 0x04,0x20,0x57,0xda,0x1d,0xc7,0xe7,0xba,0x3a,0x4b,0xd6,0x3c,0xbb,0x2a,0xd4,0x2c,0xe5,0xb7,0x8e,0x44,0x7e,0x56,0xe4,0x6d,0x9d,0x4f,0xce,0x69,0xf8,0xfc,0x7a,0xc1,0x74,0x41,0x20,0x8d,
- 0x04,0x20,0x53,0xcd,0x56,0x48,0x48,0x8c,0x47,0x07,0x91,0x41,0x82,0x65,0x5b,0x76,0x64,0x03,0x4e,0x09,0xe6,0x6f,0x7e,0x8c,0xbf,0x10,0x84,0xe6,0x54,0xeb,0x56,0xc5,0xbd,0x88,0x20,0x8d,
- 0x04,0x20,0x5f,0xd5,0x6d,0xd5,0x32,0xe0,0x8b,0xd6,0x36,0x84,0x4a,0x4d,0x01,0x5e,0x36,0xf5,0xad,0x24,0xb0,0x01,0x5a,0xe1,0xb3,0xec,0x0c,0xc7,0x0b,0xd8,0x6f,0x63,0xf0,0x8c,0x20,0x8d,
- 0x04,0x20,0x67,0xc4,0x17,0xa5,0xcb,0x77,0xbd,0xaa,0x11,0x7f,0x8b,0xc0,0x81,0xf3,0xc0,0x96,0x9d,0x31,0x27,0x9c,0xad,0x6c,0x6d,0x98,0x42,0x70,0xdb,0x50,0x12,0x96,0x0b,0x36,0x20,0x8d,
- 0x04,0x20,0x63,0xac,0x1d,0x42,0xcf,0x49,0xa5,0xa0,0x7a,0x1b,0xc2,0x77,0x70,0x7d,0xb7,0x52,0xcb,0x29,0x51,0x7c,0xb7,0xf0,0xd7,0x37,0x18,0x15,0xb7,0x4c,0x39,0xe5,0xa6,0xef,0x20,0x8d,
- 0x04,0x20,0x65,0x98,0x55,0xd0,0x8a,0xe0,0x29,0xe6,0x5e,0xef,0xb7,0x8b,0x8f,0xc9,0x27,0x53,0x3d,0xd0,0x8c,0xa2,0xfa,0x32,0x2f,0xad,0xf9,0xdc,0xe2,0x4b,0x14,0x66,0x3e,0x23,0x20,0x8d,
- 0x04,0x20,0x89,0x60,0xc6,0xee,0x04,0xdf,0xa8,0x07,0xcd,0x57,0x38,0xea,0x8f,0xf1,0xfc,0x3e,0x23,0x93,0xa2,0x3e,0xa9,0xd9,0x90,0xe8,0xf0,0x8e,0x2e,0xe1,0xa0,0xdc,0x35,0x09,0x20,0x8d,
- 0x04,0x20,0x8c,0x8d,0x69,0xb5,0xd4,0x91,0x45,0xfc,0xe0,0xdc,0x84,0x99,0xb3,0x54,0x59,0x4d,0xfe,0x24,0x1c,0xfa,0x6a,0x70,0x90,0xa5,0x7b,0x85,0x44,0x9d,0xdc,0xdf,0xb3,0x2a,0x20,0x8d,
- 0x04,0x20,0x96,0x87,0xdd,0x04,0x33,0x9d,0x2c,0x25,0xed,0xe3,0x8d,0xb2,0x7b,0xbd,0x87,0x9d,0xdb,0xb4,0x9b,0x5b,0x38,0x2a,0x98,0x1b,0xa4,0xc1,0xac,0x79,0xa2,0xde,0x59,0xb0,0x20,0x8d,
- 0x04,0x20,0xa3,0xeb,0x33,0xe3,0xfc,0x39,0xaa,0x60,0xc1,0x1e,0xb6,0xf2,0x3d,0x31,0x62,0x3b,0x91,0xd9,0xd6,0xb6,0xf8,0x7a,0x77,0xb1,0x87,0x10,0xc6,0x3e,0x95,0xad,0xb4,0x51,0x20,0x8d,
- 0x04,0x20,0xb1,0xdd,0xb8,0x4b,0x84,0x82,0xe1,0x97,0x5c,0xf0,0x81,0x80,0xde,0x30,0xdd,0xe5,0x01,0xda,0x67,0x6c,0x57,0x16,0x9d,0xec,0x06,0xee,0xc8,0x8e,0x3a,0x35,0x6e,0x5b,0x20,0x8d,
- 0x04,0x20,0xb2,0x32,0x14,0x4f,0xbd,0xef,0x43,0x29,0x2e,0xd5,0xe0,0xa7,0x17,0x35,0xb2,0x32,0xbb,0x53,0xea,0xda,0x78,0xef,0xfa,0xfc,0x98,0xa2,0x2a,0xbc,0x51,0xd3,0x21,0x12,0x20,0x8d,
- 0x04,0x20,0xc4,0x58,0x41,0xc7,0x7d,0x9c,0xf9,0x68,0x15,0xb6,0x32,0x16,0xb9,0xdc,0xfd,0x0b,0x68,0xa2,0x51,0x57,0x4b,0xcc,0x6d,0xa7,0x2c,0x64,0xb0,0xb1,0xf5,0x66,0x93,0x7a,0x20,0x8d,
- 0x05,0x20,0xd7,0x7a,0x53,0x89,0xfe,0x02,0x6a,0x59,0xb7,0x0e,0xf8,0x6d,0x9d,0x81,0xbb,0x9f,0x01,0xc0,0xc4,0xee,0x7b,0x36,0x10,0x33,0x07,0xd2,0x29,0xd8,0xec,0xcd,0x8e,0xa3,0x00,0x00,
- 0x05,0x20,0xd7,0xf1,0x19,0x9e,0x7d,0x0f,0x43,0x97,0x33,0x56,0xe8,0x12,0x1d,0x7d,0xa0,0x4d,0x21,0x5a,0x60,0x73,0xc8,0x7e,0x10,0x55,0x60,0x56,0xbb,0x65,0x50,0xa4,0x17,0x59,0x00,0x00,
- 0x05,0x20,0xd9,0x9c,0x20,0xfe,0xc2,0xe6,0x6a,0x16,0x30,0x81,0x54,0xc9,0x3f,0x9a,0x89,0x10,0xa9,0x4b,0xf1,0x05,0x56,0xd5,0x04,0x2d,0xb7,0x6a,0x7b,0x67,0x8d,0xf0,0xbe,0x8f,0x00,0x00,
- 0x05,0x20,0xe1,0x44,0x2d,0x6e,0xd3,0xd9,0xf0,0x95,0x6c,0x52,0x2e,0x44,0x3c,0x27,0x3d,0x78,0xac,0x6e,0x8f,0x27,0x1c,0x0c,0xc0,0x78,0x22,0x3e,0xa1,0x84,0x01,0x42,0x08,0x5c,0x00,0x00,
- 0x05,0x20,0xe3,0xa5,0x88,0x11,0x4d,0x3d,0xfb,0x02,0xec,0x1f,0xda,0x48,0x86,0x12,0xf6,0x12,0xd9,0x3e,0x68,0x49,0xa7,0xae,0x37,0xfd,0x02,0x48,0x38,0x8b,0xdc,0xd4,0xa6,0x8f,0x00,0x00,
- 0x05,0x20,0xe5,0x19,0x24,0x71,0xab,0x61,0xb0,0xfe,0x44,0x4a,0x74,0x8d,0xca,0x90,0xc3,0xd6,0x24,0xb4,0xd5,0x03,0xe7,0xf3,0x4f,0xbe,0x12,0x72,0xd6,0xa0,0x4b,0x22,0x0b,0xe1,0x00,0x00,
- 0x05,0x20,0xf2,0x74,0x4c,0x90,0xc3,0xd9,0x34,0x4d,0x5f,0x6e,0xdb,0xdd,0x7d,0xef,0xa5,0xed,0x6e,0x59,0x9e,0x31,0x41,0x94,0x38,0x84,0xc5,0x08,0xd2,0x23,0xb3,0xa7,0xe0,0x2c,0x00,0x00,
- 0x05,0x20,0xf3,0x77,0xe5,0xa7,0x11,0xef,0x65,0x91,0x23,0xb8,0x32,0x06,0xcb,0xc0,0x91,0xf7,0x21,0x1d,0x70,0xbc,0x83,0x1b,0x86,0x34,0x35,0x31,0x0f,0x9f,0xc1,0x0d,0xbb,0x56,0x00,0x00,
- 0x05,0x20,0xfe,0xb0,0x99,0x79,0x95,0x58,0x71,0xb5,0x63,0xcc,0x33,0xeb,0x55,0x91,0x8c,0xb4,0x3a,0xf2,0x8b,0x2d,0x8e,0x47,0xbe,0x25,0x47,0x12,0xcd,0x14,0x48,0xf0,0x1d,0xea,0x00,0x00,
- 0x05,0x20,0x07,0x61,0x26,0xd7,0x6c,0x05,0xbf,0xf6,0x2d,0x8c,0xca,0xc4,0x65,0xd3,0xd3,0xb2,0x49,0xe9,0xcc,0x53,0x1e,0xca,0x77,0x84,0xb6,0x10,0x5e,0xc2,0x5a,0xfe,0x28,0xb3,0x00,0x00,
- 0x05,0x20,0x03,0xaa,0x47,0xe9,0xe2,0x77,0xeb,0xa5,0x72,0x27,0x23,0x8b,0x13,0x62,0x61,0x32,0xb5,0xb2,0x1b,0x5a,0x18,0xb2,0xf9,0x26,0x06,0x84,0xee,0x28,0x42,0xac,0xba,0xbc,0x00,0x00,
- 0x05,0x20,0x0a,0x26,0x27,0x23,0xdd,0xf3,0x56,0xbe,0x9e,0x9e,0xa7,0xc6,0x3c,0xc5,0x99,0xc4,0x87,0x3b,0x4d,0xb9,0x13,0x62,0x91,0xf2,0x25,0x1c,0x02,0x42,0x63,0xe3,0x63,0x7a,0x00,0x00,
- 0x05,0x20,0x0c,0x50,0x55,0x46,0x87,0x5a,0x8d,0x14,0xfb,0xa7,0x29,0x70,0x18,0xa6,0x29,0x80,0x8c,0x33,0x42,0x5a,0x8f,0xe4,0x84,0x64,0x3d,0x0e,0xb5,0xbd,0x36,0x34,0x42,0xb6,0x00,0x00,
- 0x05,0x20,0x17,0x0c,0x56,0xce,0x72,0xa5,0xa0,0xe6,0x23,0x06,0xa3,0xc7,0x08,0x43,0x18,0xee,0x3a,0x46,0x35,0x5d,0x17,0xf6,0x78,0x96,0xa0,0x9c,0x51,0xef,0xbe,0x23,0xfd,0x71,0x00,0x00,
- 0x05,0x20,0x18,0x31,0xb3,0x9a,0xf8,0x8c,0xec,0x99,0x2e,0x7d,0xe4,0x90,0xa2,0x54,0x27,0xbd,0xe5,0xc8,0x65,0xdf,0x1f,0xaa,0x8f,0xe9,0x0f,0x64,0x85,0x09,0xc3,0x70,0x62,0x13,0x00,0x00,
- 0x05,0x20,0x1d,0x3a,0xac,0x0e,0x8c,0x62,0x35,0xb0,0xa4,0xaf,0xf0,0x47,0xf7,0x5a,0x55,0x8a,0x12,0x69,0xff,0x27,0xad,0xd9,0x9e,0x9f,0xa5,0xec,0x9e,0x24,0x38,0x8e,0x24,0xed,0x00,0x00,
- 0x05,0x20,0x27,0x7a,0xaf,0x5a,0x9c,0xf4,0x72,0xfe,0x3c,0xdd,0x7a,0xba,0xd7,0x98,0x31,0xde,0x73,0xce,0x84,0x5b,0x41,0xe7,0x9a,0x6a,0xe2,0xc1,0x3b,0x5b,0x37,0x23,0xc7,0xdf,0x00,0x00,
- 0x05,0x20,0x20,0x90,0xe3,0xd3,0xad,0x87,0xeb,0x2a,0xd9,0x29,0x17,0x74,0x47,0xc9,0x54,0x57,0xfa,0x3d,0x71,0x02,0x11,0xb2,0xc3,0x87,0x31,0xb3,0x9b,0x6f,0x2e,0xfc,0x30,0xea,0x00,0x00,
- 0x05,0x20,0x22,0x56,0xd6,0x98,0x11,0x61,0xe1,0x5a,0x34,0x9f,0xe2,0x9d,0xf5,0x2b,0xbd,0xbc,0xcc,0x1c,0xf5,0x1d,0x68,0xa5,0xca,0xb1,0xb5,0x4b,0xf1,0xb5,0xff,0x1e,0xdd,0xc0,0x00,0x00,
- 0x05,0x20,0x29,0xf2,0xb7,0xee,0xf1,0x70,0x02,0xe3,0xb5,0x89,0x73,0x69,0xd4,0x40,0x19,0xb1,0xd6,0x10,0xd8,0xfd,0x13,0xe8,0x9a,0xdb,0x40,0xc8,0xa9,0xb9,0x46,0x03,0x11,0x12,0x00,0x00,
- 0x05,0x20,0x2d,0xfc,0xd7,0xed,0xc7,0x20,0x05,0x1d,0xcf,0xe6,0x5d,0x0b,0x38,0xc1,0xda,0x85,0xd6,0x30,0x84,0x13,0x35,0xb8,0x72,0x3d,0xff,0xa2,0xc3,0xc4,0xf6,0x38,0xef,0xc4,0x00,0x00,
- 0x05,0x20,0x31,0x0f,0x30,0x0b,0x9d,0x70,0x0c,0x7c,0xf7,0x98,0x7e,0x1c,0xf4,0x33,0xdc,0x64,0x17,0xf7,0x00,0x7a,0x0c,0x04,0xb5,0x83,0xfc,0x5f,0xa6,0x52,0x39,0x79,0x63,0x87,0x00,0x00,
- 0x05,0x20,0x39,0xca,0x8e,0x62,0x0a,0x36,0xa7,0x68,0x22,0xc4,0xcc,0x4a,0xa9,0x16,0x69,0x4b,0x8a,0x1c,0x5f,0x6e,0x4a,0x98,0xb6,0x95,0x82,0xb3,0x66,0x66,0xc5,0x29,0x3a,0xb0,0x00,0x00,
- 0x05,0x20,0x4e,0x77,0x2e,0x12,0x91,0x67,0x6b,0x94,0xc4,0x92,0x2f,0x19,0x67,0x7d,0xcd,0x47,0x02,0xad,0xf8,0x60,0x72,0xed,0x73,0xf1,0x10,0x99,0x2c,0x05,0x61,0x66,0x55,0xd9,0x00,0x00,
+ 0x02,0x10,0x2a,0x02,0xc2,0x07,0x30,0x06,0x31,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x07,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x10,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x11,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x16,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x1d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x20,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x22,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x23,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x9a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x9d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x0e,0xc0,0x00,0x00,0x09,0x28,0x00,0x00,0x00,0x00,0x07,0x01,0x07,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x04,0xee,0x41,0x00,0x86,0x50,0xb6,0xfa,0x75,0xa4,0xff,0xfe,0x3c,0x24,0x3f,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0xd0,0x12,0x04,0x2a,0x57,0x03,0x4d,0xc5,0x81,0x16,0x78,0x7c,0xe0,0x16,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0xd0,0x14,0x0a,0x55,0x40,0x01,0xf6,0xab,0xdd,0x5e,0x40,0x39,0xb4,0x6c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0xd0,0x18,0x0a,0x75,0x6c,0x00,0xc0,0x5b,0x4d,0x0a,0x36,0x58,0x10,0x30,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0x9a,0x07,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0xd8,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x0e,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0a,0xef,0x40,0x0e,0x44,0x9b,0x01,0x27,0x46,0xca,0x1e,0x67,0x88,0x35,0x1c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0b,0xf4,0xc0,0x00,0xc1,0x92,0x0e,0xb2,0x5a,0xda,0xff,0xfe,0x87,0x77,0xb4,0x20,0x8d,
+ 0x02,0x10,0x2a,0x10,0xc9,0x41,0x01,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0xa3,0x02,0x00,0x01,0xa1,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0xca,0x20,0x8d,
+ 0x02,0x10,0x2c,0x0f,0xf4,0xa8,0x00,0x0b,0xb1,0x08,0x80,0x7d,0xb2,0xd6,0x91,0x46,0x38,0xbe,0x20,0x8d,
+ 0x02,0x10,0x2c,0x0f,0xf4,0xa8,0x00,0x0b,0xb1,0x08,0xc4,0x58,0x5c,0x61,0xdc,0xca,0xcb,0x10,0x20,0x8d,
+ 0x05,0x20,0x46,0x3e,0x67,0x73,0x9d,0xe3,0xc3,0xc7,0xeb,0x2c,0x6a,0xad,0x13,0x49,0x1e,0xaf,0x9d,0x0a,0xf7,0x79,0xbb,0x58,0x05,0xe7,0xd1,0x69,0x52,0x46,0x5c,0xb3,0x03,0xca,0x00,0x00,
+ 0x05,0x20,0x4e,0xb5,0xd6,0xc5,0x8d,0x1d,0xaa,0x84,0x1d,0xe4,0xfa,0x03,0xe6,0x33,0xa7,0xfe,0xb6,0x23,0x7b,0x56,0x88,0x7f,0x56,0xd9,0xc5,0x73,0xeb,0xcf,0xea,0x84,0xde,0x6c,0x00,0x00,
+ 0x05,0x20,0x4e,0x99,0xdd,0x79,0x70,0x95,0x13,0x59,0xf8,0x3e,0xba,0xf8,0x87,0xe4,0x29,0x55,0x55,0x42,0x0a,0x38,0x26,0xea,0xa3,0x1a,0xce,0xf2,0x40,0x3a,0xe6,0x14,0xf9,0x7f,0x00,0x00,
+ 0x05,0x20,0x4e,0x9f,0x82,0x37,0x07,0x73,0xdf,0x24,0x92,0xe4,0x6e,0x5b,0x7a,0x9a,0x11,0x14,0xb8,0x1a,0x57,0x8d,0x94,0x85,0x37,0x58,0xcf,0x37,0x85,0x91,0xb9,0xdb,0x6e,0x11,0x00,0x00,
+ 0x05,0x20,0x4e,0xe9,0x2b,0xba,0xb7,0xfd,0x14,0xbf,0x73,0xb4,0xff,0xd3,0x41,0xe9,0x8f,0x64,0x55,0xf8,0xe0,0xfd,0xc0,0x2e,0xd7,0x7a,0x22,0x25,0x3f,0xf3,0xc1,0x77,0x55,0x26,0x00,0x00,
+ 0x05,0x20,0x4f,0x34,0x39,0x35,0x2b,0x37,0x2b,0x5d,0xee,0x72,0x39,0xa5,0xd4,0xe0,0xe0,0x67,0x9e,0xb2,0xee,0x54,0x4e,0xa4,0xdd,0x2b,0xc4,0xb7,0x26,0xc1,0x67,0x65,0x78,0x21,0x00,0x00,
+ 0x05,0x20,0x4f,0x26,0x98,0x96,0xed,0xb0,0x98,0x13,0xa9,0x17,0x64,0x16,0xd7,0x4c,0xc8,0x69,0xcb,0x73,0x14,0x75,0x48,0x0f,0x1f,0x61,0xbf,0x4f,0xe2,0xa0,0x8e,0x0d,0x31,0xf8,0x00,0x00,
+ 0x05,0x20,0x48,0x76,0x8a,0x23,0xe6,0x8b,0x56,0x91,0xa5,0x92,0xcf,0xe0,0x1a,0x4a,0x71,0x5f,0x6a,0xdd,0xa1,0xfb,0xa3,0xda,0xac,0x84,0x04,0x30,0x10,0xa5,0xc5,0x02,0xf8,0x8e,0x00,0x00,
+ 0x05,0x20,0x48,0x59,0x09,0x98,0xe7,0x07,0xcf,0x21,0x58,0x36,0x7a,0x3e,0xf9,0x68,0x6d,0x31,0xe1,0xa0,0xd6,0xe9,0x69,0x48,0x1e,0x99,0x6d,0x33,0x6a,0x64,0xb0,0x80,0x12,0x81,0x00,0x00,
+ 0x05,0x20,0x48,0xf9,0xb7,0x8b,0x4b,0xfe,0xc8,0xaf,0x1d,0x5a,0x9b,0xfc,0x74,0x60,0x03,0x07,0xc8,0x3f,0xd6,0x47,0x83,0xb4,0x5a,0xdc,0x26,0x06,0x86,0x0c,0x2c,0x46,0x39,0x71,0x00,0x00,
+ 0x05,0x20,0x48,0xfd,0xbb,0x1c,0x81,0x1f,0x71,0x45,0xcb,0xf1,0xdf,0x18,0x8d,0xad,0xad,0xa5,0x0f,0x0b,0xde,0x3c,0x5b,0x65,0xef,0xea,0x79,0x5a,0x23,0x4e,0x55,0x5f,0x3d,0xa3,0x00,0x00,
+ 0x05,0x20,0x49,0x3c,0x9a,0x79,0x07,0xc0,0x6e,0xce,0xd9,0x56,0xe8,0xc0,0x48,0x24,0x93,0xff,0x17,0x21,0x55,0x1c,0x5c,0xbb,0x66,0xf6,0xc5,0xfa,0x90,0x01,0x64,0xa6,0x30,0x0b,0x00,0x00,
+ 0x05,0x20,0x49,0x10,0x39,0x4d,0x76,0x1a,0xe7,0xed,0xad,0x34,0xf8,0x9a,0x9d,0x30,0xfc,0x2b,0x8b,0x89,0x25,0xa2,0xd5,0x85,0x54,0x2d,0xe7,0xc3,0x5f,0x11,0xfd,0x36,0xf7,0x18,0x00,0x00,
+ 0x05,0x20,0x49,0x1d,0x7e,0xb6,0x34,0xa3,0x9c,0xf2,0x0e,0x45,0x7d,0x1c,0x8f,0x2a,0xc4,0xb3,0x0e,0x10,0xc9,0xa7,0x2f,0xd4,0x80,0xea,0x1e,0x70,0x0b,0x51,0x1e,0xf5,0x63,0x5b,0x00,0x00,
+ 0x05,0x20,0x49,0x2f,0xbc,0x2a,0xda,0x6b,0x2d,0xf7,0x58,0xe6,0x0c,0xd0,0xee,0x95,0x75,0xfd,0x25,0xed,0x70,0x37,0xb3,0xf9,0xe6,0xc7,0xf1,0x3b,0x26,0x4a,0x26,0x2c,0x9d,0x6b,0x00,0x00,
+ 0x05,0x20,0x49,0x46,0x7f,0x75,0x1c,0x69,0xde,0x6e,0x38,0x2d,0x71,0x38,0x08,0x23,0x75,0xcd,0x42,0x8f,0x17,0x19,0x4a,0x74,0x42,0x7e,0x5b,0x83,0x34,0x60,0x89,0xab,0x5a,0xab,0x00,0x00,
+ 0x05,0x20,0x49,0xf5,0x0b,0xa9,0x30,0x69,0x93,0xa6,0x76,0x6d,0xd1,0x04,0x04,0x0c,0xb0,0x00,0xb8,0x0b,0x19,0xac,0x51,0xa4,0x04,0xb6,0x6e,0x84,0xbb,0x08,0x61,0x33,0x7f,0x71,0x00,0x00,
+ 0x05,0x20,0x49,0xfe,0x4a,0xf0,0x1d,0xc9,0x72,0xc2,0x60,0x8a,0x43,0x4f,0x30,0xc0,0xa8,0xf0,0xbf,0x73,0xd4,0x5c,0x64,0x86,0xfc,0x23,0xdf,0x4e,0xe5,0x75,0xfa,0x3c,0xe5,0x15,0x00,0x00,
+ 0x05,0x20,0x4a,0x02,0x0b,0x7f,0x0d,0x0b,0x6f,0x42,0x42,0x58,0xfa,0xbe,0x9c,0x55,0xc9,0xf2,0xc7,0x90,0xd0,0x4a,0x7b,0xcb,0x7e,0xd9,0xd9,0x9f,0xd8,0x59,0xa0,0xf8,0xed,0x45,0x00,0x00,
+ 0x05,0x20,0x4a,0x04,0x2e,0xaa,0xd8,0xe4,0xeb,0xc4,0xe9,0xad,0xf1,0x8a,0x14,0x4b,0xe4,0xf0,0xef,0x8d,0x28,0x75,0x24,0xf7,0x97,0xdc,0x61,0xc3,0xff,0xc3,0xf4,0xcf,0x6d,0xe9,0x00,0x00,
+ 0x05,0x20,0x4a,0x18,0x3c,0x0c,0x59,0x9f,0x89,0xa5,0x88,0x84,0xcb,0x9e,0xd5,0xf0,0xa6,0xcf,0xe1,0xa4,0x92,0x10,0x3a,0xe0,0x0b,0xc4,0xc4,0x6e,0xf6,0xea,0x5d,0x5d,0xfd,0xd1,0x00,0x00,
+ 0x05,0x20,0x4a,0x40,0xd3,0x2f,0xc7,0xe3,0xf1,0xa7,0x8f,0x46,0xb0,0x18,0x78,0x2e,0x58,0x66,0x28,0xe1,0x31,0xe8,0x73,0x48,0x86,0xe4,0xbd,0x08,0x7b,0x0a,0xd4,0x69,0xce,0x60,0x00,0x00,
+ 0x05,0x20,0x4a,0xbb,0xec,0xec,0xa4,0x0b,0xc4,0xef,0x44,0x2a,0x7e,0x73,0x5d,0xa6,0x59,0x2f,0x1f,0x7e,0xd3,0x33,0x63,0xaf,0x95,0x3e,0x52,0xfb,0x2e,0xdc,0xc1,0x6f,0x90,0xd6,0x00,0x00,
+ 0x05,0x20,0x4a,0x8b,0x40,0x25,0xdc,0x06,0x2a,0xed,0x44,0x35,0xec,0x06,0x9e,0x73,0x70,0xf0,0x07,0x06,0x35,0xd1,0x60,0x4f,0x22,0xe8,0xbf,0x8a,0xdf,0xd9,0xeb,0x97,0x73,0x06,0x00,0x00,
+ 0x05,0x20,0x4a,0xaa,0x4c,0x6a,0xa5,0x1c,0xdd,0xaa,0x0a,0x83,0x47,0x12,0xb3,0x48,0x2f,0x62,0xd7,0x2d,0xd2,0xcc,0x5a,0x92,0xe6,0x94,0xea,0xee,0x18,0x86,0xaa,0xd9,0xb2,0x35,0x00,0x00,
+ 0x05,0x20,0x4a,0xf9,0x58,0xf5,0x40,0x17,0xda,0x9c,0x2e,0x68,0xab,0x7f,0x49,0xf4,0x05,0xc4,0x3a,0x87,0xe4,0x5d,0xb3,0xae,0xbe,0x77,0x5b,0x23,0x1c,0x3b,0xa2,0xe2,0x46,0xf3,0x00,0x00,
+ 0x05,0x20,0x4b,0x08,0x12,0xae,0x87,0x8a,0xfc,0x01,0xf5,0xf3,0xe2,0x1e,0x4a,0x97,0x66,0xd8,0x39,0x38,0x8a,0x9f,0x05,0xc0,0xb7,0xd0,0x2f,0x52,0x23,0xec,0xae,0xce,0xab,0x3b,0x00,0x00,
+ 0x05,0x20,0x4b,0x47,0x1e,0xa3,0x90,0x3d,0xe5,0xe0,0x03,0x41,0x85,0x68,0x58,0x9a,0x73,0x87,0x88,0xd0,0x57,0x06,0x3a,0x3b,0xc1,0xc0,0xb4,0x55,0x35,0x06,0xca,0x63,0x80,0x3a,0x00,0x00,
+ 0x05,0x20,0x4b,0x9e,0x8b,0x6a,0x74,0x7f,0x4f,0xdb,0x9f,0x47,0xb1,0x0b,0xc7,0x15,0x66,0x92,0x81,0x60,0xbc,0xac,0x95,0xa8,0x1d,0x21,0xd2,0x64,0x1c,0x22,0x25,0x09,0x1f,0x0a,0x00,0x00,
+ 0x05,0x20,0x4c,0x49,0x19,0xed,0xda,0x89,0xc2,0xa7,0xc2,0x98,0x0d,0x8d,0xf9,0xc3,0x81,0x1d,0x57,0x72,0x1f,0xcb,0x6a,0xc5,0x1e,0x8c,0x64,0xba,0xa8,0x6a,0x55,0x1a,0x5e,0x9f,0x00,0x00,
+ 0x05,0x20,0x4c,0x5c,0x1a,0x10,0x46,0x65,0x29,0x06,0x3c,0x72,0x0d,0xec,0x18,0x11,0x63,0x9e,0xbf,0xbe,0x88,0xc2,0x23,0x1a,0x67,0x02,0x4d,0x08,0x54,0x3c,0xea,0x85,0x1a,0xd9,0x00,0x00,
+ 0x05,0x20,0x4c,0x6a,0x6d,0x6a,0xf5,0x0b,0x13,0x88,0xaa,0x06,0xfb,0x23,0xed,0x6b,0x27,0x68,0xc1,0xb4,0x26,0x74,0x07,0xba,0x28,0x34,0xd6,0x8d,0x48,0xdf,0xc8,0xbd,0xc8,0xff,0x00,0x00,
+ 0x05,0x20,0x4c,0x8d,0xc1,0xca,0xf5,0x32,0x45,0x0c,0xec,0x5a,0x81,0xa7,0x64,0x71,0x0f,0xda,0xf8,0xde,0x1d,0x77,0x70,0xc3,0x53,0x51,0x56,0x02,0x1f,0x81,0x59,0xda,0xf6,0x68,0x00,0x00,
+ 0x05,0x20,0x4c,0xf7,0xda,0x58,0x2b,0xed,0xaf,0xf7,0xb9,0xb8,0xbb,0x98,0xa9,0x45,0x29,0x97,0xf3,0x8e,0xe3,0x0c,0xac,0xe8,0x3d,0xb5,0x8e,0x34,0xfe,0x24,0x7e,0xf7,0x5b,0x35,0x00,0x00,
+ 0x05,0x20,0x4d,0x40,0xe3,0xef,0x62,0x78,0xb2,0xff,0x6b,0xcb,0x1d,0xa3,0xc0,0x64,0xfc,0x38,0x7a,0x24,0xb2,0xeb,0x0e,0x76,0x38,0x6c,0x57,0x44,0x86,0xbc,0xb7,0xf9,0xd7,0x49,0x00,0x00,
+ 0x05,0x20,0x4d,0x56,0x9f,0xc3,0x17,0x13,0x1c,0xb2,0xff,0xd6,0x69,0x31,0x56,0x0e,0xf1,0x7a,0x09,0x99,0x5d,0x48,0x43,0x00,0xfb,0x5c,0x23,0x0a,0x2d,0xa7,0x9e,0xab,0xc2,0x42,0x00,0x00,
+ 0x05,0x20,0x4d,0xa0,0xba,0xc1,0x85,0xab,0x86,0xd8,0xc9,0x63,0x26,0x90,0x38,0x4f,0x5d,0x85,0xd1,0x8a,0x9a,0x03,0x5c,0x75,0x0e,0x51,0xc3,0xec,0xbc,0xb5,0x31,0x64,0x63,0xf0,0x00,0x00,
+ 0x05,0x20,0x4d,0xd2,0x2f,0xb8,0x9a,0xe5,0x6e,0x32,0x3d,0x45,0xaa,0xf7,0xee,0xc0,0xb6,0x8d,0xc4,0x01,0xe8,0xbb,0x4f,0x36,0x56,0x96,0x82,0x3c,0xeb,0x08,0x2a,0x03,0xd4,0x73,0x00,0x00,
+ 0x05,0x20,0x57,0x18,0x23,0xf7,0x6c,0xfe,0xb3,0x5f,0xa4,0x63,0x06,0xde,0xe0,0x6b,0x2d,0xf8,0x51,0xb4,0x80,0x50,0xb1,0x43,0xce,0xbc,0x84,0x02,0xee,0x13,0xe2,0x43,0x76,0x45,0x00,0x00,
+ 0x05,0x20,0x57,0x1e,0x99,0xf9,0x9a,0xe8,0xc5,0x76,0xbb,0x74,0x19,0x15,0xe8,0x82,0x4e,0x76,0x7b,0x99,0xc1,0xb8,0xb0,0x36,0x5d,0x3a,0xcf,0xa8,0x93,0x9a,0xa2,0x46,0xfb,0x4c,0x00,0x00,
+ 0x05,0x20,0x57,0x41,0x19,0x7c,0xf2,0x89,0x68,0x10,0x0e,0x2e,0x27,0x4f,0xf7,0x61,0xe9,0x6c,0x2c,0x8f,0x57,0x55,0xbd,0xf1,0xe8,0xb1,0xb2,0xfe,0x68,0x12,0xfb,0xc0,0x45,0x43,0x00,0x00,
+ 0x05,0x20,0x57,0x88,0x49,0x1e,0x4a,0xe5,0x4b,0xbe,0x07,0xa6,0x2b,0x62,0x0c,0xf1,0xfd,0x80,0x7d,0x21,0x57,0x8a,0xb7,0x88,0x85,0xcc,0x81,0x22,0xfa,0x4b,0xdb,0xca,0x23,0xdf,0x00,0x00,
+ 0x05,0x20,0x57,0x8d,0x3f,0x72,0xe1,0xc7,0x50,0x66,0x2d,0xbd,0x39,0x45,0x4c,0xc9,0xf3,0xd4,0xda,0x34,0x33,0x31,0x1d,0x53,0xee,0xe1,0xdf,0xf1,0xf5,0xa3,0x77,0x07,0x5d,0x52,0x00,0x00,
+ 0x05,0x20,0x57,0xd4,0x26,0xc6,0x04,0xde,0x03,0x0a,0x6a,0xdb,0x28,0x16,0x8f,0xe4,0x97,0x9f,0x9a,0x0f,0xbb,0xae,0xf7,0x63,0x7f,0x17,0xae,0x86,0x41,0xa5,0xb9,0xb2,0x8e,0x3c,0x00,0x00,
+ 0x05,0x20,0x50,0x41,0x61,0x20,0x98,0x22,0xed,0x64,0x4e,0x29,0x75,0xbb,0xbf,0xe5,0xec,0x1a,0x9a,0x2b,0x22,0x1c,0xd4,0x4e,0x93,0x03,0x16,0xeb,0xbf,0x4e,0xfb,0x4c,0x56,0xb6,0x00,0x00,
+ 0x05,0x20,0x50,0xa0,0xa7,0x4c,0xef,0x59,0x18,0x05,0x21,0xe5,0x79,0x00,0x9b,0xb2,0x9c,0xbc,0xa5,0x97,0x82,0xef,0x7c,0x4d,0x3a,0x57,0xb3,0x31,0x46,0x08,0x11,0x26,0xd4,0xa1,0x00,0x00,
+ 0x05,0x20,0x50,0xe2,0x20,0xc7,0xd6,0x36,0x82,0x9f,0x39,0x0f,0x90,0x49,0x0c,0x78,0x2f,0xdd,0x7e,0x38,0x3e,0x67,0xf0,0x8e,0x4a,0xa3,0x12,0x65,0x5d,0xc0,0x8e,0x60,0xf9,0x46,0x00,0x00,
+ 0x05,0x20,0x51,0x0e,0xe9,0x30,0xca,0xff,0x8b,0x76,0xa7,0x16,0x82,0x53,0xe6,0xc2,0x5c,0x71,0xcd,0xc3,0xca,0x93,0x5a,0x47,0x94,0xbb,0x92,0x95,0x8f,0x75,0xa7,0xab,0xec,0xc4,0x00,0x00,
+ 0x05,0x20,0x51,0xef,0x1a,0x38,0x0e,0x67,0xd3,0x47,0x09,0x4a,0x76,0xa6,0x1b,0xc1,0xdb,0x0b,0x62,0x96,0x3a,0x09,0x38,0xdc,0x01,0xe3,0x78,0xc4,0x79,0x00,0x0b,0x3c,0x93,0x99,0x00,0x00,
+ 0x05,0x20,0x52,0x40,0x0d,0xe5,0x6f,0xe4,0x90,0xf2,0xdd,0x0a,0x51,0x26,0x6a,0xae,0xfc,0x75,0xe1,0xd7,0x2b,0xbf,0x41,0x6e,0x46,0x85,0x04,0xb3,0x25,0x12,0x5b,0xcb,0x15,0xbf,0x00,0x00,
+ 0x05,0x20,0x52,0x6b,0x1c,0x98,0x4a,0x04,0x83,0xdf,0xe2,0x07,0x5d,0x2a,0x90,0xae,0xfa,0x69,0xaf,0x29,0xd1,0x85,0x37,0xa9,0x42,0xe7,0xac,0x17,0xf3,0x82,0x4d,0x49,0x5c,0x7e,0x00,0x00,
+ 0x05,0x20,0x52,0x90,0x79,0x1f,0x45,0x05,0xb4,0x6b,0xa1,0x7e,0x44,0xf8,0x65,0xb9,0x7c,0xa6,0xfe,0x21,0x46,0x94,0xcc,0xa9,0x2c,0x21,0x50,0xa6,0x58,0xa2,0x95,0x3b,0xb3,0x7d,0x00,0x00,
+ 0x05,0x20,0x53,0x36,0x1e,0xa7,0xc2,0x84,0x45,0x02,0x58,0x6f,0xa5,0x48,0x80,0xbe,0x76,0xe9,0x8d,0x4b,0x2a,0x76,0x03,0x77,0xe4,0xad,0xd6,0xe5,0xf0,0xa7,0x9b,0x43,0x34,0x7c,0x00,0x00,
+ 0x05,0x20,0x53,0xde,0x27,0x47,0xbc,0x52,0x8c,0x4f,0x08,0xd0,0xe7,0xdb,0x92,0x55,0x65,0x89,0xc3,0x74,0x34,0xc2,0x49,0x58,0xad,0x11,0x8a,0x88,0xc0,0x44,0xbd,0x17,0x54,0x07,0x00,0x00,
+ 0x05,0x20,0x54,0x94,0x81,0xae,0x6c,0x0a,0x0c,0xfd,0x12,0x6f,0xe3,0xc6,0xbf,0x7d,0x44,0xd4,0x32,0x94,0xdb,0xde,0xb4,0x00,0x88,0xe6,0x3c,0xb3,0x74,0x07,0xc3,0x8e,0xf8,0x54,0x00,0x00,
+ 0x05,0x20,0x54,0xaf,0x74,0x35,0x24,0xdf,0x7f,0x91,0x4d,0x4e,0x0d,0x9b,0x79,0x63,0x9c,0x18,0xd1,0x58,0x7f,0x0f,0xd3,0x76,0xde,0x99,0xcf,0x57,0x1c,0xa4,0x47,0x55,0x31,0xc0,0x00,0x00,
+ 0x05,0x20,0x54,0xe8,0x0d,0xa7,0x9b,0x42,0x6e,0x73,0x9c,0xa4,0x5a,0x64,0xfd,0xe9,0x43,0x45,0x10,0x2e,0xb5,0x6d,0x2b,0x55,0x7d,0x90,0x0b,0xc7,0xdc,0x9a,0x83,0x95,0xb2,0x9d,0x00,0x00,
+ 0x05,0x20,0x55,0x33,0x4f,0xec,0xd9,0xaa,0xda,0xe3,0x70,0x43,0x98,0xd5,0xf2,0x0c,0x34,0x95,0xe3,0xc7,0xa0,0xca,0x6d,0x6c,0x6d,0x05,0x2e,0xf2,0xf9,0xea,0x1a,0x46,0x64,0x67,0x00,0x00,
+ 0x05,0x20,0x55,0xb7,0x5f,0x1a,0x1d,0x91,0x18,0x69,0xf0,0xc6,0xf2,0x27,0x46,0x6e,0x13,0x06,0x16,0x06,0xe1,0xc5,0xfd,0x9b,0xe0,0xb4,0x2d,0x30,0xc8,0x1c,0x72,0xe8,0xbd,0x1c,0x00,0x00,
+ 0x05,0x20,0x5e,0xfd,0xc6,0xd0,0x76,0x72,0x7d,0xb2,0x93,0xad,0x92,0x58,0xd4,0x22,0x8d,0xf6,0xc9,0xbc,0x08,0x70,0x8a,0x70,0xa6,0x84,0xa8,0xbd,0xe7,0x12,0x76,0x4f,0xbf,0xcc,0x00,0x00,
+ 0x05,0x20,0x5e,0xc0,0x23,0xf6,0xc1,0x1d,0xf6,0xde,0xb6,0x1d,0xdc,0xab,0xe9,0x80,0xc8,0x4c,0x43,0x22,0x6d,0xb6,0x06,0x8c,0xa8,0x67,0xae,0x4f,0xc0,0x82,0xe0,0x08,0xcb,0xc5,0x00,0x00,
+ 0x05,0x20,0x5f,0x4a,0x89,0x83,0x91,0xfb,0x50,0x88,0xec,0xf7,0x65,0x3e,0xcc,0x8a,0xd1,0x41,0xae,0x86,0xaa,0x2d,0xe3,0xa0,0x42,0x30,0x23,0x51,0x80,0xef,0xab,0x58,0xcc,0xce,0x00,0x00,
+ 0x05,0x20,0x5f,0x5c,0x15,0x2b,0xf9,0xcb,0x9f,0xb6,0xe6,0x6d,0x9f,0x90,0x9a,0x1b,0x3c,0x72,0xa1,0x2c,0x1c,0xe1,0xeb,0xbc,0x65,0x06,0x0e,0x9c,0xcd,0x0c,0xe7,0x22,0x35,0x56,0x00,0x00,
+ 0x05,0x20,0x58,0x11,0xbe,0xef,0x99,0xf6,0x65,0xa9,0xd1,0x59,0x45,0xc6,0x03,0x44,0x48,0x26,0x68,0xcd,0x05,0x58,0xa0,0x24,0xad,0x4a,0x37,0x4c,0x5b,0xef,0xe2,0x9c,0x17,0x7e,0x00,0x00,
+ 0x05,0x20,0x58,0x50,0x5d,0xb0,0xc6,0xd0,0x74,0x88,0xf4,0x6a,0xcf,0xe9,0xe4,0x02,0x63,0x8d,0x11,0xa3,0xe8,0x1e,0xe5,0x56,0xc2,0x94,0x45,0x34,0x1a,0xf4,0xd2,0xb6,0xc8,0x2e,0x00,0x00,
+ 0x05,0x20,0x59,0x29,0xbf,0x85,0xf3,0xa5,0x29,0xdd,0xff,0xec,0x47,0xc4,0x1e,0xcf,0x55,0x95,0x38,0x72,0x48,0x2b,0xc5,0xd7,0xdc,0xbe,0x6d,0x6a,0xb9,0x57,0x0c,0xee,0xad,0x88,0x00,0x00,
+ 0x05,0x20,0x59,0x69,0x5c,0xe7,0x22,0x25,0x10,0xae,0xd3,0xaf,0x68,0xf4,0x8f,0x7c,0x0c,0x21,0x88,0xbe,0xd0,0x1a,0x8c,0x5a,0xd1,0x5d,0x58,0xc0,0xbe,0x13,0xcc,0x90,0xfe,0xc0,0x00,0x00,
+ 0x05,0x20,0x59,0x9e,0xe4,0xbd,0xc8,0xbf,0xf2,0x3f,0x0c,0xef,0x77,0x4e,0x38,0xb6,0xcc,0xe5,0x09,0x84,0xd5,0x1f,0x98,0x5d,0x3e,0x42,0x50,0xc0,0x55,0xba,0x3e,0x8e,0x13,0x5e,0x00,0x00,
+ 0x05,0x20,0x59,0xff,0x04,0xb9,0x81,0x13,0x10,0x45,0x56,0xbe,0x6a,0x33,0xd2,0x15,0x71,0xef,0x44,0xd1,0xed,0xd7,0xbf,0xdb,0x4a,0x4b,0xd5,0x61,0x0f,0x02,0xb8,0x71,0xf7,0xf2,0x00,0x00,
+ 0x05,0x20,0x59,0xe8,0xfa,0x6d,0xd6,0x3d,0x05,0xf8,0x5a,0xb8,0x28,0x32,0x65,0x04,0x4c,0x8f,0xe4,0x97,0xf6,0x10,0xbb,0xe5,0xfd,0xea,0xb8,0xee,0xab,0xef,0x96,0x4d,0xe9,0xa9,0x00,0x00,
+ 0x05,0x20,0x5a,0x39,0x5a,0x3a,0xa0,0x2d,0xd3,0x12,0xf7,0x8a,0xa9,0x4d,0xb6,0x26,0x26,0xd3,0x08,0x19,0x78,0x83,0x7a,0xfb,0x88,0xc7,0x43,0x71,0xc6,0x3a,0x99,0x97,0x4e,0x2b,0x00,0x00,
0x05,0x20,0x5a,0x29,0xfe,0x8a,0xaa,0x9d,0x78,0x81,0x04,0x53,0x37,0xf5,0x6f,0xb6,0xe1,0x57,0x08,0x80,0xcf,0xf6,0x03,0x11,0x92,0x8d,0x08,0xe3,0x99,0x9f,0x98,0x4a,0x27,0x6b,0x00,0x00,
+ 0x05,0x20,0x5b,0x16,0x5d,0xe1,0x38,0x37,0x06,0x98,0x87,0xf6,0x9e,0x59,0x10,0xf0,0xa1,0x53,0xa3,0x00,0x83,0xea,0xe2,0xea,0xaf,0x82,0xfc,0x73,0x01,0x8e,0x30,0x38,0x9d,0x1e,0x00,0x00,
+ 0x05,0x20,0x5b,0xc0,0xbf,0x7e,0xc7,0x8b,0x90,0xfd,0x8b,0x58,0x4f,0x0b,0x70,0x83,0x09,0xe7,0x87,0xb9,0xc7,0xae,0x96,0x20,0xe3,0x78,0x8b,0xeb,0x7c,0x29,0xaa,0x63,0x68,0x15,0x00,0x00,
+ 0x05,0x20,0x5b,0xc8,0xa9,0xb9,0xb1,0xd5,0x30,0x87,0x1e,0x99,0x46,0xfb,0x23,0xcd,0x3b,0x70,0x01,0xff,0xc5,0x4b,0x64,0x24,0x8a,0xd3,0x03,0xba,0x85,0x75,0x10,0x1a,0x1d,0xa9,0x00,0x00,
+ 0x05,0x20,0x5b,0xca,0x5c,0x11,0x32,0x55,0xac,0x07,0xe8,0xce,0xfb,0x98,0xc6,0x47,0x04,0xbe,0x81,0x49,0xad,0x4c,0x13,0x5a,0xf5,0x6a,0x6c,0xf0,0x11,0x3b,0x88,0x0b,0xb4,0x4e,0x00,0x00,
+ 0x05,0x20,0x5b,0xe0,0xa3,0x04,0x8a,0xd8,0x91,0xbb,0x72,0x0e,0x0b,0xc9,0x02,0x3d,0x2e,0x8e,0xc3,0x45,0x67,0xbd,0xec,0x72,0xb6,0x18,0xe2,0x57,0x1d,0xfb,0x58,0x3f,0x02,0x72,0x00,0x00,
+ 0x05,0x20,0x5b,0xe2,0x66,0x28,0x5c,0xec,0xc9,0xf9,0x2a,0xff,0x89,0x4a,0xfc,0xff,0x42,0x07,0x45,0xbc,0x8c,0xdb,0x98,0x02,0x85,0x48,0x61,0x70,0x1d,0xdb,0x72,0xc2,0x25,0x3a,0x00,0x00,
+ 0x05,0x20,0x5c,0x1b,0xbd,0x28,0xc8,0x17,0x04,0x86,0x8b,0x10,0x5e,0x02,0xfb,0x07,0x16,0x14,0x5d,0x61,0x5d,0x92,0x11,0x44,0xce,0x32,0x13,0xe1,0x4c,0xfd,0x72,0x12,0xde,0x37,0x00,0x00,
0x05,0x20,0x5c,0x40,0x7f,0x80,0x43,0x91,0x9c,0xfc,0x04,0xdc,0xdc,0x8e,0x01,0xda,0xc8,0xaf,0x90,0x62,0x64,0x16,0xf7,0x11,0xe4,0x87,0xac,0xa4,0x06,0x6f,0x8d,0x87,0x4e,0xd6,0x00,0x00,
+ 0x05,0x20,0x5c,0xbb,0xa4,0xff,0x86,0xb4,0xe5,0x18,0x1d,0x66,0x80,0x80,0x8d,0x09,0x2b,0xd4,0x44,0x8a,0x95,0x01,0xfa,0x72,0xea,0x8b,0x9c,0xef,0x0f,0xe9,0xc3,0x68,0xf2,0xbf,0x00,0x00,
+ 0x05,0x20,0x5c,0xba,0xe9,0xbf,0xac,0xc0,0x59,0x78,0x48,0x04,0x02,0x07,0xfb,0x2d,0xd1,0x46,0xa8,0xa4,0x10,0x87,0x8f,0xb9,0xc0,0x0d,0x25,0xb0,0xef,0x4b,0xfd,0x37,0x5d,0x4c,0x00,0x00,
+ 0x05,0x20,0x5c,0xe6,0x36,0x85,0x74,0xae,0x03,0x90,0xa6,0x1d,0xd4,0xfb,0x50,0x8d,0x4a,0xdb,0xeb,0x91,0x7b,0x38,0x46,0x9c,0x94,0x7f,0x09,0x1b,0xc4,0x69,0x9b,0x3f,0xde,0x83,0x00,0x00,
+ 0x05,0x20,0x5d,0x1a,0xab,0x05,0x64,0xb2,0xe7,0x58,0x72,0x4f,0x9f,0xd3,0xda,0x69,0xa5,0x7c,0x30,0xd1,0xd4,0xc4,0x7a,0xfe,0x41,0xa9,0x11,0xa6,0xf5,0xa6,0x32,0x6f,0xc6,0x97,0x00,0x00,
+ 0x05,0x20,0x5d,0x46,0x18,0x02,0xa6,0x1b,0x99,0xd3,0xf4,0x64,0x6d,0x94,0xc1,0xda,0x4b,0x2e,0x6e,0x25,0x17,0xc4,0x18,0xec,0x55,0x91,0x61,0x71,0xbf,0x33,0x3b,0x4c,0xfd,0x24,0x00,0x00,
+ 0x05,0x20,0x5d,0x93,0x10,0x3d,0x45,0x25,0xd3,0x84,0xc0,0xba,0x8c,0x47,0x1e,0x18,0xe7,0xbb,0x17,0x1d,0xa4,0x78,0x34,0x9c,0xd2,0x4c,0xd3,0x39,0x0c,0xba,0xb2,0x34,0xed,0xfd,0x00,0x00,
+ 0x05,0x20,0x5e,0x0d,0xaf,0x49,0x2a,0x15,0xfa,0x82,0x0f,0xa0,0xe0,0x3e,0x91,0xdd,0x85,0x23,0xd6,0x51,0x36,0x97,0xd9,0x69,0x7e,0xc6,0x57,0xca,0x99,0xd6,0x18,0x21,0x92,0xd7,0x00,0x00,
+ 0x05,0x20,0x5e,0x20,0xcc,0x1a,0x22,0xf1,0xa8,0x9b,0x83,0x97,0x5b,0x6d,0x05,0x53,0x75,0x99,0x54,0x18,0xcb,0x23,0x42,0x23,0x20,0x19,0xbe,0xb8,0xf5,0x8b,0x71,0x55,0x70,0xe3,0x00,0x00,
0x05,0x20,0x5e,0x69,0x4f,0x31,0x33,0xa7,0xea,0x3e,0xf4,0x7a,0x0a,0x1e,0x74,0x09,0x07,0xa1,0x50,0xf7,0x03,0xf5,0xc6,0x19,0xeb,0x95,0xaa,0x63,0x17,0x10,0x6e,0x68,0xca,0x10,0x00,0x00,
+ 0x05,0x20,0x66,0x95,0xf0,0x25,0x09,0xd5,0xaa,0x62,0xbe,0x41,0x36,0xf5,0x9a,0x3a,0x21,0x92,0x67,0xfd,0x23,0x04,0xdb,0xb3,0x9f,0x0c,0x38,0xbc,0xd3,0xdf,0x96,0xff,0xbc,0xa1,0x00,0x00,
+ 0x05,0x20,0x66,0xce,0xb6,0x27,0x46,0xce,0x84,0xee,0x9a,0x9c,0x94,0xb7,0x64,0xf0,0x3f,0x20,0x48,0x6d,0x5c,0x2a,0x8c,0x7d,0xd7,0x1a,0xf5,0x3b,0x7f,0xea,0x5d,0xa0,0xec,0x18,0x00,0x00,
+ 0x05,0x20,0x67,0x1d,0xa5,0x34,0x71,0xff,0x44,0xbb,0x91,0x96,0x0c,0x3a,0xcf,0x55,0xae,0x57,0xc8,0x88,0x48,0xe5,0xe6,0xac,0x94,0xd4,0x06,0xf8,0xe7,0x6b,0xcc,0x05,0xb9,0xe2,0x00,0x00,
0x05,0x20,0x67,0x82,0xfc,0x36,0xea,0xae,0x95,0x3b,0x5d,0x46,0xf3,0xf4,0x6c,0x50,0x69,0x29,0xc7,0x47,0x87,0xca,0xa6,0x40,0x12,0x40,0x6d,0x12,0x94,0x35,0x17,0x8a,0xba,0x56,0x00,0x00,
- 0x05,0x20,0x67,0xab,0xce,0xf2,0xe3,0xf3,0xf6,0x19,0xf6,0x56,0xa2,0x4c,0xca,0x91,0x4b,0x93,0xfe,0xbc,0x85,0x50,0x5c,0x20,0x51,0x69,0xfb,0xf0,0x92,0xbb,0x57,0xa3,0x0d,0x05,0x00,0x00,
- 0x05,0x20,0x62,0xcc,0x44,0x66,0x31,0x76,0x1b,0x43,0xbe,0xe1,0xc9,0x1d,0x20,0x26,0x7d,0xa7,0x06,0x31,0x57,0x0d,0xb9,0x58,0x20,0xb3,0xca,0xb2,0x5e,0x0a,0x15,0x0b,0xba,0x0d,0x00,0x00,
+ 0x05,0x20,0x61,0x3d,0x7d,0x3f,0x8c,0xf2,0x6d,0xb1,0x5d,0x1a,0xba,0xf8,0x0d,0xfe,0x9c,0x74,0x72,0xca,0xee,0xe3,0x73,0xe3,0xd9,0xea,0xa6,0xb2,0x58,0x0a,0x22,0x90,0x8b,0x33,0x00,0x00,
+ 0x05,0x20,0x61,0x7d,0x36,0x2c,0x86,0x7f,0xe8,0x60,0x7b,0xc2,0x18,0x08,0xbe,0xef,0xfe,0xa0,0x33,0xc8,0x0f,0x76,0x00,0xa8,0x7e,0x73,0x15,0x23,0xc1,0xb5,0x06,0x9c,0x2a,0xb6,0x00,0x00,
+ 0x05,0x20,0x61,0xcd,0x72,0x0b,0xbf,0x97,0x8f,0xf2,0x22,0xe6,0x23,0x24,0x63,0xac,0x54,0x3b,0x0c,0x7f,0xb3,0xef,0xfb,0xcf,0x01,0xf5,0x59,0x63,0x39,0x67,0x56,0x2f,0xd3,0xe1,0x00,0x00,
+ 0x05,0x20,0x62,0x5f,0x45,0x80,0x05,0x1e,0x28,0x06,0xba,0x92,0x59,0x5e,0x91,0x4a,0xb4,0x62,0x38,0x41,0xcc,0x4a,0x2d,0x36,0x52,0xb7,0x68,0x78,0x02,0xab,0xa7,0x92,0x6e,0xfb,0x00,0x00,
+ 0x05,0x20,0x62,0xc0,0xa3,0xcb,0x88,0xb8,0xa1,0x6a,0xab,0x95,0x77,0x04,0x4d,0xad,0xc0,0xef,0x2c,0xc1,0xac,0xa8,0x69,0x95,0xfd,0xa5,0xce,0x54,0x54,0x18,0x83,0xcf,0x7c,0x39,0x00,0x00,
+ 0x05,0x20,0x63,0x55,0x06,0xee,0x3c,0x4b,0x0d,0xea,0xc5,0x8b,0x7c,0x40,0x12,0x35,0xa3,0xc1,0x67,0xac,0xe9,0x36,0xf1,0xb8,0xd9,0x35,0xcb,0x9f,0x37,0xc1,0x39,0x0a,0x5b,0x31,0x00,0x00,
+ 0x05,0x20,0x63,0x62,0x11,0x6e,0x08,0xe6,0x68,0xad,0x4f,0x26,0x3b,0x31,0xde,0xa9,0xeb,0x05,0x9a,0x24,0x1f,0xc9,0x53,0x27,0xfe,0xc0,0x59,0x2d,0x35,0xf2,0x36,0x9b,0x30,0x88,0x00,0x00,
+ 0x05,0x20,0x63,0x63,0x12,0x14,0x81,0x86,0xf1,0x78,0xe8,0x15,0x7c,0x5f,0xb0,0x63,0xf6,0xe6,0xa5,0x7d,0x7d,0x09,0xaf,0xa5,0x34,0xad,0x39,0x7d,0x9c,0x76,0x95,0xaa,0x36,0xbc,0x00,0x00,
+ 0x05,0x20,0x63,0xb5,0xf9,0xfa,0xd8,0x67,0xbd,0xe0,0xee,0xc5,0x05,0x0e,0xd1,0xc1,0xc2,0x09,0x26,0x39,0x4a,0x57,0x54,0x88,0xff,0x5f,0x83,0x13,0xe8,0x7e,0x8e,0xe4,0xff,0x9c,0x00,0x00,
+ 0x05,0x20,0x63,0xbc,0xc7,0xea,0x78,0x63,0x01,0xd5,0xea,0x56,0x70,0x7c,0xa8,0x67,0x21,0xd7,0x44,0x26,0x18,0x42,0x2a,0x7a,0xf4,0x0b,0xce,0x62,0x54,0xa9,0xd7,0x96,0xa9,0x35,0x00,0x00,
+ 0x05,0x20,0x63,0xd1,0xf0,0xa2,0xa1,0x8e,0x9f,0x8b,0x48,0xc0,0x94,0x97,0x6e,0xd8,0x9f,0xf7,0x99,0xfe,0xfd,0xd2,0xd7,0xbd,0xf3,0xec,0xf0,0x69,0xc4,0x59,0x82,0x59,0x1d,0x76,0x00,0x00,
+ 0x05,0x20,0x63,0xe0,0x1d,0xa4,0x6c,0x1a,0x02,0x08,0xc4,0xab,0xc2,0x10,0xae,0xd9,0x3b,0x22,0x91,0x3b,0xbc,0x9a,0x74,0x10,0x4c,0xcd,0x60,0xbe,0xe8,0xe6,0x5e,0x4f,0x34,0xab,0x00,0x00,
+ 0x05,0x20,0x64,0x1c,0x2a,0x1e,0xfb,0x85,0x85,0x62,0xd2,0x88,0x6f,0x35,0x8a,0x1e,0x70,0x33,0x3f,0xe1,0xc5,0x6c,0x2d,0x72,0x85,0x17,0xf4,0x8b,0xa7,0xfe,0xc2,0xdb,0xc2,0x9e,0x00,0x00,
+ 0x05,0x20,0x64,0x42,0x7b,0x79,0xd6,0xff,0xc2,0x98,0x30,0x3e,0xfc,0x69,0x10,0xa8,0x4b,0xe5,0xe5,0xa7,0x09,0x3c,0x7c,0xd1,0xe3,0xb7,0x3c,0xb0,0xa4,0x6f,0x04,0x74,0xb4,0xf0,0x00,0x00,
+ 0x05,0x20,0x64,0x70,0xf4,0xc7,0x45,0x01,0x92,0x73,0x7b,0x3c,0x45,0xe3,0xfd,0x97,0xad,0x7a,0x89,0x87,0x5e,0x49,0x03,0x04,0x3a,0xf6,0x82,0xf3,0x93,0xd7,0x23,0x58,0x5c,0xab,0x00,0x00,
+ 0x05,0x20,0x64,0x92,0xbe,0x03,0xec,0x1b,0xff,0x7d,0x04,0x4b,0x5b,0x03,0x7a,0x44,0xe5,0x64,0xef,0x57,0x2f,0x0a,0x73,0x73,0xce,0xbe,0x4c,0x3f,0xd3,0xe7,0xbe,0x65,0xc6,0x3a,0x00,0x00,
+ 0x05,0x20,0x64,0xd7,0x96,0xde,0x18,0x07,0x5a,0x1a,0x61,0xd1,0xc0,0x73,0x45,0xf0,0x4f,0x1a,0xe2,0xda,0xae,0x27,0x02,0xef,0xa2,0x38,0xd6,0x48,0x89,0xd4,0xef,0x49,0x97,0x6c,0x00,0x00,
+ 0x05,0x20,0x65,0x7e,0x1e,0x70,0x74,0x05,0xe0,0xfc,0x84,0x79,0x9b,0x62,0x3a,0xb5,0x3e,0xc3,0xe4,0xff,0xe0,0xf2,0xe6,0x76,0x31,0x6a,0x1e,0xe2,0x5d,0x5f,0x3e,0x28,0x9b,0x12,0x00,0x00,
+ 0x05,0x20,0x65,0x65,0xd0,0x6e,0x5e,0x89,0x8a,0x1a,0xd4,0xd0,0xe7,0x2d,0x9c,0x0f,0xbf,0xa9,0x7a,0xf8,0xed,0x22,0x99,0xc5,0xd8,0x0d,0xdf,0xed,0xcc,0x9e,0x49,0x72,0x67,0xe7,0x00,0x00,
+ 0x05,0x20,0x65,0x85,0x07,0x13,0x4b,0xa7,0xe9,0xe7,0x1a,0xce,0xff,0xd5,0x1e,0xca,0x3c,0xb5,0xfc,0xfb,0xb5,0xd3,0x50,0xc8,0x25,0x6f,0x18,0x49,0x4f,0xca,0x29,0x78,0x9a,0x74,0x00,0x00,
+ 0x05,0x20,0x65,0x89,0x53,0xf6,0x3d,0x1a,0xb2,0x31,0xad,0xda,0x72,0xfc,0x17,0x25,0xe3,0x1c,0xb6,0xa6,0xbb,0x97,0x83,0xb1,0xe7,0xfa,0x8b,0x40,0xf6,0xf0,0x01,0x86,0x8c,0xd6,0x00,0x00,
+ 0x05,0x20,0x65,0xb0,0x9c,0x8e,0x26,0x9e,0x1e,0x1b,0x27,0x14,0x5d,0xb8,0x82,0x92,0x64,0x4e,0x7d,0x7a,0x4a,0x12,0x9d,0x73,0x85,0xe6,0x72,0x79,0xde,0x6d,0x47,0x59,0x2f,0xe8,0x00,0x00,
+ 0x05,0x20,0x66,0x3d,0xe9,0xd2,0xb9,0x2e,0x31,0xe5,0x28,0x23,0x24,0x2a,0x62,0xbd,0x5b,0xbd,0x1d,0x72,0x46,0x82,0xbc,0xff,0xb9,0xdb,0xd6,0xbd,0x76,0x80,0x37,0x4f,0xd4,0x9b,0x00,0x00,
+ 0x05,0x20,0x6e,0xcb,0xc6,0x98,0x32,0xd2,0x0d,0x57,0xed,0x3a,0xfd,0x64,0x8f,0xcc,0xe6,0xa4,0x2e,0xec,0x54,0x25,0x23,0x41,0x03,0x9b,0x0f,0xa4,0x07,0x9e,0xa1,0xd5,0x22,0xb4,0x00,0x00,
+ 0x05,0x20,0x6e,0xca,0x0d,0x62,0x85,0xda,0x36,0xe7,0x8d,0x53,0x45,0xb1,0x7c,0x9c,0x2f,0xa0,0xc5,0x49,0xff,0x75,0x02,0xee,0x38,0xae,0x24,0xd5,0xe5,0xa7,0x38,0x8f,0x18,0xc0,0x00,0x00,
+ 0x05,0x20,0x6f,0x3e,0x4e,0x19,0x45,0xed,0xe8,0x91,0x01,0x8d,0x90,0x22,0x5a,0x63,0xfc,0xdf,0x4e,0x59,0x1a,0x5c,0xc9,0xda,0x31,0x5c,0x16,0xd1,0x2a,0x02,0xb7,0xd1,0xd4,0x58,0x00,0x00,
+ 0x05,0x20,0x6f,0x1b,0xf0,0xa2,0xa9,0x0e,0x98,0x52,0x99,0x6b,0xd5,0x16,0xfb,0x60,0x3c,0x66,0x9c,0xe6,0x57,0xb1,0x75,0xe6,0x34,0xf8,0x2c,0x58,0x78,0x23,0x3c,0xbb,0xb0,0xd2,0x00,0x00,
+ 0x05,0x20,0x6f,0x33,0x6a,0x48,0x96,0xe8,0x9c,0x80,0xd2,0x3c,0x7e,0x8d,0xcd,0xf9,0x53,0x16,0xc5,0x87,0x1b,0x3b,0x92,0x97,0x99,0xd3,0xd1,0xa5,0x16,0x03,0x6d,0x24,0xf2,0x26,0x00,0x00,
+ 0x05,0x20,0x6f,0xf0,0xa5,0x6c,0x57,0x14,0x32,0x27,0x11,0x0f,0x77,0xcc,0x7c,0x87,0xda,0x53,0xb8,0x3f,0x06,0xf9,0x29,0x88,0xdc,0xdd,0x12,0x9d,0x4d,0xe2,0xd0,0x4b,0x20,0x6a,0x00,0x00,
+ 0x05,0x20,0x68,0x32,0x09,0x45,0x10,0x70,0x3d,0x07,0x5c,0x6b,0x36,0x53,0x69,0x18,0xd4,0x0d,0xd7,0xe4,0x71,0xa6,0x27,0x61,0xf7,0x33,0xed,0x42,0x41,0x04,0x6b,0x94,0x59,0xa8,0x00,0x00,
+ 0x05,0x20,0x68,0x86,0x94,0xcc,0xe2,0x57,0xab,0xe7,0x9f,0x3c,0x58,0x06,0x3c,0x0b,0xe0,0xf8,0xb2,0xea,0x27,0x12,0xef,0x58,0x45,0x94,0x4e,0x7c,0xea,0xbd,0x1f,0x88,0xcc,0x17,0x00,0x00,
+ 0x05,0x20,0x68,0xe6,0xe4,0x77,0x65,0xcf,0xc9,0xe6,0x2f,0xd5,0xf2,0x5b,0xbd,0xfb,0xfd,0x6d,0x84,0x8b,0x7d,0x94,0xeb,0x24,0xdf,0x80,0xb9,0x09,0xc8,0x17,0xc6,0x92,0x81,0xbe,0x00,0x00,
+ 0x05,0x20,0x68,0xe8,0xd6,0xc9,0x38,0x7f,0x97,0xcb,0x6d,0x24,0x0b,0xad,0xcc,0x9a,0x45,0x88,0xe5,0x8d,0x2e,0x20,0x7a,0x4d,0x25,0x87,0x73,0xaf,0xc6,0x6f,0x3b,0x0f,0x28,0x6d,0x00,0x00,
+ 0x05,0x20,0x68,0xef,0xad,0xde,0x15,0x9f,0x20,0x4c,0x93,0x28,0x3f,0x2c,0xb4,0xfd,0x90,0x9d,0x85,0xc6,0xe4,0x35,0x61,0xa4,0x48,0x78,0xa2,0xf1,0x34,0x31,0xe2,0xd1,0x62,0xad,0x00,0x00,
+ 0x05,0x20,0x69,0x12,0xc4,0x3d,0xe4,0x73,0xf0,0xef,0xf6,0xc3,0xd9,0x93,0x13,0x88,0x1b,0x2c,0x7a,0xc7,0x68,0xdb,0xfb,0xad,0x9b,0x0c,0x99,0xbb,0x0d,0xfa,0x1e,0xfe,0xc1,0xae,0x00,0x00,
+ 0x05,0x20,0x69,0x64,0x8d,0x94,0x8d,0xcc,0x72,0xe1,0x09,0x3f,0x0b,0xf3,0x4a,0xa4,0x37,0x6a,0x13,0xf1,0xb3,0x34,0x7c,0x4d,0xf4,0x03,0x86,0x25,0x1d,0x19,0xba,0x14,0x48,0x3f,0x00,0x00,
+ 0x05,0x20,0x69,0x9b,0xd2,0x2d,0xb5,0x0b,0x35,0xbe,0x63,0x14,0x6f,0x54,0x14,0xe2,0x3f,0xf3,0xb1,0xd6,0x9e,0x35,0xc0,0x94,0xdd,0xec,0x50,0x10,0x6f,0xae,0x9e,0xdc,0x59,0x5d,0x00,0x00,
+ 0x05,0x20,0x69,0xde,0x1a,0xea,0x20,0xac,0xfd,0x3e,0x94,0xf7,0xc5,0x68,0x78,0xdf,0x0c,0x06,0xff,0x67,0x9f,0xc3,0xcd,0x32,0xf1,0x8d,0x76,0xdd,0x1c,0x8a,0xe5,0x7e,0x9d,0xf8,0x00,0x00,
+ 0x05,0x20,0x6a,0x38,0xd9,0x6d,0xd4,0xfd,0x7d,0x93,0xf6,0x11,0x05,0xaa,0xab,0x35,0x92,0x3b,0x63,0x91,0x60,0x5d,0xcb,0x92,0xab,0x7b,0x9f,0x8c,0x5a,0x87,0xad,0x94,0x8c,0x42,0x00,0x00,
+ 0x05,0x20,0x6a,0x0d,0x12,0x85,0xd4,0xde,0x67,0xeb,0x5c,0x86,0x6f,0x50,0xce,0x0b,0x0c,0x43,0x52,0x24,0xb0,0x32,0x84,0x5d,0x1f,0xb6,0x62,0x8f,0x51,0xfc,0x57,0xc2,0x3d,0xab,0x00,0x00,
+ 0x05,0x20,0x6a,0x13,0xf7,0xe4,0x3e,0x61,0xe3,0x10,0x74,0xcb,0x0e,0xc7,0x83,0x1d,0x33,0xef,0x64,0xd3,0x5a,0x28,0x56,0x46,0xb0,0x19,0x8f,0x91,0x7e,0x96,0xe9,0xcd,0xab,0x80,0x00,0x00,
+ 0x05,0x20,0x6a,0x24,0x3e,0x58,0x12,0xe1,0x99,0xb7,0xaa,0xb4,0xb2,0x4f,0xb9,0x04,0x0e,0x76,0xfa,0x99,0xdd,0xcf,0xf6,0x34,0x3f,0xd0,0xdc,0x43,0x97,0xc1,0x14,0xaa,0x8a,0xbb,0x00,0x00,
+ 0x05,0x20,0x6a,0x31,0x9f,0xd7,0xa5,0x19,0xe1,0x09,0xae,0x3c,0xc6,0xe6,0x23,0x0d,0xc4,0xa6,0xd9,0x86,0xce,0x81,0xe4,0xe3,0x9a,0x99,0x17,0x59,0x92,0x16,0x3a,0xc2,0x11,0x92,0x00,0x00,
+ 0x05,0x20,0x6a,0xdd,0x0e,0xe9,0xae,0xad,0x1f,0xb1,0x02,0xc2,0x15,0x40,0x05,0x30,0x34,0x1b,0x9c,0x09,0xd9,0x56,0xf8,0xe0,0xb9,0xb6,0x3e,0x86,0xd3,0xc8,0x63,0xf1,0xf3,0x90,0x00,0x00,
+ 0x05,0x20,0x6b,0x7e,0xfe,0x63,0xef,0xa3,0x76,0xcd,0xce,0xe0,0x80,0x54,0x47,0xcd,0x57,0xc2,0xb3,0x68,0x97,0xfd,0x8d,0x35,0x94,0x30,0x03,0x69,0x2c,0x9f,0x9b,0x71,0xe5,0x1a,0x00,0x00,
+ 0x05,0x20,0x6b,0x93,0xf5,0x93,0xea,0x52,0x7b,0xca,0x31,0xde,0x60,0xcb,0x30,0x1a,0xb5,0x56,0xf5,0xf1,0x51,0x11,0xfc,0x3f,0xd0,0xb6,0xb4,0x79,0xe3,0x70,0x7d,0x49,0xa2,0x5a,0x00,0x00,
+ 0x05,0x20,0x6b,0xc4,0xc2,0x1d,0x47,0x3f,0x33,0xab,0x4d,0x5b,0x2f,0x79,0xaf,0x23,0x31,0xc4,0xeb,0x0a,0xe0,0xbe,0x00,0x3e,0x7c,0x5f,0xc7,0x2f,0x92,0x30,0xde,0xa4,0x82,0x18,0x00,0x00,
+ 0x05,0x20,0x6c,0x62,0x6e,0x3f,0xf3,0xcc,0xd6,0xbc,0xcc,0xeb,0x54,0x32,0xe6,0x41,0x1b,0x19,0x12,0x51,0x01,0x5f,0x9f,0xb6,0xdf,0xe7,0x34,0x73,0x27,0xd0,0x4f,0x39,0xeb,0x38,0x00,0x00,
+ 0x05,0x20,0x6c,0xf7,0x89,0x02,0x5c,0xb3,0xd2,0x65,0x16,0x7d,0x7b,0x8f,0x12,0xca,0x6c,0xd5,0x4c,0x9f,0xcf,0x55,0xbe,0xf9,0x4d,0xea,0xae,0xc7,0xe3,0x07,0x37,0xe3,0x58,0x4c,0x00,0x00,
+ 0x05,0x20,0x6d,0x34,0x07,0x7f,0x59,0xb0,0x31,0xa7,0xb9,0xaa,0x3c,0x4b,0xbd,0x6a,0xd8,0x2c,0x62,0xde,0x30,0x6c,0xc3,0xfe,0xde,0xc3,0xb7,0xcb,0x12,0x71,0x18,0x9d,0x70,0xd8,0x00,0x00,
+ 0x05,0x20,0x6d,0x0a,0xb4,0x22,0xdb,0xa0,0x2b,0xb9,0xe4,0x60,0x5a,0x27,0xad,0x73,0x07,0x09,0x5e,0x24,0xcc,0xc5,0x8b,0x3a,0x81,0x7d,0xc1,0xf2,0xf6,0xc6,0x48,0x18,0xf0,0x9e,0x00,0x00,
+ 0x05,0x20,0x6d,0x18,0x85,0x9f,0xe7,0x39,0xcb,0xe4,0x37,0x2a,0xcd,0x81,0x8d,0x9f,0x28,0x2f,0x14,0x88,0xba,0x12,0x9d,0xe0,0x1c,0xfc,0xf9,0xab,0xb1,0xa1,0x4c,0xcf,0x04,0x06,0x00,0x00,
+ 0x05,0x20,0x6d,0x2c,0xf3,0xce,0x94,0x19,0x63,0x2b,0x20,0x72,0xd6,0xa0,0x98,0x7b,0x79,0x35,0xcf,0xdb,0x53,0xe4,0x88,0x0a,0xbd,0xf9,0x38,0x6a,0x29,0x73,0xe7,0xfd,0x42,0xb1,0x00,0x00,
+ 0x05,0x20,0x6d,0x59,0x4a,0x01,0x27,0x05,0xbf,0xc3,0x77,0xdd,0x5e,0xc1,0xf1,0xbc,0x99,0x97,0x22,0xac,0xb3,0x5a,0xa0,0x7a,0x93,0x9f,0xcc,0x1d,0x73,0x4e,0x6d,0x3c,0x07,0x87,0x00,0x00,
+ 0x05,0x20,0x6e,0x78,0xb8,0x7d,0xec,0x95,0x9a,0x60,0x12,0xb5,0xd5,0x21,0x80,0x21,0xb0,0xcd,0x26,0x5b,0xad,0x40,0xad,0xcc,0x32,0x6a,0xda,0x92,0xdd,0xa7,0xf8,0x9a,0x50,0x8b,0x00,0x00,
+ 0x05,0x20,0x77,0x50,0x97,0xe5,0xd1,0xd9,0x1b,0xdb,0xb5,0xa3,0x66,0xdb,0x39,0xa3,0xee,0xe1,0x6f,0x5a,0xeb,0x93,0xdd,0x48,0x7e,0x1b,0xec,0x01,0xd5,0xf7,0x18,0x92,0x0f,0xbe,0x00,0x00,
+ 0x05,0x20,0x77,0x83,0xfe,0x7e,0x0a,0x79,0xa9,0xe3,0x56,0x44,0x67,0xd6,0x4c,0x2e,0xac,0xbc,0x80,0x08,0x07,0x1e,0xfb,0xe9,0xde,0x95,0x90,0x6f,0x74,0x33,0x03,0x34,0xa8,0x6e,0x00,0x00,
0x05,0x20,0x77,0xa7,0xc2,0xc7,0xa0,0xc1,0x40,0x3c,0xa0,0x94,0x9c,0xa6,0x6b,0x09,0x6b,0xad,0xae,0x4a,0x65,0x2b,0xbb,0x33,0x26,0x3d,0x3b,0x3b,0xd5,0x52,0x14,0xf9,0x28,0x08,0x00,0x00,
- 0x05,0x20,0x71,0x68,0x1b,0xc7,0x48,0x8f,0xe9,0xa3,0x53,0x29,0xb6,0x23,0x5a,0x25,0x02,0x45,0x72,0xca,0xa1,0xb6,0x06,0xfc,0xda,0x65,0x71,0x37,0xe6,0xd9,0x30,0x81,0x02,0xfe,0x00,0x00,
+ 0x05,0x20,0x77,0xaa,0x1a,0x3c,0x6d,0x78,0xfa,0x1b,0x54,0x57,0xfa,0x2a,0x02,0x08,0xd8,0x77,0xef,0xda,0x8e,0x9d,0x23,0x39,0x50,0x78,0x4c,0xbf,0x51,0x61,0x17,0xb3,0xc0,0x04,0x00,0x00,
+ 0x05,0x20,0x70,0x09,0x00,0xa8,0xcf,0x22,0xb9,0x06,0xb3,0x6d,0x5e,0x3f,0xeb,0xea,0x65,0x88,0x07,0xa9,0xd1,0xba,0xb9,0x0a,0xb4,0x13,0x3f,0x06,0xe9,0x71,0x8c,0x90,0xe2,0x38,0x00,0x00,
+ 0x05,0x20,0x70,0x4b,0xd5,0x15,0x5d,0x6f,0x1a,0xd9,0x5b,0xe4,0xcf,0x97,0x2f,0x08,0xf0,0xa7,0x17,0x9e,0x59,0x62,0x57,0xe9,0x3b,0x55,0x89,0x6a,0xd0,0xde,0x37,0x25,0x6c,0x9f,0x00,0x00,
+ 0x05,0x20,0x71,0x30,0x3a,0xa9,0x2e,0x24,0x31,0xbe,0x7f,0x76,0xba,0x94,0x16,0x38,0x5e,0xce,0x7a,0xcf,0x64,0x4c,0x2f,0x9d,0x5d,0x1c,0xaa,0x12,0x3b,0xc2,0x16,0x48,0x9e,0x28,0x00,0x00,
+ 0x05,0x20,0x71,0x74,0x6c,0x6a,0xa1,0x59,0xe7,0xdf,0xcd,0xbe,0xc1,0x45,0x99,0x2d,0xac,0x7e,0xaf,0x80,0x8d,0x00,0xce,0x66,0x0e,0x6f,0x1a,0xe5,0xbf,0xe9,0xaf,0xd3,0xa6,0xae,0x00,0x00,
+ 0x05,0x20,0x71,0x8c,0xdf,0x40,0x2f,0x60,0x40,0x6d,0x6b,0x86,0xa3,0x00,0x6c,0x99,0xae,0xee,0xd8,0x67,0x64,0x3e,0xec,0xdf,0x99,0xf5,0x64,0xca,0x42,0x50,0x85,0x10,0x56,0x39,0x00,0x00,
+ 0x05,0x20,0x71,0x9a,0xde,0x32,0xd6,0x9b,0x26,0x90,0xc5,0xb0,0xd2,0xa9,0x1f,0xc9,0xe2,0x2b,0x8e,0x8a,0xdd,0x71,0xae,0x77,0x22,0x81,0x93,0xdc,0xf9,0xe7,0xab,0x44,0xd2,0x03,0x00,0x00,
+ 0x05,0x20,0x71,0xa0,0x31,0x43,0x48,0x34,0x96,0x7d,0xb7,0xa9,0x6e,0xe9,0x3c,0xea,0xaf,0x25,0x67,0x3a,0x2f,0x7e,0xf0,0x67,0xad,0x73,0xd5,0x42,0xca,0xd7,0x5a,0x98,0xab,0xaa,0x00,0x00,
+ 0x05,0x20,0x72,0x92,0x06,0x4b,0x03,0xe5,0xa9,0x3a,0x9c,0xa7,0x91,0x4a,0x44,0xd9,0x5e,0x43,0xa3,0x4e,0x31,0x95,0xb0,0x0c,0x59,0x49,0xd8,0xe9,0xc4,0xe1,0x1b,0x46,0x4f,0xfc,0x00,0x00,
+ 0x05,0x20,0x73,0x37,0xab,0x1c,0xf6,0xa8,0xa4,0x18,0x97,0x86,0xf5,0x0f,0xd3,0xd1,0xf2,0x5f,0xbe,0xe0,0x3c,0x42,0x75,0x22,0xab,0xe2,0x3f,0xa1,0x7b,0x9b,0x02,0x17,0x9d,0xc3,0x00,0x00,
+ 0x05,0x20,0x73,0x18,0xac,0x7e,0x04,0x9d,0x0f,0xce,0x9f,0x8b,0x56,0xe2,0x04,0x2d,0x1a,0xf9,0x5a,0x13,0xc8,0xd7,0xae,0xf3,0x41,0x21,0xae,0x06,0x18,0xdc,0x31,0xdd,0xfe,0xfb,0x00,0x00,
+ 0x05,0x20,0x73,0x1a,0x61,0x24,0xb6,0x9a,0x31,0x0b,0x04,0xb0,0x81,0x8d,0x90,0xaa,0x73,0x81,0x99,0xb0,0xaf,0x16,0xa7,0x36,0xa7,0xcd,0xda,0x7e,0x34,0x4e,0x19,0xff,0x29,0xe2,0x00,0x00,
+ 0x05,0x20,0x73,0xda,0xfa,0xe7,0xec,0xc9,0x6d,0xe6,0xe1,0xe6,0x63,0x5b,0xdc,0x9a,0x6b,0xcd,0xff,0x7a,0x0b,0x96,0xfd,0x41,0x3e,0x86,0x51,0xe3,0x07,0x37,0xff,0xea,0xcf,0xc9,0x00,0x00,
+ 0x05,0x20,0x74,0x22,0xbe,0xff,0x6d,0xb7,0x99,0x8d,0x3b,0xac,0xa3,0xfd,0x48,0x79,0xec,0xea,0x18,0xcb,0x6c,0xcd,0xaa,0x00,0x74,0x1b,0xa2,0x11,0x0c,0x49,0x72,0xc5,0x6e,0x0f,0x00,0x00,
+ 0x05,0x20,0x74,0x6b,0x23,0xc7,0x10,0x86,0xb8,0xbd,0x70,0x9c,0x1d,0x5c,0x25,0x5f,0x44,0x52,0x78,0x7a,0x73,0x4e,0x9c,0x2f,0x2a,0xe2,0xb8,0xfc,0xd9,0xf3,0x9c,0x69,0x96,0x7e,0x00,0x00,
+ 0x05,0x20,0x75,0x14,0x45,0x8e,0x06,0x75,0x41,0x53,0xed,0xaf,0x30,0x74,0x1c,0x7e,0xde,0x3d,0x0d,0xdf,0xf6,0x80,0x26,0xb9,0x9f,0x52,0x05,0x1a,0xfc,0x55,0x9f,0xec,0x07,0xa3,0x00,0x00,
+ 0x05,0x20,0x75,0x5a,0xad,0xd8,0xa1,0x8a,0xab,0x5a,0x4c,0x9e,0xaa,0x9b,0xd3,0x2c,0xe3,0x9a,0xef,0x1f,0x37,0x15,0x20,0x50,0x55,0xd6,0x3d,0x5f,0xad,0x2f,0x49,0xd1,0x78,0x35,0x00,0x00,
+ 0x05,0x20,0x75,0x89,0x75,0xd0,0x89,0x0e,0xc9,0x2c,0xdf,0x8f,0xd8,0x7d,0x9a,0x5f,0x06,0x34,0xaf,0x79,0xaa,0xe5,0x35,0xdd,0x85,0xa8,0x06,0x29,0x05,0x2d,0x84,0xc5,0x6b,0xd2,0x00,0x00,
0x05,0x20,0x76,0x74,0x80,0x6c,0xab,0x7b,0x36,0x3a,0x6a,0x78,0xa4,0xa8,0xb8,0xb7,0xe7,0xf9,0x34,0x47,0x6d,0x34,0xca,0xa2,0xc6,0xef,0x81,0xab,0x62,0xb1,0x46,0x86,0xaf,0xd0,0x00,0x00,
- 0x05,0x20,0x7b,0x8e,0x51,0x44,0xa2,0xfb,0xe2,0xde,0x06,0xad,0xe5,0xe5,0x3b,0x79,0xb3,0xd9,0x3e,0x74,0xb0,0x3f,0x55,0x13,0xc1,0xa6,0x72,0x2c,0x25,0x25,0x58,0xec,0x3b,0x5a,0x00,0x00,
- 0x05,0x20,0x80,0xfc,0x95,0xc8,0x95,0x91,0x2f,0x6b,0x6e,0xc4,0x2b,0xe1,0x2f,0xa0,0xcb,0xb8,0x76,0x5f,0x6f,0x1c,0x27,0xb0,0x3a,0x2c,0xb9,0x8d,0x6c,0x55,0xbd,0x02,0x60,0xe0,0x00,0x00,
- 0x05,0x20,0x89,0x52,0xac,0x8f,0x35,0xe0,0xac,0xfb,0xbb,0xc7,0xcd,0x1a,0x24,0x0a,0xb4,0xc5,0x11,0xff,0x5a,0xf0,0xbe,0xc1,0xad,0xaf,0x0d,0x87,0xf4,0xa9,0xda,0x12,0xf8,0x12,0x00,0x00,
- 0x05,0x20,0x8a,0x32,0x54,0x37,0x12,0x24,0xb5,0x1d,0xba,0x3c,0x45,0x03,0x2e,0xda,0xfe,0xf1,0x87,0x8f,0x31,0xe5,0xfe,0xed,0xfa,0x38,0x25,0x00,0x99,0xa5,0xf4,0x51,0x02,0xf7,0x00,0x00,
- 0x05,0x20,0x91,0x06,0xd1,0x9e,0xbd,0xab,0xc4,0x61,0xb3,0x0a,0xc2,0x3b,0x29,0xf3,0x10,0x38,0xee,0xbd,0x9d,0xe3,0x99,0x97,0x30,0x70,0x6e,0xe6,0xfb,0x6a,0x3c,0x07,0x3d,0xfd,0x00,0x00,
- 0x05,0x20,0x9d,0x0d,0x0f,0x58,0x1a,0x5c,0xb4,0x1a,0xeb,0xef,0x8e,0x91,0x8d,0x8c,0x1b,0x57,0x5d,0x6d,0x97,0x24,0x28,0x45,0x54,0x8a,0x3a,0xd5,0x05,0xfb,0x76,0xac,0x25,0x52,0x00,0x00,
- 0x05,0x20,0xa4,0xb3,0x30,0x54,0x28,0x0f,0xfb,0xe5,0x76,0xb0,0x31,0xb2,0x65,0x62,0x56,0x72,0x7c,0xc9,0xcd,0x07,0x4d,0x5f,0xb1,0x69,0xe0,0xf7,0x35,0x3d,0x30,0x3c,0x7d,0x64,0x00,0x00,
+ 0x05,0x20,0x76,0x5a,0xf7,0x9c,0x68,0x91,0x6a,0xb1,0x24,0xca,0xab,0x71,0xe6,0x03,0xda,0xb6,0x3d,0xbf,0xb4,0xfc,0xac,0xdf,0x7b,0x5b,0x9f,0x41,0x5e,0xc5,0xc1,0x49,0xae,0xc2,0x00,0x00,
+ 0x05,0x20,0x7e,0xc1,0x4d,0x5b,0xa9,0x6a,0xa1,0x43,0x5d,0xaa,0xa2,0x93,0xc8,0xd2,0x55,0xc3,0x6b,0x9d,0xba,0xe0,0xb0,0xcb,0xc0,0x27,0x24,0xc5,0xea,0x5a,0xe3,0x27,0x61,0x27,0x00,0x00,
+ 0x05,0x20,0x7f,0x27,0x28,0x5a,0xa3,0x78,0x11,0x3a,0xac,0xc0,0xa2,0x4b,0x1d,0x33,0x50,0x0c,0x77,0xe8,0x22,0xd4,0x90,0x25,0xdc,0xa9,0x14,0x9f,0xed,0xab,0x24,0x4f,0xdc,0xa0,0x00,0x00,
+ 0x05,0x20,0x7f,0x9d,0xb9,0xe5,0x6b,0x95,0x99,0xa4,0xf2,0xc0,0x3e,0xfa,0xd4,0x47,0x1c,0x98,0x87,0x4f,0x2e,0x1d,0x0f,0xbe,0x43,0x92,0xa2,0xbf,0x3b,0x20,0x13,0xef,0x0f,0x86,0x00,0x00,
+ 0x05,0x20,0x7f,0xd0,0x52,0x21,0x3b,0xa9,0xc7,0x2d,0x8d,0x08,0x3d,0xfb,0x04,0x32,0x82,0xc6,0x4c,0x25,0x75,0xcc,0x2a,0xa1,0x71,0x71,0xea,0x08,0x53,0x32,0xd3,0x87,0x7f,0xad,0x00,0x00,
+ 0x05,0x20,0x78,0x40,0x6f,0xfa,0xfd,0xc6,0x1d,0xd1,0xee,0xd8,0x7d,0x66,0xe3,0xdd,0x86,0x0c,0xc7,0x14,0xa4,0x3b,0xea,0xd2,0xd8,0x72,0xdd,0x2b,0xdc,0x6a,0x62,0x7d,0x62,0x7d,0x00,0x00,
+ 0x05,0x20,0x78,0x4b,0x38,0xcc,0x73,0x38,0x53,0xd8,0x08,0x82,0x88,0x06,0x46,0xec,0xe3,0xad,0x9c,0xc8,0x44,0xd2,0x21,0x05,0xe4,0x07,0xa7,0xd7,0x1b,0xac,0x89,0x15,0x1c,0x00,0x00,0x00,
+ 0x05,0x20,0x78,0xb8,0x3e,0xd7,0xfc,0x9c,0x79,0x5c,0xf7,0x8f,0x0c,0x7b,0xf2,0x24,0xc0,0xff,0xba,0x47,0xfa,0xb6,0x57,0x54,0xeb,0xf7,0xa6,0x2b,0x82,0x8e,0xf7,0xfa,0x03,0xe6,0x00,0x00,
+ 0x05,0x20,0x78,0x85,0xe1,0x36,0x38,0xe3,0x01,0x45,0xff,0x2b,0x08,0xf7,0xa5,0x1c,0x0b,0x00,0x2a,0xa1,0x06,0xdd,0x38,0xd3,0x45,0x73,0x29,0xb3,0xdd,0x20,0x3a,0x29,0x40,0x84,0x00,0x00,
+ 0x05,0x20,0x78,0x86,0xb8,0x5b,0x40,0xb3,0xde,0xe3,0x85,0x14,0x20,0xf9,0x12,0x94,0xd2,0xf3,0x76,0xba,0xee,0x67,0x3b,0x9b,0xb8,0xfb,0xe9,0x65,0xf5,0xee,0xea,0x17,0xd2,0x8f,0x00,0x00,
+ 0x05,0x20,0x79,0x26,0x45,0x49,0xc5,0x35,0x8c,0xd1,0xc8,0x67,0xf3,0xaa,0x7d,0x60,0x6a,0x89,0x9f,0x88,0x1a,0x73,0x44,0xf9,0x49,0x52,0x52,0xe0,0x72,0xa9,0x54,0x70,0x50,0x48,0x00,0x00,
+ 0x05,0x20,0x79,0xc8,0xd1,0xe3,0x13,0x8c,0x07,0x1d,0x54,0xb2,0xb6,0xd4,0x85,0xfb,0x14,0x47,0x6a,0x1d,0x3f,0x95,0xed,0xe8,0x31,0x93,0x26,0xef,0xed,0x21,0xdb,0xb4,0xc4,0x29,0x00,0x00,
+ 0x05,0x20,0x7a,0xce,0xec,0xf7,0x77,0x3b,0xd6,0xcc,0x50,0x89,0x6c,0x8d,0xd0,0xa8,0xa4,0xd7,0x1d,0x6d,0xbc,0x2b,0x1e,0x24,0xe7,0x56,0x94,0x7d,0x3d,0x0b,0x07,0x6d,0x9c,0xc4,0x00,0x00,
+ 0x05,0x20,0x7b,0x38,0xda,0x2a,0x39,0x68,0xc7,0xa5,0xd4,0x7b,0x91,0xd1,0x57,0xa6,0x22,0x0a,0x56,0xe6,0xcd,0x97,0x38,0x0d,0xab,0xe4,0x65,0xef,0xf5,0x26,0xd8,0x31,0xdb,0xfc,0x00,0x00,
+ 0x05,0x20,0x7b,0x7a,0x2b,0xef,0x4b,0x4c,0x6b,0x94,0xfa,0xff,0x3b,0xcd,0x82,0x97,0x71,0x59,0x66,0x4b,0xce,0x0f,0x7f,0x32,0xdd,0xb5,0x45,0xa1,0x63,0x17,0xb5,0xf4,0x43,0x33,0x00,0x00,
+ 0x05,0x20,0x7b,0x4f,0x27,0xd3,0x71,0x5b,0x85,0x91,0x87,0x32,0xc4,0x81,0xa4,0x16,0x72,0x33,0x91,0x8d,0xe4,0xc2,0x1e,0xb4,0x97,0x0d,0x8a,0xfe,0x46,0x90,0x34,0xe8,0x23,0x16,0x00,0x00,
+ 0x05,0x20,0x7b,0xc9,0xa4,0x96,0x41,0xd5,0xe2,0xc3,0x5a,0x86,0x0c,0x3e,0x03,0x63,0x9c,0xa0,0x83,0xec,0x43,0x90,0x0d,0x0a,0x02,0xea,0x47,0xff,0x83,0xc5,0x59,0xe0,0xe2,0x45,0x00,0x00,
+ 0x05,0x20,0x7b,0xc9,0x9e,0xef,0x11,0x97,0x96,0x06,0xe2,0xb8,0xbd,0x2e,0x15,0xc2,0xe8,0xa5,0x4e,0xd8,0x56,0xb3,0x01,0x59,0x60,0x20,0x7a,0x51,0x9f,0xa1,0xdf,0x55,0xea,0x01,0x00,0x00,
+ 0x05,0x20,0x7c,0x1b,0x0b,0x5d,0x7f,0x4c,0xa2,0xe5,0x7e,0xa6,0x79,0x85,0x55,0xde,0xcb,0x51,0xbd,0x81,0x2a,0xfb,0xdb,0x76,0x6e,0x5c,0xbd,0x5d,0x68,0xd9,0xd9,0xbe,0xd8,0x7c,0x00,0x00,
+ 0x05,0x20,0x7c,0x51,0xbf,0xfa,0x3e,0xa5,0x2c,0x66,0x85,0xa4,0xaa,0x91,0xf1,0x6f,0xdb,0x3f,0x23,0x82,0xd9,0x39,0x07,0xde,0x20,0x96,0x56,0x84,0x2e,0xaf,0x1d,0xb1,0x51,0xd2,0x00,0x00,
+ 0x05,0x20,0x7c,0x85,0x6e,0xe3,0x20,0x4f,0x53,0x2d,0x15,0xbf,0x36,0x63,0x97,0x27,0xd3,0x23,0x9a,0xb9,0x38,0xeb,0x0b,0x6a,0x31,0x3b,0xdd,0xa0,0x46,0x42,0xbd,0xaf,0xb1,0xde,0x00,0x00,
+ 0x05,0x20,0x7c,0xf6,0xc8,0x32,0xaa,0xaf,0xc0,0xb2,0x24,0x1f,0xa8,0x27,0x35,0xe2,0x54,0xf5,0xfe,0x64,0xb4,0x36,0x85,0x6d,0x3a,0x72,0x4a,0xc8,0x03,0x55,0x27,0x33,0x2a,0x35,0x00,0x00,
+ 0x05,0x20,0x7d,0x3c,0x4d,0x07,0xa1,0xcf,0xfb,0x06,0xb1,0xfa,0x8b,0xaf,0xae,0xe8,0x0a,0x92,0xd6,0xd4,0x4e,0xba,0x34,0x5a,0xdf,0xc0,0xb8,0xca,0x54,0x54,0x3b,0xf6,0xe9,0xfc,0x00,0x00,
+ 0x05,0x20,0x7d,0x1b,0x25,0xbc,0xf3,0xf3,0xf1,0x26,0xae,0x64,0x3c,0xf5,0xc8,0x9a,0xb1,0x53,0x32,0x31,0xf3,0x7f,0x5b,0x5e,0x55,0xb9,0x36,0x02,0x97,0xd1,0xe3,0xcc,0x09,0x18,0x00,0x00,
+ 0x05,0x20,0x7d,0x7c,0x6f,0xd1,0x0d,0xf7,0x77,0x12,0x44,0x68,0x45,0x46,0x69,0xb9,0x11,0x4d,0x5c,0xa4,0xba,0xc8,0xe0,0x76,0x5b,0x02,0x72,0xc8,0xd7,0x32,0x61,0xd2,0xda,0x34,0x00,0x00,
+ 0x05,0x20,0x7d,0x61,0x8a,0xb7,0x4b,0x7d,0x5c,0x4c,0x1c,0xc2,0x35,0x1a,0xe8,0x4c,0x93,0x54,0x54,0xff,0xf9,0x04,0x36,0x1c,0x84,0x68,0x05,0xe0,0xa2,0xd5,0xcd,0xde,0x30,0x75,0x00,0x00,
+ 0x05,0x20,0x7d,0xb9,0xaf,0x77,0xca,0xd5,0x43,0x6b,0xb2,0xb1,0x16,0xa0,0x19,0x67,0x69,0x92,0xea,0x2b,0x80,0xeb,0x6f,0xe2,0x43,0xc8,0x28,0x07,0x52,0x34,0x3b,0x4a,0x69,0xf7,0x00,0x00,
+ 0x05,0x20,0x7d,0xc3,0x83,0xd7,0xda,0x98,0x87,0x08,0x3d,0x7e,0x78,0x5f,0xb7,0x1b,0xe0,0x4e,0x72,0x26,0x86,0xe8,0x65,0x7a,0xac,0x4f,0x67,0x40,0xf6,0x34,0x8f,0x74,0xb2,0x87,0x00,0x00,
+ 0x05,0x20,0x7e,0x0b,0xa1,0x49,0x17,0x4d,0x0d,0x67,0xf8,0x03,0xd8,0x55,0x1c,0x6a,0x8b,0x56,0x53,0xf4,0x34,0x5f,0xe7,0xc7,0x26,0x3d,0x5f,0x41,0x03,0x44,0x0d,0x5c,0x5e,0xe2,0x00,0x00,
+ 0x05,0x20,0x7e,0x1c,0xb2,0x70,0xd2,0x5c,0x58,0x46,0x94,0x4c,0x1f,0x10,0xb8,0x63,0x35,0x95,0x31,0x14,0xe0,0xa5,0x48,0x6d,0xf0,0x34,0xc4,0x6c,0xe0,0x95,0x29,0x69,0x44,0xe1,0x00,0x00,
+ 0x05,0x20,0x86,0xe8,0x4a,0x24,0x7b,0xde,0x95,0xd8,0x26,0xe3,0x82,0x93,0x34,0xac,0xca,0x66,0xd5,0x3a,0x8f,0x1f,0x04,0xe5,0xc1,0x69,0xc6,0x15,0x5c,0xa7,0x1b,0x96,0x66,0xeb,0x00,0x00,
+ 0x05,0x20,0x87,0x1d,0xf0,0x97,0x7f,0x27,0x80,0x5b,0xfc,0x95,0xb0,0xf0,0xea,0xca,0x0f,0x9a,0x6c,0xef,0x4c,0x7b,0x17,0xa1,0x34,0x9f,0x91,0x98,0xda,0x67,0xee,0x71,0xb2,0x36,0x00,0x00,
+ 0x05,0x20,0x87,0x7a,0x6e,0x9b,0xd2,0xe7,0xce,0x8f,0xbc,0x54,0x73,0x28,0x6d,0xd6,0x22,0x1f,0xbf,0x54,0xa3,0xf4,0x96,0x8d,0x06,0x14,0x9f,0x83,0x74,0xd5,0x43,0xb5,0xcf,0x74,0x00,0x00,
+ 0x05,0x20,0x87,0x97,0x99,0x13,0x34,0xe2,0x07,0x77,0x8e,0xd1,0x77,0x2f,0xe9,0x56,0xd9,0xfa,0x7c,0x7f,0x1a,0x4e,0xf1,0x1a,0x81,0x8a,0xf5,0xfa,0x4e,0x2d,0x18,0x24,0x7d,0x33,0x00,0x00,
+ 0x05,0x20,0x87,0x9d,0xb2,0x41,0xb8,0x37,0x39,0x4c,0xa7,0x30,0x25,0x07,0x20,0x35,0x46,0x1b,0xa9,0x85,0xc8,0xea,0x38,0xce,0xbf,0x87,0x81,0x85,0xd4,0x16,0x0d,0xac,0xe2,0x01,0x00,0x00,
+ 0x05,0x20,0x87,0xfc,0x6e,0x2d,0x4e,0x90,0x75,0x2b,0x91,0xa7,0xe7,0xc9,0x49,0xc0,0xd6,0xb6,0x53,0x87,0x9f,0xba,0x8a,0x22,0x2f,0x6f,0xb6,0x55,0x9b,0x79,0x11,0x31,0xc8,0xc6,0x00,0x00,
+ 0x05,0x20,0x87,0xdb,0x31,0xdb,0x1e,0xbd,0x09,0x8a,0x98,0xe1,0x48,0x18,0x58,0x9f,0xda,0x04,0x27,0x4a,0x6d,0x0a,0xb1,0xbd,0xad,0x11,0x9c,0xe3,0xc1,0xb1,0x65,0xcc,0x88,0xd3,0x00,0x00,
+ 0x05,0x20,0x80,0x3f,0xf5,0xe7,0xe3,0x5f,0xb9,0x0b,0x4d,0x3c,0x2d,0xee,0xbc,0xf9,0xd3,0x55,0x2b,0x5e,0x68,0x62,0x41,0x8c,0xd6,0x5f,0xda,0x23,0x83,0x2d,0x5e,0x08,0xdd,0x57,0x00,0x00,
+ 0x05,0x20,0x80,0x21,0x5b,0xb3,0x15,0x86,0x99,0xcb,0x39,0x81,0x64,0xc1,0x9d,0xba,0x91,0xdc,0x18,0xff,0x90,0x93,0xdc,0x16,0x4e,0x95,0x6d,0x8c,0xb6,0x0e,0xd8,0xc5,0x3d,0xc2,0x00,0x00,
+ 0x05,0x20,0x80,0x2c,0x41,0xf5,0xd4,0xed,0x43,0xcd,0x50,0xc8,0xe6,0x8c,0xeb,0xc7,0x52,0xf0,0xa1,0x97,0xe0,0xfb,0x97,0x41,0x35,0x1e,0xa5,0xae,0x0f,0x81,0x78,0x0d,0xbe,0x00,0x00,0x00,
+ 0x05,0x20,0x80,0xc6,0x6f,0xb3,0x18,0x5a,0x1a,0xde,0x4e,0xde,0x50,0xd2,0xc6,0x3f,0xc5,0x96,0x09,0x35,0x3a,0x4d,0x88,0x5f,0xa3,0x49,0x37,0xff,0xe6,0xc5,0x43,0x10,0xaf,0xa8,0x00,0x00,
+ 0x05,0x20,0x81,0x17,0x20,0x48,0x84,0xab,0x59,0x9d,0x51,0xaf,0x75,0x4f,0xc6,0x85,0xe9,0x7c,0x8e,0x93,0x73,0xa8,0xa0,0xd0,0x02,0xf7,0x21,0x69,0x88,0x05,0xda,0xd4,0xb9,0x34,0x00,0x00,
+ 0x05,0x20,0x81,0x43,0x43,0x1c,0xb1,0xe9,0xce,0x67,0x39,0x80,0x96,0x2a,0x8b,0x2b,0x79,0x43,0x75,0xca,0x12,0x2f,0x5f,0xa9,0x1c,0xf6,0x4c,0xcd,0xc5,0xa1,0xa2,0xbd,0x45,0xee,0x00,0x00,
+ 0x05,0x20,0x81,0x57,0xb4,0x73,0xa8,0x79,0xa8,0x67,0x7e,0x84,0x95,0xb1,0xbc,0x35,0xa1,0x01,0x27,0xff,0xdc,0x16,0x43,0xd7,0x56,0x33,0x6a,0x7f,0x0a,0x9f,0xea,0x15,0xc8,0xbc,0x00,0x00,
+ 0x05,0x20,0x81,0xe8,0xae,0xe6,0x1d,0xaf,0xcf,0xd7,0xfd,0xde,0xd1,0xa5,0x73,0x4e,0x10,0x77,0xea,0x0e,0x23,0xff,0x77,0x6a,0x44,0x7a,0xd3,0x9d,0xe0,0x23,0x02,0xdc,0xf9,0xfe,0x00,0x00,
+ 0x05,0x20,0x82,0x2b,0x48,0x2a,0x31,0xdb,0xeb,0xb8,0xd1,0x7c,0xb1,0xaf,0xc7,0x73,0x2e,0x6f,0x6c,0x43,0x20,0x73,0xe8,0x29,0x85,0xd7,0x61,0x39,0x02,0x5a,0x27,0xce,0x80,0x29,0x00,0x00,
+ 0x05,0x20,0x82,0x46,0x59,0x84,0xe2,0x01,0x8e,0x39,0x2f,0x37,0x4c,0x2f,0xb6,0xb0,0x8c,0xe6,0x7a,0xfe,0xa6,0x7f,0x27,0xdd,0x4e,0x84,0x79,0xea,0xd6,0xd8,0x2e,0xf2,0x39,0x3a,0x00,0x00,
+ 0x05,0x20,0x82,0xb6,0x88,0x6e,0xd1,0xf1,0x19,0x39,0x8d,0x0b,0xa8,0xe0,0x1a,0xfa,0xad,0x82,0x64,0x7a,0x67,0x3e,0x66,0x17,0x6c,0x15,0xdb,0xcf,0xaa,0xf4,0xe2,0xd5,0x69,0x44,0x00,0x00,
+ 0x05,0x20,0x82,0x9c,0x7c,0xba,0xe8,0x31,0x0b,0xcd,0xc5,0xdf,0x61,0x74,0x11,0xff,0xc4,0xc3,0x49,0x4a,0x27,0x55,0x2e,0x22,0x46,0x50,0xb5,0xa1,0x65,0x25,0x48,0x35,0x4e,0xd3,0x00,0x00,
+ 0x05,0x20,0x82,0xa5,0x33,0xa3,0x30,0x99,0x46,0x94,0xdc,0x51,0x01,0xe1,0x75,0x2f,0x61,0x25,0x7f,0xd5,0x6b,0x81,0x58,0x0d,0x15,0x3a,0x59,0xb9,0x1b,0xce,0xe4,0x8b,0x42,0x5e,0x00,0x00,
+ 0x05,0x20,0x82,0xce,0xa5,0xd7,0x70,0xdc,0x63,0x2c,0x86,0x2a,0xbd,0xbf,0xde,0xad,0xe3,0x0d,0x23,0x7b,0x09,0x3d,0x1a,0xaf,0x64,0x08,0x12,0xe7,0x8a,0xbc,0xcd,0x6a,0x18,0x92,0x00,0x00,
+ 0x05,0x20,0x83,0x26,0x6e,0xd1,0x59,0xb9,0x19,0x25,0x4e,0x57,0xb6,0x83,0x1b,0x31,0xc7,0x21,0xf0,0x43,0xd9,0x6b,0x22,0xb1,0xb5,0x53,0x24,0x86,0x71,0xc5,0x90,0x62,0x75,0x36,0x00,0x00,
+ 0x05,0x20,0x83,0x46,0x68,0x1d,0x3b,0x13,0xc3,0x78,0xaa,0x74,0xf4,0x7f,0x89,0x01,0xce,0x10,0xa1,0x9a,0xc8,0x8b,0xab,0x75,0x37,0x9e,0x9b,0x7a,0xef,0xac,0xf5,0xd4,0x70,0x8d,0x00,0x00,
+ 0x05,0x20,0x83,0x60,0xe4,0xae,0x67,0xc3,0x3f,0x9e,0x1a,0xc8,0xc8,0x82,0xb3,0xbc,0x7a,0x99,0xf1,0xfa,0xf0,0x1e,0x41,0x58,0x4e,0xfc,0x39,0xc2,0xf6,0xdb,0xe5,0x49,0xf2,0x04,0x00,0x00,
+ 0x05,0x20,0x83,0xa3,0x91,0xa4,0x44,0x96,0x4b,0xcd,0xe9,0xc1,0xb8,0x3f,0xb9,0xb6,0xc7,0x80,0x7e,0xb9,0xde,0x37,0x59,0x54,0xa8,0x32,0xda,0x2a,0xd8,0x54,0x9d,0xd8,0xae,0xfc,0x00,0x00,
+ 0x05,0x20,0x83,0xfa,0xf7,0x99,0xd9,0xc8,0x55,0x44,0x34,0xc6,0xd6,0xb2,0x60,0x30,0xbc,0x76,0x5e,0x4d,0x37,0xa7,0x4a,0xe9,0xc4,0x6b,0xb1,0xf3,0xd3,0x0b,0x69,0xa6,0x89,0xdd,0x00,0x00,
+ 0x05,0x20,0x83,0xc6,0x30,0x55,0xa5,0x5c,0x7b,0x31,0xb0,0x98,0x79,0x29,0xd5,0xc5,0x29,0xb4,0x8d,0x31,0x9f,0x3f,0x3d,0xba,0x46,0x5d,0x18,0x4a,0x84,0xff,0xb3,0xf7,0xc4,0x84,0x00,0x00,
+ 0x05,0x20,0x83,0xdd,0xba,0x77,0xdd,0x8b,0x0c,0x44,0x3a,0x34,0x96,0x40,0x30,0x8b,0x95,0x63,0xcc,0x9c,0x38,0xff,0x83,0xa3,0x5e,0x2f,0x04,0x2a,0xfe,0x62,0x12,0xd8,0xc6,0x7e,0x00,0x00,
+ 0x05,0x20,0x84,0x10,0x05,0x5b,0x5c,0x70,0x4b,0x6c,0xef,0xfd,0x31,0x43,0xe6,0x53,0x20,0xcf,0xe7,0x1f,0x01,0xa8,0xdb,0x87,0xe5,0x91,0xce,0xbf,0xd3,0x6c,0xc5,0x19,0xc5,0xd5,0x00,0x00,
+ 0x05,0x20,0x84,0x19,0x7a,0xd1,0x36,0x47,0x15,0x33,0x27,0x42,0xa4,0x19,0x6e,0x29,0x14,0x4a,0x8b,0xfa,0x2a,0x2a,0x71,0x3b,0x1c,0x63,0x81,0x48,0x7f,0x3c,0x2c,0x8f,0x5c,0x92,0x00,0x00,
+ 0x05,0x20,0x84,0x5f,0x9f,0x7e,0x22,0xb4,0x42,0xf1,0x38,0x4a,0x40,0xfa,0xc5,0xeb,0x83,0x98,0xce,0x73,0x91,0x53,0xc6,0xee,0x3f,0x78,0x8a,0x56,0x01,0x37,0x95,0x23,0xd5,0x94,0x00,0x00,
+ 0x05,0x20,0x85,0x32,0xa8,0x9b,0x21,0xeb,0xd8,0xde,0x73,0xdd,0xf7,0x3e,0xa2,0x75,0x72,0x28,0x64,0x48,0x35,0xd1,0x8f,0x96,0x9a,0x96,0x57,0x10,0x0c,0x9f,0xc7,0x2b,0xf9,0xc5,0x00,0x00,
+ 0x05,0x20,0x85,0x7a,0x4e,0x25,0x62,0x63,0x14,0x35,0xb0,0xfd,0x93,0xd5,0x5a,0xea,0xc6,0x4e,0xf9,0xba,0xb3,0x98,0x74,0xf1,0xa3,0xb8,0xb4,0xca,0x38,0xb7,0x45,0xad,0xd9,0xf3,0x00,0x00,
+ 0x05,0x20,0x85,0x8f,0x55,0xbe,0x27,0x56,0xdb,0x39,0x5a,0x3d,0xbb,0x66,0xd1,0x68,0xe7,0x33,0x2a,0x3d,0x84,0x26,0xc9,0x94,0x17,0x30,0x28,0x40,0x4f,0x19,0x27,0xea,0xf1,0xb1,0x00,0x00,
+ 0x05,0x20,0x86,0x14,0x0a,0xbd,0x21,0x20,0xa5,0x20,0x3c,0x9f,0xfb,0x23,0x74,0xde,0xd7,0x11,0x25,0xa3,0x05,0x23,0xf1,0xb2,0x4b,0x0f,0xd9,0xc4,0xb7,0xaa,0x1d,0x8d,0x6d,0xb6,0x00,0x00,
+ 0x05,0x20,0x86,0x21,0x66,0xf6,0xf2,0xd7,0x0f,0xee,0xc5,0x63,0x8a,0xc9,0xd6,0x4b,0x00,0x8b,0x20,0xe2,0xed,0x61,0xde,0xe9,0x9f,0xca,0x93,0x05,0x2c,0x33,0x76,0x08,0xa1,0xdd,0x00,0x00,
+ 0x05,0x20,0x8e,0x9f,0xd5,0x42,0x3f,0xba,0x5d,0xc6,0x8b,0x3f,0x5f,0x88,0xa1,0xdf,0x46,0x27,0xa5,0x4d,0x27,0x5a,0x4e,0xa6,0x39,0x3a,0xf4,0xe2,0x6d,0xba,0x7b,0xf9,0xfb,0xdc,0x00,0x00,
+ 0x05,0x20,0x8f,0x28,0xa1,0xa7,0xe2,0xd2,0xbb,0xdf,0xab,0xf0,0x1f,0xa4,0x80,0x50,0xe7,0x85,0x05,0x23,0xdb,0x1a,0x8c,0x54,0xcf,0x7a,0x76,0xce,0x0f,0xc4,0xa2,0x82,0x43,0x01,0x00,0x00,
+ 0x05,0x20,0x8f,0x47,0xd4,0x9a,0x42,0xac,0xbc,0x8b,0xf6,0xbe,0xe7,0x9c,0x7b,0x03,0xdc,0xad,0x27,0x4f,0xd1,0x85,0x22,0x9b,0x11,0x68,0xf1,0x26,0x46,0x99,0xae,0x3c,0x5b,0x3c,0x00,0x00,
+ 0x05,0x20,0x8f,0x87,0xc6,0x38,0x11,0x7e,0xb5,0x66,0xb6,0x4d,0x64,0xaf,0x09,0xee,0x5b,0xd1,0xb3,0x89,0x08,0x02,0x10,0x04,0xa1,0x03,0x35,0x43,0x22,0x47,0xfe,0x40,0xd7,0x98,0x00,0x00,
+ 0x05,0x20,0x8f,0x8e,0x3d,0xa9,0xb0,0x46,0x9f,0xe5,0x02,0xdf,0x3e,0x03,0x11,0x17,0x50,0xea,0xc4,0x08,0xd1,0x62,0x16,0x65,0xb9,0x18,0x54,0xcf,0x30,0x2d,0x48,0x09,0xd9,0xb0,0x00,0x00,
+ 0x05,0x20,0x8f,0xc3,0x43,0x7a,0xc1,0x39,0x2b,0x08,0x2c,0x20,0xab,0xa8,0x9d,0x98,0xcf,0x07,0xc9,0xdf,0xc8,0x23,0xdb,0x91,0x55,0x66,0x04,0xc0,0x0d,0x19,0xde,0x47,0x62,0x5e,0x00,0x00,
+ 0x05,0x20,0x88,0x3f,0x99,0xc3,0xee,0x87,0xd2,0x27,0x65,0xf4,0x47,0xc5,0xcc,0xd7,0xfe,0x31,0xff,0x14,0xd8,0xf0,0xe9,0x54,0xfb,0xbf,0xe3,0xad,0xbf,0x14,0x4d,0x02,0x57,0xbd,0x00,0x00,
+ 0x05,0x20,0x88,0x7f,0x3c,0x24,0x7e,0x32,0x3e,0x4a,0xb2,0x7d,0x66,0x6b,0x30,0xba,0x20,0x64,0x10,0xfe,0x6e,0x47,0xfe,0xb2,0x9b,0xb6,0xc7,0x4f,0x55,0xfd,0x64,0xa8,0xd9,0xbc,0x00,0x00,
+ 0x05,0x20,0x88,0x7f,0x7d,0x79,0x6c,0x23,0xca,0x11,0x0f,0xf6,0x9d,0xe9,0xcd,0x3c,0xbc,0x98,0xee,0x12,0x75,0xfd,0xcc,0x8b,0xb1,0x5a,0x94,0x50,0xf8,0x59,0x73,0x27,0xbc,0xc2,0x00,0x00,
+ 0x05,0x20,0x88,0xf4,0x2b,0x6d,0x14,0x55,0x26,0x7d,0x2e,0xc4,0xe7,0x21,0xf2,0xa1,0xe0,0xb4,0x5a,0x4d,0x21,0xde,0xc6,0xcb,0x8c,0x57,0xb7,0x25,0xbd,0x51,0xec,0xee,0x96,0xa0,0x00,0x00,
+ 0x05,0x20,0x89,0x0a,0xee,0x57,0xfa,0xfa,0x58,0x52,0xfb,0x0b,0x8b,0xc2,0xaa,0x8f,0xa4,0x62,0xcb,0x1d,0x1c,0x0c,0x01,0x0f,0xfc,0x9d,0xde,0x75,0x40,0xbe,0x8d,0x8d,0xb2,0xe6,0x00,0x00,
+ 0x05,0x20,0x89,0x0b,0x19,0xe0,0x61,0x1c,0x97,0x91,0x18,0x52,0x63,0x1e,0x7d,0xf3,0x7d,0x82,0x0d,0x80,0x24,0xfc,0x86,0x9b,0x55,0xff,0xbe,0x2f,0x70,0xe4,0xba,0x8b,0x6f,0x31,0x00,0x00,
+ 0x05,0x20,0x89,0x4d,0x24,0x9f,0x15,0x80,0x68,0xd2,0x17,0xa1,0xec,0x74,0x46,0x26,0x8e,0xbd,0xf4,0x8f,0xc4,0x52,0x5f,0xcc,0x09,0x9f,0x1a,0x6f,0x0d,0x64,0xe3,0x00,0x9f,0x83,0x00,0x00,
+ 0x05,0x20,0x89,0xbd,0xff,0xd5,0xe5,0xce,0x0f,0x21,0x2b,0x39,0x15,0x5d,0x8a,0xc0,0x61,0xb4,0xc6,0xa8,0x20,0xdf,0x5d,0xeb,0xca,0x35,0x97,0x16,0x7d,0xba,0xce,0x3e,0x99,0xb2,0x00,0x00,
+ 0x05,0x20,0x89,0x83,0x0d,0xfa,0x58,0x48,0x06,0xcd,0x12,0xfa,0x31,0x66,0x2f,0x5f,0x33,0x45,0x44,0xa8,0xc3,0x22,0x4c,0xb2,0xb0,0x6d,0x20,0x15,0x8a,0xee,0x9e,0x14,0x9e,0x60,0x00,0x00,
+ 0x05,0x20,0x8a,0x33,0x44,0x61,0xe9,0x29,0xe8,0xa9,0xec,0x30,0x69,0x26,0xf7,0xb8,0x14,0x75,0x68,0x08,0x43,0xa4,0xf2,0x72,0x61,0xfe,0x66,0xc6,0xb9,0x98,0xd8,0x1a,0xc0,0xef,0x00,0x00,
+ 0x05,0x20,0x8a,0x8e,0x1d,0xf3,0xdb,0x0c,0xea,0x57,0x66,0xd3,0x06,0xfe,0x89,0xad,0x53,0xdf,0xd1,0x86,0x89,0xea,0xc8,0x15,0xab,0x9d,0xc4,0xe2,0x8d,0xf9,0xc0,0x05,0x84,0x50,0x00,0x00,
+ 0x05,0x20,0x8a,0xf8,0x1d,0xc7,0xa7,0xed,0xdc,0x37,0x7d,0x48,0xb7,0x1b,0x85,0x0f,0x91,0x3b,0x85,0xc4,0xef,0xea,0xba,0x33,0x9c,0x07,0xd4,0x51,0x84,0xe6,0x60,0x5a,0x84,0x70,0x00,0x00,
+ 0x05,0x20,0x8b,0x64,0x93,0x22,0x20,0x7f,0x56,0x53,0xdd,0xe1,0xd5,0xc5,0x9a,0x02,0xc6,0x76,0x66,0x1e,0x3e,0x66,0x1d,0xa7,0xd8,0x88,0x3a,0x0e,0x7f,0xaa,0x9e,0x60,0x46,0x93,0x00,0x00,
+ 0x05,0x20,0x8c,0x59,0xa7,0x91,0x92,0xe6,0xba,0x1a,0x1d,0xcd,0x7c,0xdf,0xf5,0x86,0x61,0x7c,0x59,0x6b,0x24,0xe1,0x2c,0xc9,0x8e,0x51,0x35,0x56,0xba,0xd1,0x2e,0xff,0x89,0x23,0x00,0x00,
+ 0x05,0x20,0x8d,0x53,0x9b,0x81,0x5b,0x4d,0x6d,0x69,0xa3,0xea,0x59,0x43,0xee,0x5a,0x32,0x62,0xca,0x29,0x78,0x44,0x44,0x0f,0x90,0x85,0x89,0xc3,0x5c,0xa6,0xf6,0x79,0xd9,0x0d,0x00,0x00,
+ 0x05,0x20,0x8d,0x8c,0x5d,0x59,0x3a,0xbf,0xbd,0x79,0xb5,0x37,0xd8,0xcc,0x6b,0x9d,0x54,0xc7,0x8d,0x54,0x1e,0xb4,0x8f,0x35,0x30,0xa9,0xc4,0x4f,0x82,0x3f,0xa2,0x8a,0x74,0x11,0x00,0x00,
+ 0x05,0x20,0x8d,0xc1,0x31,0x70,0x3f,0x70,0x4c,0xe9,0x57,0x2d,0x7c,0x22,0xcc,0x45,0x7e,0x9e,0x35,0x84,0x5c,0xe8,0xfc,0x5e,0x13,0xf3,0xb2,0x73,0xe1,0x6c,0x99,0x78,0x43,0x0c,0x00,0x00,
+ 0x05,0x20,0x8e,0x36,0x8a,0x00,0x01,0x2f,0x48,0xaf,0xed,0xd3,0x2d,0x44,0x7b,0x46,0x11,0xc1,0x33,0xb6,0xc8,0xd0,0xef,0xc2,0xf6,0x65,0x58,0xcd,0x19,0x03,0x94,0x27,0x34,0xc1,0x00,0x00,
+ 0x05,0x20,0x8e,0x1f,0x2c,0x41,0xc3,0xd6,0x21,0xbc,0x80,0xc2,0xad,0x45,0xaf,0x73,0x75,0xc0,0xe7,0x5e,0x65,0x9a,0x25,0xbb,0x1d,0xdb,0xaa,0x4e,0x71,0x0d,0x49,0xb5,0xcd,0x74,0x00,0x00,
+ 0x05,0x20,0x96,0xfa,0x75,0xb5,0x94,0x62,0x8c,0x39,0x55,0x3a,0x31,0x1e,0xdb,0x45,0xdc,0xb3,0xb4,0x7f,0xce,0x5f,0x18,0xd2,0x73,0xa0,0xf0,0x31,0xb1,0x66,0xfe,0x02,0xc3,0x34,0x00,0x00,
+ 0x05,0x20,0x96,0xe2,0x12,0x75,0xbf,0x5e,0x31,0xe9,0x30,0x91,0x7a,0x8d,0x1e,0x20,0x53,0xc8,0x6a,0xa1,0x22,0x9f,0x35,0xf0,0x9f,0x66,0x16,0xdd,0xf1,0x6f,0x6a,0x2c,0x45,0x4e,0x00,0x00,
+ 0x05,0x20,0x97,0x37,0x6e,0x4e,0x4c,0xcb,0x06,0x3a,0xd3,0x42,0xbd,0x0c,0x7d,0x2e,0xfc,0x77,0x59,0x47,0xee,0x2a,0xaa,0x4e,0xce,0x77,0xb4,0xd4,0x20,0xf3,0x70,0x30,0x59,0xf1,0x00,0x00,
+ 0x05,0x20,0x97,0x20,0xb5,0xe3,0x88,0xb6,0x49,0x52,0x25,0x5c,0x25,0xfb,0x92,0xc0,0xe1,0xe4,0xfd,0xef,0x3b,0xfb,0x65,0x46,0xcc,0x70,0xcf,0xa7,0x3f,0x37,0x87,0xff,0xeb,0x52,0x00,0x00,
+ 0x05,0x20,0x97,0x57,0x2e,0x6a,0xb9,0x28,0x21,0x93,0x45,0x31,0xf0,0xaa,0x65,0x30,0xc8,0x29,0x11,0xa8,0xce,0xa9,0xfd,0x32,0x05,0xa5,0x4f,0x93,0x27,0xed,0x26,0xd3,0x65,0x6f,0x00,0x00,
+ 0x05,0x20,0x97,0xa8,0xc2,0xe6,0xc4,0xd7,0xef,0xf0,0x67,0x58,0x4c,0x8d,0x02,0xcd,0x39,0x05,0x9c,0x9e,0xae,0x22,0x89,0xae,0xb1,0xa8,0xb6,0x2c,0x35,0x0b,0x38,0x2c,0x5e,0x98,0x00,0x00,
+ 0x05,0x20,0x97,0xab,0x21,0x87,0x1a,0x5a,0x00,0x03,0xb7,0x45,0x3f,0xe1,0x58,0x90,0xf0,0x2d,0x25,0xf3,0x03,0x3b,0x7e,0xe9,0xb8,0xbd,0x33,0x2a,0x4e,0xce,0x00,0xf5,0xcf,0x3d,0x00,0x00,
+ 0x05,0x20,0x90,0x36,0xad,0x5d,0x0f,0x0d,0x2c,0xcf,0x68,0x21,0xeb,0x74,0xcb,0x02,0x18,0xc2,0x45,0x5b,0xe4,0x3d,0xda,0x99,0x94,0x35,0xce,0x49,0x9a,0x97,0xb6,0x14,0x8e,0x49,0x00,0x00,
+ 0x05,0x20,0x90,0x06,0xd5,0xe4,0xd4,0x00,0x38,0xaf,0x2a,0xaf,0x42,0xb1,0xaf,0xa3,0x2f,0xdf,0x89,0x1d,0xa3,0xa7,0xff,0x17,0xce,0xe9,0xee,0xa8,0x5a,0x04,0xc2,0x8b,0x5b,0xc4,0x00,0x00,
+ 0x05,0x20,0x90,0x13,0xda,0x08,0xe9,0xf8,0xf2,0xcb,0xa6,0xbb,0x50,0xf2,0x05,0x9a,0x61,0x86,0x6d,0xeb,0x53,0x96,0xcd,0xee,0x34,0x38,0x22,0xd6,0xd9,0xce,0xe8,0x87,0x56,0xf3,0x00,0x00,
+ 0x05,0x20,0x90,0x40,0xb7,0xe8,0x6e,0xbe,0x08,0x39,0xc7,0xba,0x52,0x7b,0xfa,0x83,0x51,0x60,0x51,0xd6,0xbe,0x4f,0xaf,0x07,0x15,0x72,0xb7,0x6d,0x12,0x03,0x7f,0x46,0x9b,0xd1,0x00,0x00,
+ 0x05,0x20,0x90,0xee,0x5c,0x84,0xd6,0xbb,0xcb,0xe3,0x85,0x0a,0xfa,0xb8,0x18,0x33,0xdb,0xb3,0x39,0x75,0x8f,0xf0,0x33,0xb6,0x74,0xac,0xea,0x6b,0x48,0x7c,0xdf,0x18,0x25,0x3a,0x00,0x00,
+ 0x05,0x20,0x91,0xfa,0x7b,0x5b,0x9a,0xad,0x97,0x25,0xf7,0xe2,0x1c,0x5c,0xf0,0x12,0x0c,0x65,0x9d,0x94,0x35,0xb1,0xd4,0xcd,0xeb,0x43,0x8f,0x89,0xbb,0x68,0xaa,0x92,0xad,0xd2,0x00,0x00,
+ 0x05,0x20,0x91,0xde,0x3d,0x89,0x05,0x12,0x5c,0x40,0xdb,0xcf,0x92,0x93,0xc7,0x95,0x91,0x67,0xd7,0x62,0x0a,0x38,0x32,0x5a,0x92,0x77,0xa7,0x23,0xa2,0x79,0x5d,0x9a,0x5b,0x63,0x00,0x00,
+ 0x05,0x20,0x92,0x3b,0x7d,0x95,0xcd,0xd9,0x2d,0xee,0x70,0xb1,0x42,0x06,0x2e,0xbb,0x72,0xc4,0x4b,0xda,0xf9,0x4a,0xe3,0xef,0x74,0xd4,0xe8,0x09,0x2b,0xb7,0x0e,0xea,0xfb,0x71,0x00,0x00,
+ 0x05,0x20,0x92,0x14,0xa6,0x46,0xf5,0xf5,0x81,0x3d,0x7b,0xb1,0x78,0x31,0xa9,0xab,0xe9,0xc5,0xb1,0x55,0xe5,0x44,0x53,0xdc,0xb6,0x5b,0x0f,0xd1,0x17,0xd3,0x7d,0x08,0x3c,0xab,0x00,0x00,
+ 0x05,0x20,0x92,0x5f,0x0c,0x17,0x71,0x87,0xdc,0x91,0x01,0x6b,0x1a,0xf0,0x1a,0xe3,0x07,0xea,0xe0,0x88,0x75,0x3b,0x00,0xc9,0xdb,0x7a,0x77,0x26,0xf9,0xfd,0xe0,0x27,0x56,0xe4,0x00,0x00,
+ 0x05,0x20,0x92,0xbe,0x04,0x55,0x44,0x1f,0x7d,0xb3,0x78,0xda,0x8a,0x35,0x20,0x18,0xcd,0x47,0xd3,0x0c,0xdd,0x94,0x15,0x20,0x0f,0x5d,0x54,0x18,0x8c,0x9a,0xbc,0x29,0x96,0x06,0x00,0x00,
+ 0x05,0x20,0x92,0xc2,0x19,0x22,0x1a,0x7b,0x1d,0x48,0x1e,0x7b,0x3e,0x5a,0x02,0xb5,0xd6,0x87,0xe5,0x7c,0xad,0x03,0x65,0x8c,0x72,0x88,0xff,0x42,0x21,0xee,0x47,0x23,0x3d,0xa2,0x00,0x00,
+ 0x05,0x20,0x92,0xc9,0xb1,0x04,0x23,0x73,0x3d,0x15,0x34,0x5b,0x1c,0x61,0x30,0x58,0x53,0x7e,0x3d,0xbe,0xa0,0x40,0xe8,0xfa,0x62,0x45,0x29,0x18,0x0e,0x5c,0x31,0x4e,0x57,0x18,0x00,0x00,
+ 0x05,0x20,0x92,0xda,0xca,0x4c,0x9d,0x77,0x8f,0xad,0xac,0x68,0x66,0xf9,0x68,0xbb,0x99,0x3f,0x20,0x0d,0x3c,0x47,0x6c,0x94,0xc1,0xbc,0x8a,0xd3,0x72,0x2f,0xd3,0xae,0xcf,0xd3,0x00,0x00,
+ 0x05,0x20,0x93,0x4a,0x86,0xc8,0x2b,0x3f,0x13,0xcb,0x4a,0xba,0x6f,0x54,0xc5,0x16,0xe1,0xac,0x32,0x22,0x23,0x51,0xc1,0x71,0x4e,0x1c,0x90,0xc7,0xa9,0xfd,0xb1,0xd2,0x23,0xfd,0x00,0x00,
+ 0x05,0x20,0x93,0x65,0x6d,0x92,0xc5,0xfd,0x93,0x3b,0x49,0xe8,0xa2,0x77,0xb3,0xee,0xb3,0xbb,0x70,0x15,0xae,0x91,0xc8,0xac,0xcf,0xd3,0xda,0x45,0x26,0x5e,0xbc,0xee,0x44,0xd5,0x00,0x00,
+ 0x05,0x20,0x93,0x9c,0xef,0x81,0x2e,0xff,0x00,0x97,0x79,0x9a,0xc3,0x98,0x21,0x79,0x22,0x71,0x46,0x65,0x0d,0xd8,0x48,0x83,0x17,0xaf,0x6d,0xc5,0x6b,0x49,0x47,0xc5,0xb7,0xe6,0x00,0x00,
+ 0x05,0x20,0x93,0xa2,0xe0,0xdb,0x5a,0x89,0x23,0x13,0xbe,0xfd,0x9f,0xbe,0x97,0x62,0x00,0x46,0xdd,0x4f,0x5e,0x55,0x85,0xc3,0xfb,0x0d,0xcc,0x9b,0x6c,0xd8,0x66,0x6c,0xe4,0x8c,0x00,0x00,
+ 0x05,0x20,0x93,0xa6,0xfa,0x8a,0x10,0xce,0x59,0x3c,0x79,0x6b,0x43,0x2c,0xba,0xa9,0xb0,0x90,0xc5,0x87,0xb7,0x96,0x93,0x6c,0xaf,0x7f,0xea,0x23,0xf2,0xcc,0x7f,0xd6,0xd1,0xa0,0x00,0x00,
+ 0x05,0x20,0x93,0xc2,0x1d,0xf1,0x72,0x5a,0xb5,0x35,0x8e,0xd9,0x8f,0x30,0x34,0x68,0x54,0x5a,0xbf,0x2b,0x99,0x7b,0x43,0x03,0xa3,0x1b,0xfc,0xf5,0xc3,0x78,0x40,0x49,0xfd,0x73,0x00,0x00,
+ 0x05,0x20,0x93,0xe8,0x00,0x6b,0x1e,0x84,0x81,0x8b,0x61,0xea,0x5e,0x7e,0x89,0x88,0x3d,0x52,0xc9,0x27,0x18,0x85,0xd5,0xfd,0xe6,0x70,0xab,0xb4,0xb5,0x1e,0xff,0x90,0x48,0xba,0x00,0x00,
+ 0x05,0x20,0x94,0x12,0x98,0x62,0x27,0x3f,0x3a,0x97,0x98,0xaf,0xf7,0x90,0x34,0x22,0x26,0x3f,0x44,0xaf,0x97,0x92,0xff,0x88,0x4d,0x2f,0xa1,0x5a,0x38,0xe0,0xc9,0xd3,0xa7,0xf3,0x00,0x00,
+ 0x05,0x20,0x94,0x12,0xe8,0xca,0x00,0x60,0x70,0x82,0x36,0x8c,0x37,0x60,0xfb,0x6c,0xae,0x2c,0xd4,0xfe,0x72,0xaf,0x90,0xf8,0xbb,0x29,0x66,0x0a,0xf8,0xb0,0x1b,0x8c,0x67,0x8d,0x00,0x00,
+ 0x05,0x20,0x94,0x23,0xef,0x14,0x87,0xd1,0xb6,0x5f,0x05,0x4d,0x9e,0xa6,0xd5,0xcd,0x8d,0x3c,0x06,0xac,0xba,0x1b,0x49,0xc6,0x00,0x4c,0xb4,0x94,0x8f,0x1a,0xfa,0xba,0xc9,0xd8,0x00,0x00,
+ 0x05,0x20,0x94,0xd7,0x30,0x49,0x85,0xe0,0x7b,0xc9,0x46,0x29,0x0e,0xd8,0x5f,0x9d,0x33,0x4d,0x59,0x5a,0xb2,0x5a,0xf0,0x67,0x70,0x28,0x42,0x1c,0xd6,0xb3,0x45,0x9a,0x86,0x4d,0x00,0x00,
+ 0x05,0x20,0x95,0x3e,0x3e,0x05,0x14,0x8a,0x0e,0xac,0x47,0x70,0x21,0x01,0xf6,0x01,0x4a,0xbe,0x50,0xab,0xc7,0xb9,0x47,0x32,0xda,0xc7,0x07,0xd8,0x52,0x49,0x3d,0xef,0x29,0xef,0x00,0x00,
+ 0x05,0x20,0x95,0x99,0x30,0x3a,0x4f,0xa8,0x28,0xff,0xb0,0x9b,0x1d,0x72,0xbb,0x76,0xee,0x23,0x8e,0x74,0xf3,0x2d,0xec,0x3c,0x03,0x22,0xa8,0x2f,0xd5,0x79,0xc8,0x96,0x24,0x51,0x00,0x00,
+ 0x05,0x20,0x96,0x0f,0x72,0x1e,0xab,0xf4,0x68,0x15,0xdb,0xca,0xee,0x24,0xcc,0x8a,0x50,0x8e,0x47,0x26,0x8f,0xe4,0x84,0x43,0x60,0x2c,0xaa,0xa9,0xcc,0x51,0x09,0xf4,0xd3,0xa5,0x00,0x00,
+ 0x05,0x20,0x96,0x14,0x9b,0x6d,0x2d,0x0f,0xdb,0xe0,0xbb,0xbf,0xe5,0x9a,0xf4,0x02,0xe7,0x7e,0x9a,0xce,0x18,0x5e,0x38,0xb8,0x93,0xf2,0xbe,0x9c,0x64,0x17,0x85,0xd8,0x93,0x9c,0x00,0x00,
+ 0x05,0x20,0x96,0x21,0x7c,0x2f,0xdf,0x0f,0x0e,0x37,0x76,0x9b,0x4c,0xd4,0xac,0xc8,0x01,0x10,0xab,0x34,0x80,0x91,0x7d,0x24,0x77,0x57,0xed,0x88,0xb4,0x5e,0x6a,0xfe,0xf9,0x52,0x00,0x00,
+ 0x05,0x20,0x9e,0x89,0xce,0xa6,0x5c,0x1b,0x78,0x22,0xcb,0x18,0x25,0x59,0xaf,0x67,0xab,0x9d,0x59,0x4f,0x2c,0xb3,0xbe,0x50,0x94,0x70,0xac,0xdd,0x79,0x5d,0x4f,0x78,0x50,0x1c,0x00,0x00,
+ 0x05,0x20,0x9e,0xf5,0x01,0x0b,0x53,0x0a,0x4d,0x0b,0xc7,0x03,0x8e,0xa7,0x73,0x33,0x80,0x39,0xce,0x02,0x6f,0x2a,0x53,0x92,0xc3,0x50,0x87,0xb7,0x4d,0x20,0xce,0x23,0xad,0xe4,0x00,0x00,
+ 0x05,0x20,0x9f,0x37,0x08,0x66,0x97,0xfa,0x15,0xf5,0x29,0x1a,0x8d,0xe6,0x85,0xac,0x46,0x0d,0xe3,0x96,0xd0,0xe9,0x00,0xbf,0x69,0xc0,0xfd,0xd4,0xa0,0xea,0xab,0xa0,0xc6,0xef,0x00,0x00,
+ 0x05,0x20,0x9f,0x1a,0xe9,0xad,0x03,0xe0,0x48,0x9b,0x67,0x53,0xcd,0x04,0xfa,0x90,0x6d,0x51,0x29,0x25,0x11,0xaf,0x6d,0x3b,0x28,0x08,0x23,0x39,0xf6,0xb8,0x3a,0x88,0x34,0x2e,0x00,0x00,
+ 0x05,0x20,0x9f,0x44,0x3f,0xc3,0x7e,0x6b,0xbc,0x37,0x5c,0x74,0xa5,0x55,0xd7,0xc8,0x77,0xe7,0xf2,0xbf,0xba,0x92,0x68,0x94,0x93,0x5b,0xe2,0xf6,0x63,0xb7,0x6d,0x44,0xf9,0x4a,0x00,0x00,
+ 0x05,0x20,0x9f,0xcc,0x16,0x10,0xb2,0x7b,0x70,0xd0,0x13,0x2c,0xad,0xf9,0xce,0x95,0x20,0x7b,0xf5,0xc7,0xa5,0x25,0xfd,0xaf,0xb2,0x55,0xf6,0x5b,0x1c,0xbc,0xe2,0x9b,0xb2,0x3b,0x00,0x00,
+ 0x05,0x20,0x98,0x1a,0xc3,0xd5,0x4e,0xc0,0xf7,0xd5,0x17,0xc0,0xd3,0x4e,0x9e,0xc5,0x81,0xb3,0xe7,0xb9,0x1c,0x5e,0x99,0xf0,0xf9,0x2c,0x9c,0xeb,0x31,0xdf,0x76,0xce,0x62,0x70,0x00,0x00,
+ 0x05,0x20,0x98,0x60,0x43,0xb1,0x9b,0x6d,0x28,0x5d,0x49,0xf6,0x92,0x5c,0x18,0x8b,0x87,0x37,0xa9,0x74,0xa3,0x8c,0x19,0x16,0x8a,0x9f,0x16,0xcf,0x03,0xf2,0xf5,0x75,0xf4,0x54,0x00,0x00,
+ 0x05,0x20,0x98,0x62,0x91,0x66,0xcb,0xff,0xab,0xf7,0x07,0xc7,0x73,0x77,0xec,0xf8,0xbb,0xeb,0xa6,0xfa,0xf4,0xdc,0xf7,0xe1,0xbd,0xbc,0xd9,0xc6,0x00,0xa7,0xf7,0x5d,0xb5,0x8b,0x00,0x00,
+ 0x05,0x20,0x98,0xaf,0xb2,0xce,0x43,0x5e,0xfd,0x45,0x62,0x54,0xa1,0x2d,0x81,0x81,0xe3,0xcd,0x29,0xc0,0x2c,0x96,0xc1,0xb5,0xa9,0x42,0x84,0x46,0xac,0x30,0x70,0x1f,0xe4,0xc2,0x00,0x00,
+ 0x05,0x20,0x99,0x26,0xe8,0x24,0x06,0x91,0x7e,0x57,0x91,0x20,0x4a,0x2c,0xce,0x45,0xd2,0x84,0x85,0x8e,0x9e,0x90,0x0e,0x7a,0x71,0x40,0xc5,0xa1,0xc1,0xd9,0x8c,0xad,0x5c,0x5b,0x00,0x00,
+ 0x05,0x20,0x99,0x79,0x37,0x64,0xfd,0xa3,0x64,0x6c,0x65,0xe3,0x93,0x22,0x31,0x3c,0x26,0x22,0xad,0xa0,0x1a,0x9f,0x9b,0xfa,0x9a,0xe0,0x4b,0xc8,0xa5,0xd5,0x26,0x83,0xb5,0x9e,0x00,0x00,
+ 0x05,0x20,0x99,0x69,0x59,0xa3,0xf8,0x73,0x5b,0xd7,0xa5,0xf3,0xce,0x6a,0xf9,0x1c,0xfa,0xdd,0xf9,0x18,0x26,0xac,0xd5,0x24,0xe5,0xc4,0x2d,0x5d,0x39,0xa5,0x81,0x3c,0x61,0xf1,0x00,0x00,
+ 0x05,0x20,0x99,0xbc,0x67,0x1f,0x65,0x5e,0x58,0x22,0x47,0xb5,0x71,0x67,0xa6,0x97,0x73,0xa0,0xd9,0xf4,0x2b,0x04,0xce,0xf7,0xcc,0xc7,0x1e,0xf5,0x61,0x76,0x0b,0x88,0x22,0x2e,0x00,0x00,
+ 0x05,0x20,0x99,0xa7,0xf8,0x8c,0xf8,0xb4,0xd7,0x67,0x07,0x9f,0x2a,0xdf,0xe1,0x0a,0x1f,0x7c,0x62,0x13,0xf1,0x0f,0x6d,0x99,0xbb,0xcb,0x34,0xc2,0xa1,0xf0,0x93,0x4f,0x54,0xb1,0x00,0x00,
+ 0x05,0x20,0x99,0xf6,0x34,0xf6,0x50,0xb7,0xfa,0xb3,0x03,0x73,0x69,0x4a,0x19,0x62,0xc0,0x4d,0xc0,0x5a,0xfc,0x55,0x58,0x7f,0x22,0x0f,0xd6,0xfc,0x37,0x6d,0xca,0xf4,0x83,0xbc,0x00,0x00,
+ 0x05,0x20,0x9a,0x75,0x47,0xb0,0x4a,0xe7,0xd0,0xa9,0x94,0xfc,0xab,0x44,0xcc,0x01,0x2d,0x50,0x41,0x38,0x19,0x70,0xce,0x38,0x27,0x40,0x85,0xfd,0x90,0xe7,0x47,0x87,0x0c,0x93,0x00,0x00,
+ 0x05,0x20,0x9a,0xbd,0xbb,0x87,0x34,0x37,0xc6,0x42,0xf8,0x92,0x45,0x5c,0x5b,0x43,0x47,0xd0,0xbb,0xb0,0x47,0x6e,0x9f,0xcf,0x22,0x64,0x70,0xd8,0x19,0x78,0x40,0x0e,0xc4,0x7a,0x00,0x00,
+ 0x05,0x20,0x9a,0xb3,0x4c,0x48,0x1c,0x5a,0x80,0x3e,0xec,0x58,0xb0,0x67,0xe9,0x19,0xe2,0x68,0xeb,0x5a,0x8d,0x49,0x20,0x26,0xf5,0x5b,0x05,0xb1,0x1d,0x1b,0xfe,0x25,0x26,0xc2,0x00,0x00,
+ 0x05,0x20,0x9a,0xf7,0x75,0x29,0xb4,0xa2,0xab,0x84,0x37,0x07,0xac,0xff,0x20,0x67,0x73,0xae,0x75,0xc7,0xcc,0xd8,0x84,0xf3,0x8d,0xa0,0xd8,0x36,0x0a,0x07,0x88,0xba,0x76,0xd7,0x00,0x00,
+ 0x05,0x20,0x9a,0xfd,0xe0,0xa8,0xae,0x85,0x3c,0x40,0x30,0x80,0x84,0xd7,0x68,0xd4,0xb3,0x9e,0x05,0xeb,0xa7,0x72,0xef,0xf2,0x0d,0x9c,0x7f,0x73,0x1a,0x56,0xa4,0xdb,0x47,0x38,0x00,0x00,
+ 0x05,0x20,0x9a,0xcb,0x39,0xa8,0x32,0x3c,0x44,0x8b,0xd3,0xc8,0xf4,0xb0,0xd9,0xaf,0xb7,0x4c,0x9c,0x7f,0x32,0x66,0x2b,0xd1,0x7e,0xf1,0x4d,0x01,0xf0,0x4a,0x1d,0x69,0xa7,0x0c,0x00,0x00,
+ 0x05,0x20,0x9b,0x18,0x96,0x0a,0x36,0x21,0x92,0xa2,0x74,0xb9,0xae,0x8e,0x70,0x6a,0xca,0x44,0xbe,0xbf,0x5c,0x60,0x07,0xca,0xa8,0x6b,0x86,0x27,0x62,0x1a,0xc1,0xf6,0xbe,0x5e,0x00,0x00,
+ 0x05,0x20,0x9b,0x82,0x32,0x5b,0xdd,0xef,0x05,0xff,0x24,0xf1,0xa2,0xc4,0x3d,0x4a,0x46,0xa9,0x0b,0xf1,0xc7,0x08,0x6a,0x35,0x74,0xdc,0x8c,0xd6,0x69,0x23,0x93,0x7f,0xc0,0xa8,0x00,0x00,
+ 0x05,0x20,0x9c,0x68,0x2a,0xac,0x16,0x7d,0x0b,0x19,0x65,0x58,0xe6,0x72,0x73,0xde,0x63,0x1b,0x4e,0x87,0x71,0x8d,0x80,0x2d,0x91,0x73,0xed,0xfa,0x90,0xaf,0x23,0x9c,0xe3,0x35,0x00,0x00,
+ 0x05,0x20,0x9c,0x8b,0x1f,0x66,0xa2,0x34,0x99,0x6d,0x11,0x40,0xbc,0x21,0x35,0x0e,0x2d,0x0a,0x03,0xda,0x21,0xdf,0x59,0x99,0x19,0xb2,0x42,0x8d,0x6c,0x4d,0x0f,0x9e,0x37,0xd3,0x00,0x00,
+ 0x05,0x20,0x9c,0xa2,0xb0,0xdc,0x18,0x3a,0x0f,0x43,0x47,0xfa,0xde,0x7d,0x15,0x60,0x05,0x32,0xda,0x71,0x63,0x28,0xd6,0x4e,0xe4,0xe6,0x58,0x28,0xd3,0x28,0x29,0x43,0xee,0xc3,0x00,0x00,
+ 0x05,0x20,0x9d,0x77,0x7e,0x28,0x63,0x0d,0x3f,0xdd,0xcd,0xab,0x31,0xcc,0x7d,0xce,0xee,0x33,0xf5,0xe9,0xaf,0x03,0x9f,0x3f,0x15,0xf6,0x42,0xbf,0xc8,0xeb,0x99,0xae,0x11,0x78,0x00,0x00,
+ 0x05,0x20,0x9d,0x43,0x49,0xc6,0xbf,0xdd,0xcf,0x68,0x06,0x6e,0x93,0x02,0xfd,0x88,0x92,0x1e,0x05,0xd0,0x86,0x72,0x58,0x31,0xc3,0x26,0x45,0xfc,0x72,0x3b,0xf3,0x33,0x36,0x41,0x00,0x00,
+ 0x05,0x20,0x9d,0x5d,0x3a,0xf5,0xfb,0x23,0x2f,0x76,0xcd,0x1a,0x0b,0x6b,0x41,0x04,0xb8,0xe4,0xdd,0xf3,0x5d,0xf3,0xb5,0x4f,0xc8,0x65,0xb4,0x3e,0x3d,0xa3,0x98,0xed,0x4d,0x38,0x00,0x00,
+ 0x05,0x20,0x9d,0xdf,0x1e,0xf9,0x35,0x09,0x76,0xb6,0x40,0xc0,0x76,0x60,0x38,0x64,0xc2,0x51,0x5f,0x43,0x67,0x03,0xe0,0xac,0xf5,0xa9,0x2e,0x74,0xea,0x5d,0x9d,0x5c,0xd2,0x03,0x00,0x00,
+ 0x05,0x20,0x9e,0x0a,0xa3,0xe7,0xc6,0x33,0xd1,0xa8,0xe1,0x44,0xce,0xeb,0xb4,0xf4,0xbb,0x25,0x5a,0x9b,0x95,0xc0,0xa7,0xea,0x4f,0xb3,0x47,0x20,0x28,0xa8,0x8a,0x08,0xa2,0x38,0x00,0x00,
+ 0x05,0x20,0x9e,0x2b,0x2a,0x43,0x1b,0xf0,0xaf,0xac,0x54,0xbf,0x49,0xda,0xa1,0xf5,0xc9,0x17,0x74,0x6f,0x56,0xeb,0xd4,0x6d,0xd8,0x48,0xf0,0xb3,0xd5,0xed,0xbe,0x6e,0xa8,0xc6,0x00,0x00,
+ 0x05,0x20,0x9e,0x7b,0x3b,0x8d,0x0f,0x55,0xc4,0xdc,0x0f,0x22,0x95,0x21,0x6e,0x7e,0x17,0x1d,0x5e,0xe0,0xfb,0x9c,0xa6,0xc5,0x39,0xac,0x31,0x09,0x4d,0xbc,0xbf,0xfd,0xaa,0xff,0x00,0x00,
+ 0x05,0x20,0x9e,0x68,0x30,0x84,0x53,0xb1,0x03,0xf8,0xbd,0xa5,0xd5,0x65,0x6a,0x5b,0x5e,0x4f,0xb7,0x89,0x43,0x33,0x90,0x67,0xf5,0x95,0xe5,0x4f,0xae,0x0a,0x4e,0x84,0x42,0x97,0x00,0x00,
+ 0x05,0x20,0xa6,0xa6,0xd8,0xe2,0x41,0x74,0x21,0x64,0xb7,0xfb,0x05,0x8d,0xc3,0x96,0xf3,0x2a,0x4c,0x18,0x00,0x3e,0xac,0x46,0x6c,0x53,0x9b,0x97,0xbf,0xa4,0x8c,0x40,0x69,0xc4,0x00,0x00,
+ 0x05,0x20,0xa7,0x51,0x7b,0x88,0x7e,0x92,0xeb,0x9b,0xba,0x89,0xee,0xf4,0xd4,0xd2,0x57,0xf9,0x05,0xcb,0x11,0x91,0x2d,0x98,0x6f,0x1a,0xcb,0x9a,0xda,0xa8,0xd2,0x81,0x47,0xb7,0x00,0x00,
+ 0x05,0x20,0xa7,0xb7,0xde,0x7f,0xf4,0xbc,0x25,0xfc,0xf2,0x95,0xb5,0xf5,0xae,0x53,0xce,0x4b,0x76,0x2d,0x92,0xc2,0x0f,0xbc,0x5d,0xa7,0xf0,0x58,0x73,0x0c,0x46,0x24,0xad,0xd2,0x00,0x00,
+ 0x05,0x20,0xa7,0xad,0x1b,0x73,0xf8,0x2a,0x47,0x95,0x78,0x1f,0x68,0xbc,0x2f,0x48,0x55,0x2b,0x95,0x6a,0x41,0x95,0xa1,0xee,0x43,0xc2,0xb8,0x64,0x6b,0xf7,0x59,0x00,0x4d,0xd0,0x00,0x00,
+ 0x05,0x20,0xa7,0xe8,0xa5,0xb6,0xd3,0x38,0x63,0x86,0xc7,0x79,0xd1,0x85,0xbc,0x5c,0xac,0x47,0x70,0xe2,0x32,0x54,0x32,0x42,0x1e,0x35,0x9c,0xe5,0xf5,0xe2,0xeb,0xb5,0xbb,0xfb,0x00,0x00,
+ 0x05,0x20,0xa7,0xf0,0x66,0xec,0xe4,0x74,0xaf,0x4f,0x2f,0x43,0x41,0x37,0xcc,0x7e,0xd3,0x21,0x2e,0x57,0xf8,0xfa,0xb7,0x53,0xb6,0x9e,0x3c,0xd7,0x30,0xe0,0xaf,0x12,0x41,0xb1,0x00,0x00,
+ 0x05,0x20,0xa0,0x0d,0x2f,0x1d,0x9e,0xe7,0x8b,0xa8,0x4b,0x10,0x29,0xf2,0x99,0xea,0xeb,0x6a,0x60,0x14,0x39,0xe8,0x70,0xcc,0x7c,0x59,0xd2,0x19,0xb3,0xf0,0xda,0x61,0x31,0xa6,0x00,0x00,
+ 0x05,0x20,0xa0,0xbb,0xa8,0xe7,0x3c,0xbd,0x3a,0x85,0x5f,0xc7,0x5f,0xa3,0xe9,0x42,0xe5,0x62,0x31,0x8b,0xc8,0xa5,0x78,0xa9,0xd2,0xc6,0x33,0x23,0xc5,0x94,0x0e,0xc9,0xb5,0x0e,0x00,0x00,
+ 0x05,0x20,0xa0,0xcb,0x73,0xea,0x3d,0xc1,0x69,0xdc,0xff,0x0d,0xc8,0x05,0x48,0xfd,0xfb,0x37,0xe8,0x6d,0xf5,0x45,0x06,0xf6,0x63,0x92,0x5a,0x08,0x32,0xf1,0xa2,0xb7,0x59,0xe5,0x00,0x00,
+ 0x05,0x20,0xa0,0xd5,0x68,0x0d,0xdd,0x70,0xcd,0xd6,0xbd,0xbd,0xd4,0x68,0x44,0x3c,0xc7,0x6f,0x5c,0xc3,0xd5,0xc9,0x99,0xf2,0x36,0x54,0x55,0xa3,0x98,0x6c,0x99,0x74,0x67,0xca,0x00,0x00,
+ 0x05,0x20,0xa0,0xf2,0x1b,0xf5,0x38,0xac,0x5f,0xc3,0x6d,0x14,0x4a,0xc4,0x0f,0xa5,0xab,0x00,0x00,0x0e,0xb3,0x64,0xe2,0x6b,0xc9,0x06,0x3f,0x9d,0x5f,0xe5,0x78,0x43,0x48,0xbb,0x00,0x00,
+ 0x05,0x20,0xa1,0x4c,0xe0,0x03,0xc6,0xff,0x3d,0x9c,0xbd,0xe7,0xa5,0x6f,0x47,0x32,0x88,0xca,0xb0,0x57,0xe7,0x9d,0x11,0xe1,0x30,0x7e,0x4a,0x8e,0x2d,0x08,0x78,0x49,0x0c,0x1a,0x00,0x00,
+ 0x05,0x20,0xa1,0x51,0x39,0xc5,0x71,0xe1,0x01,0x49,0xbc,0xf4,0x86,0x68,0xe9,0x8b,0xe1,0xdd,0xef,0xaf,0xb7,0x97,0x36,0x3a,0x02,0xb3,0x85,0x70,0xbc,0xd9,0x57,0xbe,0x87,0xd4,0x00,0x00,
+ 0x05,0x20,0xa1,0xad,0xdc,0x84,0xf2,0xd3,0xeb,0x23,0x5d,0x04,0x52,0xd8,0x2f,0x67,0x99,0xf0,0xfa,0x2a,0xe2,0x97,0xe3,0xc5,0x37,0x97,0x54,0x19,0xd2,0x6b,0xd4,0x09,0x74,0xf4,0x00,0x00,
+ 0x05,0x20,0xa2,0x4d,0xe0,0xf0,0x58,0xb9,0xd1,0xd7,0x97,0x8f,0xa5,0xab,0x6a,0x3e,0x91,0xda,0x06,0x36,0x6b,0x74,0x40,0x40,0xf4,0x19,0xf6,0x5f,0x03,0x29,0xd5,0x73,0xe0,0xaa,0x00,0x00,
+ 0x05,0x20,0xa3,0x47,0x9a,0x16,0x49,0x20,0x79,0x05,0x97,0xf8,0xea,0xd6,0x7e,0xfa,0x69,0x47,0xb2,0xb3,0xce,0x47,0x5c,0xb0,0x79,0xf3,0x09,0x1c,0x81,0xa5,0x70,0x18,0xbf,0xeb,0x00,0x00,
+ 0x05,0x20,0xa3,0x83,0x67,0x3c,0xed,0xcc,0x21,0xcc,0x1d,0xef,0xef,0x00,0x89,0x50,0x7d,0x72,0x4d,0x1b,0xc3,0xcf,0x04,0x99,0x0e,0x02,0x1e,0x85,0xbe,0x33,0x99,0x22,0x74,0x1e,0x00,0x00,
+ 0x05,0x20,0xa3,0x87,0x81,0x24,0x72,0x13,0xe9,0x15,0x90,0xce,0xd3,0x63,0x2f,0xbe,0x6e,0xc9,0x35,0xe7,0xfb,0x5b,0xf4,0xf5,0x1d,0x4c,0x17,0xed,0x02,0x33,0x23,0xc3,0xa4,0x00,0x00,0x00,
+ 0x05,0x20,0xa3,0x8f,0x4b,0xb5,0x23,0xd7,0xc4,0x59,0x82,0x21,0x2f,0x94,0x7e,0x0b,0x2c,0x74,0xed,0x59,0x4d,0xee,0x6e,0xa4,0x69,0x6a,0xaf,0x29,0x60,0xa3,0x30,0xdf,0x35,0x2e,0x00,0x00,
+ 0x05,0x20,0xa3,0xf4,0xaa,0x0e,0xd0,0x73,0x21,0x1b,0x54,0xae,0x33,0x5a,0x7c,0xe9,0x89,0xb4,0x2a,0xa3,0x3d,0x4d,0x2e,0x24,0x27,0xf2,0x84,0xea,0x1c,0x4a,0xee,0x1c,0x48,0xfb,0x00,0x00,
+ 0x05,0x20,0xa3,0xd8,0x4f,0x8b,0xdc,0x1d,0x92,0x60,0xcf,0xf6,0xfe,0xb0,0x5e,0xe0,0x6b,0xd8,0xf0,0xfd,0x74,0x73,0x23,0x62,0xa8,0x7b,0x3b,0x05,0xbc,0x70,0xa2,0x22,0x86,0x64,0x00,0x00,
+ 0x05,0x20,0xa3,0xdf,0x77,0x0c,0xbe,0x0e,0x77,0x04,0x06,0xaf,0xce,0x6b,0x32,0x0d,0x7d,0x5a,0xb6,0x7f,0x96,0x4b,0x8d,0x98,0x41,0xe8,0x4c,0x85,0x46,0xf3,0x4e,0xb0,0x55,0x75,0x00,0x00,
+ 0x05,0x20,0xa4,0x60,0xb8,0xec,0x44,0x47,0xde,0xfd,0x0a,0x34,0x30,0x39,0x3b,0xdd,0x8c,0xa9,0x17,0xb0,0x9f,0xed,0x90,0x61,0x98,0x65,0xe4,0xfb,0x99,0x56,0x05,0x9c,0xaf,0xfa,0x00,0x00,
+ 0x05,0x20,0xa4,0x8d,0x04,0x26,0x36,0x3c,0xec,0x67,0x11,0x49,0x14,0x75,0xec,0x40,0x46,0x7b,0x45,0x67,0xc8,0x92,0x14,0x63,0xb2,0x11,0x5b,0xe9,0x37,0x13,0xaa,0x33,0x7c,0xdc,0x00,0x00,
+ 0x05,0x20,0xa5,0x39,0xfa,0x5c,0x70,0x84,0xeb,0xa7,0xc1,0xd1,0x08,0x2e,0xd3,0x9c,0xac,0x14,0xae,0xc5,0x36,0xaf,0x89,0x00,0xc0,0xc2,0x0a,0x74,0xa3,0xce,0x87,0x9c,0x3f,0x50,0x00,0x00,
+ 0x05,0x20,0xa5,0x79,0xc6,0x25,0xd0,0x8a,0x76,0xcd,0x9b,0x39,0xed,0xae,0xb6,0xcb,0x33,0xeb,0xea,0x65,0x6d,0x10,0x58,0xb6,0xf6,0x40,0xa4,0xf5,0x1b,0xe3,0x5c,0x18,0x96,0x85,0x00,0x00,
+ 0x05,0x20,0xa6,0x24,0x76,0x79,0xae,0x50,0xd3,0x88,0x6d,0x7c,0xde,0xb5,0xc0,0x4f,0x51,0x41,0x9e,0x0e,0x65,0x88,0xc6,0x03,0x4a,0x17,0x10,0xd6,0xa7,0xc5,0xfb,0xa8,0x02,0xd9,0x00,0x00,
+ 0x05,0x20,0xa6,0x25,0x51,0xc8,0xfa,0x0e,0x50,0x26,0x0e,0x10,0x1a,0xfe,0x4c,0xd0,0xb3,0xb8,0xb1,0x6c,0x81,0xee,0x38,0x72,0xbe,0x81,0xfd,0x3e,0x10,0x86,0xa9,0x1b,0xef,0x19,0x00,0x00,
+ 0x05,0x20,0xa6,0x31,0xc1,0x84,0xb8,0xbe,0x91,0xab,0xec,0xce,0x70,0x45,0xea,0x5d,0x3c,0x68,0x7e,0xa9,0xe6,0x54,0xfe,0xb2,0xb5,0x4b,0x0f,0x49,0x51,0x23,0x28,0x1b,0xbb,0x66,0x00,0x00,
+ 0x05,0x20,0xa6,0x4c,0x56,0x49,0x22,0x0a,0x6e,0x89,0xcf,0xc1,0x20,0xf6,0xfd,0x99,0xe3,0xcd,0x51,0x87,0x3f,0x51,0xce,0xc5,0x78,0x62,0x9e,0xe1,0x05,0xbc,0xea,0x3d,0x43,0x20,0x00,0x00,
+ 0x05,0x20,0xa8,0x72,0xfe,0x49,0x2a,0x34,0x2d,0x86,0x37,0x59,0xe2,0x14,0x10,0x13,0xf1,0xae,0xc4,0xb0,0xbb,0xf5,0xaf,0x19,0x6a,0xf0,0xb3,0xfc,0xe9,0xfa,0x06,0x2c,0x09,0x0e,0x00,0x00,
+ 0x05,0x20,0xa8,0x95,0x26,0xe2,0x98,0xb6,0xd1,0xe3,0x96,0xa8,0x70,0x7b,0x8c,0xbb,0x0d,0x87,0xdc,0xab,0xa3,0xdf,0xf8,0x6d,0xfd,0x6b,0x9a,0xfe,0xca,0x93,0xc9,0x5a,0x51,0xa2,0x00,0x00,
+ 0x05,0x20,0xa8,0xde,0x57,0x00,0xf7,0x91,0x3e,0x24,0x89,0x16,0xea,0xfe,0x52,0x86,0xd9,0x17,0x89,0xcb,0x8d,0x65,0xed,0x17,0x58,0xab,0x7c,0x66,0x59,0xa3,0x63,0x8c,0x3a,0xed,0x00,0x00,
+ 0x05,0x20,0xa8,0xeb,0xa0,0x22,0x66,0x82,0x04,0x0e,0x4c,0x10,0x13,0x12,0x4b,0xdb,0xb7,0x28,0x62,0x50,0x9e,0xa5,0xea,0xa9,0x7b,0x54,0xa9,0x2e,0xf0,0x85,0x23,0xa0,0xe8,0x93,0x00,0x00,
+ 0x05,0x20,0xa9,0x27,0xe8,0x5a,0xc0,0xff,0x13,0x18,0x45,0x39,0x13,0x3f,0x85,0x95,0xf1,0xcd,0x9e,0xd9,0xec,0xeb,0xca,0x6a,0xa0,0xb4,0x0e,0x45,0x78,0xed,0x67,0x2a,0x8e,0xe5,0x00,0x00,
+ 0x05,0x20,0xa9,0x28,0x24,0x1d,0x83,0xff,0x1a,0xda,0x31,0x14,0x6d,0x63,0x4c,0x26,0x5e,0x53,0xd3,0x2e,0xca,0x16,0xe8,0xdf,0x15,0x8d,0x79,0x11,0x7e,0x8d,0x9f,0x88,0x32,0x86,0x00,0x00,
+ 0x05,0x20,0xa9,0x2c,0x38,0xa2,0x4c,0xcd,0x9a,0xbb,0xae,0xad,0x47,0xe4,0xb7,0xc3,0xfa,0xd5,0x97,0x62,0x81,0x88,0xd1,0x16,0x63,0xd0,0x6c,0xd3,0x8a,0x24,0x9d,0xe9,0x14,0xbc,0x00,0x00,
+ 0x05,0x20,0xa9,0x76,0xbd,0x97,0xb4,0x6a,0xed,0x12,0xb2,0x3b,0x2a,0x1e,0x77,0xb9,0x86,0x92,0xee,0x66,0x79,0x9c,0x11,0xcd,0xfd,0x22,0x65,0xe7,0x70,0x5a,0x6c,0x31,0x66,0x35,0x00,0x00,
+ 0x05,0x20,0xa9,0x5f,0x90,0x4a,0x32,0x8c,0x0f,0xb5,0xad,0x54,0x1b,0x01,0x2e,0x97,0x0c,0xb3,0x74,0xe3,0xca,0xd0,0x46,0xea,0x05,0x09,0x66,0x67,0x8a,0xde,0x34,0x3e,0x97,0x6f,0x00,0x00,
+ 0x05,0x20,0xa9,0x94,0xea,0x73,0x12,0xa5,0xea,0x75,0xde,0x36,0x2f,0x5b,0xa4,0x1d,0xbc,0x29,0x71,0x5a,0x90,0x6b,0xa5,0x1b,0xcf,0xaf,0xc3,0x70,0x51,0xdc,0x0b,0x28,0xc6,0xdb,0x00,0x00,
0x05,0x20,0xa9,0xa9,0xe5,0xae,0x01,0xc2,0x5e,0x76,0x2f,0x5d,0xa3,0x07,0xdc,0xce,0xb8,0xbc,0x6f,0x47,0xaf,0x3a,0x37,0xf8,0x5c,0x86,0xff,0xe9,0xb6,0xa5,0x00,0x93,0x76,0x11,0x00,0x00,
- 0x05,0x20,0xb2,0x63,0x45,0xf5,0x36,0xb0,0x79,0x58,0x0d,0x8a,0x54,0x52,0x16,0x2f,0x1f,0x74,0x93,0xe0,0x30,0x82,0x1b,0xe4,0x01,0x76,0xf5,0x03,0xa1,0x19,0xa3,0x8d,0x0e,0xce,0x00,0x00,
+ 0x05,0x20,0xaa,0x7b,0xc1,0xe9,0xea,0x19,0x21,0x51,0x51,0x3d,0xc2,0x88,0x63,0x47,0xc9,0x69,0xce,0xd6,0x43,0xb0,0xf4,0x09,0xf6,0xce,0x75,0x0f,0xb0,0x92,0x4e,0xc4,0x00,0xd8,0x00,0x00,
+ 0x05,0x20,0xaa,0xec,0xea,0xa7,0xc5,0xbe,0x6b,0x39,0x61,0xed,0x64,0x96,0xe1,0x39,0xd3,0x63,0xce,0x4c,0xc7,0xb3,0xb8,0x1b,0x82,0xe7,0x46,0x49,0xdb,0xd5,0x81,0xb1,0x6e,0x8a,0x00,0x00,
+ 0x05,0x20,0xab,0x01,0x37,0x86,0x9a,0xa9,0x7a,0xff,0xf9,0x5a,0x23,0x32,0x6d,0x4d,0x38,0x82,0x3c,0xff,0x61,0x3b,0x12,0xf9,0x9d,0xe9,0xa2,0x19,0xf3,0xbf,0xd0,0x2f,0x8a,0x8e,0x00,0x00,
+ 0x05,0x20,0xab,0x03,0x89,0xce,0xe5,0xf4,0xad,0xe4,0x54,0x60,0x61,0x67,0x7a,0x34,0xdc,0xe3,0x15,0x38,0x07,0x95,0x79,0xd8,0xce,0x2e,0x19,0x1c,0x20,0xf1,0x31,0x52,0x99,0x23,0x00,0x00,
+ 0x05,0x20,0xab,0x1c,0xe3,0x0c,0x7d,0x5e,0x67,0x3e,0xd9,0xf9,0x55,0x8e,0x3f,0x7e,0x96,0x6d,0x5f,0x47,0xe0,0x9f,0xc0,0xa4,0x1c,0xf7,0xa9,0x5e,0xbb,0x2a,0x11,0xd6,0x15,0xef,0x00,0x00,
+ 0x05,0x20,0xab,0x7b,0x19,0x47,0x5e,0x8b,0xff,0x8b,0xc6,0x0b,0x44,0x3f,0x57,0x73,0x21,0xf0,0x1c,0x81,0x1c,0x18,0x08,0xf7,0x48,0xd4,0x5d,0x21,0x06,0x09,0x3e,0xe9,0x7e,0xd6,0x00,0x00,
+ 0x05,0x20,0xab,0x6e,0x96,0x65,0xc6,0x02,0x85,0xa0,0x72,0xed,0xed,0xb9,0x07,0x45,0x88,0x84,0xfa,0xa3,0xb5,0x2f,0x9b,0x5c,0x08,0xbb,0xfc,0x21,0xd0,0xd8,0xd7,0x90,0xde,0x0c,0x00,0x00,
+ 0x05,0x20,0xab,0x91,0xda,0x6c,0x19,0x38,0x12,0xd9,0xff,0x9f,0xf4,0xc4,0x85,0x2f,0xac,0x00,0xa7,0x71,0x56,0x72,0x0b,0x63,0x94,0x5e,0xca,0x4f,0xb5,0x03,0xbc,0x16,0xed,0x13,0x00,0x00,
+ 0x05,0x20,0xab,0xc9,0x5b,0xfa,0x6b,0xf3,0x01,0xe6,0x35,0x69,0xe6,0x87,0xc2,0xa8,0x9d,0xf9,0x1b,0xca,0xf6,0x3f,0xf6,0x2f,0xe8,0x89,0x87,0x9d,0x6d,0xcf,0x9a,0x8e,0xdf,0x29,0x00,0x00,
+ 0x05,0x20,0xab,0xd8,0xa1,0x4e,0x07,0x50,0xe0,0x65,0x11,0x53,0xfe,0xa5,0x18,0x33,0x92,0x80,0x16,0x8a,0x1b,0x7f,0xa4,0x35,0x67,0xeb,0x16,0x00,0xf1,0xb7,0xeb,0x7d,0x13,0xc1,0x00,0x00,
+ 0x05,0x20,0xab,0xe7,0x97,0xdc,0x20,0xfb,0xb1,0x2d,0xdb,0x47,0x9a,0x4c,0x7e,0x52,0xee,0x30,0x08,0x3a,0x46,0x43,0x3e,0xb1,0x9e,0xab,0xc4,0xfe,0x0f,0xc0,0xed,0xee,0x55,0x1a,0x00,0x00,
+ 0x05,0x20,0xac,0xbd,0xf9,0x27,0xa2,0x8a,0x84,0x97,0x7d,0x9f,0xe4,0xc7,0x46,0xe4,0x85,0x4f,0x80,0x73,0x44,0xce,0x3c,0xbc,0x43,0x27,0xa9,0xbb,0x1a,0x49,0x66,0xc0,0x73,0xbe,0x00,0x00,
+ 0x05,0x20,0xad,0x20,0xaf,0xf9,0x35,0xb9,0x55,0xde,0x85,0x4e,0xac,0x04,0xc6,0x2a,0xb8,0x13,0x1a,0x32,0x13,0xe9,0xdc,0xe9,0x5f,0x93,0x23,0x0e,0xa4,0xb8,0x95,0xe9,0xc5,0x5c,0x00,0x00,
+ 0x05,0x20,0xad,0xdc,0xa3,0xa9,0x03,0x24,0xd2,0xfe,0x4d,0x31,0x4f,0xd0,0x37,0x26,0xfc,0xe9,0xcd,0x43,0xb5,0x7a,0x06,0x6b,0x06,0x86,0x8b,0x75,0x0d,0x51,0xaa,0x53,0x2e,0xd8,0x00,0x00,
+ 0x05,0x20,0xad,0xe5,0xa2,0x4b,0xc5,0xfd,0x2d,0xaa,0x51,0xa4,0x92,0xc3,0xf4,0x3e,0xac,0x37,0x95,0x03,0xfb,0x13,0x7a,0x49,0x97,0x27,0x4f,0x9d,0xaf,0xf7,0x0f,0x89,0x83,0x2e,0x00,0x00,
+ 0x05,0x20,0xae,0x51,0x8d,0x08,0x31,0x0d,0x56,0x88,0x3d,0x1a,0xf9,0x48,0x05,0x68,0xe8,0x25,0x9d,0x5b,0xcd,0x6a,0x83,0xdf,0x20,0x1a,0x60,0xb9,0x10,0x1f,0x35,0x4e,0x6a,0x9b,0x00,0x00,
+ 0x05,0x20,0xae,0x60,0xeb,0x28,0x7c,0x03,0xb0,0x45,0x01,0xe2,0x92,0xb0,0xb5,0xa3,0xff,0x02,0x76,0x4e,0x95,0xcc,0x45,0xe4,0x9c,0x20,0x16,0x6a,0xc7,0x94,0xf8,0x5d,0x6d,0xe7,0x00,0x00,
+ 0x05,0x20,0xb6,0x81,0xfd,0xb1,0xdc,0x34,0x46,0x6b,0x55,0x59,0x1c,0x8f,0xe6,0xe2,0x93,0x01,0x87,0xc0,0xb3,0x16,0xc5,0x80,0x2b,0xd5,0x0e,0x1d,0xbf,0x76,0xb8,0xbf,0xd0,0x1c,0x00,0x00,
+ 0x05,0x20,0xb6,0x98,0x60,0x64,0x1f,0xe8,0x19,0x1a,0x95,0xc2,0x5f,0xed,0x3f,0x57,0xe4,0x43,0x1f,0x15,0x82,0x54,0x4e,0xc2,0x8e,0x5c,0x99,0x1c,0x75,0x6c,0x40,0xea,0xbe,0x6d,0x00,0x00,
+ 0x05,0x20,0xb6,0xb2,0x8d,0xdd,0xd2,0xe2,0x41,0x9d,0x96,0x7d,0xc0,0x81,0xab,0xf7,0x25,0xdf,0x09,0x21,0x4d,0xec,0xcc,0x17,0x07,0x8e,0x30,0x6c,0xd2,0xc4,0x69,0xdb,0x31,0x42,0x00,0x00,
+ 0x05,0x20,0xb6,0xcf,0x88,0x35,0x74,0x20,0x79,0x8a,0xf5,0x6a,0xca,0x77,0x65,0xb6,0x29,0x7f,0xcb,0x97,0xdd,0xa8,0x37,0xaf,0xe6,0x6e,0xdd,0x1d,0x34,0xf9,0x95,0x22,0x66,0x93,0x00,0x00,
+ 0x05,0x20,0xb7,0x01,0x1c,0x28,0x55,0x17,0xc8,0x25,0x66,0x90,0x8f,0xd5,0x59,0x69,0xa9,0x92,0x5e,0xa6,0xe4,0x3e,0xad,0x64,0xe1,0xbf,0x19,0x7f,0xa7,0x5a,0x6b,0xe1,0xcb,0x94,0x00,0x00,
+ 0x05,0x20,0xb7,0x15,0xc3,0x33,0x62,0x3a,0x31,0x25,0x17,0x32,0x3a,0x17,0x74,0x88,0xef,0x34,0xdf,0x7d,0x5d,0x82,0xf1,0x29,0x55,0x63,0x2a,0xc2,0x6b,0x9a,0x8c,0x30,0x8b,0x98,0x00,0x00,
+ 0x05,0x20,0xb7,0x7b,0x1e,0x61,0x59,0xa7,0xa1,0x3f,0x50,0xef,0xde,0xc9,0x78,0x06,0x0c,0x5c,0xf7,0xdf,0x8a,0x72,0xd5,0x35,0x97,0x23,0xe7,0x55,0x1e,0x78,0x32,0xbd,0x45,0x1e,0x00,0x00,
+ 0x05,0x20,0xb7,0x92,0xbd,0x1a,0x81,0xc4,0x84,0x37,0xd0,0x28,0xc9,0x25,0xd0,0xbf,0xd2,0xe6,0x84,0x89,0xbb,0x8a,0xd7,0xef,0x61,0x26,0xc7,0xff,0xa3,0x5a,0x21,0x5a,0x7c,0x4e,0x00,0x00,
+ 0x05,0x20,0xb0,0x04,0x52,0x59,0x1e,0x21,0xd8,0x5b,0xd4,0xb3,0xbc,0x19,0x10,0x08,0xa7,0xfc,0x89,0xa9,0xfd,0xd9,0x5f,0xb5,0x4e,0x1e,0x54,0xc0,0xf8,0x2e,0xdc,0xb9,0xa0,0x13,0x00,0x00,
+ 0x05,0x20,0xb1,0x10,0x37,0xd6,0x47,0x43,0x47,0xb1,0xb4,0x2b,0xb4,0xc3,0xcc,0xbe,0x52,0x06,0x48,0x46,0xa8,0xbf,0x07,0xb6,0x50,0x54,0x15,0x50,0xb8,0x28,0x9e,0x03,0x57,0xfc,0x00,0x00,
+ 0x05,0x20,0xb1,0xa2,0x13,0xc0,0x8c,0x99,0x7f,0x0a,0x70,0x5e,0x00,0x92,0x81,0x07,0xf4,0xc1,0x09,0xe8,0xad,0x0d,0x01,0x71,0x89,0x56,0xe2,0xd6,0x1c,0x28,0x72,0x7a,0x42,0xc4,0x00,0x00,
+ 0x05,0x20,0xb2,0x4b,0x45,0x5b,0x0e,0x3a,0xd2,0x0b,0x9a,0xbc,0xb3,0x89,0x61,0xcd,0xee,0xba,0x37,0x0f,0x1d,0xb6,0x13,0x48,0x57,0x9a,0x33,0x41,0x74,0xa8,0x16,0x37,0x92,0xdb,0x00,0x00,
+ 0x05,0x20,0xb2,0xc8,0xf4,0x97,0x8b,0xbc,0xb8,0x4e,0xf7,0x71,0x9b,0xdd,0x89,0x79,0x50,0x7e,0x9d,0x91,0x57,0x8f,0x82,0x6d,0x97,0x60,0x20,0xb0,0x97,0xbc,0x9e,0x23,0xae,0x74,0x00,0x00,
+ 0x05,0x20,0xb3,0x17,0x8f,0x0b,0x3d,0x4f,0x79,0x6d,0x1b,0x46,0x40,0x5a,0x75,0xbe,0xb4,0x39,0xf6,0x15,0x63,0x5e,0x14,0x36,0x0e,0xa7,0x1e,0x1b,0xf4,0x73,0x6c,0xe2,0xdf,0x1d,0x00,0x00,
+ 0x05,0x20,0xb3,0x5f,0xaf,0x37,0x0f,0x3c,0x0a,0xc8,0x6e,0x83,0x70,0x8c,0x2b,0x11,0xaf,0x91,0x8b,0x65,0x72,0x52,0xb7,0x77,0x29,0xf2,0xd5,0xb4,0xfc,0xcb,0x17,0xf6,0x66,0xfb,0x00,0x00,
+ 0x05,0x20,0xb3,0x80,0xd0,0x49,0x0b,0xad,0xa9,0xbc,0x16,0x91,0xa9,0xeb,0x04,0xed,0x77,0x1e,0xba,0x1c,0xa7,0x85,0xbd,0xb1,0xb2,0x17,0x70,0x48,0x64,0xed,0x89,0xd9,0xae,0x04,0x00,0x00,
+ 0x05,0x20,0xb3,0xda,0x4b,0x39,0x64,0xf9,0x5c,0x5a,0xda,0xb1,0xaa,0x94,0x62,0xf3,0xb2,0x30,0xaa,0x48,0xad,0xc3,0x70,0xa9,0xf2,0xca,0x6c,0xd0,0x2e,0xfe,0xa4,0xb8,0x54,0x41,0x00,0x00,
+ 0x05,0x20,0xb4,0x61,0x4e,0xf3,0x72,0x95,0x03,0xf5,0x22,0xd9,0x2d,0x0d,0xc7,0x7d,0x9e,0x58,0xba,0x80,0xb0,0x00,0x60,0xc5,0xb7,0x72,0x8e,0xf0,0x3e,0xd9,0xdd,0x10,0xc8,0xf9,0x00,0x00,
+ 0x05,0x20,0xb4,0x82,0x5e,0xcd,0xee,0xf9,0x05,0x20,0x16,0x92,0x2a,0xf1,0x86,0x7f,0x4a,0xf4,0xc3,0x81,0x2c,0xd5,0x80,0x2b,0xdf,0x40,0x05,0xae,0x05,0xc4,0xee,0x4f,0xc8,0xdd,0x00,0x00,
+ 0x05,0x20,0xb4,0xca,0x40,0x86,0xcc,0x95,0xdd,0x8b,0x53,0xcd,0xb7,0x44,0xeb,0x2e,0xf0,0x3c,0xdc,0xab,0xc6,0xe5,0x9d,0x49,0xac,0x90,0x9e,0x2a,0xeb,0x17,0xc0,0xdc,0x4f,0x98,0x00,0x00,
+ 0x05,0x20,0xb4,0xdc,0x7e,0xd7,0xf7,0x66,0xed,0x7e,0x46,0x14,0x98,0x71,0x58,0x01,0x17,0xc0,0x6c,0xb7,0xc6,0xfd,0xa0,0x35,0x84,0x57,0x46,0x00,0xb6,0xf8,0xc5,0x00,0xe9,0x19,0x00,0x00,
+ 0x05,0x20,0xb5,0x10,0xa2,0xd9,0x44,0xbc,0xfc,0xb0,0xaf,0xd4,0x89,0xdd,0x89,0x47,0x40,0x08,0xb0,0x52,0xf5,0x6a,0x66,0x9c,0x98,0xf9,0x85,0x23,0x61,0x0d,0x75,0xb9,0x5a,0xe9,0x00,0x00,
+ 0x05,0x20,0xb5,0x18,0x9b,0x3e,0x3c,0xed,0x0f,0x59,0x98,0xd0,0xf2,0x55,0x92,0x8c,0x1c,0xf9,0x38,0x88,0x2b,0x4e,0x6a,0x33,0x6f,0x55,0xbd,0x7b,0xb6,0x11,0xee,0x90,0x10,0xe9,0x00,0x00,
+ 0x05,0x20,0xb5,0x77,0xbe,0xd5,0x51,0xfe,0xcd,0x20,0x64,0x1c,0x9f,0x8a,0xe8,0x61,0xed,0x75,0x44,0x2a,0x06,0xb6,0x2c,0x81,0x15,0x32,0xdb,0xbc,0xc5,0xb9,0xee,0x4d,0x13,0x30,0x00,0x00,
+ 0x05,0x20,0xb5,0x55,0x31,0x3f,0xe7,0xc7,0x17,0xe4,0x31,0x87,0x47,0x45,0x7c,0x67,0x43,0x5c,0x82,0x73,0xd6,0x62,0x64,0x94,0x92,0x32,0x2d,0x81,0x0e,0x01,0x35,0xc0,0x7e,0xb7,0x00,0x00,
+ 0x05,0x20,0xb5,0x82,0xe4,0xe2,0xcd,0x88,0x8b,0xa6,0x09,0x1f,0x2e,0xf2,0x60,0xb9,0x91,0xa2,0x84,0xce,0x0f,0x6d,0xaf,0x9f,0x39,0x87,0x63,0x71,0xd2,0xf3,0x13,0x52,0xce,0xbe,0x00,0x00,
0x05,0x20,0xb5,0x83,0x6f,0xb6,0x11,0xd8,0x0e,0xa8,0x57,0xda,0x15,0x20,0x5b,0x1a,0x6d,0x21,0x15,0x5a,0xbd,0xb4,0x17,0x11,0xc2,0xfb,0x0e,0xfc,0xde,0xe8,0x26,0x56,0xa8,0xac,0x00,0x00,
- 0x05,0x20,0xb9,0x54,0x08,0xb2,0xaa,0xe6,0xea,0x55,0x16,0xa7,0x51,0x0f,0x8f,0xa1,0xc9,0xd0,0x7d,0x69,0x94,0x6b,0x26,0x6a,0xc5,0x81,0x41,0x5e,0x77,0x0e,0x47,0xec,0x10,0x8b,0x00,0x00,
+ 0x05,0x20,0xb5,0xcb,0x2d,0x08,0x40,0x8f,0x25,0x91,0xfb,0xc3,0x5b,0x16,0x84,0x9f,0x68,0xdc,0x78,0xca,0x10,0xf0,0x4d,0xd2,0xc0,0x06,0xc1,0x0f,0x3c,0x28,0x6c,0xcf,0x0c,0x9c,0x00,0x00,
+ 0x05,0x20,0xb6,0x35,0x41,0xa9,0x66,0xc0,0xcf,0xf4,0x29,0xad,0x29,0x43,0x9a,0xac,0x6e,0x45,0xa4,0x29,0xf8,0x78,0xdb,0xbe,0x54,0x8a,0x49,0x10,0xd2,0xe8,0x70,0x3e,0xed,0x4e,0x00,0x00,
+ 0x05,0x20,0xb6,0x68,0x8f,0x48,0x5f,0xf7,0xbf,0x6f,0x80,0x01,0x97,0x90,0x40,0xa0,0x97,0xe7,0xdd,0xf1,0x62,0x57,0x7c,0x70,0x51,0x81,0x73,0x02,0x97,0x6d,0x67,0x57,0x34,0xe9,0x00,0x00,
+ 0x05,0x20,0xb6,0x6a,0xa4,0x77,0x5b,0xe1,0x4b,0x03,0xc5,0x1a,0xf1,0x60,0xeb,0xba,0x50,0x86,0xee,0x46,0x99,0x7a,0xd9,0x1c,0x89,0xaa,0xa8,0x7f,0x18,0xff,0x81,0x0f,0x76,0xd7,0x00,0x00,
+ 0x05,0x20,0xbf,0x04,0x49,0xd0,0x11,0x0d,0x91,0x07,0x9c,0x81,0x44,0xea,0x6a,0xf2,0xfc,0x56,0x4f,0xec,0x1f,0x18,0xad,0x3a,0x2e,0x61,0x2b,0x67,0x13,0x2c,0x2f,0x81,0xac,0xbb,0x00,0x00,
+ 0x05,0x20,0xbf,0x61,0x33,0x63,0x39,0x32,0x9d,0x57,0x29,0xde,0xd2,0xfc,0xde,0xf1,0xfd,0xed,0xd8,0x0e,0xbc,0x32,0x98,0x5f,0xe9,0xfa,0xe2,0xf1,0xc3,0x43,0x5f,0x3d,0x12,0xb4,0x00,0x00,
+ 0x05,0x20,0xb8,0x24,0x4b,0x3d,0x10,0x7e,0x4f,0x83,0x1a,0xf6,0x90,0x12,0xc6,0xaa,0x2f,0x7a,0x34,0xec,0xb0,0x0f,0x85,0x7d,0xef,0xef,0x34,0xa6,0x18,0xea,0x12,0x1e,0xfc,0xd6,0x00,0x00,
+ 0x05,0x20,0xb8,0x49,0x3c,0x06,0x5b,0x6e,0x09,0x85,0x49,0x40,0x93,0x96,0xf0,0x4d,0x3c,0x84,0x4a,0xd4,0x1b,0x3f,0x06,0x83,0x7f,0xd8,0x52,0xc4,0x5a,0x88,0x0f,0x74,0x93,0x41,0x00,0x00,
+ 0x05,0x20,0xb8,0xf4,0x1c,0x1e,0x3a,0xd4,0x60,0xa0,0x59,0xc2,0x03,0xc3,0x72,0x0d,0xd5,0x62,0x0b,0x85,0x7f,0xf0,0x89,0xfc,0x18,0xf0,0x53,0xbf,0xdb,0x8d,0x78,0xef,0x65,0x25,0x00,0x00,
+ 0x05,0x20,0xb8,0xdc,0xe6,0xbe,0xcd,0xb9,0xe3,0xf9,0x25,0xd8,0x10,0x36,0xb5,0x42,0x40,0x7b,0x08,0x51,0xe9,0xf4,0xc0,0x23,0xad,0x66,0x6e,0x13,0x87,0xc1,0xc5,0x29,0xa7,0x8b,0x00,0x00,
+ 0x05,0x20,0xb8,0xe1,0xa3,0x72,0x6a,0x05,0x15,0x91,0x53,0xcc,0x6d,0x47,0x45,0x08,0xe8,0x6b,0x01,0xf5,0x39,0x1e,0x16,0xda,0xe2,0xad,0xe9,0x00,0x63,0x94,0xc4,0xc4,0xa3,0x0a,0x00,0x00,
+ 0x05,0x20,0xb9,0x0c,0x27,0x1c,0xb1,0x6b,0x5b,0x4c,0xec,0xe3,0x60,0x7f,0x1e,0x13,0xcf,0xcd,0xc2,0xc9,0x9b,0x9e,0xf3,0x7c,0xc9,0xe3,0x4e,0xce,0xe6,0x27,0x42,0x93,0xba,0x7f,0x00,0x00,
+ 0x05,0x20,0xb9,0x71,0x92,0xd0,0xce,0xdc,0x26,0x57,0xc3,0x72,0xee,0x44,0x20,0x86,0x11,0xb9,0x54,0x6c,0x6e,0x73,0x5c,0x0f,0x9f,0x4f,0xce,0xab,0x26,0x68,0xca,0x98,0x11,0x3f,0x00,0x00,
+ 0x05,0x20,0xb9,0x83,0x9e,0xd5,0xe4,0x57,0xaa,0x02,0x11,0x3a,0xc9,0x13,0x78,0xa5,0x6e,0x81,0xb5,0x28,0x07,0xdf,0x32,0x19,0xfd,0x42,0x0f,0x70,0xe0,0x58,0x7b,0x51,0x2a,0xeb,0x00,0x00,
+ 0x05,0x20,0xb9,0xa1,0x9b,0xd0,0x6a,0xa9,0x83,0x0b,0x3a,0x40,0x38,0x3f,0x90,0xeb,0xc9,0x36,0x41,0xdb,0x07,0xec,0xf7,0xbf,0xaf,0xc5,0x5c,0xae,0xb2,0x9f,0xea,0xe6,0x36,0x90,0x00,0x00,
+ 0x05,0x20,0xb9,0xa4,0xad,0x1e,0x90,0x31,0xd0,0x59,0xe3,0x2d,0x8f,0x96,0xb8,0xfb,0x33,0x23,0xdd,0xdd,0x6c,0xe8,0xb4,0x24,0x2b,0xa5,0xe0,0xb0,0x82,0xc2,0x7e,0xf3,0x4c,0x66,0x00,0x00,
+ 0x05,0x20,0xba,0x48,0x1c,0x20,0x18,0x1c,0x82,0x1f,0xf8,0xd0,0xc9,0x27,0x26,0x08,0x46,0x3f,0xbe,0xe2,0x02,0xf3,0xd8,0xb8,0xc5,0x59,0x93,0xf9,0x92,0xb2,0xe1,0x9a,0xf7,0x88,0x00,0x00,
+ 0x05,0x20,0xba,0xcb,0x7a,0x48,0xcd,0xcb,0xd8,0x09,0xd2,0x60,0x89,0x06,0x2a,0xdf,0x5f,0xcb,0x90,0x41,0x35,0xdc,0x9b,0xee,0xce,0xe9,0x28,0x10,0xea,0xde,0x4a,0x3d,0x1e,0x30,0x00,0x00,
+ 0x05,0x20,0xbb,0x3b,0xdb,0x34,0xa7,0x33,0x25,0x8e,0x5b,0x3a,0xe4,0xac,0x99,0x6b,0x28,0x35,0x0e,0x4a,0x4f,0xd8,0xfe,0x94,0x79,0xf3,0x13,0xb6,0x0a,0x36,0x26,0x57,0x92,0xdb,0x00,0x00,
+ 0x05,0x20,0xbb,0x43,0xb7,0xde,0x6c,0x02,0x3c,0xe2,0x84,0x11,0xc0,0x84,0xbb,0x5a,0x84,0x00,0x22,0xde,0x47,0x79,0x9e,0xf2,0x65,0x10,0x8f,0x77,0x1e,0x66,0x4a,0xd0,0xa9,0x45,0x00,0x00,
+ 0x05,0x20,0xbb,0x6b,0x23,0x05,0xcd,0x5a,0x41,0xf1,0x30,0x8e,0x54,0x74,0xc9,0x54,0x64,0x5c,0x16,0x09,0x05,0x56,0x34,0x1a,0x38,0x1b,0xe4,0x02,0xad,0xcd,0xcf,0x6c,0xe7,0xbb,0x00,0x00,
+ 0x05,0x20,0xbb,0xe1,0x40,0xcb,0x85,0x9d,0x3f,0x86,0x72,0xf6,0x8a,0x22,0xbc,0xe8,0x9b,0xf1,0xab,0x84,0xa9,0x0b,0xd8,0x8f,0x58,0x7f,0x81,0x4f,0x16,0x5f,0x8d,0x22,0x8d,0xb9,0x00,0x00,
+ 0x05,0x20,0xbc,0x63,0x7d,0x44,0x4f,0x4e,0xf2,0x42,0xc8,0xf3,0x9f,0xd4,0x06,0x67,0x74,0x2a,0xdb,0x62,0x05,0xf5,0xd1,0x94,0x61,0xfa,0xab,0x88,0xc1,0x9b,0x99,0x6d,0xef,0xcd,0x00,0x00,
+ 0x05,0x20,0xbc,0x6d,0x48,0x61,0x62,0x32,0xa3,0xa7,0x56,0x45,0xe3,0xf2,0x87,0x48,0x7a,0xfe,0x2c,0x3f,0xbc,0xa0,0x71,0xdb,0x12,0x3b,0x19,0x67,0xf5,0x05,0xb6,0xae,0x54,0xe3,0x00,0x00,
+ 0x05,0x20,0xbc,0xee,0x7e,0x5a,0x6c,0x0a,0x57,0x2f,0xfa,0xd7,0x69,0x0e,0x4e,0xfc,0x93,0xa0,0x69,0x0a,0xc8,0x68,0xa3,0x6c,0x6a,0x93,0xca,0xb2,0x67,0xc0,0x0a,0xd2,0xb3,0x53,0x00,0x00,
+ 0x05,0x20,0xbd,0x07,0xc2,0x99,0x84,0x87,0x0e,0xbe,0x08,0xd2,0x0a,0x5b,0xba,0x07,0x3a,0x46,0x12,0x6a,0x38,0xd2,0x53,0x7f,0x68,0x90,0x92,0xab,0xe4,0xcd,0xa0,0x3a,0xfa,0x9e,0x00,0x00,
+ 0x05,0x20,0xbd,0x11,0x5a,0xb5,0xe2,0x4e,0xa2,0x79,0x5d,0x8a,0xc6,0x13,0x96,0x62,0x1e,0x07,0xcd,0x63,0x52,0x4d,0x85,0x86,0xa5,0x99,0x0c,0x03,0x2a,0xac,0xd3,0xf1,0x6b,0x59,0x00,0x00,
+ 0x05,0x20,0xbd,0x5f,0x90,0x40,0xb3,0x59,0x6f,0xa2,0x4e,0x18,0x97,0xf7,0xb6,0x34,0x6c,0xfa,0x63,0xb5,0xe9,0x3b,0x41,0x77,0x69,0x28,0xab,0x4e,0x40,0xeb,0x76,0x5c,0x8c,0x4b,0x00,0x00,
+ 0x05,0x20,0xbd,0x67,0x56,0x00,0x8b,0x27,0xdb,0x2f,0xeb,0xac,0x48,0x1d,0x69,0x01,0x2f,0xbf,0x02,0x62,0x90,0x41,0xa4,0x70,0x7f,0x3e,0x0c,0x1b,0x5b,0xbf,0x8a,0x1f,0x14,0xb5,0x00,0x00,
+ 0x05,0x20,0xbd,0xbc,0x15,0x93,0x9a,0x4d,0x2c,0xa2,0xc5,0x24,0x98,0x76,0x76,0x2b,0x44,0x7f,0x92,0xdc,0x50,0xa7,0xa4,0xdc,0x46,0xe2,0x2e,0xa7,0x90,0x47,0x41,0x0e,0x65,0xb9,0x00,0x00,
+ 0x05,0x20,0xbd,0x96,0xa7,0xd0,0x2a,0xac,0x87,0x2c,0x00,0x98,0x5c,0x0a,0xcb,0x95,0x5c,0xda,0x68,0xaf,0x4b,0x3b,0x3d,0xda,0xcb,0x13,0x99,0x23,0x44,0x98,0x7f,0xe0,0xcb,0x48,0x00,0x00,
+ 0x05,0x20,0xbe,0x07,0x98,0x46,0xc6,0x34,0x94,0x30,0xb0,0x90,0x89,0xcd,0x3f,0x01,0x71,0x71,0x97,0x90,0xa8,0x40,0x8e,0x46,0xb3,0x80,0x2c,0xac,0x65,0x96,0x76,0x9e,0x11,0x69,0x00,0x00,
+ 0x05,0x20,0xbe,0x0e,0xb2,0x32,0x0c,0x71,0x29,0x28,0x04,0x39,0x8f,0x1d,0x07,0x9f,0xca,0x33,0x2a,0xcd,0x83,0x6b,0x88,0x68,0x06,0xdd,0x4c,0xc1,0x27,0x67,0x1e,0xee,0xc3,0x5a,0x00,0x00,
+ 0x05,0x20,0xc6,0xfd,0xd5,0x97,0x75,0x59,0xfd,0x53,0x72,0x32,0xf4,0xe2,0xd4,0x8b,0x88,0x06,0xaf,0x07,0xac,0x07,0x56,0xbd,0x8d,0xcf,0x10,0x4a,0xf1,0xa8,0x6a,0xaf,0x2b,0x60,0x00,0x00,
+ 0x05,0x20,0xc6,0xc9,0x0a,0x6a,0x62,0xf6,0x65,0x78,0x4d,0xa3,0xa1,0xa4,0x5c,0xba,0x73,0xa1,0x1a,0x53,0x5d,0xab,0xf9,0x20,0x60,0x0d,0x8d,0xca,0x54,0xe4,0x1a,0xf5,0x91,0x14,0x00,0x00,
+ 0x05,0x20,0xc6,0xdc,0x21,0x2f,0xb1,0x80,0xb4,0xcc,0xfb,0x84,0x95,0x3a,0xc8,0x65,0xd8,0x2e,0x56,0x1b,0xb9,0xff,0x9c,0xe6,0x5d,0x07,0x66,0xc5,0xd3,0x49,0x4f,0xbf,0x9d,0xcb,0x00,0x00,
+ 0x05,0x20,0xc7,0x3b,0x73,0xc1,0x41,0xe6,0xda,0x27,0x28,0xb6,0x3c,0x99,0x1e,0x67,0xc5,0xb6,0x15,0x44,0x4f,0xce,0xdb,0xf4,0xa0,0xc9,0xdb,0x23,0x2b,0xf9,0x4d,0xe8,0xb5,0x9d,0x00,0x00,
+ 0x05,0x20,0xc7,0x1a,0x96,0x78,0xb3,0x1b,0x7b,0xed,0x43,0xb3,0x3e,0x47,0xb2,0xd4,0x3a,0x2f,0x58,0x14,0x78,0x26,0x5b,0x31,0x47,0xd1,0x42,0x60,0x9f,0x3d,0x4e,0x8e,0xf4,0x97,0x00,0x00,
+ 0x05,0x20,0xc7,0x6d,0x1d,0x06,0xdb,0x8c,0xf9,0x1a,0xdb,0xe7,0x84,0x13,0xf8,0x4d,0x65,0xfd,0x46,0x39,0x7b,0x2a,0xf0,0xa5,0xb6,0x53,0x6c,0xc6,0x07,0x40,0x49,0x04,0x83,0x94,0x00,0x00,
+ 0x05,0x20,0xc0,0x52,0x6c,0x2d,0xa7,0xaa,0xb6,0x5c,0xe0,0x02,0xbd,0x70,0x7f,0x0e,0xd5,0x89,0xfe,0xb5,0x6b,0xfb,0x81,0xfb,0x0b,0x4b,0xf4,0x85,0x2b,0x13,0x9e,0xd1,0xf4,0x54,0x00,0x00,
0x05,0x20,0xc0,0xb9,0x7b,0x21,0xbd,0xa2,0x48,0xda,0x8a,0x3e,0xc3,0x6c,0xac,0xfd,0x6d,0x63,0x21,0xb6,0xb3,0x37,0xa9,0x4d,0x42,0x2c,0x9e,0x75,0x61,0x07,0xdc,0xc9,0xab,0x9b,0x00,0x00,
- 0x05,0x20,0xc8,0xdc,0x00,0xc8,0xdf,0xa1,0xb2,0xe9,0x9f,0x00,0xb3,0x86,0x93,0xc3,0xbc,0x6d,0x56,0xe2,0x83,0xfc,0xf4,0x6e,0x55,0x5d,0xed,0x4e,0x53,0xe6,0xd1,0x4c,0x38,0x3c,0x00,0x00,
- 0x05,0x20,0xcc,0xaf,0x6c,0x3b,0xd0,0x13,0x76,0x23,0xc3,0x36,0xbb,0x64,0x4a,0x4a,0x06,0x93,0x69,0x6d,0xb0,0x10,0x6e,0x66,0xa4,0x61,0xf8,0x2d,0xe7,0x80,0x72,0x4d,0x53,0x94,0x00,0x00,
- 0x05,0x20,0xce,0x25,0x15,0xbd,0x08,0xe9,0x67,0x1c,0xa2,0xa5,0x16,0x0e,0x38,0xd9,0xe4,0xc6,0x20,0x31,0x86,0x23,0x21,0x5a,0x5a,0x76,0x1e,0x74,0xd5,0xd3,0x4e,0x86,0x61,0xf4,0x00,0x00,
+ 0x05,0x20,0xc1,0x19,0x15,0x62,0x0c,0x4e,0x6d,0x66,0xeb,0x00,0x94,0xf4,0x60,0x78,0x62,0x6c,0x9d,0x56,0xde,0xc8,0x7e,0xa2,0x97,0xa0,0x7d,0xf1,0xa2,0x33,0x7d,0x13,0xa1,0x9e,0x00,0x00,
+ 0x05,0x20,0xc1,0x5e,0xb4,0xfb,0xf7,0xb0,0x82,0xb0,0xa2,0x9c,0x76,0x46,0x36,0x65,0x6c,0x4a,0xf8,0x82,0x83,0xe1,0x3a,0xb3,0x9a,0x78,0xb4,0xf2,0x54,0xec,0x42,0x88,0xf5,0x7d,0x00,0x00,
+ 0x05,0x20,0xc1,0xa6,0x2e,0xb3,0x8c,0x3e,0xe0,0x74,0x7e,0x62,0x9f,0x38,0x6b,0xc0,0x24,0x69,0xd4,0x09,0x3f,0x58,0xe6,0x06,0x96,0xf6,0x14,0x07,0x17,0xda,0x9f,0x7d,0x74,0x87,0x00,0x00,
+ 0x05,0x20,0xc2,0x77,0x5d,0xb8,0x46,0x58,0xda,0x01,0x2a,0xef,0x9c,0x92,0xcb,0x02,0x40,0xe5,0xf3,0x74,0xed,0x13,0xf4,0x67,0x43,0xb1,0x6f,0xbd,0x6c,0xb8,0x75,0x4c,0xc6,0x27,0x00,0x00,
+ 0x05,0x20,0xc2,0xb5,0x28,0xa8,0x6b,0x0b,0x3e,0xa2,0x06,0xbd,0xd8,0xef,0xce,0xca,0x5f,0x86,0x8a,0x91,0x63,0xbe,0x66,0xcd,0x8b,0x42,0xb6,0xf7,0x49,0x80,0x7c,0x4e,0xf9,0xcd,0x00,0x00,
+ 0x05,0x20,0xc2,0x9e,0xf4,0xb2,0xd4,0x6e,0x61,0x9a,0x52,0x02,0xf4,0x21,0x24,0x25,0xcc,0x2e,0x46,0x64,0x10,0x90,0xd3,0x14,0x81,0x81,0xe2,0xe0,0x2d,0x1b,0x5b,0x4d,0x43,0x43,0x00,0x00,
+ 0x05,0x20,0xc2,0xab,0xed,0x45,0x15,0x5d,0xe9,0x18,0x6a,0xca,0x20,0x80,0x6c,0xcb,0xfe,0x9d,0x16,0x57,0x47,0xfe,0xe8,0xb5,0xbf,0x86,0x49,0x6f,0xd3,0x3e,0x73,0x7e,0x53,0x75,0x00,0x00,
+ 0x05,0x20,0xc2,0xd7,0x58,0x2b,0x54,0x9a,0x19,0x74,0xcd,0xd8,0xca,0xbe,0xbd,0x72,0x5c,0x6f,0x65,0x07,0xf4,0x61,0x6f,0x6b,0x69,0x06,0x7b,0x36,0xc6,0x3f,0x1f,0x83,0xbc,0x89,0x00,0x00,
+ 0x05,0x20,0xc2,0xdf,0x82,0x8a,0x5a,0xe2,0x13,0xef,0x8d,0x4b,0xfa,0x0c,0x7c,0x3a,0x9c,0xce,0x8c,0xf2,0x9d,0x2b,0x9e,0x90,0x45,0xad,0x3a,0x00,0xf8,0x31,0xc6,0xe2,0x47,0xb6,0x00,0x00,
+ 0x05,0x20,0xc3,0x1d,0xa1,0x35,0x63,0x64,0xa7,0x98,0x2e,0x43,0x3d,0xfe,0xaa,0x45,0x08,0xf8,0x00,0x52,0xc4,0xef,0x30,0x0b,0x75,0xad,0x1b,0x97,0x3e,0xfc,0x84,0xa4,0xe9,0x2b,0x00,0x00,
+ 0x05,0x20,0xc3,0x71,0xec,0xc2,0x61,0xfc,0x2a,0x4f,0xda,0xc5,0x14,0xe4,0xec,0x9f,0x27,0x0c,0x38,0x7c,0x22,0x6b,0x80,0x9d,0xca,0x1c,0x5d,0x86,0xe3,0x54,0x92,0xff,0xfb,0x81,0x00,0x00,
+ 0x05,0x20,0xc3,0x72,0x73,0xdd,0x68,0x22,0x0d,0x36,0x27,0xcb,0xf9,0x74,0x38,0x77,0x98,0x7b,0x64,0x02,0xff,0x5b,0x05,0x3e,0xed,0xd0,0xed,0x44,0x98,0xb3,0x35,0x4c,0x14,0x13,0x00,0x00,
+ 0x05,0x20,0xc3,0x8b,0xcc,0x56,0xbc,0x01,0xac,0x72,0xb1,0x02,0x4f,0x69,0xa1,0xc4,0x8c,0xe7,0xdb,0x52,0xa9,0x07,0x6b,0xfc,0x14,0x2f,0xee,0x11,0xbd,0xd3,0x60,0x78,0xce,0x45,0x00,0x00,
+ 0x05,0x20,0xc3,0x93,0x4c,0x47,0x10,0xf5,0x4a,0xec,0x69,0x85,0x9c,0x46,0xcc,0x05,0x90,0xd1,0xd2,0x42,0xd3,0x31,0xb3,0x1f,0x08,0x16,0xaa,0xd2,0x87,0xd3,0xbe,0x66,0x8e,0xe0,0x00,0x00,
+ 0x05,0x20,0xc3,0xc3,0x0e,0x81,0x64,0x74,0x20,0xeb,0xcd,0xdc,0x9a,0xae,0xb6,0x2e,0xe7,0xd1,0xe3,0x29,0xa6,0xf9,0x79,0x9c,0xd4,0xed,0x6a,0xf8,0xf3,0x62,0x00,0xf2,0xd9,0xcf,0x00,0x00,
+ 0x05,0x20,0xc4,0x17,0xa5,0x73,0x29,0x5f,0xb8,0x39,0xe0,0x34,0x15,0x16,0x93,0x1b,0x95,0xe5,0x3d,0x24,0x93,0x92,0x63,0x70,0x0c,0x6e,0xb2,0x5d,0x7e,0x88,0xc5,0x06,0xcd,0xd4,0x00,0x00,
+ 0x05,0x20,0xc4,0xb7,0xe8,0xce,0x84,0x19,0xb9,0xc9,0x00,0xe4,0x58,0x71,0x28,0x23,0x4c,0x08,0xb4,0xbd,0xc4,0x45,0x1e,0x37,0xbc,0x8e,0xa7,0xa9,0x55,0x7e,0xd1,0xc2,0x00,0x82,0x00,0x00,
+ 0x05,0x20,0xc4,0xbe,0xd7,0xed,0xec,0x29,0xd1,0x88,0x6f,0x3a,0x88,0x9c,0x4c,0x2c,0x3f,0x01,0x8a,0x1c,0x16,0x87,0x3b,0xfe,0xac,0x6a,0x99,0xad,0x69,0x99,0x58,0x03,0xf0,0x90,0x00,0x00,
+ 0x05,0x20,0xc5,0x20,0x1e,0xf4,0x71,0xcc,0x4f,0x72,0xb6,0xae,0x0e,0x05,0x78,0x02,0x9c,0xfa,0x90,0x10,0x00,0xbc,0xab,0x80,0xc5,0x6d,0x57,0x5f,0xff,0x70,0x87,0x9a,0xba,0xa0,0x00,0x00,
+ 0x05,0x20,0xc5,0x8a,0x0a,0x02,0x80,0x22,0x83,0x1b,0x9a,0xc0,0x01,0xc4,0x9c,0xa0,0xa4,0x66,0x47,0x0d,0x7a,0xf2,0x91,0xed,0xde,0x48,0xdc,0x0b,0xe3,0xdc,0xff,0x92,0x15,0x91,0x00,0x00,
+ 0x05,0x20,0xc5,0x9f,0x23,0x53,0xcd,0x5b,0x4b,0xa5,0xf2,0x58,0xe7,0x26,0x89,0xe8,0x15,0xf9,0xcb,0x9b,0x5a,0x73,0x0a,0x6b,0x60,0xce,0x41,0x9c,0x29,0x1d,0x82,0xc8,0x05,0xf4,0x00,0x00,
+ 0x05,0x20,0xce,0xf8,0xfb,0x76,0x6b,0x75,0xac,0x8d,0x99,0xe9,0xde,0x04,0x1d,0x0d,0xf3,0x36,0x29,0x0f,0x74,0x2f,0x4f,0xed,0xbf,0x5c,0x07,0x92,0xcc,0x85,0x18,0xce,0xe9,0x00,0x00,0x00,
+ 0x05,0x20,0xce,0xd3,0xab,0xc8,0xeb,0xe4,0xde,0x1b,0x83,0x01,0x13,0xe2,0x7c,0xc3,0xe2,0xa6,0x7d,0x48,0x85,0xd0,0x75,0xeb,0x57,0xb4,0xb1,0x45,0x78,0xdd,0x2e,0x1f,0xd2,0x65,0x00,0x00,
+ 0x05,0x20,0xce,0xde,0x6c,0x15,0x16,0x2e,0x44,0x3d,0x1b,0xf5,0xe4,0x65,0xe2,0x2f,0xb3,0xa8,0xbb,0xdc,0x7c,0x1b,0x98,0x11,0xc3,0x08,0x2f,0x93,0xbc,0x55,0x80,0x89,0x12,0x88,0x00,0x00,
+ 0x05,0x20,0xcf,0x98,0xbc,0x46,0xe2,0x48,0xc6,0xf1,0x01,0xd4,0x65,0xdb,0x6e,0xbc,0x94,0x5b,0x55,0x54,0xf7,0xc7,0x35,0xa0,0xc6,0x8b,0xa0,0x1b,0xa9,0x37,0xfd,0xe8,0xa2,0x40,0x00,0x00,
+ 0x05,0x20,0xcf,0xaf,0x29,0x4f,0x10,0xe6,0x70,0xdc,0xd4,0x06,0xb5,0x77,0x68,0xfc,0xf3,0xcf,0x2b,0x79,0xce,0x2e,0x9e,0x43,0xd4,0x64,0x85,0x74,0xd7,0x68,0x33,0xea,0x4c,0xe8,0x00,0x00,
+ 0x05,0x20,0xcf,0xc4,0x9b,0xbf,0x1c,0x98,0x28,0x8d,0x28,0x1b,0x22,0x8b,0x09,0xba,0x8c,0x90,0x7e,0xf3,0x6a,0x4e,0x56,0xec,0x52,0x63,0x6c,0xd4,0x5c,0x4a,0x3d,0xe2,0x8e,0x4f,0x00,0x00,
+ 0x05,0x20,0xcf,0xc4,0x9c,0x95,0x95,0xf5,0x80,0x34,0x9a,0x99,0x00,0x2b,0x4f,0xbc,0xb2,0x81,0xe8,0x90,0x8b,0x32,0x78,0x4b,0xd9,0x5e,0xf1,0x83,0x46,0x47,0x56,0x9b,0x5c,0xf6,0x00,0x00,
+ 0x05,0x20,0xcf,0xcc,0xa2,0x48,0x2a,0x0a,0xf5,0xf5,0xbc,0x4f,0x0b,0x4e,0x62,0xb8,0xa9,0xcf,0x4a,0x76,0xd5,0x69,0xc9,0x6b,0x8c,0x0e,0x9f,0x56,0x36,0xe1,0xe4,0x70,0x97,0x17,0x00,0x00,
+ 0x05,0x20,0xc8,0x0a,0x3e,0x74,0x5a,0x3e,0x47,0xcb,0x6a,0x7a,0xe4,0x26,0x98,0x40,0x30,0x66,0xf3,0xc3,0x83,0x01,0xf5,0x40,0x34,0xfa,0x43,0xeb,0xa8,0xa4,0xe1,0x09,0xd0,0x22,0x00,0x00,
+ 0x05,0x20,0xc8,0x55,0x01,0x42,0x68,0x45,0xb8,0xdb,0x48,0x72,0xeb,0xd2,0x45,0xf8,0x0b,0x8f,0x51,0xc3,0x99,0x18,0x81,0x7a,0x64,0x5a,0x91,0x1e,0x0c,0x5c,0x48,0x02,0x8d,0x34,0x00,0x00,
+ 0x05,0x20,0xc8,0x73,0xfd,0x68,0x67,0xfc,0x6b,0x4f,0x50,0xc3,0xc0,0xd8,0xb6,0x4c,0xc5,0xc0,0xbf,0x16,0xbc,0x92,0x58,0x09,0xdd,0x74,0x5f,0x61,0xe3,0xf8,0x9a,0x44,0x52,0x42,0x00,0x00,
+ 0x05,0x20,0xc8,0xac,0x68,0x5b,0xe7,0x5d,0xbf,0xcd,0xfc,0x1f,0x05,0x3c,0xdf,0x38,0x2b,0x48,0xc3,0xc0,0x45,0xb2,0x3b,0x90,0x11,0xc1,0xde,0xab,0xa2,0x42,0x72,0xe8,0xcb,0x5d,0x00,0x00,
+ 0x05,0x20,0xc8,0xf8,0xd9,0x73,0x22,0xc5,0x4c,0xfb,0x29,0x0e,0x2c,0xd0,0x82,0xcc,0xc9,0xff,0x1b,0xe6,0x17,0x8c,0xe2,0x09,0x0f,0x00,0x83,0x80,0x32,0xd6,0x0d,0x1e,0x89,0xc7,0x00,0x00,
+ 0x05,0x20,0xc9,0xad,0x22,0x12,0x37,0xb4,0x1a,0x81,0xef,0x27,0x15,0x17,0x9a,0x40,0x2a,0x39,0x8f,0x33,0xc8,0x35,0x90,0x5b,0x07,0x5a,0x24,0x1b,0xa5,0x32,0xc1,0x75,0x05,0xa5,0x00,0x00,
+ 0x05,0x20,0xca,0x08,0x7a,0x5c,0x6f,0xc1,0xba,0x3a,0xd5,0xb9,0x20,0xd8,0x28,0x5e,0x59,0x18,0x8a,0xb9,0x46,0xfe,0x2c,0x18,0x6c,0x87,0xee,0x19,0x0b,0x0b,0x40,0x17,0x8c,0xbf,0x00,0x00,
+ 0x05,0x20,0xca,0xb5,0x1f,0xab,0x39,0x41,0xb3,0x4e,0xab,0x3e,0xfd,0xdb,0x10,0x93,0xbe,0xa7,0x6c,0x05,0xb4,0xd8,0x58,0xa4,0xaf,0xf7,0xc1,0x53,0x27,0xef,0x09,0x84,0x26,0x07,0x00,0x00,
+ 0x05,0x20,0xca,0x82,0x93,0x15,0xfc,0x75,0x1c,0x25,0x3e,0x4c,0x78,0x47,0x85,0xa3,0x88,0x5b,0xbe,0x5d,0xac,0x25,0x4c,0x82,0xe0,0x63,0x6d,0x2f,0x3f,0x86,0x22,0x3a,0x58,0xe3,0x00,0x00,
+ 0x05,0x20,0xca,0x91,0xe3,0x81,0x64,0x95,0x14,0x72,0x91,0x7f,0xf3,0xf2,0x8a,0x4c,0xc8,0x10,0x39,0x98,0xbf,0xb0,0x98,0x58,0xb6,0x1b,0x10,0x2f,0x86,0xd6,0xb9,0x8a,0xf9,0xd2,0x00,0x00,
+ 0x05,0x20,0xca,0x90,0x9e,0x7f,0x60,0xa3,0x18,0xff,0x46,0xb6,0xaa,0x3f,0x60,0xc7,0xa8,0x43,0xbd,0x7a,0x6a,0x87,0xe4,0x5c,0xf3,0x84,0xf8,0x74,0xf7,0xfa,0x5c,0xf1,0xc1,0x91,0x00,0x00,
+ 0x05,0x20,0xcb,0xeb,0x08,0x0e,0x22,0x68,0x0c,0x01,0xf4,0x18,0xa4,0xcb,0xf3,0xa9,0xfe,0x7c,0x67,0x58,0x85,0x8a,0x69,0xe0,0x3a,0x2f,0x70,0xb1,0x0b,0x3f,0xb8,0x1d,0x42,0xb3,0x00,0x00,
+ 0x05,0x20,0xcc,0x0b,0x3f,0x8b,0xd1,0x45,0x7e,0x0a,0x5f,0xda,0x85,0x89,0xdb,0x96,0x0a,0x46,0xc6,0x20,0xf2,0x91,0xa8,0x4b,0x8f,0x33,0x96,0xcf,0xcb,0xcf,0x27,0x54,0x96,0xd6,0x00,0x00,
+ 0x05,0x20,0xcc,0x0e,0xe8,0x18,0xbb,0x23,0x53,0xa7,0xd7,0xfc,0x92,0x5d,0x5f,0x0e,0x67,0x7c,0x7c,0x98,0x00,0xb6,0xec,0x21,0x9c,0xca,0xad,0x28,0xe1,0x9c,0x0b,0x02,0x3d,0xdf,0x00,0x00,
+ 0x05,0x20,0xcc,0x62,0xa4,0x77,0x8c,0x6f,0x7c,0x5c,0x4d,0x19,0x51,0x58,0x7b,0xfc,0x94,0x09,0x01,0xbf,0xbc,0x03,0xb8,0x37,0x95,0xa2,0xd0,0xf1,0xa6,0xa6,0xc6,0x57,0xae,0x80,0x00,0x00,
+ 0x05,0x20,0xcc,0x8a,0xf1,0x34,0x2a,0xe1,0xb4,0x1b,0x5d,0x7f,0xc6,0x3a,0x40,0xc4,0x55,0x5d,0xc7,0xd3,0x3c,0x57,0x04,0xc9,0x61,0xc4,0xcf,0x41,0x89,0xf7,0x43,0x0a,0xa3,0x6d,0x00,0x00,
+ 0x05,0x20,0xcc,0xb3,0x0f,0x91,0xa0,0xb8,0x73,0xd7,0xec,0xbb,0x40,0xce,0x55,0x28,0x7a,0xa6,0xb0,0x67,0x92,0x16,0x4e,0xdd,0xe3,0xa9,0xc5,0x29,0x44,0xc5,0xad,0xb8,0x65,0xa0,0x00,0x00,
+ 0x05,0x20,0xcc,0xe3,0xb1,0x7e,0x19,0xf5,0x78,0x78,0xb4,0x86,0x62,0xb2,0x99,0x47,0xba,0xb6,0x11,0xca,0x78,0x91,0xc7,0x19,0xfe,0x49,0x5b,0x67,0xfe,0xea,0x3f,0x56,0x97,0x14,0x00,0x00,
+ 0x05,0x20,0xcc,0xf1,0x70,0xa4,0x04,0xfd,0x04,0x5c,0x51,0xf7,0x7e,0x3f,0xd4,0xd9,0xf9,0x1a,0xa6,0x6e,0x18,0x35,0x3a,0xf9,0xb6,0x9f,0x42,0x8d,0xa1,0x1b,0xea,0x87,0xa9,0x06,0x00,0x00,
+ 0x05,0x20,0xcd,0x00,0xc4,0xfb,0x60,0x1f,0xf6,0x96,0x36,0xdf,0xbb,0x6f,0x16,0x26,0x41,0x49,0xbf,0x53,0x6b,0x69,0xe7,0xad,0xb6,0x3c,0x5a,0xa0,0xde,0x23,0x24,0xaa,0x14,0x05,0x00,0x00,
+ 0x05,0x20,0xcd,0x44,0x75,0xc5,0x34,0xcc,0x06,0xbb,0xef,0xe5,0x3a,0x02,0x76,0xe1,0x9c,0xc7,0x9f,0xdf,0x56,0x6b,0xc3,0x28,0x94,0xd3,0x27,0x3e,0x84,0xfd,0xf3,0x10,0x2c,0x67,0x00,0x00,
+ 0x05,0x20,0xcd,0xe4,0x3d,0x96,0x02,0xc9,0xfc,0x31,0x98,0x89,0x16,0xb8,0xd6,0xb0,0x3b,0xb5,0xbe,0xd0,0x2d,0x04,0x86,0xc1,0xf1,0x4b,0x4c,0x82,0x31,0xe9,0xb0,0xa5,0xdd,0x90,0x00,0x00,
+ 0x05,0x20,0xce,0x35,0x8b,0x57,0x10,0x1c,0xba,0x13,0x0d,0xce,0xe4,0xcc,0x1a,0x6c,0x36,0x4b,0xf7,0x83,0x61,0xbb,0xc9,0x68,0x1c,0x73,0x89,0x23,0x05,0xeb,0x83,0xc5,0x0d,0xa6,0x00,0x00,
+ 0x05,0x20,0xce,0x62,0x4e,0x72,0xa7,0xff,0xbc,0x93,0x15,0xd1,0x1d,0xb4,0x43,0xd3,0x51,0xf3,0xf9,0xc4,0xeb,0x74,0xc3,0xaa,0x6a,0xb3,0xe8,0xb5,0x0e,0xfd,0x9b,0xa8,0xcf,0x04,0x00,0x00,
+ 0x04,0x20,0xc0,0x87,0x6d,0x13,0x94,0x29,0x8b,0x63,0x8a,0x0d,0x07,0x0d,0xb6,0x6a,0x12,0xa8,0x17,0x8d,0x6d,0xd9,0x01,0x2e,0x0b,0x09,0x3b,0xbf,0x0d,0x33,0x08,0x87,0x35,0xa8,0x20,0x8d,
+ 0x04,0x20,0xc0,0x8b,0x52,0x0e,0x8b,0x53,0xe2,0x3e,0x85,0x88,0xac,0x08,0x9a,0x47,0xa0,0x7c,0xc5,0x2e,0x7c,0x60,0x84,0xc5,0x5c,0xba,0x6d,0x69,0xcb,0x5b,0x53,0x6e,0xf1,0x84,0x20,0x8d,
+ 0x04,0x20,0xc0,0x95,0xe5,0xf4,0xa5,0xb7,0x9d,0x2c,0x9a,0x6e,0x17,0xc9,0x3e,0x17,0x13,0xab,0xf7,0x28,0x0c,0xbd,0x05,0xb0,0xac,0x72,0x6b,0x79,0x88,0xcd,0x37,0x98,0xf2,0x05,0x20,0x8d,
+ 0x04,0x20,0xc0,0x9a,0x47,0xb7,0x2a,0x9a,0x8e,0x5c,0x4a,0x08,0x4a,0xcc,0x14,0xab,0xa0,0xb2,0x2a,0xb9,0x6c,0x88,0x80,0x7a,0xa4,0xd0,0x6e,0x9a,0x6a,0xda,0xac,0x24,0xf0,0x0f,0x20,0x8d,
+ 0x04,0x20,0xc0,0xad,0x18,0x80,0x2e,0x63,0x91,0x75,0x5c,0xc6,0x55,0xd6,0x3c,0x5d,0x50,0x70,0xbf,0x08,0x63,0x53,0xed,0xae,0x29,0x5d,0x26,0x70,0xd7,0x5a,0x60,0x76,0x11,0xfc,0x20,0x8d,
+ 0x04,0x20,0xc0,0xad,0x68,0xd9,0x50,0x40,0x6a,0xa2,0xcd,0xe2,0xea,0xb1,0x09,0x79,0xa5,0xf9,0xe3,0x92,0x4e,0x2c,0x81,0xac,0xee,0x60,0x04,0xf8,0x61,0xd7,0x4e,0xb4,0x0a,0x8b,0x20,0x8d,
+ 0x04,0x20,0xc0,0xae,0x91,0x9f,0x89,0x8f,0x2b,0x46,0xf3,0x9f,0x10,0xe5,0x91,0x38,0xc4,0xd7,0x9e,0x11,0xb6,0x01,0x59,0x51,0xa7,0x49,0x8a,0xe9,0x39,0x48,0x32,0x28,0x35,0xbf,0x20,0x8d,
+ 0x04,0x20,0xc0,0xf4,0x06,0x23,0x71,0x23,0x36,0x8d,0x72,0x1a,0x0f,0xfc,0xbe,0x51,0x38,0x86,0xf9,0xbc,0x0a,0x2e,0xb4,0x66,0x7b,0x43,0x02,0xab,0xc5,0x27,0x14,0xcf,0xb2,0xef,0x20,0x8d,
+ 0x04,0x20,0xc0,0xf8,0xdc,0x52,0x50,0x52,0x1a,0x6f,0x4d,0x42,0xb3,0x18,0xe7,0xe5,0xab,0xb9,0xf0,0x53,0xab,0x66,0x95,0xb5,0xee,0x81,0x79,0xfd,0x5e,0xef,0x4d,0xd0,0x36,0xd5,0x20,0x8d,
+ 0x04,0x20,0xc0,0xfc,0x1d,0xda,0x6c,0xa7,0x83,0x9e,0xa9,0x9f,0x3d,0xbd,0xce,0xb9,0x98,0xaf,0xba,0xe6,0x93,0xda,0xfd,0xc8,0x23,0xfc,0xbb,0xab,0x57,0x65,0x05,0x72,0xac,0x07,0x20,0x8d,
+ 0x04,0x20,0xc0,0xca,0xe8,0x86,0xfd,0xe3,0x1b,0x9f,0x9b,0xb4,0xd3,0x29,0xaa,0x2d,0x4e,0x65,0x40,0xa1,0x86,0xd7,0x70,0x07,0xe0,0x44,0x0a,0x6a,0x12,0x1d,0x23,0x9f,0x32,0x8a,0x20,0x8d,
+ 0x04,0x20,0xc0,0xd1,0x02,0x2a,0x0f,0x11,0x7b,0xbf,0x5b,0xb4,0xb4,0x86,0x25,0xdb,0xaf,0x9f,0x1b,0xa2,0xab,0x3d,0xd1,0x5d,0xca,0xd8,0x63,0xa0,0x85,0xd9,0xf5,0x7c,0x31,0xe0,0x20,0x8d,
+ 0x04,0x20,0xc0,0xd7,0xd5,0x42,0x3a,0x05,0x2a,0x82,0x75,0x93,0x4a,0x99,0xbf,0x9f,0x2a,0x81,0xf9,0xb7,0xb8,0x28,0x0c,0xf1,0xc6,0x48,0xb9,0x50,0x69,0xc4,0xd1,0xaf,0x37,0x4c,0x20,0x8d,
+ 0x04,0x20,0xc0,0xdc,0x9a,0x31,0x15,0x4b,0xd0,0xd9,0x69,0x76,0x34,0x17,0xdb,0x83,0x16,0x0b,0x4d,0x16,0x5b,0xbe,0x6d,0x59,0x30,0x2e,0xa5,0x46,0x3f,0x28,0xf3,0x4a,0x95,0x63,0x20,0x8d,
+ 0x04,0x20,0xc0,0xea,0x1b,0x8f,0x32,0xf5,0xbb,0x62,0x15,0x05,0x44,0x25,0x06,0xcd,0xe1,0x1f,0xe6,0xb4,0x38,0xa4,0x6c,0x10,0x7e,0x9d,0x6d,0xce,0xf9,0xde,0x78,0xb5,0xc7,0x00,0x20,0x8d,
+ 0x04,0x20,0xc1,0x01,0x3f,0x10,0x1c,0x24,0xaa,0x3e,0x35,0x0c,0x39,0xb5,0x11,0x07,0x66,0x3b,0xe9,0x27,0x43,0x29,0x0f,0x38,0x05,0x87,0x67,0x38,0xd3,0xc1,0xe9,0xa8,0x63,0x75,0x20,0x8d,
+ 0x04,0x20,0xc1,0x0a,0x81,0x64,0xd4,0x2f,0x39,0xb9,0x39,0x29,0x18,0x98,0x7f,0xaf,0x2a,0xfa,0xfd,0x8e,0x6c,0x1e,0xae,0x92,0x1c,0x2b,0x77,0xd5,0xb8,0xdf,0xdd,0xca,0x4c,0xb8,0x20,0x8d,
+ 0x04,0x20,0xc1,0x0a,0x90,0x61,0x6e,0xab,0xc6,0x70,0x87,0xa1,0xe8,0x4e,0x9b,0xef,0xe3,0x41,0xa7,0xda,0x7b,0x4b,0x66,0x70,0x2e,0xf3,0x06,0x98,0x03,0x61,0xbc,0xec,0xde,0x6c,0x20,0x8d,
+ 0x04,0x20,0xc1,0x0c,0x77,0x8a,0x91,0xc0,0x06,0xb0,0xdf,0x2a,0xf3,0xb7,0x44,0x90,0x2c,0x2d,0x28,0xc5,0x3d,0xc8,0xde,0x87,0x1d,0x0a,0x65,0x64,0x17,0xea,0xc1,0xbd,0xb2,0x50,0x20,0x8d,
+ 0x04,0x20,0xc1,0x1b,0x6d,0x78,0xbb,0x47,0x94,0x5e,0xd3,0x4d,0x00,0xfd,0x75,0xa0,0xd7,0x57,0x51,0x84,0x65,0x35,0x5f,0xd9,0x2b,0xed,0xf9,0x48,0x81,0x34,0x12,0x4e,0x30,0xc8,0x20,0x8d,
+ 0x04,0x20,0xc1,0x1c,0x01,0xd0,0x8e,0xdd,0x14,0x5f,0x4b,0x65,0x24,0xf1,0x69,0x86,0xa6,0x63,0xeb,0x19,0xa9,0x20,0xec,0x56,0xff,0xd8,0x4f,0xe0,0x10,0x23,0xfa,0x65,0x39,0xf7,0x20,0x8d,
+ 0x04,0x20,0xc1,0x20,0x98,0xb5,0xb4,0x2f,0x0a,0x13,0x65,0x0a,0xff,0x20,0x53,0xc5,0xc7,0x16,0x18,0x9f,0x88,0x41,0xc9,0x3c,0xd1,0xab,0x1c,0x79,0x3d,0xfd,0x88,0xe5,0x92,0x44,0x20,0x8d,
+ 0x04,0x20,0xc1,0x22,0xd6,0x14,0xd1,0xa7,0x3c,0x6e,0x6e,0xb2,0x42,0x53,0x5e,0x71,0xbf,0x66,0xfb,0x37,0xbb,0x2d,0x6a,0x87,0xa7,0xea,0xcb,0xdd,0x21,0x95,0x20,0x93,0xa2,0xaf,0x20,0x8d,
+ 0x04,0x20,0xc1,0x27,0x32,0xe5,0xfa,0xa8,0x1a,0xc5,0x10,0xf6,0xb9,0x01,0x43,0x3a,0x70,0x14,0x8d,0xbb,0x49,0xcc,0x10,0x22,0x6a,0x92,0x6a,0xe3,0x4f,0x66,0x90,0x31,0x7c,0x3e,0x20,0x8d,
+ 0x04,0x20,0xc1,0x4c,0xed,0xee,0x68,0xa7,0xad,0xb6,0xc6,0xad,0x2e,0x2d,0xa6,0xb1,0xe2,0xb4,0xca,0xec,0xa1,0xa2,0x9b,0x7b,0xfe,0xfb,0xd8,0xea,0xf8,0x72,0x8a,0x73,0xa5,0x4c,0x20,0x8d,
+ 0x04,0x20,0xc1,0x59,0x44,0x81,0x9e,0x78,0x3f,0xda,0xb3,0xef,0xec,0x3e,0x6a,0x99,0x4e,0x14,0x32,0x2b,0x33,0xeb,0x30,0x5a,0xe1,0xda,0x6c,0xc9,0x6d,0xfa,0x4b,0x1d,0x1d,0x56,0x20,0x8d,
+ 0x04,0x20,0xc1,0x5f,0x0b,0x67,0x90,0x71,0x8d,0xa8,0xf6,0x43,0xb1,0x0c,0x63,0x1b,0x3f,0xf3,0xd8,0x7b,0xcc,0x86,0x6a,0x25,0x9e,0xf6,0x91,0xb6,0xc8,0x6a,0x8a,0x1a,0x26,0xc0,0x20,0x8d,
+ 0x04,0x20,0xc1,0x5f,0x41,0x32,0xbc,0xcc,0x9f,0x89,0xd0,0x32,0xe9,0x1e,0xdc,0x93,0x97,0x17,0x12,0xe8,0x37,0x1d,0xd4,0xbe,0x82,0xa5,0x5b,0xad,0x3d,0xce,0x02,0xf6,0x51,0x70,0x20,0x8d,
+ 0x04,0x20,0xc1,0x61,0xb9,0x12,0xe9,0xbe,0x69,0x6b,0x7e,0x6d,0xb0,0xbe,0x94,0xe8,0x93,0x3a,0x29,0xd2,0xf6,0x3e,0xe9,0x2c,0xfc,0x7b,0xce,0x96,0xdd,0x93,0xb8,0x89,0x27,0xda,0x20,0x8d,
+ 0x04,0x20,0xc1,0x67,0x44,0x50,0x1f,0xe1,0x64,0xf6,0xc0,0x0d,0xa8,0x11,0x3d,0x73,0xd0,0x6f,0xaa,0xc0,0x07,0x80,0x76,0x18,0xf4,0x8f,0x6e,0x63,0xdf,0x4e,0x79,0x2a,0x87,0xff,0x20,0x8d,
+ 0x04,0x20,0xc1,0x6f,0x9e,0xec,0xc3,0x0d,0xe9,0xd3,0x81,0xe6,0xd9,0x3a,0xa0,0x03,0xaf,0xc5,0xde,0x18,0xbd,0x10,0x5f,0x93,0xf9,0x14,0x9c,0x47,0xcb,0x04,0xf0,0x2b,0x7c,0x1f,0x20,0x8d,
+ 0x04,0x20,0xc1,0xbb,0x70,0x92,0x59,0x45,0x10,0x04,0x1a,0xd8,0xba,0x62,0xde,0x8b,0xa7,0xaa,0x7c,0x5b,0x90,0xbc,0xe9,0x06,0xbf,0xbd,0x11,0xfc,0x51,0x26,0xc7,0xd4,0x6f,0x89,0x20,0x8d,
+ 0x04,0x20,0xc1,0xbf,0xd2,0x8b,0xbb,0x12,0x04,0x19,0x02,0x31,0x79,0x6b,0xa9,0x70,0x51,0x7a,0xaf,0xea,0x8d,0x34,0x0f,0x2a,0x0f,0x8a,0xa1,0x1d,0x05,0x6c,0x9e,0x45,0xf4,0x08,0x20,0x8d,
+ 0x04,0x20,0xc1,0x85,0x96,0xe9,0x6b,0x81,0xd5,0x2d,0xb8,0xf7,0xa9,0x44,0xae,0x2a,0x5c,0xe9,0x14,0x6e,0x5e,0x3b,0x5b,0xa2,0x8c,0x61,0xad,0x22,0x6d,0xa4,0x95,0x88,0xf9,0xd3,0x20,0x8d,
+ 0x04,0x20,0xc1,0x86,0x5b,0x44,0xdb,0xdc,0xb7,0x0b,0x20,0x11,0xb5,0xc2,0x44,0x81,0x6a,0x44,0x59,0x0a,0x23,0x76,0x4e,0x7f,0x62,0x88,0x4f,0x8a,0x63,0x8f,0x05,0x9d,0x58,0x3d,0x20,0x8d,
+ 0x04,0x20,0xc1,0x8f,0xc3,0xdf,0x94,0x30,0x1e,0x81,0xda,0xee,0x1a,0x93,0x1f,0x54,0xcb,0xf5,0x54,0x08,0x55,0x04,0xaa,0xb4,0x44,0x20,0x9f,0xae,0xc9,0x6a,0x55,0x35,0x36,0x99,0x20,0x8d,
+ 0x04,0x20,0xc1,0x97,0x5a,0xb4,0x3b,0x1a,0xb5,0x53,0xea,0xd6,0x33,0xc4,0xda,0xb3,0xd3,0xe2,0xcc,0x11,0x9d,0xb5,0x7e,0x38,0x92,0xa7,0x64,0x27,0x28,0x60,0xf2,0xf9,0xaa,0x63,0x20,0x8d,
+ 0x04,0x20,0xc1,0x9d,0x27,0x85,0xbf,0x18,0xba,0x0f,0x1c,0x10,0xa4,0x78,0x47,0x13,0x4e,0x4f,0x93,0x39,0xa5,0xc7,0x97,0x37,0x13,0xaf,0xac,0xd6,0x97,0x38,0xd0,0xfc,0x2e,0x7a,0x20,0x8d,
+ 0x04,0x20,0xc1,0x9d,0x6b,0x67,0xdf,0x55,0x6b,0x14,0x69,0x62,0xb2,0x9b,0x21,0x76,0xe9,0x1e,0x7e,0x52,0x82,0x7d,0x9c,0x14,0xcf,0x95,0x97,0x8c,0x72,0x53,0x56,0x0d,0xbb,0xae,0x20,0x8d,
+ 0x04,0x20,0xc1,0xad,0x4b,0x67,0xa0,0xa4,0xca,0x2e,0x4e,0x0b,0xa6,0x28,0xe2,0x04,0xc7,0x17,0xcb,0xe5,0x99,0x38,0x53,0x3c,0xe7,0xc7,0x0d,0x3e,0xcf,0xaa,0x95,0xfc,0xbb,0x0e,0x20,0x8d,
+ 0x04,0x20,0xc1,0xf8,0x41,0xa6,0xaf,0x0b,0xbb,0xda,0xc8,0x0d,0x51,0xfe,0x4d,0xee,0x9f,0xf9,0x1f,0xf2,0x00,0xfd,0x3f,0x4d,0x52,0x9a,0x9f,0x9f,0xd8,0x10,0xfd,0x4a,0x62,0x6a,0x20,0x8d,
+ 0x04,0x20,0xc1,0xf9,0x47,0x60,0xb9,0x26,0x3b,0xb1,0xb5,0xc9,0xf6,0x59,0xb2,0xc5,0x07,0x39,0xac,0xf8,0x16,0x0a,0xb6,0xfd,0x24,0xb2,0x12,0xa9,0x5a,0xbd,0xc6,0x0e,0x3c,0xbb,0x20,0x8d,
+ 0x04,0x20,0xc1,0xfb,0x49,0x7c,0x6a,0xd7,0x67,0x3b,0xaa,0x7e,0x62,0x09,0x19,0x6c,0x20,0xca,0xd9,0xb4,0xa2,0x8c,0x97,0x5b,0x6c,0xf9,0x99,0x1f,0x11,0xe5,0x37,0xae,0x46,0x52,0x20,0x8d,
+ 0x04,0x20,0xc1,0xc6,0x3c,0x05,0xef,0xf2,0xcd,0x4d,0xf1,0x1f,0xa5,0x22,0x38,0x1b,0xa9,0xcb,0x4a,0x30,0x26,0xd1,0xf8,0x9d,0xb9,0xd9,0x10,0x2f,0xde,0x66,0xa7,0x98,0x49,0xb2,0x20,0x8d,
+ 0x04,0x20,0xc1,0xd1,0x2b,0x2e,0x6a,0x8c,0xb7,0x47,0xd5,0x51,0xc1,0xa5,0x44,0x3a,0x9d,0x46,0x9a,0x96,0xe2,0xea,0xd9,0xad,0x39,0x30,0x51,0xee,0x1b,0xc5,0x95,0x0d,0xca,0x0a,0x20,0x8d,
+ 0x04,0x20,0xc1,0xd2,0xac,0x2c,0x53,0x2f,0x7f,0xf1,0x90,0xc2,0xfd,0x0a,0x52,0xd4,0xdb,0x34,0x87,0x73,0x36,0xfe,0xe3,0xc6,0x7c,0x96,0x89,0xba,0x4c,0x53,0x86,0x8b,0x64,0xc5,0x20,0x8d,
+ 0x04,0x20,0xc1,0xdb,0x90,0xf5,0xec,0x10,0x48,0x88,0x4b,0xc1,0xbb,0x37,0x7a,0xe4,0x78,0xd0,0xcc,0x15,0xcc,0x88,0x95,0xab,0x59,0x9b,0xd5,0x3a,0xa8,0xce,0x99,0x29,0xb7,0xc0,0x20,0x8d,
+ 0x04,0x20,0xc1,0xe1,0x89,0xd1,0x66,0xb0,0xe7,0x57,0x65,0x27,0xa6,0x1c,0x3d,0x0a,0x85,0x6a,0x82,0x7f,0xf5,0x86,0xc5,0xb9,0xb5,0x7a,0xde,0xd8,0x0f,0xa2,0xe6,0x8b,0x92,0x8b,0x20,0x8d,
+ 0x04,0x20,0xc1,0xe7,0x72,0xd0,0xbd,0xcd,0xe0,0xe8,0x2a,0x8e,0x19,0x5e,0xcc,0xc9,0xad,0x64,0xd9,0xbe,0xf3,0x1d,0x8c,0xc9,0x78,0x3d,0x73,0xea,0xf6,0x55,0x67,0x2a,0x92,0x54,0x20,0x8d,
+ 0x04,0x20,0xc1,0xeb,0x8b,0xa4,0xa0,0xa3,0xe6,0xf9,0x26,0x37,0x89,0x76,0xeb,0xce,0xbd,0xca,0xd3,0x4d,0x18,0x6f,0x44,0xed,0x20,0x04,0x4c,0x4f,0x4c,0x37,0xa6,0x3e,0x47,0x33,0x20,0x8d,
+ 0x04,0x20,0xc1,0xee,0x23,0x3f,0x1a,0x0d,0xac,0x73,0xbd,0x86,0x22,0xd7,0x83,0x1d,0x2f,0x55,0xbe,0x22,0xc5,0x2b,0x87,0xa7,0x18,0x6b,0x0b,0xdf,0xb7,0xa8,0xdc,0x91,0xb0,0x58,0x20,0x8d,
+ 0x04,0x20,0xc2,0x34,0xae,0x3a,0x6c,0xb5,0x12,0x6f,0x85,0x1d,0x45,0xbe,0x4b,0x41,0xb3,0x6d,0xc3,0xaf,0x27,0x0f,0x5d,0xfb,0x7c,0x2b,0xe1,0x4d,0x6a,0x0a,0x4f,0x58,0xd3,0x0e,0x20,0x8d,
+ 0x04,0x20,0xc2,0x37,0xa7,0x30,0xff,0x39,0xfb,0xc7,0x11,0xd3,0xe2,0x35,0x92,0x6a,0x68,0x2f,0x17,0xc1,0x58,0x67,0xcd,0xee,0xde,0x07,0x2c,0x9c,0x22,0xe9,0x96,0xf1,0x23,0xe7,0x20,0x8d,
+ 0x04,0x20,0xc2,0x38,0x6b,0xc3,0x1e,0xd8,0xa5,0x49,0xa8,0x80,0xde,0x65,0x2d,0x3a,0x38,0xcf,0x0c,0x49,0xeb,0x47,0x11,0x4c,0x86,0xd8,0x44,0x4e,0x3d,0xd3,0x6f,0xa4,0x17,0x67,0x20,0x8d,
+ 0x04,0x20,0xc2,0x38,0xda,0x98,0xee,0xaa,0x47,0xd0,0xe4,0x41,0x3a,0x27,0x52,0x64,0xfc,0xa5,0x8d,0xbd,0x37,0xd1,0xd6,0xc9,0x3f,0x6f,0x6e,0x1a,0xc0,0x2a,0x70,0x80,0x61,0x70,0x20,0x8d,
+ 0x04,0x20,0xc2,0x3b,0x7f,0x22,0x4d,0x32,0x7e,0xf4,0x56,0x3d,0xb4,0xfc,0x8d,0x8e,0x2d,0x9a,0xe1,0x2a,0x87,0x28,0x4b,0xc7,0x8d,0x77,0x8b,0x0a,0x46,0xd4,0x1e,0xec,0x2e,0x34,0x20,0x8d,
+ 0x04,0x20,0xc2,0x3d,0x46,0x29,0x4b,0x08,0x7d,0x58,0xf1,0x3f,0xe8,0x68,0xe9,0x4b,0xea,0x82,0x8c,0x29,0x0e,0x57,0xe9,0x6a,0x64,0x77,0xe7,0xfa,0x7a,0x1c,0xd1,0x64,0x71,0x36,0x20,0x8d,
+ 0x04,0x20,0xc2,0x02,0x62,0x95,0xee,0xf8,0xd0,0xcc,0x55,0x2b,0x0e,0x4b,0x1d,0x8d,0xac,0x6a,0xf5,0x1e,0x9c,0x31,0x7d,0xc3,0x31,0x3d,0x52,0x99,0xe4,0xa7,0x7a,0x83,0x94,0x55,0x20,0x8d,
+ 0x04,0x20,0xc2,0x11,0x84,0x52,0xcd,0x97,0x3b,0x93,0xb1,0x56,0x46,0xec,0x9a,0x32,0x07,0x6e,0x0a,0xab,0x28,0x07,0x09,0x8c,0x3f,0x1e,0x37,0x9b,0x63,0x72,0xc2,0xcd,0xd5,0x47,0x20,0x8d,
+ 0x04,0x20,0xc2,0x12,0x3b,0xb1,0x66,0x69,0x45,0x68,0x87,0xb9,0xbd,0x44,0x74,0x9c,0xd3,0x17,0x77,0xdf,0xb0,0x82,0xa3,0x9e,0xc4,0x36,0x89,0x53,0x9a,0xef,0x86,0xc9,0x34,0x29,0x20,0x8d,
+ 0x04,0x20,0xc2,0x24,0x4f,0xf5,0x2a,0x91,0xb5,0xf9,0x9f,0xfc,0x0d,0xdd,0xb0,0x7a,0x22,0x8e,0xcf,0x4a,0xc5,0xcc,0x3b,0x28,0x76,0xb3,0x1b,0x6e,0xda,0x61,0x18,0xaf,0x01,0xa1,0x20,0x8d,
+ 0x04,0x20,0xc2,0x24,0x41,0xfe,0x45,0xdd,0xf3,0x26,0xac,0xc6,0x25,0x10,0xe0,0x4b,0x4e,0x2f,0x05,0x18,0xad,0x6a,0x7e,0x74,0x62,0x84,0x78,0xf8,0xba,0x2c,0x48,0x1d,0x95,0xd1,0x20,0x8d,
+ 0x04,0x20,0xc2,0x25,0x5a,0x55,0x90,0x9b,0x7f,0x63,0xcf,0xc3,0x68,0xe3,0x0c,0xc8,0x6b,0xfd,0x69,0x27,0xde,0xd1,0x61,0x6d,0x6a,0x75,0xdf,0xb2,0xc6,0xdc,0xb7,0x8c,0x0e,0x48,0x20,0x8d,
+ 0x04,0x20,0xc2,0x26,0x22,0x61,0xdb,0xb5,0x74,0xc5,0x77,0xce,0x65,0x7c,0xc7,0x37,0x6d,0xf8,0xc4,0x58,0xfd,0x28,0x31,0x86,0xcc,0xad,0x93,0x42,0x9e,0xe0,0x33,0x4e,0x9a,0x09,0x20,0x8d,
+ 0x04,0x20,0xc2,0x28,0x49,0x42,0x02,0xfe,0xda,0xdf,0xaa,0xe0,0x18,0x2a,0xc5,0xd8,0x5f,0xc3,0x04,0x89,0x67,0x2a,0xf8,0x6f,0x2d,0x84,0x7c,0x2d,0xa8,0x20,0x38,0x4c,0x27,0xa0,0x20,0x8d,
+ 0x04,0x20,0xc2,0x33,0xf1,0xe9,0x6a,0x32,0xb4,0xc2,0xcd,0xfe,0x47,0x49,0xa9,0xc0,0xee,0x9c,0x15,0x04,0x9a,0xe1,0x1b,0x32,0x16,0x95,0x76,0xac,0x90,0xec,0x17,0x03,0x84,0x6a,0x20,0x8d,
+ 0x04,0x20,0xc2,0x76,0x69,0x71,0xb5,0xa3,0x24,0x5c,0xcc,0x16,0x6f,0xd5,0x4e,0x09,0x8d,0x24,0x75,0x95,0xb0,0x4d,0xea,0x94,0x4d,0xec,0xdc,0x4e,0xab,0x8b,0x5e,0x51,0x83,0x02,0x20,0x8d,
+ 0x04,0x20,0xc2,0x77,0x0e,0x22,0x92,0x9d,0xca,0x28,0x70,0x28,0x90,0x69,0x6d,0xa6,0xb0,0x17,0xde,0x7d,0x18,0xcb,0x1f,0x7c,0xca,0xe2,0xf0,0xa9,0xad,0xa9,0xb2,0x48,0x68,0x6c,0x20,0x8d,
+ 0x04,0x20,0xc2,0x7d,0xef,0x16,0xe9,0x18,0xeb,0x9e,0x5f,0x2a,0x3c,0xf2,0x73,0xf7,0x76,0xaa,0x90,0xe0,0xd5,0x0b,0x18,0xb3,0x9b,0x87,0x6c,0x45,0xd2,0x87,0xc2,0x08,0x80,0x33,0x20,0x8d,
+ 0x04,0x20,0xc2,0x46,0x71,0xd2,0x27,0xf5,0x61,0x7a,0x61,0x46,0x65,0x24,0xa7,0x80,0x29,0xca,0x5a,0x8d,0x90,0xf7,0xb9,0xf7,0x98,0x76,0x24,0x1d,0x3a,0x78,0x0d,0x87,0x1d,0xba,0x20,0x8d,
+ 0x04,0x20,0xc2,0x54,0xe4,0xd5,0x32,0x37,0xb0,0x72,0xa7,0x4b,0x6e,0x82,0xf1,0x44,0xfa,0x27,0x8b,0x1e,0x6a,0x8b,0xde,0x33,0x22,0x04,0x39,0xd2,0x95,0x89,0x9b,0xef,0x2e,0xb3,0x20,0x8d,
+ 0x04,0x20,0xc2,0x68,0x3c,0xca,0x56,0xc5,0x4b,0x0c,0x12,0x67,0xd1,0x0c,0x72,0xd4,0x86,0xb9,0xbd,0x9f,0x50,0x2d,0xbf,0xf4,0xa6,0x41,0x2b,0x49,0xc6,0x4b,0x44,0x4a,0xb7,0x7c,0x20,0x8d,
+ 0x04,0x20,0xc2,0xb4,0x57,0x38,0xae,0x41,0x6e,0x60,0xc5,0xfd,0x07,0x3a,0xe5,0x58,0x24,0x5c,0x65,0x5c,0x08,0xd0,0x35,0xb5,0xcb,0xd7,0xbe,0x3b,0x29,0x0b,0xad,0xec,0xb7,0x99,0x20,0x8d,
+ 0x04,0x20,0xc2,0xb9,0x22,0x44,0x55,0xc6,0x6b,0x0b,0x98,0x26,0x6f,0xe5,0x16,0x78,0x84,0x45,0x57,0x97,0x03,0x73,0xe4,0xb3,0xbf,0x6c,0x18,0x30,0xb0,0x24,0x50,0x22,0x41,0x10,0x20,0x8d,
+ 0x04,0x20,0xc2,0x8f,0xb9,0xf3,0x99,0x4b,0x92,0xf4,0xff,0xce,0xa4,0x08,0xef,0x7b,0x4b,0x49,0xf0,0x2d,0x4f,0xc4,0xdb,0x10,0xa2,0x7f,0xc8,0x83,0xc8,0xb1,0x0f,0x33,0x30,0x2f,0x20,0x8d,
+ 0x04,0x20,0xc2,0x94,0x75,0xb7,0xd7,0xf1,0xc4,0xc3,0xe2,0x37,0xec,0x6e,0x02,0xec,0x5d,0x05,0x0f,0xd5,0x71,0xeb,0x8b,0xc0,0x89,0x22,0x72,0xf6,0xe3,0xbd,0x90,0x56,0x53,0x26,0x20,0x8d,
+ 0x04,0x20,0xc2,0xa0,0x43,0xd9,0x7c,0xf9,0xed,0x87,0xd0,0xe7,0xa5,0x2e,0xa7,0xb8,0x97,0x70,0x96,0x3a,0xad,0x68,0xbc,0x0e,0xf5,0xbe,0x58,0xf6,0x19,0xee,0xd4,0x29,0x28,0x37,0x20,0x8d,
+ 0x04,0x20,0xc2,0xa9,0xa1,0x2e,0xd1,0xdd,0xf6,0xd1,0xe4,0xa9,0x1a,0xb6,0xee,0x49,0xee,0xcc,0xdd,0x0c,0x79,0xa3,0x04,0xd4,0x46,0xf6,0xce,0x79,0x80,0xf3,0x7e,0x0a,0xae,0x1f,0x20,0x8d,
+ 0x04,0x20,0xc2,0xad,0x1b,0x50,0xa5,0xb5,0x41,0x75,0xd9,0x15,0x9e,0xce,0xb3,0xe3,0x3a,0xc3,0xbb,0x71,0x93,0xe3,0xb7,0x2f,0xef,0xe0,0xc2,0xe5,0xcf,0xa9,0xf9,0x9c,0x47,0x44,0x20,0x8d,
+ 0x04,0x20,0xc2,0xf4,0xf8,0x90,0x01,0xc6,0xb1,0x0c,0x1d,0x95,0x46,0x21,0xcf,0x45,0xc0,0x7d,0x1e,0xc6,0xa1,0x33,0xd1,0xb6,0xcc,0xb2,0xb6,0x9d,0xdf,0x3a,0xe0,0x39,0xfc,0x43,0x20,0x8d,
+ 0x04,0x20,0xc2,0xf5,0x29,0xc8,0xe0,0x76,0x5f,0x88,0x4e,0x93,0xfb,0x3c,0xb6,0xf3,0xf9,0xd4,0x0e,0xb2,0x0d,0x4d,0xa5,0x8e,0x84,0xf9,0x55,0xbc,0xa8,0x00,0x23,0x8d,0xb6,0x3c,0x20,0x8d,
+ 0x04,0x20,0xc2,0xf7,0xf6,0xe0,0xfb,0xad,0x13,0x9d,0x17,0x11,0xce,0xc8,0xe8,0x3a,0x64,0x45,0xf0,0x8c,0xec,0x69,0xec,0x4a,0xd6,0xb2,0x26,0x58,0x8c,0x29,0x5b,0x21,0x24,0x02,0x20,0x8d,
+ 0x04,0x20,0xc2,0xf6,0x17,0x77,0x36,0xb4,0x8d,0xd1,0x84,0xf1,0x88,0x92,0xaa,0xbb,0x15,0xb5,0xae,0xfd,0xa8,0x23,0x33,0xe2,0x72,0x79,0x83,0xee,0x9c,0x1d,0x2e,0x20,0xfe,0x1b,0x20,0x8d,
+ 0x04,0x20,0xc2,0xc0,0xec,0x59,0xce,0x22,0x6a,0xf2,0xba,0x44,0xb5,0xd9,0x8b,0xa4,0xe2,0xd0,0x0e,0x52,0x3d,0x21,0xad,0x30,0x91,0x71,0xff,0x0e,0x19,0x64,0x44,0x97,0x5a,0x86,0x20,0x8d,
+ 0x04,0x20,0xc2,0xc0,0xf8,0x9a,0xd3,0x47,0x07,0x2a,0x32,0xfd,0xbd,0x56,0x7a,0x2f,0x64,0x91,0x77,0x84,0x6c,0x81,0xc6,0x28,0x10,0xe8,0x76,0x29,0xac,0x4d,0xe7,0x12,0xae,0xc9,0x20,0x8d,
+ 0x04,0x20,0xc2,0xc2,0xb6,0xc4,0x7a,0x4b,0x4a,0x99,0xd2,0x53,0x5f,0xb1,0x3f,0x3d,0x17,0xe3,0x0d,0x08,0xf6,0x10,0x71,0x2b,0x46,0xb2,0xca,0xde,0x89,0xe2,0xde,0x1e,0xa2,0x76,0x20,0x8d,
+ 0x04,0x20,0xc2,0xc7,0x3b,0xfd,0xdd,0xc7,0x52,0x5d,0x52,0x71,0x8c,0xe0,0x5e,0xe0,0xbd,0xf0,0x14,0xe5,0xf7,0xb6,0x04,0x65,0xaa,0x5a,0xf4,0xaa,0x5d,0x40,0xd2,0x53,0x8c,0xd9,0x20,0x8d,
+ 0x04,0x20,0xc2,0xcf,0xba,0xad,0x14,0x7f,0x95,0xaf,0xbe,0x7a,0x99,0xed,0xcb,0x98,0xa6,0xa2,0x32,0x80,0x3a,0x41,0xee,0x36,0xea,0x90,0x9c,0xb7,0x87,0x9b,0x08,0x3e,0x38,0xbc,0x20,0x8d,
+ 0x04,0x20,0xc2,0xe5,0x56,0xa6,0x11,0x11,0x81,0x35,0x65,0x3d,0x31,0x55,0x69,0xf8,0x59,0xd6,0xfd,0x9f,0xfb,0x15,0x33,0xc9,0x45,0x98,0xd9,0x62,0xf7,0x70,0xfe,0x6d,0x0c,0xa7,0x20,0x8d,
+ 0x04,0x20,0xc2,0xe9,0x62,0x0a,0xcb,0x40,0x4b,0xd1,0xdb,0x52,0xa3,0xfd,0xc1,0xc3,0x86,0x97,0x04,0x51,0x9e,0x6a,0x29,0xdd,0x8e,0x8a,0x59,0x8d,0x69,0xfe,0xd9,0x69,0x24,0x00,0x20,0x8d,
+ 0x04,0x20,0xc2,0xf1,0x43,0x2d,0xfd,0x0e,0x9f,0xee,0x99,0x88,0x71,0x4e,0x4d,0x22,0x2f,0xbc,0xac,0xb3,0x90,0x43,0x20,0x8d,0xf1,0xeb,0xf0,0x38,0xac,0x43,0x90,0xd1,0xd1,0x0a,0x20,0x8d,
+ 0x04,0x20,0xc3,0x0d,0x87,0x0e,0xb9,0x99,0x65,0xc6,0xb5,0x09,0x4b,0x6c,0x8a,0xf8,0x80,0x19,0x27,0x74,0xb3,0xfe,0xea,0x2b,0xb8,0xe2,0x98,0x3c,0xa1,0xca,0x3d,0xa9,0xb3,0x44,0x20,0x8d,
+ 0x04,0x20,0xc3,0x11,0x6d,0x8f,0x8a,0x59,0x1e,0x7b,0x52,0xc1,0x51,0x86,0xf5,0xae,0x32,0xf1,0xe5,0x20,0xf2,0x55,0x11,0xb5,0x46,0x7e,0x43,0x66,0xcf,0x26,0xb5,0x52,0x0b,0x6a,0x20,0x8d,
+ 0x04,0x20,0xc3,0x1b,0x87,0x8f,0xf7,0x66,0x74,0x55,0x03,0x51,0xe6,0x2f,0x58,0x69,0x01,0x2f,0xe3,0x51,0xe1,0x7e,0x21,0x18,0xf7,0xbb,0xfc,0x89,0x48,0x7a,0x68,0x7a,0x74,0x14,0x20,0x8d,
+ 0x04,0x20,0xc3,0x1e,0xfe,0xa5,0x60,0x55,0x8a,0x74,0xe8,0x2e,0xcd,0xbd,0x6d,0xee,0x00,0x42,0xd5,0x18,0x06,0x2e,0x46,0x6e,0xcd,0xbc,0x65,0xbd,0x52,0x30,0xc5,0x56,0x9e,0x2f,0x20,0x8d,
+ 0x04,0x20,0xc3,0x23,0x46,0xb3,0x55,0x3b,0x81,0x1b,0x7e,0x2f,0x77,0x92,0x36,0x43,0x8c,0x25,0x7a,0x7c,0xfb,0x74,0x62,0xd2,0xa4,0x7b,0xb0,0xd5,0x77,0xaf,0xd5,0x8d,0xb7,0xac,0x20,0x8d,
+ 0x04,0x20,0xc3,0x27,0xa3,0x8c,0xa6,0x1d,0xdd,0xa0,0x5a,0xa9,0xd2,0xb9,0x8e,0xcc,0x2f,0xa8,0x1e,0x9f,0xf5,0x3f,0xae,0xf9,0x3a,0xd5,0x71,0x86,0x39,0xc5,0xca,0xb5,0x18,0x9a,0x20,0x8d,
+ 0x04,0x20,0xc3,0x29,0x42,0x83,0xa1,0x8f,0xfa,0xb4,0x4a,0xc5,0x88,0x7c,0xf3,0x33,0x67,0x17,0x9d,0xef,0x99,0xb9,0x3e,0x0d,0xfa,0xbc,0xae,0xd4,0x25,0x6d,0xbb,0x16,0xfb,0x3e,0x20,0x8d,
+ 0x04,0x20,0xc3,0x2e,0x40,0x7f,0x92,0x95,0x93,0x88,0x56,0xbf,0x4c,0x8f,0xfe,0x0d,0xb5,0x43,0x05,0x28,0x72,0x2d,0x03,0xbb,0x7e,0x9b,0xe3,0x2a,0x5a,0x12,0xe3,0xdf,0x72,0x77,0x20,0x8d,
+ 0x04,0x20,0xc3,0x76,0x0a,0xba,0xc3,0x57,0x44,0xeb,0xfe,0x19,0xdf,0x25,0xb8,0x23,0x3a,0xa7,0x53,0xab,0x9b,0x68,0x8d,0xc4,0xa3,0xe5,0x0a,0x2a,0x6b,0xd1,0x09,0x30,0x88,0xd1,0x20,0x8d,
+ 0x04,0x20,0xc3,0x41,0xcc,0xba,0x30,0xef,0xc8,0x73,0x1c,0x96,0x59,0x0c,0x0f,0xac,0x3c,0xc9,0xaf,0xb9,0xf1,0x66,0xaf,0x55,0xae,0x3a,0x35,0xf8,0x79,0x01,0x1b,0x5f,0x95,0x70,0x20,0x8d,
+ 0x04,0x20,0xc3,0x45,0xf2,0x8b,0xe3,0xce,0xb9,0x2d,0xe9,0x4f,0xf3,0x9e,0x35,0x06,0xae,0x38,0x7f,0xc7,0x05,0x84,0xe2,0x4c,0xed,0xc5,0x4a,0xaa,0x73,0x8b,0x49,0x77,0x21,0x91,0x20,0x8d,
+ 0x04,0x20,0xc3,0x50,0xba,0xe6,0x94,0x59,0x81,0xa9,0xae,0xba,0x38,0x90,0x2f,0x83,0x02,0xec,0x1e,0x3e,0x37,0x3f,0x8f,0xe4,0xd9,0x60,0x89,0x7f,0x2b,0x7b,0x36,0xeb,0x73,0x4b,0x20,0x8d,
+ 0x04,0x20,0xc3,0x55,0x5f,0xb5,0x27,0xf1,0xd3,0xdb,0x92,0xd7,0xbe,0x36,0x6a,0xcd,0xb4,0xf3,0x85,0x8a,0xd3,0x93,0x34,0x57,0xb3,0x36,0xdd,0xbd,0xd4,0x37,0x96,0x47,0x02,0xde,0x20,0x8d,
+ 0x04,0x20,0xc3,0x60,0x6c,0xb9,0x35,0x1d,0xab,0xa8,0xd1,0x1a,0x8a,0xc8,0x23,0x87,0x5a,0x27,0x4f,0x68,0x21,0xeb,0x9d,0x24,0x36,0x95,0x55,0xfc,0xbd,0xd4,0x67,0xc5,0x34,0x5b,0x20,0x8d,
+ 0x04,0x20,0xc3,0xb9,0x85,0x4f,0xe7,0x69,0x9e,0xf0,0x55,0xd6,0xf9,0x75,0x2c,0xef,0xc0,0x4a,0xfd,0x6d,0xf0,0x36,0xf4,0x22,0x22,0x90,0x9e,0x46,0xe5,0xe4,0xa9,0x9e,0x91,0x1d,0x20,0x8d,
+ 0x04,0x20,0xc3,0x81,0x3d,0x07,0x9e,0x3e,0x49,0x43,0xe3,0xed,0xef,0xcc,0x96,0x16,0xe6,0x7b,0xc8,0x8d,0xdd,0xb9,0x1d,0xed,0x25,0xe9,0x0f,0x17,0x5b,0x8f,0x77,0xc9,0xfe,0x5f,0x20,0x8d,
+ 0x04,0x20,0xc3,0x83,0x10,0x7e,0x3b,0x51,0x26,0x9a,0x1e,0x3c,0x37,0x04,0x51,0xc2,0x8c,0x91,0x33,0xc7,0x33,0x44,0x21,0x6a,0xc3,0x5e,0x37,0x87,0xed,0x76,0xa9,0xd4,0xcb,0x04,0x20,0x8d,
+ 0x04,0x20,0xc3,0x8c,0x5b,0x8c,0x4e,0xd7,0xb9,0x34,0x84,0x24,0x22,0xb5,0xa7,0x6b,0xcb,0xcb,0x69,0xa3,0x69,0x56,0xac,0xb8,0xb6,0x16,0x7b,0x40,0x77,0x72,0x2d,0xa3,0x01,0xa6,0x20,0x8d,
+ 0x04,0x20,0xc3,0x99,0x6b,0x94,0x48,0x5a,0x40,0x3f,0x6c,0xc8,0x10,0x47,0xdf,0xf7,0xee,0x37,0x17,0x87,0x89,0xe7,0xe9,0x7a,0xc8,0x0d,0xd4,0xea,0x93,0xd8,0xba,0xca,0xc3,0xa6,0x20,0x8d,
+ 0x04,0x20,0xc3,0x9b,0xd3,0x67,0x90,0xfc,0x9c,0x81,0x23,0x88,0xfa,0x4b,0xac,0x80,0x48,0xa4,0x90,0xec,0x33,0xbe,0x4b,0xb4,0x10,0x4f,0x7e,0xdc,0xe3,0xb7,0x91,0xc8,0xa4,0x62,0x20,0x8d,
+ 0x04,0x20,0xc3,0x9c,0x10,0xff,0x43,0xc4,0xfd,0xa6,0xf4,0x6f,0x95,0x36,0x08,0x3e,0x00,0xda,0xd8,0x54,0xf8,0xc5,0xa4,0x5a,0xee,0x79,0xde,0xab,0x20,0x30,0xbe,0xd0,0xb6,0xf4,0x20,0x8d,
+ 0x04,0x20,0xc3,0xa6,0x28,0x61,0xa9,0xd7,0x15,0xa1,0x29,0x0b,0x77,0x78,0x74,0x9c,0xb3,0x4d,0x2b,0x5b,0x20,0x02,0x0e,0x5d,0x10,0x40,0x5a,0x54,0x3b,0x59,0xb2,0x57,0x5b,0xa5,0x20,0x8d,
+ 0x04,0x20,0xc3,0xf6,0x9a,0x3b,0xfe,0xd8,0xd8,0x8f,0xc7,0x07,0x55,0x76,0xa8,0x69,0x7a,0xf6,0x84,0xb5,0xc6,0x34,0xf2,0xa5,0xd9,0xaf,0x22,0x1a,0xee,0x30,0x29,0x88,0x7e,0xf2,0x20,0x8d,
+ 0x04,0x20,0xc3,0xf9,0xf3,0x50,0x7e,0x2a,0x65,0x54,0x9a,0x9d,0xe3,0x90,0x20,0x70,0x3b,0x42,0x79,0x92,0xc4,0x80,0x14,0xc4,0x07,0x37,0xc5,0xbf,0xeb,0xf7,0x94,0x37,0x0c,0x6b,0x20,0x8d,
+ 0x04,0x20,0xc3,0xfc,0xa5,0x99,0xb1,0xaa,0x25,0x0f,0xee,0x06,0xe0,0xd5,0xae,0xf4,0xff,0xa3,0x74,0xaf,0xbc,0x2a,0xf7,0xbc,0x99,0xe4,0x5a,0xd4,0x6e,0x99,0x68,0x8d,0xf7,0x1c,0x20,0x8d,
+ 0x04,0x20,0xc3,0xc0,0x0c,0x97,0x59,0xdc,0xfa,0x38,0x66,0x83,0x5e,0x0c,0x94,0xbf,0x01,0xd5,0x2a,0xaf,0x6c,0xd4,0x75,0x65,0x3c,0xd0,0x32,0x71,0xc2,0x12,0x39,0x8e,0x61,0x26,0x20,0x8d,
+ 0x04,0x20,0xc3,0xc0,0xac,0x4a,0x7c,0x08,0x4e,0x7d,0x26,0x90,0x1f,0xa3,0xfb,0xe1,0x90,0x6c,0x4d,0x6b,0xec,0x80,0x49,0x14,0xf3,0x79,0xdd,0x0f,0x0a,0x0c,0x88,0x58,0xdb,0x2c,0x20,0x8d,
+ 0x04,0x20,0xc3,0xd4,0x95,0x4f,0x83,0x6e,0x21,0x8f,0x4a,0xa4,0x16,0x06,0x83,0x4e,0x76,0x6c,0x93,0xdb,0xfb,0x9b,0xb7,0x88,0x35,0x7a,0x19,0x39,0x5d,0xa3,0xaa,0xf7,0xa7,0x16,0x20,0x8d,
+ 0x04,0x20,0xc3,0xd8,0x85,0x4e,0x5b,0x90,0x00,0x52,0xa7,0x54,0x77,0x72,0xc5,0x04,0x02,0xeb,0x3f,0x76,0x84,0x2b,0xba,0x82,0x77,0xdb,0xb7,0x9d,0xc2,0x06,0x01,0x30,0x2e,0xfd,0x20,0x8d,
+ 0x04,0x20,0xc3,0xda,0x86,0x82,0x3a,0x3e,0x03,0x5d,0xa4,0x6e,0xac,0x7e,0x0b,0xfe,0x64,0x87,0xac,0xfc,0xd6,0x36,0xf3,0x7f,0xc1,0x4a,0x1f,0x20,0xdd,0x2d,0x9f,0x34,0x61,0xf4,0x20,0x8d,
+ 0x04,0x20,0xc3,0xdc,0x86,0xe4,0xd0,0x5e,0xf2,0xee,0x8f,0x72,0x9c,0x5e,0xc0,0x35,0xa1,0x50,0xe6,0xd1,0xdd,0x57,0x58,0x13,0x63,0x09,0xe0,0x4f,0x1a,0x60,0x8b,0xac,0x84,0x73,0x20,0x8d,
+ 0x04,0x20,0xc3,0xdf,0xfd,0xbe,0xba,0xa8,0x92,0x58,0x6b,0x6b,0x9d,0x8e,0xe4,0xd2,0x24,0x65,0xee,0x55,0x36,0xd3,0x32,0xaf,0x2a,0xd8,0x9b,0xb2,0x06,0xb0,0x12,0xb8,0xbe,0xf8,0x20,0x8d,
+ 0x04,0x20,0xc4,0x3f,0x2f,0x3c,0x9f,0x4e,0x63,0x94,0xf6,0x97,0x5b,0xa3,0x89,0xda,0xe3,0xe8,0x65,0xc5,0x2d,0x38,0xab,0xf5,0xf0,0x28,0x71,0x78,0x1a,0x6f,0xfb,0xb8,0x1e,0xe4,0x20,0x8d,
+ 0x04,0x20,0xc4,0x1a,0x05,0xf1,0xe7,0xc7,0xed,0x9d,0xae,0x4e,0x46,0xb7,0x1c,0xa3,0x01,0xef,0x82,0xd0,0xe6,0xb5,0xc3,0xf1,0xa6,0x1b,0xaf,0x73,0x73,0x15,0x7b,0x70,0x7e,0x2a,0x20,0x8d,
+ 0x04,0x20,0xc4,0x1c,0x88,0x4f,0x6c,0x72,0xd3,0xcc,0x1a,0x1c,0xe6,0x70,0xc2,0x74,0xc3,0x09,0x88,0x4f,0x88,0x13,0x59,0x78,0xd1,0xa6,0x3c,0x66,0x10,0x81,0x0e,0x94,0xb2,0x09,0x20,0x8d,
+ 0x04,0x20,0xc4,0x2a,0x70,0xb2,0xa2,0xe7,0x51,0x8d,0x8e,0x2b,0xfb,0x44,0x4a,0x1e,0x86,0x1c,0xf4,0x52,0x56,0xd7,0xe5,0xfb,0xbc,0x80,0xa8,0x77,0x8f,0xaf,0x6b,0xca,0x2a,0xed,0x20,0x8d,
+ 0x04,0x20,0xc4,0x40,0xc0,0x86,0x0b,0xca,0x99,0xe7,0x75,0xea,0x17,0x61,0xdf,0x6d,0xa9,0xac,0x54,0x50,0x2d,0x70,0x70,0x6b,0x21,0x55,0xe3,0x42,0xba,0xeb,0x04,0x73,0x69,0xc2,0x20,0x8d,
+ 0x04,0x20,0xc4,0x47,0x36,0xcf,0x8b,0x53,0xf1,0x2c,0x62,0x35,0x8e,0x20,0x7b,0xdb,0x6a,0xe6,0xbe,0x6b,0xdb,0x28,0x74,0x87,0x34,0x3c,0xba,0x18,0x90,0x57,0x50,0xd6,0xcb,0x98,0x20,0x8d,
+ 0x04,0x20,0xc4,0x56,0x2e,0x47,0x70,0x28,0xa3,0xcb,0xf6,0xcd,0x12,0x29,0x38,0x8e,0xa0,0x94,0x5e,0x03,0xba,0x3b,0xa2,0x35,0xd5,0x98,0x66,0x55,0xc2,0x89,0xef,0x36,0x9b,0x2c,0x20,0x8d,
+ 0x04,0x20,0xc4,0x58,0xf0,0x48,0x69,0x60,0x7f,0xf7,0x35,0xdc,0x17,0xa2,0x93,0xeb,0x85,0x4f,0x4d,0x3f,0x84,0x29,0xbf,0xdb,0x7a,0x47,0x13,0x53,0x2e,0x1b,0x5b,0x46,0x03,0x3d,0x20,0x8d,
+ 0x04,0x20,0xc4,0x60,0xe5,0xd8,0x0e,0xbb,0xc1,0xbd,0x0a,0xda,0xc9,0x0c,0xd0,0x18,0xcc,0x6a,0x28,0x48,0xfb,0xd4,0x61,0x57,0x96,0xa4,0x1e,0x18,0x9f,0xfa,0x0e,0x0f,0x03,0x80,0x20,0x8d,
+ 0x04,0x20,0xc4,0x6c,0xa9,0x20,0xcf,0xbf,0x0a,0xe8,0x2e,0xcd,0x2f,0x85,0x7b,0x4d,0xef,0xbe,0xb3,0xa6,0x49,0xcc,0x7a,0x0d,0xfd,0x8d,0x42,0x66,0xf8,0xfb,0x49,0x98,0xe8,0x6d,0x20,0x8d,
+ 0x04,0x20,0xc4,0x70,0x13,0xb3,0x44,0x97,0x24,0x8a,0x3d,0x2d,0xc2,0x4a,0x5a,0xa0,0x8c,0xac,0x2f,0xae,0x32,0x09,0xeb,0x51,0x66,0x6a,0xc5,0xef,0xa4,0xf1,0xc1,0x76,0x05,0x39,0x20,0x8d,
+ 0x04,0x20,0xc4,0x73,0x65,0xee,0x21,0x2a,0x6f,0xf2,0x60,0x38,0x4d,0x5a,0x9c,0xeb,0x1f,0x83,0x2a,0xf6,0xa8,0x97,0x53,0x30,0xb8,0x3e,0xd2,0x0f,0xd1,0x57,0x9b,0xc2,0x3f,0x34,0x20,0x8d,
+ 0x04,0x20,0xc4,0xb4,0xca,0x62,0xa2,0x6b,0xc6,0x01,0x92,0x73,0xc8,0x2a,0xb2,0x1f,0xf0,0x8b,0x7f,0x3f,0x47,0xe4,0xd4,0xdc,0x12,0xbf,0xf8,0xb9,0x67,0x30,0x7c,0x99,0xd2,0x3d,0x20,0x8d,
+ 0x04,0x20,0xc4,0x8e,0xfd,0x1b,0xc1,0xee,0xda,0x32,0x13,0x3b,0xe3,0x6e,0xd5,0x70,0x39,0xf0,0xa0,0x1c,0xac,0xb7,0x80,0xcc,0x64,0x7c,0x33,0x82,0xed,0x9b,0xe6,0x82,0xfc,0xac,0x20,0x8d,
+ 0x04,0x20,0xc4,0xa1,0xd8,0xcd,0xe5,0xca,0xb3,0xd3,0x4f,0x52,0xf6,0x90,0x30,0xc8,0x7f,0x91,0x05,0x9d,0xa4,0x8f,0xca,0xe8,0xff,0x1e,0x05,0xec,0xe6,0x3a,0x4e,0x43,0x65,0x8d,0x20,0x8d,
+ 0x04,0x20,0xc4,0xb1,0x7e,0x90,0x06,0xb3,0x60,0xf2,0x91,0x99,0xd3,0x4f,0x61,0x5e,0x5a,0x16,0xc9,0x42,0x41,0x5d,0x2e,0xd2,0xdc,0x57,0x05,0x81,0x5a,0xed,0xbc,0xab,0x14,0x0b,0x20,0x8d,
+ 0x04,0x20,0xc4,0xf5,0x5a,0x07,0xcb,0x58,0x88,0x6b,0xd2,0x82,0xa6,0xd0,0x45,0x26,0x05,0x7b,0x03,0x8c,0xf1,0x51,0x25,0x2f,0x7e,0x4a,0x9a,0x7c,0x04,0x49,0xdb,0xea,0x0a,0x82,0x20,0x8d,
+ 0x04,0x20,0xc4,0xc1,0xf8,0x7e,0xbd,0x5a,0xb3,0x3e,0x67,0x0f,0xdb,0x39,0xc1,0x5c,0x43,0x9e,0x19,0x73,0x32,0x90,0x1b,0x66,0xd0,0x1b,0x3e,0x3e,0xcf,0x64,0x0d,0x90,0x71,0x01,0x20,0x8d,
+ 0x04,0x20,0xc4,0xd1,0xa7,0x16,0x50,0x37,0xd5,0xcc,0x85,0x6d,0xf0,0x21,0x7e,0x66,0x00,0x74,0x75,0x97,0xb1,0x72,0x20,0x70,0xb4,0xdd,0x74,0xfa,0x45,0x99,0x26,0x13,0x1f,0x05,0x20,0x8d,
+ 0x04,0x20,0xc4,0xd4,0xa8,0x11,0x0a,0xff,0xf2,0x94,0xd8,0x01,0x90,0xd6,0x29,0xd2,0x8c,0xdf,0xd3,0x1d,0xc7,0x51,0x37,0x84,0xab,0xd0,0x79,0x07,0xf1,0xf9,0xa0,0x0b,0x84,0x75,0x20,0x8d,
+ 0x04,0x20,0xc4,0xe1,0xca,0x3a,0xd1,0xf5,0x6d,0x84,0xb2,0x29,0xa8,0x05,0xf0,0x21,0x89,0x4a,0xf3,0x85,0x95,0x87,0x81,0xdb,0xbc,0xf0,0x82,0x23,0x59,0xd1,0x8f,0xd4,0xd0,0x85,0x20,0x8d,
+ 0x04,0x20,0xc4,0xe0,0x79,0x39,0x6a,0xfb,0xe1,0x48,0xf4,0x54,0xd1,0x41,0x78,0xd0,0x87,0xad,0xff,0xac,0x21,0x16,0x0e,0xf6,0xfe,0x4b,0x23,0x6e,0x50,0x34,0xc1,0x52,0x03,0x5f,0x20,0x8d,
+ 0x04,0x20,0xc4,0xe1,0x98,0xb3,0xe5,0x51,0x36,0xa8,0x18,0xfd,0x0f,0xb5,0x30,0x43,0xf8,0xc1,0x12,0x69,0x8f,0x78,0xbd,0x80,0x82,0xa7,0x4f,0x43,0x1d,0x00,0x96,0x1c,0x7f,0xee,0x20,0x8d,
+ 0x04,0x20,0xc4,0xe2,0x7a,0xe2,0x4c,0x7f,0x11,0x0d,0x42,0x8c,0x1c,0x5e,0x67,0xf7,0x90,0xdd,0x24,0x75,0x17,0xbb,0x0f,0x91,0xc7,0x5d,0xe3,0x19,0xb9,0x16,0x2d,0x5f,0x38,0x41,0x20,0x8d,
+ 0x04,0x20,0xc4,0xf0,0xdd,0x13,0x61,0x53,0x0c,0x0a,0xc7,0x06,0x7a,0xbb,0x1c,0xe0,0x65,0x1b,0x0e,0xf5,0x12,0x22,0x10,0xa0,0x20,0x2a,0x5b,0xbc,0xda,0x13,0x43,0xb0,0x96,0x0d,0x20,0x8d,
+ 0x04,0x20,0xc4,0xf3,0xe7,0x57,0xcb,0xeb,0x8a,0x74,0xd0,0x6b,0x2a,0x3a,0xad,0x79,0x72,0x37,0x2b,0xbf,0x3f,0xf7,0xb0,0x90,0x02,0xe3,0x52,0x18,0x29,0xc1,0x37,0xce,0xcd,0xcc,0x20,0x8d,
+ 0x04,0x20,0xc4,0xf2,0xd6,0x79,0x36,0x03,0xcd,0xd3,0xec,0xa8,0x8a,0x19,0x00,0xfc,0x0e,0xd1,0xbf,0x44,0x1c,0x0a,0x36,0xcd,0x3f,0x1c,0x4f,0x2c,0x14,0xa3,0x0b,0x04,0x62,0x96,0x20,0x8d,
+ 0x04,0x20,0xc5,0x3c,0x85,0x9a,0xe9,0x29,0x4a,0x30,0xec,0xb0,0xfc,0xa3,0x6b,0x33,0x3e,0xc3,0x1f,0xb2,0xdc,0x24,0x8c,0xa6,0xf5,0xfa,0xa3,0x70,0x99,0x70,0xc6,0x25,0xe9,0x37,0x20,0x8d,
+ 0x04,0x20,0xc5,0x3e,0x2e,0xa9,0x26,0x62,0xc4,0x8e,0x02,0x2e,0x2b,0xcd,0x0e,0x8f,0x50,0x97,0x4b,0x50,0xdb,0x79,0x00,0xbb,0xa6,0x81,0x8f,0x6e,0xaa,0x2f,0x56,0xe8,0x60,0xbd,0x20,0x8d,
+ 0x04,0x20,0xc5,0x0a,0x4d,0xbb,0xb7,0xfc,0x9f,0x80,0xcb,0xb3,0x55,0x3d,0xc8,0xf8,0xf9,0x0c,0x45,0xcf,0x52,0x1e,0x46,0x55,0x8f,0x67,0x63,0xc5,0x42,0x0d,0x61,0x81,0x5d,0x48,0x20,0x8d,
+ 0x04,0x20,0xc5,0x0e,0x40,0xcd,0xe1,0xf5,0x22,0xf9,0x46,0x3b,0x36,0xea,0xaf,0xcc,0x4b,0xea,0xdf,0xd1,0xcf,0xea,0x10,0x13,0xfc,0xbc,0xce,0xbf,0x63,0xcb,0xf9,0xf3,0xc4,0xaf,0x20,0x8d,
+ 0x04,0x20,0xc5,0x20,0xe4,0x1e,0x3c,0x7f,0xfd,0x3d,0x62,0x8f,0xbd,0x04,0x8a,0x44,0x4f,0xcc,0x90,0x9e,0xa3,0x7a,0x23,0x52,0xb9,0x61,0xb0,0x74,0x75,0xd2,0x9c,0x75,0x40,0xef,0x20,0x8d,
+ 0x04,0x20,0xc5,0x2f,0xbd,0x67,0xd1,0xea,0xc9,0x83,0x84,0x71,0x30,0xdf,0x34,0x72,0x46,0x35,0xf0,0xec,0x6f,0x7e,0x80,0x7f,0xb4,0x03,0xd2,0x57,0x48,0x62,0xad,0x1d,0x84,0xaa,0x20,0x8d,
+ 0x04,0x20,0xc5,0x74,0x4c,0x92,0x10,0x29,0x1c,0xf8,0xcd,0x1b,0xf4,0x38,0x51,0xcb,0x62,0x54,0x39,0xba,0x8e,0xbf,0xaa,0xa7,0x02,0xbd,0xba,0x6b,0xeb,0xe4,0x49,0xa1,0xb8,0x31,0x20,0x8d,
+ 0x04,0x20,0xc5,0x7e,0x04,0x34,0x38,0xbe,0x7d,0x62,0x25,0x27,0x7a,0x4d,0x9b,0xf8,0xc7,0x13,0x98,0x3b,0x0f,0x6a,0xf9,0x44,0xb8,0xd3,0x96,0x73,0x9d,0x71,0x3a,0xb8,0x4d,0xa2,0x20,0x8d,
+ 0x04,0x20,0xc5,0x7e,0xb5,0x8b,0x03,0xb5,0x51,0xa6,0x72,0xef,0x6d,0x16,0x73,0x5c,0x51,0x49,0x3d,0x59,0x5a,0x72,0x04,0xa9,0xd0,0x85,0x86,0xbd,0x15,0xb5,0x99,0x6d,0xdf,0xe6,0x20,0x8d,
+ 0x04,0x20,0xc5,0x4d,0x9a,0xb0,0xfc,0x69,0x91,0xbf,0x66,0xad,0xfb,0xc9,0xb0,0xb8,0x52,0xba,0x7c,0xf1,0x08,0x05,0x3f,0xeb,0xeb,0x32,0x56,0x50,0xdc,0x10,0xdc,0x79,0x3e,0xc3,0x20,0x8d,
+ 0x04,0x20,0xc5,0x4f,0x55,0xf4,0x35,0x4b,0xfa,0xb4,0xb1,0xce,0xa2,0x59,0x6f,0xf2,0xc3,0xc4,0x1a,0x7a,0xd9,0x6c,0xe7,0x3f,0xef,0x5a,0xc6,0x87,0x66,0x76,0xe4,0x53,0xc3,0x51,0x20,0x8d,
+ 0x04,0x20,0xc5,0x5a,0xf7,0xd7,0x6d,0xd9,0xec,0x4b,0xae,0xb4,0x31,0x6a,0x8b,0x57,0x7b,0xc0,0x81,0x5b,0x8e,0xcd,0x3e,0xb8,0x37,0xcb,0xb5,0x7e,0xf1,0xf5,0x5b,0xca,0xc9,0x37,0x20,0x8d,
+ 0x04,0x20,0xc5,0x64,0xe5,0x5b,0xde,0x67,0xd5,0x08,0x41,0x37,0x0f,0x18,0xd9,0xa6,0xb6,0x3b,0x5e,0xe7,0x55,0xc4,0x17,0xa3,0x17,0xc2,0x63,0xc9,0x3c,0x51,0xd5,0xe1,0x9d,0x67,0x20,0x8d,
+ 0x04,0x20,0xc5,0x68,0x3d,0x17,0xd6,0x0f,0x9f,0x42,0x0b,0x97,0x86,0xc1,0xec,0x46,0x80,0xbe,0xba,0x9c,0x0e,0x04,0x7b,0xac,0x7c,0xfb,0xb4,0xaa,0xc3,0x50,0xae,0x58,0x47,0xb9,0x20,0x8d,
+ 0x04,0x20,0xc5,0x6a,0xe1,0xda,0x01,0xdc,0xb2,0xb3,0x2a,0xfc,0x21,0x85,0x88,0x7e,0x0c,0x3b,0xf0,0xe8,0x5c,0x78,0xb8,0xda,0xa9,0x5d,0x7e,0x7b,0xda,0xc0,0x19,0xb2,0xa7,0x1a,0x20,0x8d,
+ 0x04,0x20,0xc5,0xbf,0x38,0x02,0x89,0x69,0x96,0xf4,0xb1,0x20,0x57,0x63,0xf9,0x5e,0xa9,0x37,0x0d,0x02,0x50,0x36,0x24,0xd9,0xd3,0xf7,0x84,0xf9,0x42,0x56,0xff,0x17,0xfa,0x8d,0x20,0x8d,
+ 0x04,0x20,0xc5,0x82,0xf8,0xc9,0x0e,0x19,0xa6,0xb1,0x6a,0x0e,0xa0,0x6a,0xe9,0xf6,0x0c,0xd6,0x96,0xe3,0x52,0x71,0xd0,0xc2,0x8c,0xb1,0x6e,0x68,0xf8,0x31,0x20,0xaa,0x58,0x2f,0x20,0x8d,
+ 0x04,0x20,0xc5,0x95,0x75,0x83,0x03,0x73,0xd1,0xec,0x19,0x24,0x31,0xa7,0x5e,0xe5,0xaf,0x9a,0xa2,0xb1,0xe6,0x47,0xfb,0xc8,0x6f,0x58,0x01,0x52,0x58,0x2a,0x71,0x5b,0x3b,0x02,0x20,0x8d,
+ 0x04,0x20,0xc5,0x98,0x7e,0xe4,0x57,0xdc,0x75,0x11,0xff,0x2c,0x56,0x2f,0xd5,0x61,0x86,0xba,0xb9,0xb5,0xc8,0x0c,0x41,0x3b,0xa5,0x04,0xe0,0xc4,0x2d,0x0c,0x38,0x7d,0x9b,0x8d,0x20,0x8d,
+ 0x04,0x20,0xc5,0xa1,0xe7,0x5c,0x65,0x1d,0x56,0x81,0x4f,0x62,0xa0,0x24,0x3d,0x81,0x55,0x12,0xf9,0xf4,0x5b,0xc1,0xbe,0x15,0x1a,0xa8,0x0b,0x23,0x22,0x2c,0x43,0x38,0xc8,0x96,0x20,0x8d,
+ 0x04,0x20,0xc5,0xa0,0xa1,0xa9,0x07,0x7e,0x63,0xb3,0xdf,0xcb,0x06,0x97,0x98,0x48,0xd4,0x74,0x03,0x4b,0x29,0xbb,0xf4,0x05,0x10,0xa8,0xf5,0x5c,0xc7,0xed,0x64,0x71,0x35,0x1f,0x20,0x8d,
+ 0x04,0x20,0xc5,0xa0,0xfd,0xa9,0x36,0x11,0xd5,0x37,0x6b,0x92,0x77,0x1a,0xde,0x38,0xb0,0xeb,0x3a,0x2e,0x77,0x81,0x9b,0x55,0x4b,0xf5,0x37,0x2c,0xd4,0xa8,0x67,0xde,0x1d,0x05,0x20,0x8d,
+ 0x04,0x20,0xc5,0xa1,0x83,0x4b,0xfa,0x86,0x6e,0x15,0x24,0x8a,0x26,0x56,0x79,0x36,0x32,0x2b,0x5b,0x56,0x7b,0xc8,0x32,0x9d,0x52,0xb8,0xfa,0xf7,0xe3,0x4f,0x9d,0xdb,0x84,0xef,0x20,0x8d,
+ 0x04,0x20,0xc5,0xaa,0xfc,0x52,0x3c,0x6e,0x3d,0x93,0x96,0xef,0x95,0x41,0xc6,0x1f,0xc2,0x1f,0x0f,0x3b,0x72,0x1f,0xc2,0xef,0xf9,0xa2,0x52,0x6d,0xc8,0x7b,0x1b,0x41,0x40,0xfa,0x20,0x8d,
+ 0x04,0x20,0xc5,0xf6,0xd6,0xe2,0xf8,0xd9,0xf8,0x4b,0xeb,0x54,0x80,0xd3,0x62,0x3c,0xee,0x7c,0x66,0x4d,0xf1,0x24,0x5b,0x54,0xf8,0xf2,0x80,0xd8,0xf5,0xb5,0x4b,0xf0,0xba,0x63,0x20,0x8d,
+ 0x04,0x20,0xc5,0xc1,0xa4,0x53,0xbe,0x2b,0xf8,0x8e,0x32,0xf9,0x1a,0x99,0x5f,0xde,0xf1,0x5d,0x31,0x79,0xab,0x0b,0x85,0x49,0x7a,0x08,0x88,0xad,0xf8,0x58,0x5c,0x29,0xc6,0x58,0x20,0x8d,
+ 0x04,0x20,0xc5,0xcd,0x57,0xfb,0xcb,0x5e,0xc5,0xe5,0x3b,0xf6,0xe1,0xd9,0xfb,0xd7,0x2e,0x28,0xf6,0x20,0xed,0x54,0xda,0x53,0x01,0x72,0xc8,0x38,0x1e,0xdc,0x2b,0x76,0xba,0x12,0x20,0x8d,
+ 0x04,0x20,0xc5,0xd6,0x0b,0xa0,0x00,0x9e,0x0a,0xd8,0xdf,0x6b,0xd5,0x4e,0x1e,0x3f,0xc3,0xdf,0x3e,0x34,0xe6,0x97,0xff,0x4c,0x25,0xe8,0x7b,0xd8,0x30,0x35,0xda,0x4f,0x77,0x6d,0x20,0x8d,
+ 0x04,0x20,0xc5,0xd7,0x67,0xb2,0x49,0x18,0x5e,0xb1,0x9d,0x1d,0x3a,0xf2,0xe7,0xa2,0x48,0x73,0x76,0x88,0x05,0x39,0x7d,0x70,0x00,0x10,0x3c,0xc4,0xa7,0xbc,0xff,0x70,0x09,0xa1,0x20,0x8d,
+ 0x04,0x20,0xc5,0xdb,0x49,0x2d,0x3f,0x3c,0x97,0x66,0x38,0xa7,0xdf,0x81,0xbf,0xca,0x6b,0x67,0x52,0x96,0xc3,0x9e,0xad,0x6b,0x86,0xcc,0xbc,0xd5,0x2d,0xbc,0xd1,0xd4,0x74,0xf7,0x20,0x8d,
+ 0x04,0x20,0xc5,0xe1,0xb0,0xa6,0xc3,0x88,0x95,0xb5,0x95,0x75,0xb2,0x2e,0x9d,0x14,0x5a,0x5f,0xdf,0x98,0x34,0x80,0xea,0xfe,0x2a,0x0a,0xa8,0x03,0x1c,0x2f,0x6c,0x1a,0xbb,0xb2,0x20,0x8d,
+ 0x04,0x20,0xc5,0xe2,0x40,0xf4,0x09,0xa0,0xda,0xf9,0xec,0x3f,0xcf,0x4f,0x84,0x64,0x09,0xf5,0x0a,0x61,0xf3,0xce,0xde,0xf9,0x69,0x8e,0x94,0xc0,0x00,0xa0,0xba,0xf6,0xcc,0xcc,0x20,0x8d,
+ 0x04,0x20,0xc6,0x36,0x16,0xcb,0x2b,0x1e,0xa6,0x10,0xe0,0x7c,0xe9,0x74,0x9f,0x86,0x71,0x08,0xf3,0xa7,0xf7,0x32,0xa6,0x50,0x4d,0x7d,0x68,0x84,0x7f,0x73,0x28,0xa7,0xdf,0xe2,0x20,0x8d,
+ 0x04,0x20,0xc6,0x3f,0x1a,0x48,0xe4,0x3e,0x85,0x0d,0x5c,0xc7,0x7c,0x87,0x95,0xc6,0xfc,0x33,0xc8,0x93,0x16,0xb2,0x29,0xe1,0xed,0xef,0x63,0xd2,0x67,0x31,0x3a,0xa7,0x3f,0x52,0x20,0x8d,
+ 0x04,0x20,0xc6,0x0d,0x71,0x8a,0xb8,0x7f,0xa6,0xde,0x7a,0x8c,0x7b,0x2e,0xb9,0x1a,0x48,0xf0,0xa2,0x6d,0x5d,0x22,0x3d,0x0e,0x8d,0xb9,0x4e,0x0b,0x8b,0x2b,0xf0,0x70,0x35,0xa8,0x20,0x8d,
+ 0x04,0x20,0xc6,0x1d,0xd9,0x72,0x3e,0xb4,0x7c,0xff,0xaf,0xaf,0xed,0x18,0xb7,0xfe,0xe6,0x0f,0x3f,0x43,0x11,0xf3,0xa1,0xa4,0x2a,0xf0,0xd5,0x7c,0xaf,0x54,0xae,0xd8,0x61,0x5f,0x20,0x8d,
+ 0x04,0x20,0xc6,0x23,0xa7,0x92,0x19,0x6d,0x12,0x48,0xee,0x7e,0xde,0x30,0x75,0x88,0x12,0x4b,0x46,0x13,0xad,0x75,0x9d,0xee,0xa6,0x0a,0xb1,0xfb,0xf9,0x8b,0xbe,0x99,0x4c,0x45,0x20,0x8d,
+ 0x04,0x20,0xc6,0x2c,0xc1,0x68,0xe7,0x57,0xe7,0xdf,0x13,0xe9,0xa3,0x7d,0xa7,0x20,0x70,0x2c,0xfc,0x9a,0xce,0xb5,0x5e,0x16,0x4b,0xa0,0xf9,0x30,0xa3,0x35,0x66,0xe4,0xe8,0x2f,0x20,0x8d,
+ 0x04,0x20,0xc6,0x76,0x8c,0xdc,0xbe,0x78,0xe7,0x1d,0xd0,0x41,0x8a,0x28,0xee,0x05,0xe6,0x4b,0x75,0x54,0x48,0x03,0xe5,0x4c,0xe1,0x2a,0x64,0xbb,0x5f,0x5d,0xc4,0xa6,0x04,0x76,0x20,0x8d,
+ 0x04,0x20,0xc6,0x78,0xbf,0x82,0x02,0x49,0x76,0xb1,0x0e,0x63,0x15,0x2e,0xeb,0xad,0x24,0x1c,0x45,0x15,0xbb,0x6b,0xa7,0x95,0x33,0xcb,0x41,0xaa,0x48,0xe4,0x2f,0x96,0x85,0xf6,0x20,0x8d,
+ 0x04,0x20,0xc6,0x7a,0x8f,0x49,0x63,0xc5,0xa3,0xa6,0x43,0x27,0xec,0x19,0x67,0x40,0xa6,0x94,0xc1,0xd2,0xfb,0xe1,0x30,0xcf,0x07,0x18,0x89,0x4b,0x1e,0x46,0x99,0x7b,0x5a,0xc0,0x20,0x8d,
+ 0x04,0x20,0xc6,0x40,0xa3,0x3a,0x2d,0x89,0xf3,0x92,0x35,0xe2,0x5b,0xb8,0x03,0xe0,0x08,0xea,0xef,0x23,0x79,0x89,0x87,0x33,0x1b,0x2c,0xf0,0x9e,0xca,0x5e,0x48,0x2b,0xba,0x39,0x20,0x8d,
+ 0x04,0x20,0xc6,0x42,0xa0,0x6a,0x58,0x30,0x7a,0x48,0x1a,0x26,0x56,0xa5,0x58,0x21,0xbd,0x3a,0xf6,0x32,0xa9,0xb9,0x28,0xdb,0xeb,0x66,0xcd,0x11,0x2f,0x22,0x25,0x91,0x7f,0x6c,0x20,0x8d,
+ 0x04,0x20,0xc6,0x4f,0xa4,0x34,0x84,0x2a,0xb2,0xe3,0x89,0x5f,0xaa,0xac,0x22,0x93,0xda,0x55,0x5e,0xb9,0x2f,0x1d,0xbb,0x78,0x36,0x33,0x5d,0x2b,0xee,0x14,0xc3,0x55,0x06,0xf8,0x20,0x8d,
+ 0x04,0x20,0xc6,0x50,0x67,0x48,0xa4,0xbb,0xc4,0xef,0x7c,0x58,0xd9,0x37,0xab,0x90,0xeb,0x7d,0x9d,0x1d,0xfc,0xaf,0xee,0x99,0x8e,0xbe,0xd3,0x8e,0xaf,0x26,0xa7,0x6c,0xba,0xfe,0x20,0x8d,
+ 0x04,0x20,0xc6,0x50,0x90,0xfd,0xf4,0xf3,0x23,0x11,0xd8,0x3f,0x92,0xa9,0xa2,0x6c,0x8f,0x2e,0x22,0xa3,0xaf,0xf3,0xd0,0x3f,0xad,0xd4,0x08,0x94,0x28,0xb8,0xee,0x2e,0x05,0xdd,0x20,0x8d,
+ 0x04,0x20,0xc6,0x56,0x04,0x6f,0xb1,0x00,0xc6,0x3d,0x28,0x69,0x6d,0x14,0xd9,0x7e,0x9d,0x9f,0x19,0xc6,0x99,0x1d,0x19,0x62,0xb8,0x7f,0x44,0xf2,0xe0,0x5d,0x1d,0xfd,0x1e,0x55,0x20,0x8d,
+ 0x04,0x20,0xc6,0x5d,0xaa,0xe7,0x8a,0xa2,0x26,0xce,0xef,0x36,0xc3,0x54,0xcf,0x8c,0x65,0x1d,0xba,0x49,0x0a,0x4f,0xe9,0x5f,0xf8,0x98,0xbe,0xa4,0x9e,0xf3,0x93,0xdd,0xdb,0x2a,0x20,0x8d,
+ 0x04,0x20,0xc6,0x60,0x5c,0xdb,0xe5,0x36,0x73,0x2f,0x6e,0xef,0xac,0x8d,0x96,0x9d,0xa0,0x94,0xae,0x20,0x0c,0x25,0x05,0xee,0x0b,0x85,0x8a,0x29,0x6a,0x49,0x18,0x77,0x46,0x4f,0x20,0x8d,
+ 0x04,0x20,0xc6,0x63,0x6f,0xd1,0x45,0xa2,0xff,0x13,0xd5,0x6b,0x24,0xd8,0x00,0xb3,0x7f,0xb5,0x1e,0xa3,0xca,0xf6,0x76,0x89,0x28,0x41,0xd3,0x93,0x8f,0xe3,0x5d,0x01,0xef,0xe5,0x20,0x8d,
+ 0x04,0x20,0xc6,0x65,0xa0,0x8c,0xf6,0x3d,0xca,0x60,0x3b,0x2f,0x12,0x05,0xca,0xfb,0xd6,0xfd,0xac,0xbb,0xc6,0x3b,0xaf,0x2e,0xf3,0x64,0x91,0xfe,0xf7,0x02,0x1c,0x56,0x25,0x90,0x20,0x8d,
+ 0x04,0x20,0xce,0xb6,0xf2,0xa3,0x37,0xb3,0xc0,0x4d,0x48,0x29,0x27,0xf5,0xa4,0x12,0x55,0x1f,0xa2,0x2b,0xb6,0x60,0xc8,0x80,0xe2,0x14,0x01,0xcc,0xa8,0x35,0x0b,0x97,0xbb,0x26,0x20,0x8d,
+ 0x04,0x20,0xce,0x88,0xac,0x71,0xfc,0x76,0x56,0xa8,0xc5,0x94,0x86,0x93,0x01,0x67,0xd6,0xd2,0xb5,0xa8,0x93,0xc7,0xbc,0x59,0xba,0x33,0x98,0x78,0x9a,0xcc,0xb1,0xf2,0x47,0x1f,0x20,0x8d,
+ 0x04,0x20,0xce,0x88,0xee,0x50,0x4a,0x1e,0xf0,0xc3,0x4e,0x49,0x44,0xc0,0x6f,0xe2,0x14,0x53,0x13,0x24,0xbe,0xd4,0x2e,0xc7,0xb6,0xbe,0x1c,0x74,0x94,0x40,0x4d,0xea,0x12,0x1b,0x20,0x8d,
+ 0x04,0x20,0xce,0x8c,0xdc,0x9c,0x1f,0x9c,0xd0,0x96,0x2c,0x9f,0xe8,0xeb,0x01,0xe4,0x04,0x86,0x77,0x7c,0x5f,0x29,0x8c,0x60,0x1c,0xc5,0x01,0xad,0x82,0xe6,0x1f,0xfc,0x49,0x39,0x20,0x8d,
+ 0x04,0x20,0xce,0x90,0x7b,0xb4,0x9f,0x5e,0x1c,0x3b,0x19,0x6a,0xb3,0xea,0x36,0x67,0x60,0xf6,0xf9,0xb6,0x49,0x11,0x8d,0x52,0xc0,0x17,0x4f,0xc4,0xe8,0xed,0xa7,0x12,0x00,0x62,0x20,0x8d,
+ 0x04,0x20,0xce,0x96,0x75,0xc8,0xf7,0x02,0xba,0xeb,0x55,0x10,0x86,0x40,0x24,0xff,0x68,0x71,0x67,0x06,0x56,0x1d,0x40,0xc1,0x66,0x44,0xd3,0xe2,0xb7,0xcf,0x86,0xd1,0xf6,0x28,0x20,0x8d,
+ 0x04,0x20,0xce,0x9a,0x94,0x2c,0xe9,0x5e,0xf7,0x87,0x50,0x93,0xec,0x42,0x32,0xb1,0xa2,0x00,0xdf,0x3f,0xcd,0xc7,0x98,0x9c,0xd5,0xcb,0x70,0x3b,0xeb,0x48,0x15,0x51,0x23,0xa6,0x20,0x8d,
+ 0x04,0x20,0xce,0x9a,0xe1,0x0f,0x87,0x04,0x27,0xae,0xfc,0x58,0x8f,0x8a,0x49,0x4d,0x03,0xf9,0x1a,0xe2,0x7f,0x50,0x7b,0x29,0xaf,0x8a,0x95,0xa9,0x1c,0xe6,0xf2,0x22,0x02,0xb8,0x20,0x8d,
+ 0x04,0x20,0xce,0xb0,0x9a,0xdc,0x35,0xdc,0x4a,0xf9,0x3b,0x82,0x4a,0xae,0x2e,0x23,0xfa,0x2f,0x7b,0x70,0xf4,0xa8,0x3c,0xce,0x21,0x86,0xa7,0xf0,0xdf,0xf3,0x1e,0xf9,0xd4,0x35,0x20,0x8d,
+ 0x04,0x20,0xce,0xf6,0x68,0xf8,0xad,0x46,0xf4,0xd5,0x1c,0xac,0x53,0xaa,0x20,0xd5,0xf4,0x57,0xe5,0xa0,0x4d,0xd0,0x28,0x69,0x91,0x9b,0x3a,0x4c,0xb2,0x7e,0xd0,0x1f,0xc8,0xe9,0x20,0x8d,
+ 0x04,0x20,0xce,0xfd,0xcd,0x7e,0x20,0x6c,0xd1,0x8e,0x21,0x4b,0x26,0x10,0x7b,0x16,0xc7,0xd1,0x81,0xb7,0xe2,0x10,0xcf,0xc6,0xe2,0x66,0x39,0x56,0x2b,0xdd,0x05,0x1b,0x63,0xc4,0x20,0x8d,
+ 0x04,0x20,0xce,0xc1,0x23,0x66,0x99,0x1d,0x4f,0x18,0x91,0x30,0x4b,0x54,0x6e,0xc0,0xa4,0xc3,0x64,0xfa,0x5b,0x39,0x8a,0xf7,0x28,0xfe,0x44,0x85,0xd7,0x65,0x20,0x8c,0x6c,0x5f,0x20,0x8d,
+ 0x04,0x20,0xce,0xce,0x39,0xbe,0xac,0x68,0x33,0xa4,0x66,0xad,0x5b,0x9f,0x96,0x14,0xc3,0x0e,0xa5,0x86,0xc9,0xcc,0xc9,0xb1,0xed,0x1f,0xf5,0x5d,0xeb,0x26,0xef,0x10,0x39,0xa8,0x20,0x8d,
+ 0x04,0x20,0xce,0xce,0x61,0x9d,0x3f,0xcd,0xe6,0x83,0xe8,0xca,0x4a,0xda,0x4b,0xf9,0xc2,0x14,0xf3,0x6d,0xcd,0xe3,0xf1,0x7a,0x47,0x06,0xd1,0x6c,0xe2,0x7b,0xcd,0x16,0xb7,0x94,0x20,0x8d,
+ 0x04,0x20,0xce,0xd2,0xbd,0x23,0x25,0xbd,0x8a,0xc8,0x34,0x21,0x88,0x05,0xb9,0xd2,0x53,0x6f,0x02,0xd3,0x61,0x89,0xd4,0xd0,0x0d,0x49,0xbf,0x6d,0x30,0x27,0x34,0x2c,0x4c,0x94,0x20,0x8d,
+ 0x04,0x20,0xce,0xd9,0xb0,0x7a,0xc8,0x47,0xb4,0x91,0x6f,0xe2,0xd1,0x6d,0xf3,0xd0,0x40,0xfb,0x29,0xc2,0x62,0xcd,0x94,0x90,0xd1,0xd4,0xed,0xd9,0xe2,0x7d,0xcf,0x98,0xe2,0xac,0x20,0x8d,
+ 0x04,0x20,0xce,0xdc,0x3d,0x6c,0xae,0x09,0xd5,0x5c,0x3e,0xe0,0x8b,0x49,0x0d,0x96,0x12,0x1c,0x95,0x24,0xcf,0x67,0x65,0x12,0xd5,0x81,0x16,0x0f,0xba,0x71,0xd8,0x1a,0x6f,0x6e,0x20,0x8d,
+ 0x04,0x20,0xcf,0x34,0xd7,0xf7,0x29,0x1e,0xe6,0x76,0x8f,0xbc,0x3f,0x5b,0xce,0xa0,0x38,0x6e,0x7b,0x50,0xec,0xab,0x09,0xb0,0xf9,0xf1,0x84,0xd0,0xb6,0x16,0xd5,0xb3,0x6f,0x23,0x20,0x8d,
+ 0x04,0x20,0xcf,0x07,0xf2,0xf0,0x75,0x85,0x27,0x9a,0xd6,0x0a,0x62,0x77,0xdc,0xb7,0x2f,0xc3,0xa3,0x17,0x40,0xdd,0xda,0x4e,0x12,0xcf,0x7c,0x36,0x15,0xa3,0xef,0x96,0xcb,0xa3,0x20,0x8d,
+ 0x04,0x20,0xcf,0x0d,0x58,0x61,0x8c,0x4f,0x52,0xc3,0x6c,0x6d,0x03,0xbe,0xad,0xd4,0x5a,0xe7,0x5f,0x92,0x3e,0x02,0x89,0x2b,0x9c,0x1f,0x92,0xed,0xdb,0xd2,0x88,0x5e,0x03,0xc9,0x20,0x8d,
+ 0x04,0x20,0xcf,0x18,0xc7,0x85,0x3f,0x60,0xf4,0xb4,0xa7,0x4d,0xc8,0x55,0xd0,0xfa,0x53,0x1c,0x5c,0xc7,0xea,0x57,0x3e,0x24,0x32,0x5d,0x10,0xf2,0x93,0x07,0xe8,0xce,0xd6,0x0a,0x20,0x8d,
+ 0x04,0x20,0xcf,0x1f,0x8a,0x8e,0x8f,0x12,0x09,0x48,0x4f,0x35,0x39,0xf9,0xf9,0x05,0x00,0x38,0xf0,0x43,0x55,0xe6,0x9d,0x8c,0x56,0x2e,0xa5,0x94,0x59,0xcc,0x27,0xc6,0xeb,0x27,0x20,0x8d,
+ 0x04,0x20,0xcf,0x20,0x6a,0x81,0x26,0x56,0xe7,0x1f,0x01,0xcc,0x47,0xf2,0xa7,0xa1,0x0b,0xbf,0x6e,0x1f,0x4e,0xa0,0xad,0x1f,0x5b,0x73,0x52,0x32,0x4b,0xb0,0x96,0x11,0x35,0x95,0x20,0x8d,
+ 0x04,0x20,0xcf,0x22,0x68,0xca,0x83,0xce,0xec,0x9b,0xfe,0x98,0x51,0xb4,0xa6,0x08,0x03,0xb2,0x2e,0xa5,0xa0,0x31,0xe8,0x78,0xae,0xb6,0x8b,0xb4,0x5f,0x71,0x25,0x40,0x95,0x3c,0x20,0x8d,
+ 0x04,0x20,0xcf,0x25,0xe3,0x74,0x30,0x1b,0x1d,0xce,0x76,0xb4,0xd2,0x3d,0x31,0x33,0xbc,0xca,0x70,0xf2,0x9d,0x7d,0xa5,0x9b,0x78,0x26,0x1f,0xf7,0x02,0x1a,0x74,0xfb,0xf9,0x94,0x20,0x8d,
+ 0x04,0x20,0xcf,0x33,0x1d,0xd7,0x5b,0xd4,0x41,0x84,0xe3,0xe4,0xe5,0xa9,0x7b,0x93,0x3a,0x0a,0xf3,0xe7,0xf8,0x0f,0xc5,0x79,0x27,0x52,0xe9,0xcc,0xe0,0xda,0xed,0x95,0x06,0x26,0x20,0x8d,
+ 0x04,0x20,0xcf,0x74,0x1b,0xfb,0xdd,0xfb,0x2a,0x0d,0xe1,0x33,0x8d,0x26,0x93,0xdd,0xc9,0x50,0x6c,0xc8,0xb1,0xa3,0x56,0xe3,0xb6,0xbe,0x77,0x17,0x6f,0x0c,0xed,0xa3,0xf6,0x8b,0x20,0x8d,
+ 0x04,0x20,0xcf,0x48,0x26,0x9f,0xe2,0x8b,0xcc,0xee,0xf1,0xa5,0x5a,0xfd,0x00,0xd9,0x7c,0xc0,0x6a,0x50,0xc3,0x68,0xc8,0x33,0x21,0xd3,0x6f,0x7f,0xb3,0x05,0x01,0x9c,0xfb,0x69,0x20,0x8d,
+ 0x04,0x20,0xcf,0x6b,0xed,0xa3,0xeb,0xa9,0xd4,0x51,0xc0,0x44,0xbe,0xd0,0xe2,0x37,0x1e,0xd1,0x97,0x73,0xbe,0x6e,0xb4,0xe2,0x57,0x17,0xbc,0x80,0x57,0xde,0x75,0x8b,0x11,0xd5,0x20,0x8d,
+ 0x04,0x20,0xcf,0xb4,0xa1,0x8c,0xb4,0x9f,0xf8,0xee,0xb5,0x38,0x21,0xd4,0x35,0xa7,0x82,0x00,0x3d,0x83,0x75,0xd1,0xcf,0x57,0x96,0x80,0x42,0x78,0x56,0xe8,0x43,0x52,0x42,0x2c,0x20,0x8d,
+ 0x04,0x20,0xcf,0xb5,0x1e,0xea,0x04,0x33,0x0d,0x5e,0x3a,0x78,0x33,0x82,0x91,0xca,0x81,0x17,0x92,0x52,0x80,0x88,0xd6,0xce,0x4f,0x37,0xbd,0xd8,0x14,0x2e,0x59,0xa5,0xec,0x71,0x20,0x8d,
+ 0x04,0x20,0xcf,0xb6,0x3f,0xfc,0xc3,0xf8,0x23,0x32,0x28,0xa4,0x03,0x15,0x0c,0x09,0xa8,0xfc,0xf3,0x15,0x54,0x22,0xef,0x0b,0x08,0xff,0x7b,0xa9,0x28,0xe0,0x42,0xfc,0xea,0x6c,0x20,0x8d,
+ 0x04,0x20,0xcf,0xb6,0x57,0xa2,0x79,0x1d,0xb6,0xe9,0xfb,0x56,0x9d,0xe6,0x86,0x8c,0xfd,0xde,0xf9,0x40,0x4f,0x3a,0x2a,0xee,0x6f,0x45,0xcd,0xc6,0x3c,0x9b,0x5f,0x59,0x9a,0x65,0x20,0x8d,
+ 0x04,0x20,0xcf,0xb9,0xa1,0xf3,0xa0,0x05,0x08,0x78,0xeb,0x02,0x65,0x78,0x4b,0x57,0xd9,0x55,0x92,0xba,0xac,0xf6,0x2f,0x6c,0xba,0x12,0x98,0xee,0x1a,0xfa,0x72,0x0c,0x29,0x45,0x20,0x8d,
+ 0x04,0x20,0xcf,0xba,0xb0,0xde,0x95,0x77,0x6f,0xbf,0x56,0x95,0xec,0x4d,0x63,0x61,0xcf,0x5c,0x13,0x9c,0x89,0x16,0xa8,0x75,0x63,0xd5,0xdb,0x9a,0xcc,0x7c,0x9d,0xfe,0xca,0x13,0x20,0x8d,
+ 0x04,0x20,0xcf,0x8d,0x1e,0x8b,0xb8,0x8b,0xfb,0x22,0x42,0x56,0xfe,0xc3,0xa7,0xa9,0xbb,0x47,0x01,0x01,0xf5,0x03,0x66,0x4c,0x81,0xa4,0x47,0x4a,0x59,0xf2,0xe8,0xe3,0x31,0x54,0x20,0x8d,
+ 0x04,0x20,0xcf,0x9b,0xb3,0xff,0xb4,0xea,0x94,0x3e,0xdd,0x50,0x2d,0x83,0x00,0x48,0x7a,0x89,0x15,0x70,0x32,0x5b,0x4a,0x1b,0x18,0xc0,0x09,0xfb,0xf7,0xb8,0x0e,0xf0,0xf9,0x46,0x20,0x8d,
+ 0x04,0x20,0xcf,0x9b,0xd5,0x2b,0x00,0x0a,0xf4,0x7a,0x42,0x62,0x7e,0xf7,0xa6,0xfa,0xe1,0x77,0xd4,0xf4,0x2c,0x56,0xe0,0x7d,0xc3,0x3a,0xb9,0x9d,0xb7,0x2b,0x4f,0x34,0x59,0xa7,0x20,0x8d,
+ 0x04,0x20,0xcf,0x9b,0x0f,0x2d,0x4c,0x4b,0xb0,0x93,0xc1,0xfd,0x4e,0xe6,0x6d,0x18,0x49,0x87,0x09,0xb3,0x98,0x74,0x77,0xf9,0x46,0xb2,0x6c,0x6e,0x02,0x3f,0x83,0xff,0xf9,0xdf,0x20,0x8d,
+ 0x04,0x20,0xcf,0x9b,0x4a,0xdd,0xa9,0x40,0x89,0x5d,0xd7,0x9f,0x77,0x2b,0x74,0xd8,0x0a,0x2e,0x7c,0x6d,0xa6,0xb8,0x76,0xd7,0xc8,0x8e,0x5d,0x84,0x0a,0x97,0xce,0x08,0x27,0x62,0x20,0x8d,
+ 0x04,0x20,0xcf,0x9c,0xa4,0xdd,0x82,0x5d,0x85,0xde,0xbc,0x36,0x43,0xa1,0x7e,0xdb,0x14,0x07,0xe2,0x97,0x04,0x4c,0x0c,0xe6,0xf9,0x93,0xba,0xec,0xd7,0x3d,0x18,0x97,0x48,0x93,0x20,0x8d,
+ 0x04,0x20,0xcf,0xa0,0xc2,0xef,0x4c,0x58,0xff,0x48,0x25,0x97,0xf1,0xe2,0xe8,0x35,0x48,0x21,0x23,0x29,0xbf,0x75,0x59,0x37,0x4d,0x8d,0xde,0x70,0xee,0x83,0x6e,0x81,0x65,0x7b,0x20,0x8d,
+ 0x04,0x20,0xcf,0xa5,0xe9,0xf8,0x28,0xe2,0xd6,0xfa,0x38,0x7e,0x8b,0x40,0xa1,0x6f,0x9c,0xb3,0x76,0x7f,0x11,0x2f,0x29,0x13,0x78,0xa9,0x2e,0x3a,0x53,0x8d,0x73,0xd2,0x3d,0x8a,0x20,0x8d,
+ 0x04,0x20,0xcf,0xa4,0xe0,0x76,0x4f,0x53,0x51,0xdc,0x93,0xcf,0xd5,0xcd,0xe5,0xb4,0x87,0xa6,0xc7,0xf3,0xb6,0x0d,0xe8,0xc6,0x8c,0x6f,0x89,0x99,0x07,0x62,0x18,0xbc,0x96,0x20,0x20,0x8d,
+ 0x04,0x20,0xcf,0xa7,0xe2,0xde,0xc7,0x33,0x47,0x54,0x6f,0xd5,0x88,0x3c,0x3e,0x8e,0x80,0x8e,0x2f,0xa6,0x7f,0xb5,0xf0,0x3b,0x87,0x67,0x62,0x82,0x56,0x9e,0xed,0x4e,0xe5,0x99,0x20,0x8d,
+ 0x04,0x20,0xcf,0xa6,0xc0,0x16,0xb0,0xb1,0x75,0x21,0xf2,0x22,0x3b,0x40,0x53,0x72,0x91,0x15,0x0d,0xcb,0xbd,0x58,0x5d,0x97,0x2d,0x3a,0xd1,0xa6,0x10,0x50,0x0e,0x80,0x23,0x49,0x20,0x8d,
+ 0x04,0x20,0xcf,0xa9,0xc9,0x6e,0x99,0xf0,0x6e,0xa2,0x6e,0x78,0x40,0x70,0x21,0x04,0xdf,0xa0,0x2f,0x3e,0x08,0x3c,0x1d,0x08,0x3d,0x8a,0x9b,0x78,0x53,0x6f,0x16,0x30,0x17,0x5a,0x20,0x8d,
+ 0x04,0x20,0xcf,0xf5,0x11,0xec,0x11,0x50,0x23,0x1f,0x10,0x87,0xa0,0x8d,0xf8,0xc5,0x49,0x65,0x60,0xdc,0x8c,0x29,0x63,0xde,0x55,0x7f,0x22,0xae,0x47,0xf4,0xc2,0x35,0x44,0x8b,0x20,0x8d,
+ 0x04,0x20,0xcf,0xf9,0xdb,0x28,0x4b,0x5f,0xea,0xa5,0x46,0xff,0xc8,0x18,0x80,0xd4,0x38,0x82,0x66,0x27,0xef,0x1f,0xb0,0xf3,0xd5,0x0f,0x7b,0x32,0x13,0x72,0xe7,0xbc,0x15,0xf2,0x20,0x8d,
+ 0x04,0x20,0xcf,0xc8,0x1d,0x5d,0x48,0x41,0x92,0x32,0x83,0x1c,0x11,0xf8,0xfa,0x04,0x90,0xb8,0x74,0x9b,0x63,0x23,0x0f,0x4a,0xee,0xba,0xca,0x0c,0xc9,0x83,0x90,0xa4,0x57,0xfd,0x20,0x8d,
+ 0x04,0x20,0xcf,0xcb,0xf5,0xc6,0xb4,0x7f,0xb7,0xab,0x28,0x39,0x43,0x6a,0x15,0x63,0x11,0x3b,0x0d,0x40,0x17,0x85,0xcc,0xfd,0x95,0x91,0x18,0x6a,0xb5,0x5a,0x56,0xc3,0xb4,0xfd,0x20,0x8d,
+ 0x04,0x20,0xcf,0xcd,0xb9,0xdf,0x6d,0xa0,0x98,0x3e,0xbb,0x35,0x97,0xec,0x68,0x71,0x1a,0x8a,0x11,0x42,0xdd,0x74,0x9d,0x75,0x49,0x3a,0xd1,0xdb,0xf8,0xb4,0x5c,0xa1,0xbf,0x78,0x20,0x8d,
+ 0x04,0x20,0xcf,0xcd,0xc4,0x11,0x4d,0xda,0x3e,0xd5,0xa1,0x0e,0xb2,0xe7,0xb2,0x2b,0xee,0xf5,0xd6,0x74,0x76,0x75,0xd1,0xdc,0x5c,0x08,0x02,0x4c,0x14,0xf2,0x39,0x09,0x31,0xd8,0x20,0x8d,
+ 0x04,0x20,0xcf,0xd3,0xa5,0x88,0xa9,0xe8,0x76,0x89,0x43,0x2d,0x90,0x79,0xc4,0x55,0x1e,0xf2,0xec,0xc4,0x0c,0x45,0x93,0xd9,0x51,0xc5,0x87,0x09,0x69,0x8a,0x07,0x47,0xdd,0x82,0x20,0x8d,
+ 0x04,0x20,0xcf,0xd2,0x10,0xd9,0x58,0xc8,0x3c,0x4d,0xfd,0x10,0x74,0xbd,0x4f,0xad,0xbb,0x69,0x06,0xe6,0x75,0x1b,0x18,0x9a,0xeb,0x0e,0x42,0x8f,0xec,0x54,0xea,0xf8,0x34,0x49,0x20,0x8d,
+ 0x04,0x20,0xcf,0xd3,0x37,0x80,0xc7,0x67,0x1a,0x0e,0xbd,0xdd,0x7e,0xbe,0x5b,0x04,0x67,0xd0,0x21,0xbc,0xf2,0x2a,0x7d,0x8e,0x7c,0x91,0x8b,0x89,0xe4,0xe2,0x16,0x34,0xd6,0x7a,0x20,0x8d,
+ 0x04,0x20,0xcf,0xd9,0xf8,0xb3,0x27,0x72,0xfd,0x2b,0x41,0xaa,0xf2,0xf9,0x20,0x0e,0x29,0x35,0xec,0xd3,0x1a,0x7d,0xcd,0x8c,0xfd,0x26,0xfe,0x98,0x06,0x20,0x7f,0x8e,0xeb,0xe9,0x20,0x8d,
+ 0x04,0x20,0xcf,0xd8,0x2a,0x20,0xfd,0xad,0xbb,0x07,0x07,0xce,0xec,0x0d,0xaf,0xa4,0xee,0xcd,0x05,0x97,0xc2,0xfd,0x5b,0x32,0xbd,0x18,0xe5,0xbc,0x41,0xdd,0xcd,0xd5,0xd1,0xfb,0x20,0x8d,
+ 0x04,0x20,0xcf,0xe3,0x76,0x45,0x95,0x9c,0x82,0x68,0xc6,0xd6,0x3f,0x15,0xbf,0x85,0xea,0x57,0x87,0x3a,0x6c,0x10,0xf9,0x7a,0x3e,0x73,0x58,0x97,0xfa,0xd2,0x3f,0x1e,0x8e,0xa1,0x20,0x8d,
+ 0x04,0x20,0xcf,0xe9,0xbd,0x79,0x0e,0xb1,0x56,0xda,0xfa,0x75,0xc7,0xa8,0x8b,0x59,0x54,0x95,0xf9,0x50,0x4f,0xa6,0x18,0x2f,0x60,0x30,0x4f,0xf2,0x47,0xab,0x13,0x7d,0x41,0xfd,0x20,0x8d,
+ 0x04,0x20,0xc8,0x3c,0xad,0x53,0x53,0xd6,0x9c,0x71,0xc5,0xf0,0x0a,0x22,0x93,0xaf,0xfd,0x20,0x07,0x71,0x26,0xad,0x81,0x54,0xbe,0x07,0x24,0xc1,0x82,0xd5,0xa2,0x12,0x17,0x3a,0x20,0x8d,
+ 0x04,0x20,0xc8,0x03,0x7f,0xc8,0xe8,0xc8,0xca,0x23,0xc4,0xb3,0x3c,0x92,0x2a,0x63,0x0f,0x86,0x39,0xfd,0xb5,0x1a,0xd9,0x02,0x8e,0x00,0x83,0x75,0xb8,0x13,0x74,0x5c,0x9a,0xf8,0x20,0x8d,
+ 0x04,0x20,0xc8,0x05,0xe8,0x1c,0x30,0x08,0x7b,0x87,0x72,0x35,0x14,0x98,0x14,0x2d,0xfb,0xdb,0x86,0xac,0x96,0xd1,0x2c,0xec,0xc0,0x73,0x0e,0xe9,0xdd,0x1e,0x06,0x29,0xe0,0xf6,0x20,0x8d,
+ 0x04,0x20,0xc8,0x07,0xd1,0xab,0x0a,0x53,0x88,0xba,0x76,0x63,0x4f,0xd7,0xf6,0x47,0x5c,0x78,0xcb,0xe2,0x3a,0x5c,0x77,0xc4,0x19,0x75,0xb5,0xbf,0x82,0x23,0x77,0x9c,0xd9,0x21,0x20,0x8d,
+ 0x04,0x20,0xc8,0x0a,0x30,0x15,0x83,0xd1,0xfd,0x42,0x69,0xec,0xa2,0x75,0xd1,0x1c,0xec,0x54,0x00,0x3d,0xa4,0x62,0xbd,0xa6,0x02,0x4a,0x5a,0x73,0xee,0xa8,0xc5,0xce,0x7d,0x87,0x20,0x8d,
+ 0x04,0x20,0xc8,0x0c,0xa3,0x80,0xc3,0xcd,0x54,0x67,0xd1,0xdd,0xcb,0x4a,0xba,0xdc,0x50,0xb8,0x17,0xd9,0xd8,0x86,0xdd,0x64,0x07,0x01,0xcd,0x95,0x64,0xbf,0xc7,0xee,0x89,0xd7,0x20,0x8d,
+ 0x04,0x20,0xc8,0x0f,0x1a,0xa1,0xb4,0x15,0x2e,0xfb,0xd3,0xbe,0x3f,0x9a,0xa4,0x22,0xdf,0x15,0x69,0x3b,0xc6,0x80,0xf7,0x57,0xc4,0xe1,0xb5,0xb2,0xb3,0x3d,0x07,0x2c,0x25,0x2a,0x20,0x8d,
+ 0x04,0x20,0xc8,0x17,0x13,0xda,0x89,0xea,0x79,0xf9,0xb6,0x65,0x2a,0xff,0xfb,0xc4,0x64,0x3e,0x4b,0x68,0x7c,0x5f,0x1d,0x0e,0x08,0x71,0x36,0x6c,0x3b,0x51,0xcc,0x73,0x02,0x6c,0x20,0x8d,
+ 0x04,0x20,0xc8,0x2d,0xf3,0x35,0x78,0x24,0x22,0xb7,0x98,0x4c,0x93,0xf6,0x4f,0x6c,0x0d,0xa9,0x28,0x39,0x08,0xe7,0x41,0x40,0x02,0x66,0x9b,0xb1,0x03,0xbc,0xf9,0xe9,0x48,0xe7,0x20,0x8d,
+ 0x04,0x20,0xc8,0x30,0x5a,0x61,0x9e,0x4e,0xfa,0xcb,0xbe,0x23,0x93,0x35,0x7f,0xbe,0xb6,0x96,0xab,0x80,0x39,0x0d,0x93,0x98,0x30,0x9a,0x30,0x09,0x35,0xa8,0x88,0x5f,0xfa,0x7e,0x20,0x8d,
+ 0x04,0x20,0xc8,0x75,0xaf,0x49,0x5b,0x22,0xd3,0x71,0x08,0x12,0xb1,0x4c,0xea,0x53,0xcc,0x44,0xe9,0xcd,0xc8,0xba,0x18,0x1b,0xc2,0x93,0x06,0x8c,0x1a,0xba,0xc5,0xd3,0xf6,0x7d,0x20,0x8d,
+ 0x04,0x20,0xc8,0x75,0x04,0x5f,0x2c,0x91,0x26,0x77,0x58,0x7e,0x2c,0x1b,0x64,0x2a,0xaf,0xde,0x08,0x42,0x3b,0x79,0xa9,0xcc,0x96,0x43,0x58,0x0e,0xbf,0x32,0xc9,0x72,0x11,0x94,0x20,0x8d,
+ 0x04,0x20,0xc8,0x7d,0xaa,0x71,0xdd,0x86,0x65,0x3f,0xc7,0x29,0x04,0x3d,0x30,0x14,0xd9,0x76,0x02,0x8d,0x34,0x4e,0x30,0x92,0xfd,0xc8,0xbf,0xc8,0x66,0xef,0x87,0x57,0x62,0x05,0x20,0x8d,
+ 0x04,0x20,0xc8,0x44,0x8d,0x0b,0x4f,0x52,0xa9,0xf3,0xd8,0xde,0xe1,0x15,0xcc,0xf0,0x41,0xc3,0x7c,0xee,0x85,0xb9,0x7e,0x71,0x14,0x42,0xc9,0x12,0xb2,0x69,0x6f,0x97,0x65,0x3d,0x20,0x8d,
+ 0x04,0x20,0xc8,0x58,0x74,0x3a,0x30,0x5a,0xc6,0x45,0x99,0xa8,0xc1,0xec,0xe3,0x4a,0xcf,0xac,0x56,0x21,0xa6,0x17,0xb8,0x8a,0xcf,0x56,0x8b,0x23,0x62,0xfb,0x20,0x03,0xad,0x77,0x20,0x8d,
+ 0x04,0x20,0xc8,0x5a,0xea,0xd3,0xde,0x42,0x84,0x40,0x38,0x79,0x8a,0x9f,0x6b,0x5b,0x95,0x73,0xfc,0x8b,0x56,0x64,0x08,0x49,0x96,0xb4,0xce,0xd3,0x26,0x95,0x21,0x56,0x53,0x61,0x20,0x8d,
+ 0x04,0x20,0xc8,0x6c,0x18,0x5f,0x13,0x41,0xd5,0x5a,0x3c,0x5d,0xc9,0xc9,0x97,0x1f,0xee,0x40,0x4a,0x1f,0x85,0xcf,0x28,0xad,0xec,0x72,0x01,0x39,0xf4,0xaa,0x19,0xb2,0xb7,0xb3,0x20,0x8d,
+ 0x04,0x20,0xc8,0x6c,0xf3,0x53,0x99,0xd2,0xcb,0x49,0xbb,0xbe,0xf5,0x7c,0x3a,0x67,0x50,0xb7,0x54,0xac,0x55,0xd1,0xdf,0xe2,0xf4,0x1d,0x5a,0xe7,0x02,0x54,0xe6,0x08,0xa3,0x8e,0x20,0x8d,
+ 0x04,0x20,0xc8,0xb4,0x2e,0xf9,0x5f,0x38,0x87,0x4b,0xf6,0xd1,0x5b,0xd1,0x78,0xdf,0xcb,0x2d,0x27,0x85,0x94,0x0c,0x8f,0xbf,0xe9,0xd3,0x4d,0x8f,0x73,0xaa,0x97,0xa6,0xb3,0xb1,0x20,0x8d,
+ 0x04,0x20,0xc8,0xb8,0xbe,0x75,0x37,0xdc,0xee,0xb0,0x1b,0xe7,0x1d,0x1d,0x5e,0x4a,0x9d,0x52,0xfd,0xbd,0xcb,0x0a,0x05,0xbe,0x6a,0x21,0xc4,0x49,0xba,0xf8,0x6a,0x18,0xa1,0x24,0x20,0x8d,
+ 0x04,0x20,0xc8,0x85,0xcb,0x48,0x04,0x6b,0x46,0xac,0xc0,0x6f,0xe5,0xe4,0x5c,0xb7,0xc8,0x5c,0x86,0x7b,0x65,0xf0,0x44,0xad,0x46,0x0c,0x5a,0xd0,0xeb,0xd2,0x24,0x89,0x20,0xb6,0x20,0x8d,
+ 0x04,0x20,0xc8,0x87,0x5f,0xe7,0x75,0x24,0xe2,0xf2,0x3b,0xf2,0x75,0x30,0x82,0x7e,0x9b,0xae,0x31,0xeb,0x73,0x62,0xa0,0x29,0x30,0x38,0xcb,0x19,0xe5,0xc6,0xe8,0xa8,0x9e,0x27,0x20,0x8d,
+ 0x04,0x20,0xc8,0x89,0x94,0x14,0x1f,0x63,0x0d,0x5e,0x55,0xd4,0x5f,0x12,0x5e,0x58,0x30,0x64,0x75,0xc1,0xa4,0xd1,0x92,0xad,0x2c,0xaa,0x6a,0x9f,0x4e,0x83,0xe2,0xc1,0x5a,0xe6,0x20,0x8d,
+ 0x04,0x20,0xc8,0x90,0x5d,0x79,0x1c,0xc6,0x5f,0xdd,0xab,0x74,0x20,0xe5,0x6c,0x46,0x0a,0x1b,0x24,0xc5,0x15,0x6f,0x60,0x96,0xc0,0x48,0x6e,0xf1,0xc1,0x3e,0xfd,0xf0,0x4b,0xd9,0x20,0x8d,
+ 0x04,0x20,0xc8,0x9a,0xbe,0xd5,0xc9,0x17,0x41,0x42,0xe0,0x6c,0x94,0xab,0xcc,0x5c,0x8e,0x9e,0x49,0x07,0xd7,0x0e,0xbe,0x00,0x4e,0x29,0x8e,0x92,0xa7,0x8f,0xfd,0x3c,0x1d,0xf8,0x20,0x8d,
+ 0x04,0x20,0xc8,0xa6,0xdb,0x57,0xab,0x6e,0xf0,0xa9,0x8b,0x10,0x90,0x4c,0x82,0x6e,0x02,0x21,0x37,0xbb,0xf3,0x81,0xec,0x28,0x74,0x8e,0x1c,0xcd,0x92,0xf8,0xaf,0xfd,0x8e,0xe4,0x20,0x8d,
+ 0x04,0x20,0xc8,0xa8,0x68,0xc8,0xb8,0xb8,0x77,0x8e,0xd0,0x41,0x1b,0x46,0x82,0xd6,0x7d,0x42,0xdf,0xcf,0x83,0x5a,0xde,0xe5,0x5e,0x6a,0x38,0x2e,0x85,0x5c,0xb9,0xa2,0x89,0x9d,0x20,0x8d,
+ 0x04,0x20,0xc8,0xad,0xeb,0xab,0x81,0x2b,0x57,0xcf,0x16,0xfb,0x62,0xa2,0xc5,0xb5,0x4d,0x0d,0x9a,0xf9,0x4a,0xf2,0x7f,0xce,0xb5,0xad,0x3b,0xe1,0x47,0x15,0x52,0x79,0x9c,0xbd,0x20,0x8d,
+ 0x04,0x20,0xc8,0xb1,0x46,0x21,0xf4,0x02,0x1d,0x36,0x74,0xa7,0x29,0x58,0x74,0x4f,0x60,0x4e,0x62,0x68,0x20,0xe7,0x40,0x4f,0xfd,0xae,0xa9,0x77,0x4e,0x39,0xf0,0x08,0x9d,0x28,0x20,0x8d,
+ 0x04,0x20,0xc8,0xf4,0xc3,0x22,0x44,0x9c,0xb5,0xb4,0x71,0x92,0x5d,0xd2,0xbf,0xf4,0xb1,0x74,0x13,0x83,0x4e,0x84,0xe2,0xda,0xe8,0x77,0xd0,0x56,0xdc,0x71,0xf2,0x02,0xbb,0xdc,0x20,0x8d,
+ 0x04,0x20,0xc8,0xf6,0x5b,0xb7,0xed,0xb2,0xd3,0xff,0x43,0x09,0x91,0x28,0x16,0x71,0xda,0x34,0xbf,0xb4,0xd7,0x46,0xd6,0x9f,0x7f,0x4f,0x5c,0xcf,0xdf,0xd7,0x11,0xc6,0x81,0x36,0x20,0x8d,
+ 0x04,0x20,0xc8,0xfe,0x88,0xe2,0x53,0x06,0xed,0x34,0x70,0x85,0x0a,0x61,0xb1,0xa3,0x49,0x2d,0x75,0xbf,0xb4,0xf6,0x74,0xe8,0xf4,0xee,0x33,0xa1,0x6b,0x50,0x57,0x84,0xed,0x19,0x20,0x8d,
+ 0x04,0x20,0xc8,0xff,0x48,0x7f,0xa3,0x58,0xa4,0x48,0x77,0x9e,0x5b,0x03,0x0c,0x30,0xfb,0xf8,0x9a,0x86,0xb9,0x40,0x4d,0x94,0x8b,0xbe,0xb4,0x7a,0x16,0xb0,0xfc,0xa6,0x7c,0x0c,0x20,0x8d,
+ 0x04,0x20,0xc8,0xd1,0xcf,0x03,0x34,0x4d,0xc4,0x98,0x03,0x56,0x6d,0x46,0x41,0x2c,0x7b,0x08,0xd4,0xf9,0x74,0x91,0x0b,0x86,0x2a,0xdb,0x4c,0x6f,0x35,0xc3,0x2b,0x41,0xc7,0x59,0x20,0x8d,
+ 0x04,0x20,0xc8,0xd9,0xdc,0xdd,0xd3,0xb0,0xe4,0xc0,0x6d,0x35,0x42,0x76,0x96,0x2d,0x44,0xed,0x98,0x15,0xdb,0x1f,0x80,0x34,0xa4,0x28,0xa2,0x9a,0xf2,0xb9,0x92,0xf7,0xf2,0xf7,0x20,0x8d,
+ 0x04,0x20,0xc8,0xdb,0xae,0x47,0x68,0x75,0x43,0x72,0xa9,0xfd,0x85,0xfa,0xd3,0x7e,0x28,0x0b,0x78,0x28,0x33,0x95,0xe9,0x23,0x2e,0x39,0x6d,0x0e,0x68,0x6c,0x3f,0x46,0x09,0xc7,0x20,0x8d,
+ 0x04,0x20,0xc8,0xdd,0x51,0xb4,0x8a,0x27,0xdd,0x79,0xdc,0x6d,0x21,0x3e,0x5e,0x6e,0xa2,0xa7,0x58,0x9c,0xb8,0x1d,0x67,0x02,0x4b,0xbe,0xe6,0xab,0x9e,0x0e,0xa8,0x17,0xc4,0x45,0x20,0x8d,
+ 0x04,0x20,0xc8,0xdd,0x5c,0x78,0xc2,0x4f,0x9b,0x16,0x5c,0x18,0x33,0x53,0x02,0xef,0x0c,0xe9,0xc2,0x3d,0xcb,0xe7,0xda,0x23,0x96,0xc8,0x31,0x4b,0x0c,0x3c,0x58,0x7a,0x8a,0x93,0x20,0x8d,
+ 0x04,0x20,0xc8,0xdd,0x84,0xa9,0x75,0xef,0xfd,0x4d,0xdb,0x8f,0x05,0xf0,0x90,0xf1,0x2c,0x19,0xef,0xa4,0x0f,0xf7,0x74,0x14,0x3f,0xe5,0xbb,0x94,0x9e,0xe1,0x82,0x4c,0x60,0x32,0x20,0x8d,
+ 0x04,0x20,0xc8,0xe0,0xe6,0xfe,0x9d,0x71,0x50,0xde,0x9b,0x1c,0x88,0x98,0xa4,0x5c,0x5f,0xa7,0x35,0x7c,0x3e,0xca,0x5b,0x67,0x61,0x11,0xc7,0x79,0x15,0x34,0x49,0xca,0x92,0xa2,0x20,0x8d,
+ 0x04,0x20,0xc8,0xe1,0x72,0xe6,0x17,0x08,0x01,0xee,0xf1,0xb2,0x69,0x9a,0x08,0x0f,0x3b,0x49,0x64,0x52,0x6a,0x9c,0x3d,0xe5,0xcd,0x09,0xd5,0x08,0xa7,0xa1,0xba,0x9f,0xcf,0xd2,0x20,0x8d,
+ 0x04,0x20,0xc8,0xe6,0x23,0xa0,0xb2,0xe9,0xa0,0xb1,0xa1,0x31,0xfd,0x72,0x23,0x42,0x00,0x2c,0xd6,0x2c,0x0c,0xe0,0x9b,0x3b,0xf7,0x58,0x76,0xcc,0x4d,0x41,0xb6,0x5d,0xab,0xc6,0x20,0x8d,
+ 0x04,0x20,0xc8,0xf2,0xa1,0x45,0xae,0x14,0xe0,0x76,0xeb,0xc7,0x48,0x5a,0x67,0x89,0x7d,0xe3,0x59,0x57,0x64,0x2e,0x19,0x78,0x6b,0x17,0xe0,0x69,0x6e,0x98,0xd8,0xe9,0xb9,0xa9,0x20,0x8d,
+ 0x04,0x20,0xc9,0x13,0xf6,0x23,0x29,0x58,0x75,0xe8,0x10,0x4f,0x7e,0x6a,0x6c,0x4a,0xc4,0x8d,0x67,0xf7,0x57,0xc5,0xe5,0xfc,0x5b,0x45,0xd3,0xfb,0x83,0x50,0x07,0x5b,0xbc,0xab,0x20,0x8d,
+ 0x04,0x20,0xc9,0x13,0x80,0x4e,0xd8,0x03,0xe7,0x5a,0xd0,0x2f,0xf0,0x75,0xa1,0x3d,0xd6,0xd8,0x1b,0xcf,0x86,0x51,0xa9,0x3d,0xb5,0xfa,0x24,0x8a,0x96,0x36,0x52,0xd6,0x0e,0xfe,0x20,0x8d,
+ 0x04,0x20,0xc9,0x1f,0x01,0x8e,0xdc,0xc8,0x21,0x00,0x59,0x57,0xf8,0x20,0x4c,0xbe,0x16,0xc2,0xae,0xcb,0xdc,0x87,0xd3,0x9e,0xd5,0xee,0xed,0x86,0x91,0xe7,0xa0,0x19,0x15,0x70,0x20,0x8d,
+ 0x04,0x20,0xc9,0x24,0xed,0x0c,0x32,0x53,0xf6,0x2a,0x45,0xaf,0x35,0x0d,0xd6,0x27,0x15,0x3c,0xbe,0x8f,0x44,0x91,0x76,0xf2,0x18,0x3b,0xad,0xee,0xf9,0x61,0x0a,0x53,0x13,0x95,0x20,0x8d,
+ 0x04,0x20,0xc9,0x2e,0xd5,0x99,0xa5,0xba,0xc7,0x8b,0xf9,0x64,0x44,0x2b,0x83,0xd1,0x0c,0x89,0x6f,0x96,0xa4,0xa9,0x72,0x9d,0xa2,0x2b,0xd1,0x1c,0xe9,0xc1,0xd6,0xca,0xae,0x66,0x20,0x8d,
+ 0x04,0x20,0xc9,0x78,0x26,0x7c,0x26,0xaf,0x20,0xe5,0xac,0x49,0x12,0x7e,0xa7,0xdf,0x90,0x8c,0xe1,0x91,0x48,0x1b,0x87,0xe4,0x39,0x69,0x22,0xdb,0x2f,0x4e,0x74,0xd5,0x06,0x57,0x20,0x8d,
+ 0x04,0x20,0xc9,0x78,0xae,0x10,0xa3,0x78,0xad,0x22,0xe1,0xc1,0xcf,0x39,0xc1,0x98,0x65,0x6c,0x81,0xe9,0x8c,0x23,0xf0,0x1d,0x1f,0xbf,0x52,0xf3,0x1f,0x47,0x2f,0x6b,0x00,0xe5,0x20,0x8d,
+ 0x04,0x20,0xc9,0x7c,0xdb,0x2e,0x31,0x98,0xfd,0x0f,0xee,0x55,0x12,0x18,0x62,0xbf,0xbc,0x7a,0x1a,0xde,0x78,0xe1,0x14,0x51,0x06,0xc2,0x12,0x44,0xf3,0xb2,0x85,0x01,0xcb,0x14,0x20,0x8d,
+ 0x04,0x20,0xc9,0x7d,0x30,0xb0,0xe2,0x3b,0x32,0xee,0x79,0x6c,0x3d,0xfd,0x5a,0x6e,0x4c,0x4a,0x77,0x8e,0x1d,0x29,0x8d,0x78,0xb6,0xd9,0xe0,0xdd,0x21,0xf0,0xd6,0x69,0x15,0x80,0x20,0x8d,
+ 0x04,0x20,0xc9,0x4f,0x7e,0xb4,0x91,0x82,0x89,0x16,0x6d,0x25,0x74,0x39,0xff,0x6e,0xab,0x60,0x31,0xc7,0xa0,0xa8,0x9f,0x41,0xe0,0x79,0x33,0x12,0x6e,0xfa,0x7e,0x7c,0x30,0x16,0x20,0x8d,
+ 0x04,0x20,0xc9,0x5d,0xfd,0x54,0x1b,0x8b,0x50,0xeb,0x84,0xe7,0xe2,0xa9,0x33,0xf0,0x8f,0x85,0xa1,0x0a,0x13,0xfc,0x01,0x0e,0xb7,0x36,0xa3,0x26,0xe2,0x4f,0x32,0xa7,0xcf,0x29,0x20,0x8d,
+ 0x04,0x20,0xc9,0x5c,0xc4,0x02,0x5b,0xa2,0x7f,0x6f,0x48,0x08,0xdc,0xf1,0xb1,0x3a,0xe7,0x68,0x7d,0x57,0x2c,0x74,0x18,0x49,0x85,0x8c,0xd8,0x20,0xef,0x07,0x79,0x45,0x17,0xe2,0x20,0x8d,
+ 0x04,0x20,0xc9,0xb5,0x89,0x2d,0x56,0x00,0x4d,0x41,0x29,0x50,0x03,0x71,0x7b,0x05,0xa2,0x8c,0xdd,0x91,0x68,0xa9,0x45,0x65,0x82,0x4a,0x22,0x1e,0xbf,0x7b,0xa9,0xd6,0x50,0x45,0x20,0x8d,
+ 0x04,0x20,0xc9,0xbe,0xe0,0xdc,0xe1,0xe0,0xb8,0x9d,0x8c,0xd9,0x37,0x3f,0x92,0x94,0x24,0x98,0x97,0x5d,0x49,0xdc,0x2b,0xb1,0x49,0x8e,0xe8,0xc9,0x5a,0x41,0x9c,0x6a,0x3a,0x72,0x20,0x8d,
+ 0x04,0x20,0xc9,0x81,0x40,0x85,0x9c,0x3f,0xe0,0x25,0x4f,0x8f,0x34,0xdf,0xdc,0x82,0xd1,0x11,0x7c,0x00,0x64,0x38,0xd6,0x55,0xf0,0x11,0xdd,0xbc,0xa0,0xf3,0x5a,0x42,0xd6,0x22,0x20,0x8d,
+ 0x04,0x20,0xc9,0x88,0x67,0xdc,0x31,0xfe,0x77,0xc3,0x51,0xe4,0x6a,0x03,0xc9,0xd2,0xd8,0xb6,0x15,0xc6,0xac,0x95,0x77,0x46,0xa2,0x9b,0x69,0x9f,0x85,0xa4,0xdb,0x5b,0x59,0x1b,0x20,0x8d,
+ 0x04,0x20,0xc9,0x93,0x19,0xbb,0x7a,0x32,0x00,0xdc,0x3f,0xc8,0xe1,0x85,0xfd,0xb5,0x68,0x5b,0x86,0x88,0x61,0xda,0x97,0x46,0xa8,0xf4,0x95,0xfe,0xf1,0x0e,0x42,0xa2,0x4d,0xd5,0x20,0x8d,
+ 0x04,0x20,0xc9,0x9f,0xb2,0xec,0x6c,0xb0,0x5b,0x1f,0xeb,0xbf,0x8b,0xa9,0x75,0x18,0x63,0x42,0x63,0xbe,0x28,0x8e,0x0e,0x63,0x35,0x74,0xca,0x66,0x86,0x62,0x86,0xda,0x0e,0x16,0x20,0x8d,
+ 0x04,0x20,0xc9,0xa2,0xf9,0x1c,0x63,0x22,0x12,0xc1,0xbf,0x7c,0xb9,0x71,0x6d,0x2b,0x3a,0xd2,0xc1,0xc4,0xdc,0xd6,0x11,0x39,0xa7,0xd1,0xe9,0x7e,0xc2,0xef,0x5e,0x62,0x3c,0x9d,0x20,0x8d,
+ 0x04,0x20,0xc9,0xaa,0xa5,0xb5,0xb9,0xd0,0x2b,0x01,0x37,0x08,0x29,0x6d,0xf9,0xfa,0x8c,0x0e,0xd1,0x2e,0x4c,0xb3,0x3b,0x55,0x90,0x9d,0xb8,0x2c,0x7f,0xe9,0x26,0x76,0xa7,0x69,0x20,0x8d,
+ 0x04,0x20,0xc9,0xac,0x25,0x94,0x28,0xd7,0x65,0xc9,0x83,0xa7,0x2a,0x2d,0x85,0x85,0xc4,0x44,0xe6,0x8f,0x72,0xf9,0x70,0x1b,0xd0,0x12,0xd4,0x82,0x18,0xfe,0xa7,0xbd,0x6e,0x09,0x20,0x8d,
+ 0x04,0x20,0xc9,0xae,0x6e,0x0f,0x89,0x41,0x68,0x83,0x99,0xd9,0x80,0x57,0x19,0xed,0x49,0x54,0x4f,0xdc,0x9c,0x31,0xe5,0x30,0x8a,0xce,0x39,0x2e,0x94,0x76,0x86,0x61,0x27,0x33,0x20,0x8d,
+ 0x04,0x20,0xc9,0xc0,0x1b,0xb9,0x61,0x24,0x62,0xa9,0xb4,0xc0,0xd1,0x11,0x7a,0x9c,0x9e,0xab,0x00,0xeb,0xba,0x91,0xda,0xa6,0x3f,0x24,0xc9,0x86,0xc8,0xcc,0xa8,0xd3,0x3c,0x98,0x20,0x8d,
+ 0x04,0x20,0xc9,0xc0,0xf6,0xbe,0xef,0x56,0xd6,0xc8,0x96,0x4c,0x3a,0xe9,0x89,0xce,0x6e,0x19,0x1d,0x26,0x20,0x9f,0xc0,0x03,0x8b,0x03,0x60,0x05,0xd9,0x35,0x44,0x87,0xd2,0xd8,0x20,0x8d,
+ 0x04,0x20,0xc9,0xc6,0x3e,0x6a,0x67,0xde,0xdf,0x5f,0x41,0xa5,0x47,0xeb,0xbb,0x6c,0xc3,0x1e,0x37,0x35,0x9a,0x9e,0x7a,0x5d,0xa0,0x9c,0xfd,0x26,0x69,0x89,0xd2,0x77,0x3a,0x2a,0x20,0x8d,
+ 0x04,0x20,0xc9,0xc8,0x0f,0xbe,0xa7,0xa6,0x6d,0xc1,0x4c,0x9f,0x7a,0x87,0xfa,0x79,0x76,0x4e,0x11,0x01,0x66,0xe8,0xfd,0x8d,0x5c,0x9c,0xae,0xac,0xd2,0x3f,0xc2,0xc3,0x16,0xb8,0x20,0x8d,
+ 0x04,0x20,0xc9,0xcc,0x3a,0x9d,0xa7,0xee,0x70,0xc0,0xda,0x2c,0x1e,0xa2,0x54,0xb4,0x4f,0x04,0x43,0x72,0xa3,0x11,0x04,0x0f,0xc4,0x31,0x5e,0x52,0xf7,0x35,0x2e,0x66,0x10,0x97,0x20,0x8d,
+ 0x04,0x20,0xc9,0xce,0xaa,0xf6,0x9f,0x7d,0xe9,0x4d,0xfb,0x1f,0xae,0x69,0xeb,0x2c,0x29,0x78,0xf7,0x62,0xce,0xe5,0xa0,0x07,0x29,0x4f,0x68,0x2c,0xb7,0x0d,0x6c,0x98,0x1b,0x00,0x20,0x8d,
+ 0x04,0x20,0xc9,0xcf,0x7b,0xaf,0x3b,0xb5,0x46,0x04,0xf2,0x42,0x19,0x26,0xe5,0x2a,0x06,0x96,0x9a,0x36,0x0e,0xb8,0x2d,0xa1,0xc8,0x5a,0x2d,0xda,0xf6,0x7a,0xe9,0x05,0x9a,0xcd,0x20,0x8d,
+ 0x04,0x20,0xc9,0xe3,0x95,0x4b,0xe6,0x50,0xeb,0x82,0x17,0xd2,0xd0,0x1c,0x6b,0xde,0x96,0xfa,0x20,0x72,0x22,0xec,0x88,0xf2,0x65,0x41,0xd3,0x7d,0x57,0xd0,0xa7,0x3c,0xac,0x3b,0x20,0x8d,
+ 0x04,0x20,0xc9,0xec,0xc9,0x04,0x1f,0x87,0xaa,0xde,0x60,0xa8,0xf6,0xdf,0xc9,0x8b,0x63,0x70,0x64,0x08,0xc9,0xdc,0xde,0xb5,0x86,0xaf,0xae,0x29,0x8c,0x90,0xe1,0x0e,0xc9,0x0b,0x20,0x8d,
+ 0x04,0x20,0xc9,0xf2,0xfa,0x30,0x3c,0x44,0xcc,0x3b,0xe3,0xbb,0x11,0xe0,0xeb,0x4e,0x9c,0xdc,0x69,0xad,0x80,0xdb,0x2e,0xff,0x1f,0xff,0x03,0x4c,0xb7,0x3e,0xbb,0xe1,0x73,0x94,0x20,0x8d,
+ 0x04,0x20,0xca,0x3f,0xf1,0x5c,0x16,0x9a,0x9b,0x05,0x25,0x0e,0x1f,0x22,0x72,0xfc,0xd2,0xa1,0x8e,0x1a,0xd7,0x59,0xf1,0x3e,0xc3,0x75,0x40,0xbf,0x3d,0xda,0x0b,0x95,0x99,0xb8,0x20,0x8d,
+ 0x04,0x20,0xca,0x14,0x4e,0xcb,0xf7,0x98,0x8c,0xff,0x16,0x21,0x49,0xb2,0x93,0x8b,0x3e,0x34,0xaa,0x3d,0xbc,0xc7,0x52,0xf4,0x94,0x37,0x72,0x18,0x25,0x12,0x2b,0x75,0xc7,0xd7,0x20,0x8d,
+ 0x04,0x20,0xca,0x1f,0xbf,0xe2,0x44,0x2b,0x04,0x16,0xe2,0x15,0x9f,0x12,0x80,0x1b,0xc3,0x4e,0xcf,0xce,0xa0,0x9f,0x3f,0x7c,0x76,0x5b,0xea,0x99,0xc8,0xe9,0xaa,0x80,0x32,0x1e,0x20,0x8d,
+ 0x04,0x20,0xca,0x1f,0x93,0x0e,0x3a,0x67,0x8c,0xc4,0x96,0x82,0xa3,0xff,0x77,0x92,0x33,0x75,0x67,0xfe,0x78,0xbd,0xf9,0xe2,0x60,0xfd,0x69,0xf3,0x39,0x1b,0x91,0xa8,0x23,0x3d,0x20,0x8d,
+ 0x04,0x20,0xca,0x21,0x44,0x57,0xa3,0xd9,0xc6,0x89,0x87,0x51,0xd4,0x19,0x3f,0x9d,0xbf,0x53,0x5d,0x21,0x89,0xca,0xb9,0x36,0xa3,0xa7,0x6a,0x33,0x75,0xdd,0xaf,0xc2,0xc3,0x57,0x20,0x8d,
+ 0x04,0x20,0xca,0x30,0xff,0x6a,0x9c,0xb9,0x65,0x45,0xa5,0xbd,0x01,0x38,0xdf,0xa4,0x80,0xfd,0x8a,0x3f,0x54,0xb4,0x9a,0x89,0x3d,0x13,0xfb,0x0e,0x62,0x77,0xca,0x6e,0xcc,0xbb,0x20,0x8d,
+ 0x04,0x20,0xca,0x7b,0xd5,0x1d,0x86,0x91,0x0e,0xcd,0x70,0x85,0x3f,0x1a,0xcc,0x13,0xee,0x03,0xb7,0x4d,0xaf,0x93,0x4d,0x15,0xd2,0x0c,0xc7,0x26,0x36,0xc9,0xe9,0x0f,0x79,0x65,0x20,0x8d,
+ 0x04,0x20,0xca,0x7e,0x92,0xfd,0xdc,0x0e,0xe1,0x99,0x8d,0xd1,0x4e,0xa5,0x37,0x26,0xbc,0xa4,0xbe,0xbc,0xc2,0x5b,0xf9,0x43,0x40,0xc1,0xf0,0x86,0xad,0x4e,0x0e,0xe8,0xd8,0xae,0x20,0x8d,
+ 0x04,0x20,0xca,0x46,0x5d,0x7e,0xdb,0xac,0xf9,0x17,0xe0,0x3e,0xa4,0x81,0xb8,0xf7,0x08,0xe7,0x7b,0x2a,0xe0,0x07,0x07,0x21,0x39,0x16,0xd5,0xc4,0x58,0x5d,0x9d,0x99,0xe9,0xc4,0x20,0x8d,
+ 0x04,0x20,0xca,0x4c,0xdb,0xa0,0xfc,0xec,0x73,0xb5,0x01,0x66,0xbd,0x4f,0x82,0x07,0x00,0xa8,0x9a,0xe3,0xb1,0xc0,0xd8,0x44,0xd5,0xf4,0x56,0x53,0x21,0xd7,0xb0,0x38,0xc3,0xc1,0x20,0x8d,
+ 0x04,0x20,0xca,0x6f,0xd8,0xb0,0x0a,0x1e,0x5d,0x16,0x06,0xd9,0x5e,0xbf,0x6e,0x5c,0x54,0x11,0x0f,0x64,0x02,0x7b,0x1b,0x5a,0x27,0x40,0x68,0xb1,0x24,0x16,0x07,0xe3,0x37,0x0a,0x20,0x8d,
+ 0x04,0x20,0xca,0x71,0xf1,0xf6,0x7e,0x8d,0xd6,0x91,0x7b,0x8f,0xac,0xc1,0xb3,0xc1,0x1e,0xc5,0xf2,0x59,0x35,0x17,0x98,0x64,0xb0,0x14,0x0c,0x75,0xd0,0x8b,0x79,0xf3,0x13,0x2b,0x20,0x8d,
+ 0x04,0x20,0xca,0xb6,0x23,0x22,0x57,0x7e,0xe9,0x72,0x56,0x97,0x60,0x72,0x16,0x43,0x07,0xaa,0x8e,0x4c,0xc9,0xe4,0xc0,0xdd,0xa0,0xb0,0xf4,0xfe,0x83,0xe6,0x5b,0x4a,0x5f,0xab,0x20,0x8d,
+ 0x04,0x20,0xca,0x85,0xa5,0xa0,0x7a,0xe7,0x81,0xd4,0xc7,0x43,0x7d,0xe7,0x56,0x4e,0x9a,0x99,0x51,0x69,0xf4,0x61,0x8e,0x37,0x7c,0x06,0x9a,0xd0,0x7d,0xaa,0x9a,0x82,0x77,0x41,0x20,0x8d,
+ 0x04,0x20,0xca,0x91,0x20,0xaf,0x6f,0xaf,0xc7,0x2c,0xee,0x59,0x18,0x2d,0x34,0x72,0x3f,0x61,0xe2,0x79,0x4a,0x17,0x2e,0xe8,0xe7,0xa3,0x75,0x8a,0x03,0xd1,0xbe,0x7e,0xa6,0xa9,0x20,0x8d,
+ 0x04,0x20,0xca,0x92,0xda,0x50,0x8d,0x41,0xb2,0x79,0x78,0x7d,0xc7,0xb4,0x91,0x4f,0x93,0x44,0x41,0xe2,0xe5,0x09,0x85,0xf4,0xad,0xe3,0x32,0x1c,0xb1,0x45,0xd2,0x7e,0xc5,0x9f,0x20,0x8d,
+ 0x04,0x20,0xca,0x92,0xe2,0x57,0xbb,0xb7,0x09,0xde,0x7f,0x2e,0x9e,0xfa,0xe6,0xbd,0x88,0x4f,0x0a,0x8a,0x04,0x9c,0x03,0x98,0xdc,0x4a,0x73,0x84,0xeb,0xdf,0xfb,0x23,0x8f,0xec,0x20,0x8d,
+ 0x04,0x20,0xca,0x97,0xa2,0xc9,0x08,0x95,0x36,0x2c,0x1c,0xf2,0xa0,0x3f,0x05,0xc7,0xa0,0x29,0xf1,0x56,0x14,0xfc,0x83,0x00,0xf3,0x50,0x28,0x76,0x0e,0xe2,0x3e,0x03,0x0f,0x3c,0x20,0x8d,
+ 0x04,0x20,0xca,0x97,0xfb,0xee,0x9f,0xdf,0xbb,0x94,0xf9,0xcf,0x41,0xbb,0xb1,0xde,0x73,0xc7,0xc5,0x3b,0x69,0x09,0x40,0xec,0x0e,0x2c,0x23,0x09,0xc5,0x5d,0xd9,0x4b,0x1e,0xb4,0x20,0x8d,
+ 0x04,0x20,0xca,0x9b,0x07,0x51,0x5e,0xcf,0xcd,0xf3,0xf7,0x1f,0x8b,0x30,0x28,0x07,0xd2,0x36,0x70,0xac,0x2c,0x21,0x2b,0xea,0x5e,0x90,0xac,0xca,0x03,0x6b,0x6f,0xff,0x43,0x10,0x20,0x8d,
+ 0x04,0x20,0xca,0xa1,0xc2,0x98,0x42,0xe0,0x6e,0xa9,0x06,0x48,0xff,0x1e,0x9b,0x24,0xa1,0xc7,0x66,0x3b,0x37,0x5e,0xc1,0xd2,0xd6,0x12,0xd8,0xd4,0x31,0xe0,0x6d,0x7d,0x7f,0x82,0x20,0x8d,
+ 0x04,0x20,0xca,0xa3,0xef,0x5d,0x51,0xa9,0x04,0x6a,0x79,0x2a,0xc0,0x1b,0xe6,0xde,0xb3,0x21,0x70,0xd2,0xe9,0x8f,0x92,0xe5,0xd1,0x4a,0xa5,0xf2,0xe7,0xe5,0xce,0x15,0x74,0x85,0x20,0x8d,
+ 0x04,0x20,0xca,0xae,0x4d,0x15,0xac,0xe4,0xe4,0xc0,0xd3,0x81,0x19,0x89,0xf4,0x7d,0x3a,0x11,0x24,0x58,0xc3,0xae,0xcb,0x4b,0x97,0x04,0xbc,0x65,0xa6,0x44,0x84,0xe4,0x6b,0xff,0x20,0x8d,
+ 0x04,0x20,0xca,0xb2,0x9e,0x75,0x8e,0xba,0x4e,0x9a,0xc7,0x30,0xb1,0x0f,0xd3,0x6d,0x18,0xa0,0x86,0x1d,0x40,0x10,0x0e,0x3f,0x51,0xcd,0x8b,0x80,0x6b,0x76,0x33,0xb4,0xde,0xfe,0x20,0x8d,
+ 0x04,0x20,0xca,0xb2,0x9e,0x50,0xf5,0xab,0xc1,0x5f,0x10,0x9f,0x1a,0x54,0x54,0xea,0x84,0x67,0xa7,0x89,0x59,0x1f,0x40,0xf3,0x47,0xa9,0xd9,0x93,0xc2,0x68,0xe9,0x45,0xac,0x55,0x20,0x8d,
+ 0x04,0x20,0xca,0xf5,0xf1,0x51,0x9b,0x32,0xf1,0xf6,0x94,0xf6,0x5f,0xe8,0xb6,0xb8,0x3e,0x7e,0x10,0x23,0xbe,0xe6,0x5b,0x65,0x2e,0x14,0xb0,0xae,0xe6,0x48,0xaa,0x14,0x39,0x76,0x20,0x8d,
+ 0x04,0x20,0xca,0xf6,0x3b,0xf1,0xb2,0xb2,0x49,0xf5,0xf5,0xfa,0x29,0xab,0x87,0xd4,0x9d,0xb5,0x0c,0x58,0x4c,0x51,0xa6,0xa8,0x3e,0xf6,0x0e,0xff,0xe7,0x01,0xbf,0x41,0x9b,0x3c,0x20,0x8d,
+ 0x04,0x20,0xca,0xf8,0x69,0xfa,0x80,0x28,0x2c,0xde,0x77,0x51,0x5c,0x03,0xcb,0x69,0x94,0x4d,0x27,0xd9,0xa4,0x4d,0x87,0x00,0x71,0xc7,0xd4,0x10,0xf0,0x4a,0x68,0xd3,0xca,0xe4,0x20,0x8d,
+ 0x04,0x20,0xca,0xfb,0x57,0x42,0xa6,0xc1,0x7e,0x32,0x19,0x6f,0xb8,0x19,0x9f,0x1d,0xe6,0xe0,0x50,0x48,0x95,0xa6,0x84,0x98,0xca,0x7f,0x56,0x79,0x29,0x3f,0xcd,0xc9,0x07,0x3f,0x20,0x8d,
+ 0x04,0x20,0xca,0xd0,0x09,0xf0,0xb1,0xb9,0x28,0x88,0xdf,0x6d,0x0a,0x12,0x25,0xa6,0xa6,0x8f,0x6c,0x46,0x05,0x02,0x36,0xbc,0x51,0xbc,0xc3,0x07,0x1e,0xd7,0xcb,0x8e,0x35,0x00,0x20,0x8d,
+ 0x04,0x20,0xca,0xd1,0x8e,0xbb,0x94,0x81,0x9f,0x04,0xe9,0xa1,0x36,0x00,0x38,0x35,0x6e,0x63,0x53,0x36,0x0d,0x76,0x75,0xc5,0x41,0xd2,0xc2,0x28,0x2b,0x99,0x1a,0x89,0xe6,0x78,0x20,0x8d,
+ 0x04,0x20,0xca,0xd5,0x68,0x62,0x6f,0xb8,0x4e,0xa3,0x72,0x8c,0xb3,0xe0,0x8c,0x37,0x3e,0x6a,0x08,0x5c,0xc1,0x21,0x45,0xb3,0x1c,0x1b,0x59,0x7d,0xac,0xca,0xb2,0xde,0x7b,0x25,0x20,0x8d,
+ 0x04,0x20,0xca,0xdf,0x99,0x8a,0x04,0xc7,0x1d,0x21,0xed,0xcc,0x9b,0xe4,0xcf,0xb1,0x02,0x89,0xfc,0x98,0xde,0x90,0xc9,0x08,0x46,0x8d,0xed,0x32,0xb5,0xd4,0x60,0xa7,0x59,0x10,0x20,0x8d,
+ 0x04,0x20,0xca,0xef,0xa4,0xaa,0x95,0xd2,0x29,0x92,0x95,0xdb,0xe9,0xc5,0xaf,0x72,0x2d,0xab,0x90,0xcc,0x88,0x55,0x9a,0xd6,0x91,0x85,0x94,0x9f,0x09,0x2f,0xfa,0x04,0xeb,0xdb,0x20,0x8d,
+ 0x04,0x20,0xca,0xf2,0x73,0x74,0xe8,0x7e,0x3e,0xd1,0x72,0x8b,0x90,0x1f,0x13,0x45,0xdd,0xd9,0x7d,0xb6,0x25,0x3f,0x49,0x3e,0xce,0xdd,0xf3,0x32,0x95,0x24,0x04,0xd5,0x08,0xbd,0x20,0x8d,
+ 0x04,0x20,0xcb,0x34,0x9d,0x2b,0x4d,0x5f,0xdf,0x43,0x68,0x0c,0x00,0xd2,0xa8,0x88,0xd2,0xeb,0x98,0x36,0xdc,0x53,0xc2,0xfe,0x1f,0x29,0x8b,0xc5,0xa4,0xf3,0x88,0xab,0xf0,0xb5,0x20,0x8d,
+ 0x04,0x20,0xcb,0x0a,0xc1,0xb3,0x2b,0x96,0x31,0xf7,0x58,0x9e,0xab,0xcd,0x43,0x54,0x70,0xf7,0xb9,0x54,0x9d,0x74,0x85,0x22,0x0d,0xc9,0x49,0x5b,0x3c,0x5c,0xbc,0xd0,0x27,0xa8,0x20,0x8d,
+ 0x04,0x20,0xcb,0x0a,0xc6,0x37,0xfa,0x19,0xba,0x94,0xa9,0xd5,0xc7,0x13,0x3e,0xf8,0x5e,0x0c,0xcd,0xf7,0x99,0xff,0xb3,0x08,0x7e,0xf3,0xf9,0x5d,0x41,0x5b,0x31,0x61,0x88,0x64,0x20,0x8d,
+ 0x04,0x20,0xcb,0x12,0xd1,0x46,0x36,0x9d,0x11,0xcf,0xf9,0xb8,0x6f,0xa5,0x00,0xbf,0xdf,0x0d,0x4c,0x33,0xba,0x6b,0x5c,0x37,0xba,0xe6,0xd8,0x30,0x25,0x46,0x57,0xc3,0xd5,0x25,0x20,0x8d,
+ 0x04,0x20,0xcb,0x19,0x31,0x8e,0x24,0xb6,0x98,0x99,0x98,0xf2,0xfe,0x52,0x8c,0x23,0x44,0x22,0xd9,0x89,0x4b,0xec,0x46,0x13,0xa0,0x5f,0x36,0x29,0x9a,0xca,0xe6,0x67,0xbf,0xde,0x20,0x8d,
+ 0x04,0x20,0xcb,0x1b,0xb4,0xe2,0xbd,0x06,0xa2,0xe1,0xea,0x83,0x6c,0x49,0x83,0x23,0xd4,0x03,0x79,0x98,0x76,0x8b,0xe3,0x0e,0x4b,0x60,0xb8,0x89,0x7e,0x0d,0xd2,0x38,0xfe,0x83,0x20,0x8d,
+ 0x04,0x20,0xcb,0x21,0x5a,0xe8,0x43,0xba,0x53,0xba,0x84,0x4b,0x87,0xd7,0xe8,0x94,0x6c,0x49,0x0c,0xc4,0x5e,0xca,0xbc,0x9b,0x9c,0x8f,0xd0,0x26,0x6c,0xfd,0xea,0xb7,0x54,0x74,0x20,0x8d,
+ 0x04,0x20,0xcb,0x27,0xf7,0xc8,0xd3,0x6b,0x61,0x75,0x7a,0x68,0x09,0xeb,0x65,0x0c,0xb4,0x3c,0xcd,0x34,0x82,0x79,0xf0,0x5e,0xec,0x61,0x7c,0x7c,0xe9,0x5d,0xd3,0xca,0x76,0x83,0x20,0x8d,
+ 0x04,0x20,0xcb,0x26,0x3f,0xe8,0x3c,0x6c,0x81,0xad,0x38,0x44,0xce,0x8e,0x14,0xca,0xf7,0x88,0xcb,0x4b,0xdf,0x06,0x39,0xb7,0x94,0xce,0x09,0x70,0x7b,0x23,0x35,0x2f,0xa4,0xa6,0x20,0x8d,
+ 0x04,0x20,0xcb,0x29,0x43,0xda,0xe7,0x70,0x3c,0x7e,0xed,0x28,0x4b,0xc3,0xe6,0x0b,0x22,0xac,0xee,0x7b,0x7b,0x38,0x4e,0x18,0xce,0xec,0x76,0xcc,0x82,0xc5,0x0b,0x6a,0x55,0x7b,0x20,0x8d,
+ 0x04,0x20,0xcb,0x2b,0x14,0x1a,0x80,0x99,0xe4,0x06,0xc2,0x8e,0x2d,0xd8,0xbf,0xa8,0xc2,0x18,0x39,0x35,0x20,0xec,0xec,0x14,0x41,0xfc,0x1e,0x6c,0xc3,0x05,0x7e,0x2c,0xcf,0xe0,0x20,0x8d,
+ 0x04,0x20,0xcb,0x2b,0x14,0x4d,0x64,0xb8,0xd8,0x60,0x4c,0xb0,0x4a,0xc9,0x75,0xfe,0xd2,0xbe,0xd6,0xc2,0xff,0x1b,0x85,0xc9,0xa5,0x40,0x84,0x89,0x83,0xf6,0xcd,0x45,0xa7,0x1a,0x20,0x8d,
+ 0x04,0x20,0xcb,0x30,0x0a,0xd3,0x19,0xff,0xf8,0x2d,0x15,0xdb,0x20,0x7b,0xdc,0x39,0x48,0xab,0xe3,0xf8,0x16,0xe3,0x7a,0x71,0xa9,0xf6,0xcf,0x26,0x0d,0x46,0x9e,0x8b,0x12,0xbf,0x20,0x8d,
+ 0x04,0x20,0xcb,0x32,0x9b,0xf3,0x58,0xba,0xde,0x47,0x8c,0xd8,0x06,0xf9,0x1a,0xd8,0x3b,0xb0,0xb4,0xf2,0x18,0xd3,0xa4,0x50,0x41,0xb1,0xbc,0x91,0x52,0xb9,0x9b,0x1e,0x32,0x67,0x20,0x8d,
+ 0x04,0x20,0xcb,0x76,0x64,0xa9,0xf0,0x50,0x12,0x0a,0xff,0xca,0x01,0x19,0xa2,0x49,0xf0,0x9e,0x83,0x6f,0x18,0xc5,0xab,0x1b,0xca,0x6c,0xcc,0x53,0x9a,0x39,0x7d,0xf0,0x1f,0x4e,0x20,0x8d,
+ 0x04,0x20,0xcb,0x76,0xc4,0xea,0x66,0x35,0x9e,0x1c,0xe5,0x55,0x9c,0x9d,0x55,0x44,0x23,0x91,0xc3,0x2a,0x80,0x5f,0x6f,0xbf,0xe3,0x85,0x1f,0xf4,0x7f,0xa1,0x93,0x41,0xe1,0x94,0x20,0x8d,
+ 0x04,0x20,0xcb,0x7a,0xfa,0x44,0xf7,0xdc,0x5a,0x85,0x29,0x52,0xec,0xef,0xc9,0x09,0xa9,0x59,0xc9,0x6b,0x2d,0x7b,0xa6,0x45,0x2e,0x3c,0xc3,0x26,0xe0,0x48,0x02,0xce,0x2e,0xd2,0x20,0x8d,
+ 0x04,0x20,0xcb,0x40,0x82,0x1e,0xbb,0x84,0x66,0xb7,0x5c,0x68,0xec,0x54,0x19,0x70,0x90,0x7b,0x29,0x52,0x03,0x34,0x2c,0xdc,0x1d,0xca,0x19,0xb6,0xe6,0x0e,0xbf,0x00,0x55,0x2c,0x20,0x8d,
+ 0x04,0x20,0xcb,0x43,0x5e,0x0a,0x8f,0x57,0xe3,0x11,0xab,0x91,0x82,0x3d,0x76,0x88,0x2e,0xa1,0xe4,0x2b,0xb6,0x03,0x58,0x6f,0x35,0xcd,0xff,0xef,0xb8,0x89,0x16,0xbd,0xac,0xc3,0x20,0x8d,
+ 0x04,0x20,0xcb,0x45,0xcb,0x9e,0xd8,0xb2,0x60,0x44,0xb9,0x0e,0x03,0xf7,0x29,0x5e,0xb3,0x90,0xd0,0xb9,0x0b,0xc8,0xeb,0xbb,0x2d,0x45,0xaf,0xd1,0x04,0xcb,0xc0,0x9e,0xb9,0x34,0x20,0x8d,
+ 0x04,0x20,0xcb,0x48,0x0e,0xb9,0x7f,0x81,0x9a,0x84,0x66,0xbb,0x71,0xb4,0x62,0x88,0x37,0xb6,0xac,0x8e,0x40,0xea,0xf8,0xca,0xa1,0xae,0x7f,0x08,0x6e,0xfc,0x74,0x05,0x5a,0xd3,0x20,0x8d,
+ 0x04,0x20,0xcb,0x4d,0x73,0x28,0x66,0x54,0x1e,0x5c,0x11,0xe0,0xe8,0xab,0x75,0x82,0xf5,0x5e,0x17,0x4c,0x8e,0x38,0x3e,0x59,0x54,0x02,0x3c,0x72,0x72,0x01,0xd2,0xf6,0xdf,0xce,0x20,0x8d,
+ 0x04,0x20,0xcb,0x51,0xf5,0x21,0xc0,0x11,0xa5,0x8e,0x9c,0x10,0x41,0x66,0xd2,0x5e,0x3f,0xe4,0xab,0xf8,0xe6,0xa6,0xc7,0x5d,0xe5,0xb3,0x3e,0x1e,0x35,0xea,0xd6,0xc6,0xea,0xca,0x20,0x8d,
+ 0x04,0x20,0xcb,0x57,0x56,0x31,0x3c,0x1d,0x5e,0x9a,0x73,0xca,0x08,0x7c,0xc7,0x07,0x8a,0xa1,0x70,0x5e,0x83,0x90,0x45,0x71,0x83,0x31,0x29,0xdf,0x95,0x86,0x04,0x00,0xe3,0x72,0x20,0x8d,
+ 0x04,0x20,0xcb,0x58,0x60,0xa3,0xd0,0x5d,0xad,0x61,0xad,0x19,0x4d,0xe4,0x2f,0x12,0x89,0x69,0x6c,0x6c,0x4e,0x85,0xa7,0x8d,0x47,0x7b,0xe1,0xef,0x01,0x5e,0x63,0xc8,0x6d,0x8d,0x20,0x8d,
+ 0x04,0x20,0xcb,0x59,0x67,0x03,0x23,0x50,0x8a,0x57,0xc4,0x08,0x5f,0x8f,0xc7,0xf1,0xcf,0xc7,0xd1,0xcc,0xc1,0xcc,0x3b,0xc7,0x72,0x75,0x7d,0x68,0xbc,0x44,0xc0,0x06,0xac,0xf8,0x20,0x8d,
+ 0x04,0x20,0xcb,0x67,0xa4,0x87,0xcd,0x45,0x52,0x65,0xf3,0xf2,0xd1,0x86,0x23,0x00,0x5b,0x61,0x23,0x04,0x96,0x1d,0x3e,0x9b,0xeb,0xf9,0x81,0x49,0x0d,0x7f,0x16,0x8c,0x9a,0xf4,0x20,0x8d,
+ 0x04,0x20,0xcb,0x6a,0xa8,0x53,0x7f,0xf2,0x08,0xda,0x7b,0x57,0xe9,0xdf,0x19,0x4d,0xbb,0xf2,0x4b,0x0b,0xba,0x4f,0x13,0x4a,0x77,0x8b,0x6a,0x87,0x61,0x4b,0x08,0x7e,0xe6,0xfc,0x20,0x8d,
+ 0x04,0x20,0xcb,0x6c,0x45,0x48,0xe3,0xe3,0xa5,0xd0,0x69,0xba,0xd6,0xaf,0x15,0xac,0xc9,0xa6,0x2b,0x2b,0x7c,0xf2,0x0e,0xb1,0xe0,0xc7,0xef,0x55,0x92,0x09,0xe2,0xca,0xea,0xc9,0x20,0x8d,
+ 0x04,0x20,0xcb,0x6e,0xab,0xe0,0x7d,0xf7,0x24,0x52,0xcc,0xc9,0x90,0xa4,0xc4,0x6c,0x1f,0xda,0x64,0x0c,0xde,0xc7,0x93,0x48,0x8b,0xec,0x26,0x9b,0xb9,0x2a,0x61,0x37,0xdf,0x7d,0x20,0x8d,
+ 0x04,0x20,0xcb,0xb8,0x51,0x66,0xdc,0x1c,0x4c,0x20,0xca,0x8c,0x99,0x98,0x83,0x25,0x48,0x93,0xb8,0xc4,0x67,0x7c,0x5c,0xc1,0x40,0x24,0x00,0xb4,0x19,0x07,0x03,0xce,0xbb,0x33,0x20,0x8d,
+ 0x04,0x20,0xcb,0xba,0x90,0x4a,0xb9,0xec,0x1d,0xf7,0xa8,0xd1,0x33,0x79,0x1e,0x76,0x76,0x1a,0x05,0xcc,0x81,0x44,0xf6,0x5e,0x92,0x91,0x89,0xf5,0xf4,0x87,0x5c,0x56,0xac,0xbf,0x20,0x8d,
+ 0x04,0x20,0xcb,0x82,0x9d,0x7c,0x24,0x63,0xf1,0x79,0x20,0xc3,0xa8,0x2c,0x2f,0x95,0xc8,0xae,0x31,0x42,0x2b,0xfb,0x39,0x18,0x47,0xff,0x25,0xd4,0xc0,0x97,0x17,0xbc,0xdf,0x76,0x20,0x8d,
+ 0x04,0x20,0xcb,0x86,0x92,0xb0,0x86,0x89,0x2a,0xc4,0x85,0xef,0x86,0xa7,0xcf,0x21,0x74,0x8d,0x08,0x50,0x98,0xfb,0x0f,0x3d,0x30,0xc5,0x7a,0x97,0x60,0xa7,0xc6,0xa1,0x24,0xd5,0x20,0x8d,
+ 0x04,0x20,0xcb,0x8b,0x22,0x2e,0x6f,0x7e,0xb6,0xdd,0x5c,0x3e,0x2c,0x98,0x53,0x2a,0xc6,0x81,0x8d,0x63,0xc4,0x8b,0xbb,0x27,0xfc,0xc3,0xf3,0x70,0x33,0x80,0x98,0x87,0x0c,0xbe,0x20,0x8d,
+ 0x04,0x20,0xcb,0x8f,0x70,0x65,0x4e,0x60,0xa3,0xd3,0x1a,0x0b,0x4e,0x88,0x3a,0x6b,0x79,0x97,0xae,0x80,0x63,0xf6,0x2c,0xa3,0x7a,0x12,0x71,0x6e,0x95,0xa9,0x74,0xd6,0x3d,0x8e,0x20,0x8d,
+ 0x04,0x20,0xcb,0x94,0xc3,0x62,0x5b,0x34,0x8d,0x2e,0xb9,0x15,0x48,0xa0,0xfd,0xdd,0x0a,0x46,0xba,0x82,0x5c,0x99,0xc6,0xf6,0x45,0x66,0x91,0x04,0xc7,0x9d,0xa7,0xb4,0x6c,0x1f,0x20,0x8d,
+ 0x04,0x20,0xcb,0xa4,0x9a,0x89,0x67,0x86,0x6c,0xa5,0xb1,0x7c,0xd9,0xeb,0x21,0xb2,0x8f,0x32,0xc0,0x94,0xf5,0x65,0x18,0x7a,0x7e,0x96,0x26,0xc3,0x3e,0x79,0x41,0xda,0xec,0x6d,0x20,0x8d,
+ 0x04,0x20,0xcb,0xa4,0xaf,0x16,0xfa,0x06,0xd9,0x75,0x14,0x04,0x06,0x32,0x84,0x51,0x19,0x86,0xf1,0xb4,0xec,0x19,0xcb,0xf9,0x85,0xdb,0x07,0xff,0xad,0x0d,0x4a,0x13,0x01,0x1b,0x20,0x8d,
+ 0x04,0x20,0xcb,0xaa,0xcf,0x59,0x40,0x9c,0xf2,0xcb,0x8b,0xfd,0xe8,0x8d,0x08,0x0f,0x92,0xbd,0x0c,0xdd,0xa4,0x17,0xb7,0x38,0x8c,0xad,0x9c,0xc1,0x5e,0xe9,0xea,0x82,0x29,0x20,0x20,0x8d,
+ 0x04,0x20,0xcb,0xac,0x2f,0xc5,0x4b,0x38,0xfd,0x73,0xa4,0x9f,0xd7,0x2e,0xe6,0x28,0xb3,0xb2,0x19,0x44,0x1c,0x02,0xb0,0x9b,0x75,0x4f,0xf5,0x38,0x52,0xfa,0xbd,0x43,0x01,0xea,0x20,0x8d,
+ 0x04,0x20,0xcb,0xf7,0x57,0xa9,0xe2,0x28,0xef,0xd5,0xde,0xad,0xa1,0x16,0xb8,0x00,0xbd,0x80,0xea,0x7a,0x71,0x74,0x2f,0x33,0x02,0xdf,0xb7,0x4b,0xb4,0x33,0x13,0xe2,0x84,0xae,0x20,0x8d,
+ 0x04,0x20,0xcb,0xcc,0xe0,0xbd,0x5a,0x4e,0xa5,0x40,0x50,0xf4,0xc9,0x58,0x7e,0x21,0x19,0xde,0x35,0x93,0xa7,0x77,0xa8,0x76,0x6d,0x4f,0x80,0xff,0xfb,0x3f,0xea,0x53,0x9e,0xd8,0x20,0x8d,
+ 0x04,0x20,0xcb,0xcd,0x80,0xb4,0x20,0xb9,0x6b,0x94,0x92,0x92,0xfc,0x1a,0x0e,0x77,0x22,0x3d,0xc6,0xa2,0x29,0x2f,0x57,0x6c,0x40,0x8d,0x44,0x84,0xee,0x5b,0x08,0xcb,0x33,0x8c,0x20,0x8d,
+ 0x04,0x20,0xcb,0xce,0x90,0xb1,0x7b,0x2c,0x26,0x12,0x67,0xdb,0x0a,0x6a,0x3e,0x4b,0xbd,0xd6,0x05,0xab,0x90,0x28,0x98,0x06,0xa7,0xdb,0x49,0x73,0x75,0x05,0x04,0x0f,0x0a,0x17,0x20,0x8d,
+ 0x04,0x20,0xcb,0xda,0xe7,0x6e,0x0e,0x88,0xeb,0xcb,0xa7,0xa7,0x4e,0x1a,0xa9,0x4a,0x9e,0xb1,0x04,0x7a,0xd1,0xfe,0x9b,0xbe,0xf0,0x32,0x26,0x0a,0x38,0xb4,0xb0,0xb4,0x32,0x71,0x20,0x8d,
+ 0x04,0x20,0xcb,0xde,0xc3,0xa7,0xfe,0x07,0x87,0x84,0x88,0xfd,0x84,0xe8,0x17,0x4a,0xe2,0xc5,0x67,0x64,0xb4,0x3e,0xcb,0x47,0x22,0xe2,0xd7,0x12,0x3e,0x3c,0x6e,0xa2,0xf2,0xc2,0x20,0x8d,
+ 0x04,0x20,0xcb,0xe1,0xa6,0xe4,0x4d,0x58,0x24,0xcc,0x6e,0x2c,0xb4,0xd8,0x0c,0x04,0x15,0xf4,0xff,0x72,0xc6,0xae,0x8c,0x20,0x3b,0x36,0x6d,0x09,0x83,0x78,0x51,0x38,0xc6,0xc6,0x20,0x8d,
+ 0x04,0x20,0xcb,0xe1,0x57,0x6b,0xa1,0xbd,0x38,0xdd,0x53,0x6c,0x3e,0x9e,0x3c,0x82,0xff,0xb3,0x1f,0x24,0x4c,0x7b,0x84,0xa5,0x93,0x5b,0x58,0x26,0xd8,0xf2,0x8d,0xe9,0x09,0xbb,0x20,0x8d,
+ 0x04,0x20,0xcb,0xef,0xa9,0xc3,0x5f,0xc5,0x51,0x6c,0x85,0xe2,0xe3,0x70,0x92,0xc2,0x6b,0x3a,0x0c,0xe0,0x75,0x5f,0x15,0x97,0xef,0xf9,0xa5,0x9f,0xc2,0xa0,0x25,0xde,0x4c,0x35,0x20,0x8d,
+ 0x04,0x20,0xcc,0x17,0x6c,0xe4,0xb9,0x1b,0x80,0x23,0x34,0xd3,0x93,0x5c,0x56,0x62,0x04,0x98,0x0d,0xe7,0x73,0x85,0xec,0x7f,0xa7,0x3d,0x3f,0xde,0xf1,0xcd,0xf0,0x3f,0x6b,0xda,0x20,0x8d,
+ 0x04,0x20,0xcc,0x21,0xc3,0x68,0x88,0x50,0x8a,0x65,0xcb,0xdc,0x29,0x65,0x39,0x61,0x65,0x0c,0x22,0x59,0x4d,0x9e,0x6e,0x9d,0x3a,0xc6,0x41,0x9d,0x6a,0x97,0xc2,0xc6,0xc4,0x06,0x20,0x8d,
+ 0x04,0x20,0xcc,0x22,0x9e,0x14,0xe7,0x7f,0x19,0x0e,0x90,0xfd,0xbb,0xe7,0x91,0x5d,0x39,0x78,0x09,0xbf,0x86,0x2a,0x1b,0x77,0x57,0x67,0x7a,0x84,0x9c,0x75,0xf9,0xae,0x42,0x70,0x20,0x8d,
+ 0x04,0x20,0xcc,0x23,0x60,0x1f,0xc3,0x6e,0xe7,0xd2,0xd1,0x3f,0x71,0xd7,0x85,0x03,0x5f,0xce,0x5c,0xf1,0xd0,0xf7,0xc7,0x2d,0x85,0x34,0xb1,0x9c,0x1f,0x7e,0x4b,0x0a,0x20,0x89,0x20,0x8d,
+ 0x04,0x20,0xcc,0x27,0x8a,0xc7,0xe7,0xd7,0xff,0x7e,0xc6,0xe8,0x6f,0xa2,0x79,0x46,0x41,0x3d,0x84,0x59,0x63,0x08,0x81,0x8c,0x77,0xab,0xc9,0x58,0x49,0x62,0x27,0x55,0xdc,0xdb,0x20,0x8d,
+ 0x04,0x20,0xcc,0x2b,0xd6,0x91,0xf8,0x8d,0x89,0x95,0x61,0x9a,0x08,0x3b,0x2d,0x4a,0x4a,0x62,0x35,0x01,0x2b,0x5a,0x93,0x6d,0xa8,0xe0,0xc4,0x51,0x39,0xd0,0xdc,0xda,0x77,0x2a,0x20,0x8d,
+ 0x04,0x20,0xcc,0x2a,0x16,0xc2,0xd6,0x3c,0xdd,0x4b,0xea,0x57,0x40,0x9a,0x6d,0x05,0x65,0x43,0xac,0xae,0xb2,0xb3,0xc7,0xc5,0xdb,0xb6,0x52,0xbd,0xa6,0xb9,0x27,0x20,0x59,0xcd,0x20,0x8d,
+ 0x04,0x20,0xcc,0x75,0xad,0x0b,0x78,0x0d,0x21,0x76,0xf8,0x1e,0x7a,0x30,0x3a,0x95,0xd2,0xe6,0x52,0xd0,0x29,0x65,0x31,0xfc,0xa7,0x15,0x94,0x4b,0x1c,0xb7,0xa1,0xf1,0x2d,0xb9,0x20,0x8d,
+ 0x04,0x20,0xcc,0x7c,0x52,0xa2,0x57,0xbb,0xb8,0x62,0x2d,0x8a,0x76,0x03,0xf4,0x64,0xac,0xf9,0x0e,0x98,0x86,0x01,0x6e,0x68,0x6a,0x5b,0x7c,0x9b,0xb7,0xc0,0xc0,0xf7,0x21,0x21,0x20,0x8d,
+ 0x04,0x20,0xcc,0x7f,0x28,0x09,0x68,0x65,0x79,0xe4,0x8d,0xac,0x61,0x01,0x98,0x44,0xe5,0x59,0xd1,0x05,0x1c,0xf1,0xcf,0x51,0xb2,0x0f,0xf8,0xae,0x28,0x4f,0x6e,0x56,0x56,0xe0,0x20,0x8d,
+ 0x04,0x20,0xcc,0x62,0x58,0xf6,0x51,0xed,0xa2,0x61,0xcf,0xd1,0x6f,0x38,0x2b,0xb5,0xd3,0x5d,0x6c,0x4f,0x89,0x7e,0xfc,0x4d,0x29,0x5b,0xa3,0xb4,0x81,0x7e,0x68,0x95,0x72,0x86,0x20,0x8d,
+ 0x04,0x20,0xcc,0x62,0x73,0x4b,0xba,0x2c,0xd7,0x85,0xc8,0xf4,0xb3,0xfa,0x4d,0x50,0x92,0x34,0x1b,0x61,0x4f,0xe7,0xf0,0xa0,0x7c,0xb8,0xa3,0x1d,0x2c,0xe4,0x72,0x59,0xdc,0x8e,0x20,0x8d,
+ 0x04,0x20,0xcc,0x67,0xb8,0x9b,0x8f,0x05,0xd8,0xed,0x72,0x82,0x1f,0x7c,0x42,0x1d,0x7f,0x03,0xd0,0xd1,0x9c,0x34,0x0c,0x36,0x44,0xee,0x1d,0x69,0xe3,0xe4,0x7f,0x49,0xae,0x89,0x20,0x8d,
+ 0x04,0x20,0xcc,0x6b,0x24,0xa6,0x21,0xda,0xcd,0x56,0x10,0xb3,0xce,0xaa,0x54,0xd4,0x1c,0x7a,0xfd,0xb3,0xcd,0x95,0xec,0x31,0x54,0x43,0xf9,0x3b,0x4a,0xc5,0xab,0x9a,0x25,0x63,0x20,0x8d,
+ 0x04,0x20,0xcc,0x71,0xa8,0xc1,0x62,0x81,0x7a,0xfe,0x93,0x9e,0xb0,0xbc,0xd6,0x4c,0x41,0x9f,0x6a,0x3e,0x75,0x85,0xe1,0xf0,0x5e,0x36,0xeb,0x83,0x8c,0x25,0x39,0xa8,0xa1,0x46,0x20,0x8d,
+ 0x04,0x20,0xcc,0xb9,0xf0,0xfb,0xcf,0x5a,0x5f,0x9e,0x00,0xee,0x63,0xc0,0xd1,0x22,0xbf,0xdd,0xe7,0x99,0xb5,0xb9,0x55,0xf9,0x64,0xa9,0x73,0xf1,0xcf,0xc1,0xc6,0x46,0x27,0x19,0x20,0x8d,
+ 0x04,0x20,0xcc,0x80,0xbb,0x52,0x64,0x29,0xfc,0xcf,0x5f,0xd8,0xb8,0x84,0x13,0xd1,0x79,0x8e,0x74,0x16,0x3b,0xe3,0xcd,0x34,0x63,0x53,0x87,0xbb,0xfb,0x9a,0xee,0xf7,0xd2,0x7d,0x20,0x8d,
+ 0x04,0x20,0xcc,0x83,0x92,0x92,0x24,0xcb,0x1b,0x8b,0x9d,0xea,0x9d,0xe6,0x21,0x37,0x57,0xbd,0x0c,0x66,0x0f,0x23,0x6c,0x72,0x0f,0xbe,0x09,0x5b,0x6c,0x97,0x44,0xd7,0xef,0xf1,0x20,0x8d,
+ 0x04,0x20,0xcc,0x8d,0x37,0x63,0x1a,0x95,0x48,0x73,0x94,0x20,0xdf,0x3a,0x3b,0xec,0x60,0xcb,0xff,0x32,0x8d,0x0e,0xf3,0xb7,0xcc,0xdd,0x62,0x36,0x17,0x0f,0x3d,0x1e,0xf9,0x93,0x20,0x8d,
+ 0x04,0x20,0xcc,0x91,0xde,0xdf,0x4d,0xaa,0x45,0xc7,0x42,0x2f,0xce,0x5c,0xf5,0x34,0x94,0x50,0x7a,0x5a,0x0d,0xac,0xe1,0x3c,0x38,0x81,0xdc,0xbf,0xf6,0xb2,0xf3,0x32,0x39,0xc5,0x20,0x8d,
+ 0x04,0x20,0xcc,0x90,0xfb,0x49,0x2f,0x67,0x0b,0xb7,0xfa,0x84,0x16,0x4f,0xf5,0xc0,0x88,0xec,0x5f,0xb1,0x52,0x4b,0xf4,0xf8,0x3f,0x35,0xb3,0x6d,0xaf,0x0f,0xe8,0xee,0x8a,0x3a,0x20,0x8d,
+ 0x04,0x20,0xcc,0x91,0x20,0x0e,0x20,0xfa,0x57,0x77,0xf5,0xa7,0x20,0xb5,0x59,0x26,0xd2,0x7d,0x6a,0xd5,0x79,0x24,0x62,0x6e,0xaf,0xe5,0xbf,0x04,0x70,0xf5,0xf8,0x4c,0xf0,0xf1,0x20,0x8d,
+ 0x04,0x20,0xcc,0xa3,0xcd,0xde,0x09,0xf3,0x65,0x18,0x1f,0xd0,0x35,0xcc,0x70,0x0c,0x53,0x5c,0xed,0x89,0xb4,0x16,0xe6,0x58,0xba,0xdf,0xc4,0xbc,0x30,0x19,0xea,0x03,0x9f,0xf4,0x20,0x8d,
+ 0x04,0x20,0xcc,0xae,0x62,0x15,0xea,0x71,0x52,0x2d,0xb6,0x68,0xe4,0x29,0x25,0x6d,0xe3,0x80,0x8a,0x86,0xa9,0x69,0x02,0x57,0x61,0x07,0x42,0x21,0x35,0x31,0xd2,0xeb,0x9d,0xc2,0x20,0x8d,
+ 0x04,0x20,0xcc,0xb3,0x42,0xc6,0x59,0x7d,0x88,0x07,0x62,0x54,0x0b,0xc6,0xd8,0x3c,0x11,0x66,0x1d,0x34,0xb4,0x95,0xf3,0x4e,0x71,0x34,0x89,0x3a,0x52,0x59,0xd3,0xb2,0x0f,0x7a,0x20,0x8d,
+ 0x04,0x20,0xcc,0xfc,0x65,0x39,0xfb,0x6f,0x80,0x63,0x46,0xf4,0x13,0x41,0x07,0xf3,0x11,0x49,0x29,0xe3,0xce,0xd5,0xa6,0x34,0xdc,0x37,0x75,0x00,0xd2,0x98,0xb8,0x76,0xb9,0x4e,0x20,0x8d,
+ 0x04,0x20,0xcc,0xfc,0x7a,0xe7,0x0e,0x02,0xf2,0xce,0x03,0xbf,0xf0,0xe2,0xdf,0xe0,0xb5,0x19,0x26,0x3a,0xe6,0xd6,0x75,0x2a,0x5c,0xf3,0x7d,0xb6,0x62,0x5e,0xbc,0x4d,0xbc,0x2e,0x20,0x8d,
+ 0x04,0x20,0xcc,0xfd,0x5f,0x92,0x07,0xfd,0x6a,0xbb,0x63,0xaa,0x4e,0x42,0x32,0x99,0x56,0xdc,0xb0,0x9d,0xb5,0xa7,0x12,0xb0,0x63,0xaf,0x26,0x65,0xac,0x51,0x0a,0xf5,0xc1,0x69,0x20,0x8d,
+ 0x04,0x20,0xcc,0xc4,0xc5,0xc6,0x53,0x1a,0x9f,0xf1,0x38,0xe4,0x23,0x96,0xfb,0x27,0xfd,0x33,0xf6,0x86,0x64,0xc8,0xb6,0xbd,0x76,0xb9,0x14,0x14,0x29,0x63,0xde,0xe2,0x71,0x40,0x20,0x8d,
+ 0x04,0x20,0xcc,0xce,0xc2,0x63,0x94,0x23,0xa9,0x32,0xfe,0x1b,0xf3,0x6c,0x6a,0x26,0xf4,0xf9,0xe1,0xff,0x4b,0xa8,0x28,0x66,0x06,0xd7,0x24,0xe3,0x2f,0x0d,0x4b,0x57,0x86,0x84,0x20,0x8d,
+ 0x04,0x20,0xcc,0xd9,0x69,0x61,0xdb,0xee,0x54,0xe3,0x3c,0xb3,0xa2,0x59,0xa7,0x7d,0xc8,0x59,0xe8,0x24,0xdc,0x9b,0xb7,0x82,0x90,0x1a,0x40,0x45,0xa6,0x1d,0x06,0x9e,0xd5,0x4c,0x20,0x8d,
+ 0x04,0x20,0xcc,0xdd,0x4e,0x62,0x75,0x35,0x5e,0x20,0x29,0x20,0x49,0x34,0x2f,0x2f,0xa9,0xee,0xe3,0x71,0x5c,0x92,0xfc,0x0e,0xa2,0x46,0x59,0x47,0x0e,0x02,0x96,0xe5,0x7a,0x76,0x20,0x8d,
+ 0x04,0x20,0xcc,0xed,0x1c,0x29,0x67,0x13,0x4a,0xe2,0x09,0x5c,0x83,0x67,0x3d,0x01,0x13,0x72,0x16,0x89,0xe8,0x4c,0x64,0x74,0x62,0x62,0x0e,0xf0,0x92,0x2e,0x36,0xd1,0xfa,0x56,0x20,0x8d,
+ 0x04,0x20,0xcd,0x36,0x45,0x1f,0x75,0x9c,0x12,0x56,0xde,0x09,0x82,0xd8,0xd8,0x6d,0x21,0x82,0xcd,0xac,0xd1,0x9c,0x21,0xcc,0x88,0xe7,0xa2,0x31,0xac,0x4d,0x4c,0xe9,0x61,0x95,0x20,0x8d,
+ 0x04,0x20,0xcd,0x37,0x83,0xfd,0x95,0x85,0xb7,0xcd,0x13,0xf0,0x9f,0x40,0xcb,0x4e,0xc4,0xd0,0x66,0x9a,0x05,0x1e,0x9f,0xfa,0xaf,0xd8,0xc2,0x7c,0xb0,0xe4,0x0a,0x4d,0x79,0x82,0x20,0x8d,
+ 0x04,0x20,0xcd,0x3f,0xe2,0x08,0x20,0x3e,0x05,0xe7,0x15,0x28,0x45,0x26,0xd0,0x79,0x98,0xbb,0x0a,0x31,0x4a,0x87,0x14,0x4f,0x33,0x3d,0x05,0x0d,0xb7,0x52,0xbb,0xed,0x48,0xf8,0x20,0x8d,
+ 0x04,0x20,0xcd,0x00,0xe9,0xd2,0x75,0xd3,0x4c,0x12,0xf5,0xd3,0xea,0xab,0x9f,0xf6,0x84,0x38,0x4f,0xd2,0x69,0x3f,0xd7,0x8a,0x65,0x9e,0x16,0xfb,0x98,0xad,0x87,0xf7,0x68,0x01,0x20,0x8d,
+ 0x04,0x20,0xcd,0x02,0xc4,0x66,0x6c,0x69,0x71,0xaa,0xc1,0xd6,0x83,0x1f,0x8c,0x86,0x13,0x2e,0x81,0xcd,0xa4,0xc0,0xcc,0x89,0x7f,0x65,0x77,0x72,0x8e,0x56,0x37,0x2c,0x46,0xe2,0x20,0x8d,
+ 0x04,0x20,0xcd,0x05,0xf9,0x38,0x37,0xf4,0xe6,0x9f,0xae,0x56,0x56,0xf5,0x10,0x12,0xe0,0x91,0x43,0x71,0x75,0x43,0xf0,0x36,0xbf,0x4c,0x7b,0xec,0xa3,0x0c,0xa9,0x3b,0x23,0x25,0x20,0x8d,
+ 0x04,0x20,0xcd,0x1a,0xc6,0xc7,0xe2,0xcc,0x6f,0x52,0xa4,0xd7,0x9d,0x55,0x65,0x7b,0x28,0x9a,0x3a,0xa9,0x2a,0xfc,0x2a,0x36,0x9e,0x0f,0x20,0x39,0xc6,0xb4,0x96,0x50,0x9e,0x7f,0x20,0x8d,
+ 0x04,0x20,0xcd,0x1c,0xc5,0xed,0x9b,0x48,0xd4,0xe3,0xf4,0x23,0x8d,0x8a,0x41,0x34,0x96,0xe9,0x78,0xc8,0xac,0x56,0x3b,0x0e,0xa6,0xf3,0xbe,0x84,0x81,0xfd,0x09,0xfa,0xff,0x1e,0x20,0x8d,
+ 0x04,0x20,0xcd,0x27,0x81,0xfd,0xf9,0x56,0x08,0x91,0x4e,0x28,0xc4,0x74,0xb8,0x2e,0x24,0xbe,0xc1,0x15,0x51,0xad,0x9c,0x86,0x97,0x6d,0x46,0xb6,0xa0,0x9e,0xd3,0x65,0x4f,0x69,0x20,0x8d,
+ 0x04,0x20,0xcd,0x32,0x35,0xfd,0xad,0x49,0xf1,0xe4,0x37,0x10,0xb4,0x85,0xd4,0x7c,0xa0,0x26,0x9b,0x12,0x19,0x9f,0xb3,0x71,0x19,0xb9,0x60,0xb9,0xd1,0xe7,0x22,0x85,0xc0,0xbe,0x20,0x8d,
+ 0x04,0x20,0xcd,0x74,0xda,0x48,0x97,0x08,0xa2,0xd1,0x06,0x93,0x58,0x9f,0x12,0x56,0xc7,0xa8,0x67,0x05,0xe2,0x28,0xdc,0xa6,0x9b,0x30,0xcb,0xd6,0xef,0xf2,0x8e,0x0a,0x60,0x09,0x20,0x8d,
+ 0x04,0x20,0xcd,0x7d,0xb3,0x91,0xc0,0xfa,0x65,0x3b,0x1e,0x1b,0xb1,0xb4,0xd4,0x05,0x0f,0xdf,0x83,0x6e,0x20,0x43,0xfa,0x5e,0x71,0x0b,0x1b,0x5a,0x36,0xda,0x4f,0xe6,0x7e,0x8c,0x20,0x8d,
+ 0x04,0x20,0xcd,0x42,0x7c,0x0a,0x83,0x79,0x97,0x11,0xa3,0x72,0x57,0xf0,0x8b,0x93,0xdc,0x22,0x9b,0x81,0xdb,0x39,0x44,0x85,0xc6,0xfa,0xec,0xbd,0x8e,0x1f,0xdf,0x18,0xc9,0x2a,0x20,0x8d,
+ 0x04,0x20,0xcd,0x4d,0x49,0xdb,0x54,0xfc,0xe9,0xc1,0xdf,0xf3,0xd7,0x56,0x43,0x1c,0x6f,0xf2,0x7a,0xde,0x72,0x9c,0xf7,0x18,0xc7,0x61,0xe0,0x2d,0xa5,0x30,0x61,0xfe,0x31,0x80,0x20,0x8d,
+ 0x04,0x20,0xcd,0x52,0xde,0xa6,0x42,0x6f,0xd2,0xd1,0x42,0x52,0xe7,0x28,0x7e,0xec,0xd5,0x47,0x83,0xc2,0x60,0x49,0x83,0xf9,0xa9,0xf9,0xf5,0xe7,0x83,0x28,0xfc,0xc8,0x69,0x3a,0x20,0x8d,
+ 0x04,0x20,0xcd,0x59,0x72,0xe3,0xb9,0xfb,0x6e,0x45,0x34,0xcb,0xab,0xc2,0x7f,0xc6,0xa4,0x73,0xde,0xac,0x56,0xb9,0xab,0x5f,0x6b,0xb9,0xba,0x51,0x94,0x47,0x80,0xad,0x87,0x10,0x20,0x8d,
+ 0x04,0x20,0xcd,0x5e,0x26,0x7c,0x84,0x61,0x6a,0xb5,0x2c,0xd0,0x43,0xb6,0x53,0x64,0x56,0x06,0xab,0x45,0x1b,0x6d,0xf8,0x80,0xea,0xf5,0x13,0x42,0xb7,0xe5,0x0e,0x80,0xf3,0x2a,0x20,0x8d,
+ 0x04,0x20,0xcd,0x72,0x88,0x95,0x5b,0x3f,0x0e,0xae,0xe9,0x3c,0xa6,0xbb,0xcc,0x69,0xaf,0xf5,0x49,0xab,0xce,0x63,0xd3,0x68,0x64,0x08,0x52,0x85,0xb4,0xb4,0x22,0xdf,0x04,0x18,0x20,0x8d,
+ 0x04,0x20,0xcd,0xb8,0xe5,0x99,0xf7,0xa2,0x53,0xe4,0x60,0x6a,0x61,0xe9,0x70,0xdf,0x7f,0x0f,0x75,0x2c,0x2f,0xa1,0x67,0x88,0xc0,0xe0,0x81,0x24,0xb1,0x22,0x3f,0x48,0x33,0x5f,0x20,0x8d,
+ 0x04,0x20,0xcd,0x82,0xd7,0x54,0xcf,0x77,0x21,0x74,0x0f,0x0b,0xa0,0x5e,0x38,0x9e,0xec,0xdf,0x27,0xad,0xa2,0xc0,0x6a,0x01,0x62,0xc8,0xe8,0x84,0x50,0xb9,0xce,0xd0,0x4b,0x5a,0x20,0x8d,
+ 0x04,0x20,0xcd,0x83,0x03,0x1f,0xab,0x27,0xf6,0x0a,0x44,0xac,0x0d,0x8b,0xd4,0x55,0x21,0xfe,0x04,0x46,0x59,0xa9,0x44,0x34,0x96,0xc3,0x92,0x86,0x7c,0x47,0xaf,0xf1,0x1c,0xc7,0x20,0x8d,
+ 0x04,0x20,0xcd,0x88,0x8c,0x73,0x8d,0x34,0x54,0x5c,0x9d,0xa0,0x74,0x1d,0x5d,0x95,0xcf,0xb4,0x07,0xba,0x1e,0xd2,0x23,0x79,0x5f,0x48,0x78,0x2e,0xf0,0xd6,0x1d,0x6f,0xa2,0xe9,0x20,0x8d,
+ 0x04,0x20,0xcd,0x8d,0xa1,0x56,0xaa,0x66,0xff,0x4d,0x1d,0x02,0xb0,0x52,0x09,0x43,0x23,0x80,0xce,0x20,0xae,0xd5,0x9e,0x65,0x45,0xb3,0x3c,0x53,0xc2,0x40,0x97,0xff,0x49,0xc8,0x20,0x8d,
+ 0x04,0x20,0xcd,0xa2,0xfd,0x28,0x3a,0x13,0xaa,0x18,0xc7,0x77,0x1e,0x74,0xfb,0xc7,0xc6,0x37,0x9a,0x36,0x9d,0xe2,0x31,0x6a,0x95,0x26,0x3c,0xd9,0x28,0x36,0xaf,0xa0,0x95,0xae,0x20,0x8d,
+ 0x04,0x20,0xcd,0xa4,0x07,0x96,0x32,0xbe,0x64,0xe6,0x49,0xd3,0xc7,0xbb,0xa4,0xa0,0xb6,0x42,0x3b,0xe9,0x4f,0xc5,0x37,0xc3,0x2d,0x0a,0x31,0xf0,0x5d,0x52,0x1f,0xae,0xf3,0x5e,0x20,0x8d,
+ 0x04,0x20,0xcd,0xa6,0x95,0x5f,0xa1,0x5e,0x65,0xc4,0x78,0x9f,0x3d,0x8a,0x42,0x28,0x56,0xa1,0x46,0xbd,0x2c,0x20,0xe2,0x7d,0xdd,0x73,0x73,0xaa,0x80,0x91,0x92,0x3d,0x43,0x86,0x20,0x8d,
+ 0x04,0x20,0xcd,0xa9,0xb2,0x3f,0x79,0x82,0x91,0xed,0x07,0xeb,0x1a,0x43,0x2b,0xab,0x83,0x67,0x22,0xb7,0xbd,0x57,0x7e,0x73,0x02,0xda,0x45,0xaa,0x9c,0x83,0xdd,0x73,0x66,0xf1,0x20,0x8d,
+ 0x04,0x20,0xcd,0xac,0xf0,0x95,0xf8,0x64,0xb2,0x26,0x2a,0xcb,0x2b,0xb3,0x95,0xeb,0xcc,0xf7,0xa3,0xe6,0xfe,0xf9,0x33,0x6d,0xe0,0xcb,0x8d,0x2e,0xdf,0x87,0xc0,0xfb,0xf6,0x01,0x20,0x8d,
+ 0x04,0x20,0xcd,0xf7,0xf2,0xdb,0xa1,0xe1,0x01,0x39,0xec,0x64,0x50,0x08,0x5a,0x37,0x6b,0x6f,0xbe,0x03,0x3e,0x7f,0x74,0x1c,0x12,0x00,0x55,0xc4,0x38,0xa2,0x52,0x21,0x4e,0xbc,0x20,0x8d,
+ 0x04,0x20,0xcd,0xc1,0x44,0x8d,0xf2,0xe8,0x89,0xeb,0x55,0x5e,0xc2,0x82,0x58,0x53,0x06,0x98,0x56,0x8e,0x10,0x55,0x7b,0x94,0x9f,0xbb,0x05,0xba,0x60,0x84,0x39,0xad,0xdd,0x36,0x20,0x8d,
+ 0x04,0x20,0xcd,0xc3,0x0d,0xab,0xe7,0xb4,0xac,0xed,0x17,0x7f,0xe0,0x0f,0x26,0x2c,0xca,0x78,0xd3,0xf4,0xd3,0xef,0xc6,0x0d,0x48,0xaa,0xb9,0x80,0x1c,0x7d,0xf6,0xac,0xba,0xc8,0x20,0x8d,
+ 0x04,0x20,0xcd,0xc5,0xa0,0xe6,0x90,0x1a,0x90,0xf7,0xde,0x67,0xb8,0x4d,0xf6,0xfc,0x9b,0x5e,0x5a,0x11,0x36,0xff,0xce,0x11,0x35,0x9e,0xd5,0x4d,0x24,0x1b,0x47,0xb5,0xde,0x9d,0x20,0x8d,
+ 0x04,0x20,0xcd,0xc4,0xdc,0xad,0xda,0x22,0x0c,0x54,0x1b,0xde,0xad,0xf1,0x7e,0x6f,0x2d,0x67,0xbc,0x0e,0xa3,0x88,0x25,0x10,0xe9,0x60,0x46,0x18,0xcd,0x91,0x94,0xbc,0xa9,0xdb,0x20,0x8d,
+ 0x04,0x20,0xcd,0xd5,0xc0,0xc2,0x24,0x19,0x37,0x36,0xac,0x3f,0xc3,0x12,0xb9,0x3b,0x14,0x78,0xb7,0xf8,0xea,0xb0,0x27,0xb9,0xf7,0x4e,0x3b,0x68,0xb3,0x06,0x18,0xa4,0x76,0x11,0x20,0x8d,
+ 0x04,0x20,0xcd,0xe0,0x37,0xd3,0x86,0x65,0x5b,0xda,0xe7,0x4a,0x1a,0xc7,0xe1,0x6a,0x56,0x80,0xf2,0xa6,0xd8,0xfa,0x16,0x6d,0x2b,0x77,0xb5,0xbe,0xf5,0xb7,0x46,0xb3,0x57,0x81,0x20,0x8d,
+ 0x04,0x20,0xcd,0xe0,0x4f,0x10,0xb0,0xe3,0x87,0x91,0xe9,0x95,0xc1,0x0c,0xb8,0x4d,0xda,0x11,0x4c,0x60,0x19,0xc8,0x11,0x85,0x55,0xd4,0x40,0xe3,0x2f,0x81,0x1b,0x9f,0x49,0x11,0x20,0x8d,
+ 0x04,0x20,0xcd,0xf2,0x5c,0xef,0x3c,0x68,0x43,0xfa,0x6d,0x05,0x15,0x74,0xfe,0xdc,0x8d,0xcb,0xc2,0xdc,0xd2,0x84,0xc9,0x16,0x10,0xa4,0x45,0x8b,0x28,0xfb,0xce,0x18,0x71,0xff,0x20,0x8d,
+ 0x04,0x20,0xcd,0xf3,0x03,0x96,0xc8,0xd9,0x86,0x72,0x52,0xec,0xc8,0x0c,0xfe,0x02,0xdc,0x02,0xa5,0xe1,0x21,0x1a,0x5a,0xd6,0x90,0x3c,0x55,0x81,0xe7,0x08,0xdd,0x6a,0x95,0xc6,0x20,0x8d,
+ 0x04,0x20,0xce,0x38,0x92,0x48,0xed,0x7d,0xf6,0x8d,0xd9,0x22,0x84,0x43,0xaf,0xc0,0x44,0x07,0x20,0x49,0xbc,0x99,0xf7,0x6c,0xf7,0x08,0x13,0xec,0xa0,0xd1,0x67,0x5c,0xb9,0x1d,0x20,0x8d,
+ 0x04,0x20,0xce,0x04,0x23,0x57,0x2e,0x51,0x1e,0xe6,0x93,0x7e,0xa2,0xe9,0xfe,0x2f,0xbc,0x00,0xf8,0x39,0xc2,0xbf,0x06,0x82,0x9c,0x8a,0xae,0x7a,0x7d,0x13,0x76,0xe7,0x08,0xbe,0x20,0x8d,
+ 0x04,0x20,0xce,0x07,0x94,0x38,0xe0,0x08,0x29,0x6c,0x04,0xe1,0x82,0x88,0x66,0xf0,0x7d,0x8f,0x35,0xdf,0x85,0x85,0x02,0x1b,0xbf,0x14,0x13,0x15,0xc6,0x14,0xe9,0xb6,0xee,0x5c,0x20,0x8d,
+ 0x04,0x20,0xce,0x09,0x32,0xa8,0x0d,0xba,0x04,0x57,0xfa,0x73,0xec,0xc8,0x65,0x5d,0x6a,0x76,0x7b,0x15,0xe9,0x1b,0xcc,0x85,0xe3,0xe3,0x10,0x46,0x40,0x7c,0x58,0x2a,0x99,0x32,0x20,0x8d,
+ 0x04,0x20,0xce,0x12,0x57,0x51,0x1b,0x3c,0x5f,0x2b,0x6c,0xae,0xe3,0xad,0x78,0xe6,0x62,0x59,0x4b,0x03,0xc7,0x5e,0xb0,0xc8,0x34,0x66,0xb9,0xed,0xea,0xb3,0x52,0x26,0x45,0xd1,0x20,0x8d,
+ 0x04,0x20,0xce,0x15,0x4e,0x05,0x5e,0x78,0xd0,0x55,0x83,0x5e,0x3e,0x18,0xf4,0x1b,0x13,0x5d,0xa5,0x7e,0x1e,0x60,0x48,0x9b,0xcd,0x9c,0xee,0x08,0xc3,0x1a,0xf2,0x65,0x72,0x6b,0x20,0x8d,
+ 0x04,0x20,0xce,0x17,0xc5,0x14,0x89,0x96,0xe7,0xca,0x90,0xb2,0xad,0x21,0x18,0x39,0xe1,0x75,0xe2,0xcc,0xce,0x94,0x6f,0xb4,0x94,0x09,0x5c,0xa1,0xf7,0x67,0xd3,0x8c,0xb7,0xc6,0x20,0x8d,
+ 0x04,0x20,0xce,0x1e,0x75,0x35,0x71,0xe3,0x8d,0x15,0x35,0x3d,0x9f,0xb9,0x0c,0x03,0x5c,0xf2,0x86,0x00,0x48,0xc8,0x8b,0x78,0x82,0x44,0x55,0x24,0x8c,0x68,0x3d,0x79,0xcd,0xe4,0x20,0x8d,
+ 0x04,0x20,0xce,0x22,0xe1,0xd1,0x91,0x35,0x4c,0xf4,0x34,0xf8,0x30,0x51,0xd6,0x39,0x6f,0x09,0xd7,0xe6,0x8c,0xb2,0xda,0xed,0x39,0xf7,0xaf,0xa3,0x07,0xeb,0x63,0xaa,0xfb,0x43,0x20,0x8d,
+ 0x04,0x20,0xce,0x2a,0x6a,0x31,0x5d,0x78,0x80,0xd3,0xf3,0x2a,0xde,0x7f,0xa3,0x2c,0x85,0xb9,0x82,0x3e,0x0d,0xf8,0x3c,0x83,0x9a,0xc1,0x72,0x7e,0x8d,0x27,0x82,0xdb,0xfa,0xe2,0x20,0x8d,
+ 0x04,0x20,0xce,0x30,0x42,0xaf,0xb4,0x6b,0x6d,0xf5,0xb6,0x29,0x59,0x8b,0x8a,0xb7,0x13,0xb7,0x11,0x8e,0x37,0x82,0xc7,0x42,0x19,0x69,0xb4,0x1a,0x4f,0xfb,0x3f,0xef,0x95,0x48,0x20,0x8d,
+ 0x04,0x20,0xce,0x5a,0xd3,0x42,0xc2,0x7f,0x8d,0xde,0xd9,0x49,0x37,0x75,0x1c,0x91,0xc6,0x56,0xca,0x21,0xbd,0xcf,0xc2,0xf7,0x97,0xc4,0xfa,0x2e,0x75,0xef,0x37,0x0a,0xaf,0x25,0x20,0x8d,
+ 0x04,0x20,0xce,0x5b,0x31,0x95,0xe2,0x0e,0xe4,0xf2,0xf5,0xe1,0xd9,0xb4,0x61,0x66,0xda,0x6a,0x58,0x7b,0x59,0x52,0x35,0xe7,0xb9,0xd8,0x39,0x49,0xc2,0x04,0x49,0x07,0x37,0xcf,0x20,0x8d,
+ 0x04,0x20,0xce,0x64,0x8f,0x86,0x34,0x2d,0xb0,0xb0,0xf7,0x56,0xd8,0x44,0x18,0x55,0xfd,0x4d,0xfd,0x58,0xa0,0x27,0xf1,0x88,0x88,0x17,0x1d,0x49,0xee,0xf4,0x1e,0x09,0x48,0x1d,0x20,0x8d,
+ 0x04,0x20,0xce,0x66,0x7c,0xfb,0x9c,0x38,0xd3,0x76,0xec,0x7d,0xe5,0xe2,0x52,0x7e,0x4d,0x6d,0x30,0x79,0x5f,0x42,0x35,0x31,0xc5,0x40,0x3e,0x1b,0xc5,0xda,0x7c,0x14,0x6f,0x56,0x20,0x8d,
+ 0x04,0x20,0xce,0x68,0x87,0xa5,0xc6,0x11,0x6b,0x2f,0xd3,0x05,0x39,0x4c,0x49,0x10,0xee,0x6f,0xaa,0x82,0x18,0xc0,0xdc,0x85,0xe1,0x7b,0x5e,0xeb,0x75,0xbe,0xbe,0x0c,0x55,0xb1,0x20,0x8d,
+ 0x04,0x20,0xce,0x68,0xbd,0x5e,0xb8,0x3c,0x2a,0x04,0xb4,0x7e,0xc9,0x65,0xa1,0xe5,0x69,0x73,0xdf,0x7e,0xae,0x4f,0xd5,0xe7,0xc8,0x00,0x7f,0xd7,0x7c,0xa7,0xde,0x35,0xdd,0xb3,0x20,0x8d,
+ 0x04,0x20,0xce,0x6f,0xc8,0xeb,0x11,0x55,0xe8,0xbd,0x28,0xda,0x72,0x5c,0x44,0x26,0xc2,0x26,0xe4,0xa5,0xaf,0x96,0x0a,0x94,0x9b,0x76,0xef,0x8c,0xa6,0xdd,0x3b,0x57,0xb7,0x9b,0x20,0x8d,
+ 0x04,0x20,0xce,0x70,0xfd,0x6a,0xfe,0x8e,0x33,0x84,0x37,0x9b,0x7a,0xe6,0xaa,0x3f,0xc9,0x52,0x3b,0x86,0x85,0xc7,0xf0,0xac,0xfa,0x0a,0x42,0xbf,0x41,0xb6,0x0f,0x53,0x73,0xa0,0x20,0x8d,
+ 0x04,0x20,0xce,0x73,0x9c,0xe7,0x39,0xe8,0x65,0xa8,0x35,0xc8,0x4d,0xd6,0x7b,0x8f,0x68,0x0d,0xd0,0xf0,0x24,0x92,0x33,0xe3,0x05,0xc6,0xf3,0x79,0x43,0x83,0x5b,0x99,0x10,0x0b,0x20,0x8d,
0x06,0x10,0xfc,0x32,0x17,0xea,0xe4,0x15,0xc3,0xbf,0x98,0x08,0x14,0x9d,0xb5,0xa2,0xc9,0xaa,0x20,0x8d,
0x06,0x10,0xfc,0xc7,0xbe,0x49,0xcc,0xd1,0xdc,0x91,0x31,0x25,0xf0,0xda,0x45,0x7d,0x08,0xce,0x20,0x8d,
0x06,0x10,0xfc,0xdc,0x73,0xae,0xb1,0xa9,0x1b,0xf8,0xd4,0xc2,0x08,0x11,0xa4,0xc7,0xc3,0x4e,0x20,0x8d,
};
static const uint8_t chainparams_seed_test[] = {
- 0x04,0x20,0xd7,0x13,0xfe,0x00,0xf0,0xf1,0x07,0xcb,0x30,0xb1,0x31,0xc7,0x68,0xbb,0x05,0xca,0x18,0xb5,0x1d,0xb1,0x0f,0xf2,0x7e,0x66,0xdb,0xaa,0xf4,0x05,0xaf,0x37,0x0a,0x62,0x47,0x9d,
- 0x04,0x20,0xd1,0x71,0xfe,0x4c,0x9e,0xe9,0x99,0xb1,0x6c,0xd5,0xdd,0x3a,0xc3,0xd8,0x74,0x1d,0x42,0x32,0x9f,0xca,0xe9,0x47,0x9e,0x18,0x74,0x43,0x22,0xb9,0xa5,0x31,0xb9,0x66,0x47,0x9d,
- 0x04,0x20,0xd2,0xe4,0xd1,0x40,0x65,0x5d,0x95,0xaf,0xe8,0x67,0xc0,0xe3,0x72,0xfd,0x0a,0x2e,0x35,0xb7,0xbd,0xac,0x67,0x78,0x36,0xe1,0xb8,0xba,0x30,0xcf,0x2e,0x05,0xdd,0x9d,0x47,0x9d,
- 0x04,0x20,0xde,0xdd,0xe8,0x01,0x03,0x98,0x3f,0x2d,0x3d,0x8b,0x99,0x27,0xea,0xe1,0xa3,0xde,0xff,0x50,0x30,0xc2,0x41,0x4e,0x7e,0x72,0x24,0x3d,0xad,0x78,0x3c,0xab,0x12,0x67,0x47,0x9d,
- 0x04,0x20,0xdb,0x9d,0xe0,0xc8,0x5d,0x65,0x4b,0xe0,0x7b,0x0f,0x63,0x80,0x85,0x21,0x73,0x07,0x94,0x0f,0xb0,0x23,0x38,0xec,0x78,0xb6,0x07,0xa1,0xd2,0xb0,0x82,0xf8,0x20,0xea,0x47,0x9d,
- 0x04,0x20,0xdb,0xc9,0xb2,0xe1,0x4b,0x43,0xf1,0xc9,0x3d,0xea,0x51,0x9a,0x71,0x6b,0x4a,0x15,0xe7,0x3e,0xfe,0x8b,0x24,0x7a,0xaa,0xff,0x53,0xf7,0xfc,0x10,0xc6,0xcc,0x14,0x88,0x47,0x9d,
- 0x04,0x20,0xe5,0x38,0xc1,0x67,0x52,0x2d,0x6f,0x2f,0xbe,0xc2,0xb3,0x45,0x2b,0x19,0x8c,0x10,0xf3,0x09,0xe5,0x37,0xfe,0x66,0x57,0x6f,0x7a,0x4d,0x78,0xf8,0x50,0x41,0xd6,0x90,0x47,0x9d,
- 0x04,0x20,0xed,0x76,0x8d,0x28,0xb0,0x44,0x2c,0xff,0xf4,0xd9,0x6a,0x5c,0xf9,0xca,0x5f,0x81,0xa2,0x23,0x48,0x82,0x24,0x2e,0xfc,0xbe,0x0a,0x1e,0xf9,0x02,0x43,0x31,0x37,0xf5,0x47,0x9d,
- 0x04,0x20,0xee,0x57,0x1b,0xab,0xd0,0xd7,0x27,0xca,0xe7,0xaa,0xe2,0x09,0xf3,0x4e,0x80,0x90,0xd2,0x0a,0x9d,0xc4,0x59,0xd0,0xdc,0xa1,0x97,0x09,0x4e,0x2f,0xfe,0x9f,0xa8,0x0a,0x47,0x9d,
- 0x04,0x20,0xf7,0xe5,0xb0,0x17,0xdc,0x21,0xed,0xfb,0xb6,0xf5,0xe6,0xb4,0x0b,0xb3,0xf3,0x6c,0xb8,0x3f,0x2a,0x93,0x89,0x66,0x2f,0x05,0x30,0xdf,0xfa,0xdf,0xf2,0x1b,0x52,0x78,0x47,0x9d,
- 0x04,0x20,0xf0,0x38,0xe6,0xe3,0xbb,0x4d,0x17,0x56,0xd0,0xae,0xf6,0xf4,0xa9,0x99,0x96,0xa9,0xe8,0xfc,0xfb,0x76,0x08,0xed,0x7f,0xb7,0xf0,0xa0,0xd3,0x8d,0xea,0x18,0x87,0x8c,0x47,0x9d,
- 0x04,0x20,0xf1,0x67,0x83,0x6d,0xa7,0x17,0xa6,0xdd,0x1f,0x19,0x5c,0xbd,0x92,0x8e,0x45,0x0c,0x5c,0x2c,0x9d,0x57,0x98,0xe1,0x46,0x40,0x3d,0x87,0x30,0x02,0x9f,0x1d,0x88,0xde,0x47,0x9d,
- 0x04,0x20,0xff,0x7b,0xca,0x5b,0xa3,0x4c,0x68,0x7d,0xf1,0x3d,0x18,0xef,0xb4,0x3e,0x39,0x34,0x0d,0x9c,0x3c,0x49,0x9b,0xe7,0x67,0x2c,0x78,0x61,0x42,0x67,0x62,0xd0,0x15,0xb5,0x47,0x9d,
- 0x04,0x20,0xff,0xbc,0xb7,0x65,0x60,0x0d,0xc1,0x04,0xbc,0x30,0x95,0x67,0xe9,0x37,0x62,0xf7,0x5b,0xe3,0x2a,0xd6,0x3b,0xaf,0x8a,0x98,0xc9,0xfb,0x4b,0x66,0xb2,0xdc,0x13,0xc0,0x47,0x9d,
- 0x04,0x20,0xf8,0x57,0x5e,0x80,0x2d,0xc4,0xc6,0x5e,0x7f,0x15,0x09,0xee,0xcc,0x29,0xf1,0x65,0x53,0x1c,0x41,0xc1,0xf7,0x51,0xa4,0xb0,0x76,0x86,0xe3,0x10,0x24,0x4d,0xd2,0x11,0x47,0x9d,
- 0x04,0x20,0xfd,0x74,0x90,0x71,0x06,0xbf,0x2b,0xdc,0x69,0x31,0xf2,0x63,0x1f,0x18,0x17,0x71,0xd2,0x75,0xe4,0xf5,0x35,0x89,0xc0,0x55,0x71,0x05,0xc4,0x77,0x64,0xbf,0x20,0x36,0x47,0x9d,
- 0x04,0x20,0xfe,0x4c,0x16,0x4f,0x37,0x75,0xb4,0xe2,0x54,0x7d,0x00,0x21,0x39,0x3a,0x2c,0xb7,0xe8,0x9a,0xf3,0x2f,0x8a,0xf6,0xe4,0x6b,0x7d,0xea,0x18,0xc3,0xc3,0x86,0x57,0xc5,0x47,0x9d,
- 0x04,0x20,0x00,0xe5,0x30,0x05,0x39,0xf9,0x05,0xac,0x6d,0x33,0xe5,0xb4,0x3a,0xd1,0x8c,0x75,0xb3,0x5f,0x9b,0xcc,0xd1,0x76,0xa0,0x24,0x84,0x49,0x4b,0x40,0x67,0xee,0x4d,0x93,0x47,0x9d,
- 0x04,0x20,0x01,0x25,0x8f,0x4c,0xb4,0x28,0x06,0xaa,0x4f,0xc5,0x5d,0x34,0x19,0x40,0xcd,0xb6,0xb9,0xad,0x52,0x3a,0xc3,0x52,0x05,0x9a,0x97,0x5e,0x69,0x9a,0x2a,0x66,0xde,0x48,0x47,0x9d,
- 0x04,0x20,0x02,0xee,0xed,0xe8,0x3d,0x20,0xd1,0xb0,0xb7,0x44,0xd6,0xb9,0x08,0x9b,0x13,0x35,0xee,0xf4,0x0b,0x8a,0x6e,0x10,0xfa,0xbc,0x75,0x14,0xcb,0x28,0xd4,0x40,0x44,0x3a,0x47,0x9d,
- 0x04,0x20,0x03,0x88,0x08,0xcf,0x7c,0xa3,0x1c,0xe6,0xd4,0x7a,0x50,0x61,0x1d,0x84,0x5c,0x95,0x89,0x4f,0x03,0x8c,0x91,0xf4,0x67,0xf2,0x4a,0xc4,0x2a,0x44,0x6e,0x47,0xc8,0xae,0x47,0x9d,
- 0x04,0x20,0x03,0xe3,0x9a,0xa7,0xe7,0x30,0xa7,0x21,0x93,0x8c,0x52,0x76,0x4b,0x43,0x7d,0x35,0x70,0xa9,0x3d,0x35,0x54,0x11,0x83,0x1b,0xe1,0x7b,0x6d,0xd9,0xaa,0xb2,0x26,0x9b,0x47,0x9d,
- 0x04,0x20,0x05,0x9e,0xaf,0x67,0x77,0x31,0xef,0xe7,0x65,0xd4,0x3b,0x86,0x2c,0x0c,0x10,0x9c,0x7d,0x4c,0xe4,0x2d,0xb7,0x05,0x12,0x51,0x17,0xfb,0x15,0x47,0xdd,0xd7,0x5b,0x0e,0x47,0x9d,
- 0x04,0x20,0x06,0x30,0xd8,0x03,0x34,0x16,0x0f,0xa4,0x8f,0xb1,0x21,0xc4,0x53,0x19,0x87,0xa3,0x60,0xf1,0xdb,0x2b,0x09,0xf2,0x18,0x1b,0x1e,0x5a,0x78,0x29,0xe7,0x4e,0x12,0x7e,0x47,0x9d,
- 0x04,0x20,0x0e,0x90,0xa0,0x77,0x60,0x80,0x95,0x5e,0x1a,0x5f,0xb3,0x1c,0x6d,0x87,0x11,0x20,0x35,0x52,0xe5,0x9d,0x7f,0xf0,0x4d,0xec,0x68,0x30,0xa4,0xca,0xd5,0xaf,0x0e,0x20,0x47,0x9d,
- 0x04,0x20,0x09,0x3f,0x9b,0xec,0xe7,0xf0,0xd6,0x03,0xba,0x2b,0xac,0xa3,0x13,0x41,0x9c,0x70,0x0e,0x58,0x9a,0x0c,0xd4,0xc3,0x66,0x84,0x7c,0xa7,0x76,0xd9,0xd3,0xa5,0xff,0xba,0x47,0x9d,
- 0x04,0x20,0x0a,0xe8,0xaf,0x6a,0xc9,0xd7,0x03,0x2a,0x8e,0xc7,0xe7,0xd9,0x47,0x77,0x87,0x3d,0xa4,0x09,0xa8,0xb3,0x44,0x2e,0x4a,0xcf,0xaa,0x08,0x3e,0x79,0x4d,0x2e,0x25,0xfd,0x47,0x9d,
- 0x04,0x20,0x0d,0x02,0xcf,0x15,0x0e,0x79,0x72,0xab,0xc2,0x25,0xbf,0xab,0x07,0xa1,0xc4,0xe8,0x0e,0xb3,0xe2,0x81,0xcf,0x7e,0xe3,0x4a,0x10,0xc7,0x0e,0x0e,0xbd,0xad,0x32,0x20,0x47,0x9d,
- 0x04,0x20,0x1e,0xc5,0x90,0x07,0x29,0x4f,0x7e,0xb3,0x46,0x51,0xe9,0x81,0x65,0x24,0x7f,0xae,0xcd,0x96,0xc6,0x00,0xfe,0x70,0x8c,0xc1,0x8a,0xe2,0xe3,0x80,0x48,0x40,0xab,0x10,0x47,0x9d,
- 0x04,0x20,0x18,0xd3,0xc1,0x52,0xa1,0xde,0xaa,0x4e,0x88,0xf3,0x7f,0x92,0x09,0xcc,0x43,0x6b,0x59,0x76,0x3d,0xce,0x2a,0x66,0x7c,0xa3,0xf3,0x39,0xaf,0x73,0xcf,0xf8,0x83,0x89,0x47,0x9d,
- 0x04,0x20,0x1c,0x0e,0x75,0xca,0x45,0xb3,0x0f,0xb3,0x7b,0x27,0xb5,0xde,0x22,0x86,0xde,0xe5,0xf3,0xd8,0x95,0x0a,0x11,0x96,0x86,0x84,0xee,0xbd,0x7a,0x04,0xd7,0x90,0xca,0x04,0x47,0x9d,
- 0x04,0x20,0x1c,0x66,0x71,0x60,0x3c,0xbf,0x22,0x32,0x91,0x56,0xe9,0xbf,0x74,0xb8,0xd7,0x47,0xc1,0x07,0x2e,0x88,0x59,0xa8,0xb0,0x9a,0xd5,0x93,0x09,0xb6,0xdb,0x6e,0x40,0x6a,0x47,0x9d,
- 0x04,0x20,0x1d,0x83,0xcf,0x89,0x90,0x06,0xa6,0x97,0xb2,0xa9,0x01,0x01,0x1f,0x98,0x62,0x04,0x65,0xa5,0x93,0x3e,0x6a,0x08,0x53,0xa3,0x90,0x2e,0xb5,0x02,0x1e,0x78,0x98,0x3d,0x47,0x9d,
- 0x04,0x20,0x27,0xe6,0xa8,0x97,0xbc,0x69,0xb7,0x0e,0xd4,0x4d,0xe9,0x9b,0xff,0xe6,0xc9,0xb3,0x3f,0xc5,0xa8,0xa0,0xaf,0x19,0x61,0xd2,0xfb,0x7d,0x5c,0xdf,0x62,0xb0,0x36,0xe6,0x47,0x9d,
- 0x04,0x20,0x24,0xe9,0x86,0x63,0x9f,0x96,0xe1,0x42,0x3e,0xa3,0x03,0x9d,0xfd,0x23,0xa4,0xeb,0x05,0xfa,0x3a,0xb1,0xcd,0x3a,0xce,0x24,0xbd,0x87,0x99,0x65,0xd9,0x19,0x75,0xf1,0x47,0x9d,
- 0x04,0x20,0x28,0x50,0xc2,0x49,0xb8,0x3e,0x68,0x10,0xe6,0x02,0xdd,0x01,0x42,0xe5,0x41,0xc1,0x58,0xd5,0x5e,0xb8,0x7b,0xae,0x0a,0x90,0x14,0x0f,0xe3,0x97,0xe4,0xfa,0x2b,0xaf,0x47,0x9d,
- 0x04,0x20,0x2e,0x43,0x1b,0x30,0xd6,0x62,0x9d,0xf8,0x50,0x8b,0x89,0xcb,0x49,0x2a,0x7b,0x42,0x40,0x10,0x0b,0xfe,0xcd,0xfe,0x6e,0xe8,0x65,0x89,0x2a,0xc3,0x8d,0x49,0xf2,0x2a,0x47,0x9d,
+ 0x05,0x20,0xd6,0x21,0xcb,0x8a,0xd9,0xa8,0x74,0xa9,0xe0,0x48,0xea,0xde,0xc0,0xea,0x1b,0x6a,0xfd,0x08,0x62,0xc1,0xfb,0x62,0x5f,0x15,0x42,0x99,0xce,0x0f,0xaf,0x73,0x59,0x35,0x00,0x00,
+ 0x05,0x20,0xe1,0xbb,0x4a,0x85,0x55,0x47,0x4b,0x5c,0x0d,0x13,0x22,0xab,0x90,0x25,0x63,0x9e,0x4d,0x48,0xba,0x30,0x4d,0x1f,0x4b,0x4d,0x98,0x64,0x52,0xb7,0x43,0xc2,0x4b,0x3b,0x00,0x00,
+ 0x05,0x20,0x2e,0xed,0xf9,0x38,0x8f,0x96,0x3e,0x98,0x58,0xbf,0x1a,0xdd,0xc8,0xbb,0x50,0x56,0x00,0xf3,0x69,0x71,0x0e,0x86,0xa5,0x56,0xc5,0xb5,0x30,0xc3,0x02,0x15,0x5a,0x60,0x00,0x00,
+ 0x05,0x20,0x6c,0x7e,0xd7,0x65,0x61,0xef,0x2f,0x5d,0xbb,0x26,0xe2,0xa5,0x51,0x47,0x6e,0x2e,0x4b,0x62,0x92,0x83,0xd3,0x7f,0x74,0x27,0x16,0xac,0xf5,0xa4,0x5f,0x20,0x5f,0xe0,0x00,0x00,
+ 0x05,0x20,0x77,0x93,0xb0,0xef,0x61,0xae,0xbd,0x59,0x9d,0xd0,0xca,0x71,0xb3,0xfc,0x1b,0x84,0xa9,0x00,0xcc,0x24,0xdd,0x16,0x04,0xb1,0x39,0x92,0xf9,0xba,0x82,0x18,0x41,0x31,0x00,0x00,
+ 0x05,0x20,0x70,0xa0,0x87,0x84,0x37,0xbf,0x1e,0x07,0x3c,0xca,0x50,0x5a,0x9d,0x6f,0x88,0x27,0xdc,0xfc,0xc6,0x62,0x07,0x4d,0x34,0x5a,0x3e,0x70,0xc1,0xb3,0xef,0x51,0xc9,0xa4,0x00,0x00,
+ 0x05,0x20,0x8e,0xb2,0x37,0xa8,0x52,0x59,0x7e,0x4e,0x4f,0x45,0x61,0x97,0x4e,0x76,0xe7,0x2d,0xbb,0x93,0x51,0xf3,0x38,0xcf,0xd7,0x88,0x96,0x1b,0xbc,0x90,0x26,0x8c,0xa9,0x06,0x00,0x00,
+ 0x05,0x20,0xb9,0x85,0x34,0xf2,0x44,0x76,0xdc,0x59,0x4d,0x18,0x63,0xb0,0x4a,0x66,0x1f,0xe0,0x6a,0x31,0xc4,0x31,0xf2,0x66,0x80,0x78,0x91,0x70,0xd6,0x5e,0xd4,0x1b,0x16,0x7a,0x00,0x00,
+ 0x05,0x20,0xc7,0x49,0xe0,0x43,0x3c,0x4a,0x92,0x97,0x11,0x0f,0x75,0xed,0x48,0xe4,0x5a,0x4c,0x4b,0x5f,0x21,0x75,0x28,0x47,0x06,0x26,0x0a,0xef,0xf8,0xc0,0x04,0x1d,0xa0,0x22,0x00,0x00,
+ 0x05,0x20,0xc1,0x36,0x04,0xd7,0x53,0x33,0xe1,0xf4,0xd6,0xb9,0xcb,0x7b,0x6b,0x86,0x6c,0x1e,0xe7,0x72,0x57,0x60,0xbc,0x86,0xb0,0x74,0x2a,0x7b,0x82,0x44,0x58,0x42,0xc2,0x53,0x00,0x00,
+ 0x04,0x20,0xfb,0xcf,0xf6,0x44,0x5a,0xe4,0xc9,0xdf,0xb2,0xaf,0x78,0x12,0x55,0x15,0x3c,0x62,0xbf,0x9a,0x67,0x93,0x25,0x15,0x86,0x4f,0x76,0x33,0xc6,0xfb,0x7a,0xaf,0x68,0xc8,0x47,0x9d,
+ 0x04,0x20,0x0a,0xb2,0xef,0xb1,0xf7,0xa0,0x23,0xf8,0x9e,0x41,0x45,0x86,0x0b,0xc0,0x58,0x62,0x2e,0x08,0x88,0x23,0x60,0x77,0x21,0x82,0x13,0xaf,0xb0,0x1d,0x4a,0xb0,0x9c,0xf3,0x47,0x9d,
+ 0x04,0x20,0x1f,0xb7,0x52,0xf3,0xb3,0x07,0x04,0x78,0x92,0xcd,0x8d,0x31,0x5c,0x3d,0x9f,0xc0,0x4b,0x79,0xd2,0x7b,0xd7,0xc5,0x19,0xc3,0xd0,0x2e,0x23,0x51,0x5a,0xfc,0xdf,0x22,0x47,0x9d,
+ 0x04,0x20,0x21,0x60,0x5b,0x7a,0xa9,0x87,0xcc,0xf3,0x60,0xee,0x95,0x37,0x02,0xeb,0x87,0x94,0x8f,0x77,0x84,0xe0,0xc7,0x35,0xe1,0x0a,0x46,0xcf,0x78,0xa2,0x63,0x82,0xad,0xa8,0x47,0x9d,
0x04,0x20,0x36,0x3c,0xd4,0x1f,0x8f,0x63,0xfa,0x49,0x62,0xb5,0x69,0xd6,0x9f,0x42,0xaa,0xfe,0x54,0x14,0xd1,0xd2,0xb2,0xae,0x52,0xe1,0x08,0x7e,0xc6,0x15,0x56,0x45,0xbd,0xb3,0x47,0x9d,
- 0x04,0x20,0x38,0x3d,0xac,0xa2,0x19,0x80,0xdc,0x61,0xff,0xb9,0x37,0xd6,0x53,0xf0,0xb0,0x89,0xb6,0x14,0x33,0x62,0x7c,0x33,0x8a,0x3d,0xdc,0xdd,0xba,0xfb,0x70,0xa4,0x6f,0x9b,0x47,0x9d,
- 0x04,0x20,0x38,0x04,0x94,0x99,0x3a,0x60,0x61,0x08,0xcc,0xf9,0x43,0x18,0x8f,0x01,0xb5,0x43,0x7e,0x35,0xa5,0x27,0x2a,0xf6,0x85,0x78,0x81,0x36,0xed,0xb6,0xb0,0xd2,0xac,0x77,0x47,0x9d,
- 0x04,0x20,0x38,0x54,0xfe,0xde,0xcf,0x83,0xb9,0x06,0x7f,0xaa,0x79,0x96,0x58,0x89,0x78,0x45,0x29,0x51,0x9a,0xbf,0x64,0xd1,0x02,0xe2,0x5f,0x74,0x15,0x2e,0x0d,0x8f,0x81,0x9e,0x47,0x9d,
- 0x04,0x20,0x3c,0x0c,0xec,0x7b,0x47,0x74,0x12,0xcc,0xef,0xe1,0x88,0xcb,0x57,0x11,0xd5,0xd8,0x91,0x7e,0x95,0x17,0x0c,0x12,0xe2,0x46,0x7c,0xc0,0xe3,0xe3,0x92,0x26,0xeb,0x85,0x47,0x9d,
- 0x04,0x20,0x3d,0x42,0xc6,0x66,0xb0,0x8b,0xcc,0xf9,0x6a,0xfd,0xa7,0x10,0xfe,0x2a,0x45,0xd9,0x3a,0xcd,0x15,0xa4,0x00,0xbf,0xde,0x1a,0x6d,0x3a,0x5b,0xa8,0xc8,0x95,0x6a,0x3c,0x47,0x9d,
- 0x04,0x20,0x3d,0xb7,0x5c,0xbf,0x7a,0xb7,0x0f,0xe3,0x21,0xeb,0xa1,0x3c,0x8b,0xf3,0x9d,0x72,0x3d,0x69,0xfc,0xcc,0x22,0xa5,0x1c,0xb4,0x3f,0x98,0xcb,0x63,0xa8,0xc8,0x9f,0xcc,0x47,0x9d,
- 0x04,0x20,0x40,0xc7,0x1f,0x78,0x96,0x51,0xc8,0xd4,0x54,0x0f,0x32,0x00,0xda,0x0d,0x2a,0xb4,0x04,0xff,0x0e,0xf3,0x94,0x8d,0xf4,0x5e,0x23,0x74,0xfa,0x0c,0xfa,0x87,0xfb,0x3b,0x47,0x9d,
- 0x04,0x20,0x43,0x30,0x0d,0xf9,0x04,0xba,0x10,0x88,0x45,0x56,0xa5,0xee,0x22,0x1d,0xb5,0xe2,0x8d,0xd9,0x1e,0x68,0x8d,0x87,0xaa,0x9b,0x82,0x6a,0x71,0xe5,0x95,0x2b,0x79,0xf6,0x47,0x9d,
- 0x04,0x20,0x45,0x0e,0x7a,0x38,0x4d,0x97,0xc8,0xd9,0xc7,0x2b,0xbc,0xae,0xa9,0xe3,0x3a,0x40,0x65,0xf3,0xc0,0xc8,0x31,0xab,0xe9,0x02,0x99,0x82,0xb2,0xa0,0x79,0x60,0x92,0xed,0x47,0x9d,
- 0x04,0x20,0x4a,0x3b,0x66,0x48,0xee,0x55,0x05,0xed,0x91,0x14,0x5e,0x57,0x64,0xeb,0x23,0xab,0x56,0x83,0x56,0x36,0x2d,0x6a,0x2f,0xf8,0x28,0x11,0x37,0x3a,0x73,0x76,0x2e,0x6a,0x47,0x9d,
+ 0x04,0x20,0x3d,0x90,0xfc,0xa1,0xd3,0x12,0xee,0x6d,0xac,0x83,0x6f,0x70,0x9e,0xa7,0xcd,0xf3,0xd5,0x13,0x35,0x8b,0x54,0x9d,0x9c,0xae,0x33,0x5b,0x56,0xf3,0x52,0xa8,0xbb,0xaf,0x47,0x9d,
+ 0x04,0x20,0x47,0x4c,0xf3,0xdb,0x43,0xd6,0xb9,0x36,0xa2,0x0a,0x49,0x03,0x71,0xdb,0x3d,0xc1,0x82,0x17,0x74,0xc2,0xa4,0x8e,0xec,0x12,0xb5,0xfd,0xfe,0xee,0x77,0x81,0xf4,0x17,0x47,0x9d,
+ 0x04,0x20,0x43,0xc3,0x99,0x69,0x61,0x27,0xd6,0x00,0xea,0xe0,0x42,0xaa,0xa1,0xaa,0xd7,0x40,0x1b,0xe9,0xed,0xa0,0x50,0x1c,0xb9,0xd8,0x32,0x3b,0xc9,0x50,0xcb,0x23,0xab,0xb1,0x47,0x9d,
0x04,0x20,0x4a,0x4b,0x4c,0x27,0xea,0x89,0xb2,0xa6,0x3e,0xf5,0x6e,0xc3,0xa4,0xe8,0xf6,0x5e,0x54,0xcc,0x93,0x64,0xce,0x36,0x82,0xd9,0x5f,0x1b,0x65,0x6b,0x02,0xc6,0x66,0x60,0x47,0x9d,
- 0x04,0x20,0x4b,0x74,0xfe,0x48,0xc5,0x79,0xd5,0x77,0xba,0xdf,0x52,0x63,0x40,0xc4,0x30,0x04,0xff,0xf5,0x29,0x01,0xcc,0x15,0x5a,0x58,0xf7,0xc0,0x16,0x28,0x83,0x36,0x60,0xa0,0x47,0x9d,
- 0x04,0x20,0x4c,0x6a,0x4c,0x67,0x94,0x97,0xa4,0xe3,0x78,0x9e,0x16,0x65,0x58,0xf5,0x95,0xa9,0xcd,0x94,0x9a,0xbc,0x40,0xc2,0x4e,0x20,0x71,0x72,0xd9,0x02,0x50,0x75,0x9f,0x41,0x47,0x9d,
- 0x04,0x20,0x4c,0x85,0xc2,0xc6,0xb5,0x6a,0xf4,0x3d,0x84,0xf9,0xc3,0x8b,0x21,0x7f,0x57,0x7e,0x66,0x66,0x6b,0x6d,0x5f,0x0a,0xd0,0xf0,0x76,0x56,0x65,0x78,0xf8,0xa7,0x42,0x75,0x47,0x9d,
- 0x04,0x20,0x52,0xf0,0xcb,0x8e,0xa9,0x27,0xd4,0x21,0x57,0x73,0xcb,0x40,0x17,0x6e,0x83,0x73,0xe4,0x59,0xa9,0x89,0x23,0x14,0x14,0x6a,0x91,0x85,0xd2,0xce,0x1c,0x85,0x05,0x06,0x47,0x9d,
- 0x04,0x20,0x55,0x93,0x75,0x82,0x96,0x4c,0xc8,0x24,0x96,0x48,0xb3,0x9e,0x15,0xf5,0xf5,0x6f,0x5b,0xec,0xf6,0x39,0xff,0xa8,0xaf,0x3a,0x4c,0x5d,0x22,0x3d,0xd3,0x14,0xc3,0x05,0x47,0x9d,
- 0x04,0x20,0x58,0xbf,0x47,0xe7,0x52,0x8d,0xb5,0x83,0xbc,0x55,0xb1,0xb8,0x02,0xe3,0xdc,0xc2,0xc4,0xe7,0x79,0x85,0xb2,0xe7,0x38,0x27,0xae,0xad,0x0c,0xb8,0x34,0xed,0x71,0xde,0x47,0x9d,
- 0x04,0x20,0x59,0x76,0xc7,0xdc,0xb8,0x4d,0x1d,0x51,0x40,0x75,0x43,0x57,0xdd,0x3e,0xa3,0x63,0x06,0x0f,0x5e,0x18,0x29,0x10,0x08,0xac,0xa0,0x60,0xd2,0xf3,0x63,0x6e,0xa6,0x58,0x47,0x9d,
- 0x04,0x20,0x60,0xbe,0xae,0x7d,0xa3,0x4d,0x6a,0x71,0x1a,0x5d,0xe5,0x98,0x9c,0xde,0xa0,0x99,0x39,0x19,0xd3,0x01,0x0a,0x5d,0x1c,0x21,0x43,0x94,0x92,0x71,0x5d,0x77,0xd7,0xdf,0x47,0x9d,
- 0x04,0x20,0x62,0x42,0x6d,0x98,0xc4,0xa1,0x16,0xc1,0x7d,0x17,0x9e,0x37,0x94,0x88,0x58,0x76,0xa9,0x13,0x6a,0x98,0x39,0x22,0x58,0x13,0xf8,0x9a,0x99,0xa2,0x25,0x56,0x59,0x05,0x47,0x9d,
- 0x04,0x20,0x6a,0xb1,0x07,0x66,0xbe,0x50,0xec,0x8e,0x6b,0x72,0xfc,0xb4,0xc2,0x67,0x26,0xa1,0x7a,0x10,0x15,0xd3,0xd0,0x36,0x7a,0xf0,0x83,0xd0,0xc3,0x59,0x85,0x68,0x90,0xd8,0x47,0x9d,
- 0x04,0x20,0x6d,0x6b,0x07,0x72,0xf7,0x45,0x8c,0x1d,0xe3,0x5c,0xf2,0x58,0x20,0xd2,0x95,0x25,0x22,0x51,0xc3,0x59,0x96,0xc1,0xdc,0x7e,0xa4,0x82,0x89,0x0a,0xf5,0x25,0x38,0x1a,0x47,0x9d,
- 0x04,0x20,0x77,0xaa,0x57,0x56,0x17,0xce,0xdd,0x79,0x64,0xaf,0x78,0xb2,0xf4,0x91,0x36,0x75,0x1c,0x1c,0xcd,0x31,0x35,0x4a,0xe4,0x8b,0x64,0x65,0x4e,0x06,0xec,0x2a,0xc4,0x95,0x47,0x9d,
- 0x04,0x20,0x70,0x11,0x6d,0x2d,0xa7,0xc9,0x9f,0xd8,0xe3,0xe8,0xae,0x5a,0x4a,0x50,0xac,0x3f,0xd6,0x57,0xad,0xd0,0xa5,0x35,0x14,0xd7,0xb1,0x76,0x58,0xb0,0x90,0xa4,0x1c,0x9b,0x47,0x9d,
- 0x04,0x20,0x72,0xdb,0xfc,0x04,0x48,0xee,0xec,0xae,0x1b,0xad,0xe6,0x9a,0x87,0xe1,0x17,0xae,0x13,0x70,0xae,0x83,0x90,0x62,0x59,0x30,0xed,0x44,0x43,0xe9,0xab,0xee,0xaa,0xd0,0x47,0x9d,
- 0x04,0x20,0x74,0xd8,0x56,0x9c,0x5e,0xb4,0x62,0x12,0xea,0x6f,0x1e,0x3d,0x95,0x22,0x50,0x16,0xe3,0xba,0x45,0xb2,0xa3,0xad,0x26,0xb0,0x13,0x74,0xdd,0xec,0x22,0xe0,0x70,0x9a,0x47,0x9d,
- 0x04,0x20,0x75,0x45,0xe9,0x01,0x21,0x81,0x44,0x1b,0x57,0x76,0x8c,0x3f,0x85,0xa9,0x74,0xf4,0x3c,0xf8,0xd5,0x12,0xcf,0x13,0x1e,0x2f,0x18,0x13,0x78,0xa3,0x51,0x59,0x49,0x49,0x47,0x9d,
- 0x04,0x20,0x7b,0x3b,0xf1,0xa0,0x78,0xc9,0xba,0xb4,0xd2,0xad,0xed,0x0b,0x1e,0xd2,0x8d,0xd2,0x08,0xd1,0x51,0x5b,0x01,0x74,0x6c,0xc0,0x5d,0xcd,0x4c,0x53,0xf3,0xba,0x16,0xe3,0x47,0x9d,
- 0x04,0x20,0x7b,0x11,0x26,0x1d,0xf6,0xa1,0xb7,0xc3,0x36,0x19,0x0d,0x27,0x10,0x36,0xb7,0xd5,0x93,0x60,0xc8,0xf8,0x82,0x79,0x46,0xe8,0x78,0xce,0x29,0x50,0x2b,0x44,0x3f,0x7a,0x47,0x9d,
- 0x04,0x20,0x7b,0x96,0x08,0xa2,0x54,0x5c,0xd0,0x94,0x9c,0x0a,0xa7,0xb3,0xea,0x7d,0x38,0x0b,0x8e,0xee,0x91,0xe3,0x91,0xb9,0xc9,0xcc,0x81,0x28,0x2e,0xc3,0x02,0x9a,0xcf,0x65,0x47,0x9d,
- 0x04,0x20,0x81,0x34,0x90,0x93,0x9c,0xf9,0xc9,0xe7,0x81,0xa5,0xab,0xf1,0x03,0xe1,0xb3,0x2f,0xf7,0xcf,0x19,0x94,0x2f,0x7a,0x1b,0xc5,0x83,0xc9,0x8c,0xc3,0x5b,0x09,0x96,0x14,0x47,0x9d,
- 0x04,0x20,0x86,0x7d,0x81,0xf5,0x72,0x30,0xc0,0x91,0x4c,0x8e,0x04,0x48,0x47,0xce,0xcd,0x43,0xef,0x22,0x67,0x17,0xea,0x95,0x2f,0x51,0x4f,0x57,0x67,0x58,0x21,0xa5,0x2e,0x68,0x47,0x9d,
- 0x04,0x20,0x8b,0xfc,0xf6,0xec,0x3b,0x71,0x25,0x88,0xe8,0xc8,0x72,0xc3,0x89,0x05,0x27,0x81,0x28,0x6b,0xb6,0x72,0xa7,0xc5,0x16,0xaa,0x67,0xe6,0x37,0xb7,0x2b,0x99,0xa8,0x97,0x47,0x9d,
- 0x04,0x20,0xa2,0x46,0x23,0xd2,0xdb,0x3e,0x7a,0x65,0x05,0xd4,0x45,0x78,0xff,0x3e,0xc1,0x28,0xdb,0xfa,0xf1,0x5e,0x32,0xe9,0x6a,0x8f,0x96,0x45,0x15,0x01,0x7f,0x1f,0x75,0xbf,0x47,0x9d,
- 0x04,0x20,0xa8,0xa6,0xbb,0x02,0x06,0x65,0x3b,0xb2,0x52,0x79,0xd1,0xc9,0x6a,0x01,0x42,0x43,0xca,0x69,0xe1,0x69,0x90,0xfe,0x2c,0xd2,0x7c,0x18,0xfd,0xab,0xc7,0x71,0x7f,0x8b,0x47,0x9d,
- 0x04,0x20,0xa9,0x7b,0x48,0xf7,0x73,0xcb,0x07,0x37,0x4e,0xaa,0x68,0xc4,0x67,0x08,0xea,0x5b,0x68,0x0a,0xfe,0x14,0x82,0x6a,0xa1,0x79,0x82,0x9c,0x0b,0x52,0x17,0xd6,0x6b,0x1b,0x47,0x9d,
- 0x04,0x20,0xb3,0x6e,0x64,0x99,0x26,0x7a,0xeb,0xd4,0x53,0x8c,0x94,0xb1,0x4a,0x37,0x02,0xaa,0xa9,0xc8,0x36,0x11,0xec,0xf9,0x0f,0x08,0xa3,0x9f,0x3e,0xaf,0xd2,0xd1,0x2a,0x0b,0x47,0x9d,
- 0x04,0x20,0xb3,0xd4,0x15,0x0e,0x3f,0x12,0xed,0xfc,0xab,0x69,0x55,0x91,0x45,0xcf,0xc1,0x2f,0x35,0xa4,0xf7,0x94,0xff,0xd8,0xbe,0x44,0xc8,0x36,0xaf,0x0f,0xa0,0x4e,0x36,0x22,0x47,0x9d,
- 0x04,0x20,0xb6,0x5e,0x39,0xeb,0x93,0x18,0x22,0xad,0x78,0x94,0x34,0x48,0x31,0x8d,0xd1,0x42,0xb7,0x38,0x58,0x49,0xea,0x00,0xb9,0xcf,0x58,0x43,0x38,0x22,0x22,0x88,0x87,0xde,0x47,0x9d,
- 0x04,0x20,0xb9,0x80,0xf6,0xa1,0x4a,0x0a,0xc6,0xe3,0x19,0x27,0xe9,0x2d,0x75,0x60,0x14,0x3d,0x2c,0xda,0x97,0x77,0x54,0x9f,0x78,0xb8,0x9b,0x72,0x6a,0x58,0xab,0x8b,0x95,0x95,0x47,0x9d,
- 0x04,0x20,0xba,0xab,0x91,0x9c,0x48,0x8b,0x9b,0x34,0x5c,0x30,0xf3,0xd2,0x78,0xd3,0xbf,0x09,0x79,0x23,0x4e,0x18,0x5d,0x5e,0x75,0x6b,0xa2,0x91,0x63,0x2c,0x75,0xfd,0x06,0x36,0x47,0x9d,
- 0x04,0x20,0xbb,0x50,0xf0,0x50,0x8d,0xb7,0x6c,0xd4,0x87,0x59,0x0d,0xfd,0x5f,0x51,0x86,0xa8,0x43,0xb3,0x7a,0xe7,0x2f,0x54,0x97,0x7d,0xed,0xc3,0x7b,0x31,0xe6,0xb9,0x05,0xe7,0x47,0x9d,
- 0x04,0x20,0xc0,0xc1,0xf5,0x59,0xe8,0x46,0xf6,0x9d,0x41,0xf0,0xde,0x8b,0x32,0xf9,0x6f,0xd6,0xb2,0xd5,0x36,0x56,0x43,0xd3,0x60,0x08,0x55,0x94,0x13,0xf5,0xef,0x7f,0x4d,0x4a,0x47,0x9d,
- 0x04,0x20,0xce,0xd3,0xd2,0xba,0x56,0xa1,0xde,0xc9,0xc4,0xdb,0x50,0x7b,0xe9,0x4d,0x59,0x65,0x1c,0x02,0x4a,0xa3,0xea,0x73,0xb2,0x66,0x70,0xe7,0x85,0xc1,0x20,0x60,0x79,0x96,0x47,0x9d,
+ 0x04,0x20,0x4b,0x5e,0x72,0xcc,0x87,0x51,0x65,0x3b,0x05,0x4e,0xdf,0x10,0x3b,0xad,0xee,0xe9,0x47,0x6f,0x2e,0x2e,0x62,0x98,0x4a,0x2a,0xe7,0xdd,0xc4,0xb9,0x9d,0x72,0x99,0x0e,0x47,0x9d,
+ 0x04,0x20,0x4c,0x4e,0xfb,0x40,0x07,0x4c,0x53,0xfe,0x9a,0x61,0xf9,0xa7,0xad,0x92,0xa4,0xf7,0x6f,0xf0,0x84,0x16,0xc7,0xd3,0xc2,0x0c,0xec,0x30,0x5d,0xd6,0xa7,0x4c,0x50,0x08,0x47,0x9d,
+ 0x04,0x20,0x4d,0x1b,0xe3,0x0d,0x81,0x30,0x25,0x1e,0xfc,0x27,0x8f,0x33,0x2d,0x8c,0xa7,0x17,0x9f,0x97,0x82,0xda,0xfb,0x60,0x1e,0x0c,0x03,0x08,0x11,0xfc,0x44,0x30,0xef,0x73,0x47,0x9d,
+ 0x04,0x20,0x77,0x75,0x8f,0x94,0x03,0x9d,0x03,0x1e,0x4e,0x90,0x3a,0x2f,0xec,0x32,0x28,0x6e,0xe1,0x96,0xfe,0x81,0x3f,0x66,0x4b,0x52,0x84,0x3d,0xbb,0x6b,0x88,0x2d,0x2a,0x7d,0x47,0x9d,
+ 0x04,0x20,0x8a,0x0c,0x56,0x6d,0x2e,0x41,0x7a,0xb9,0x2f,0xe1,0xfe,0x23,0xe1,0xf8,0x55,0x18,0xe8,0xa0,0x5b,0x0a,0x67,0xd4,0x63,0x53,0x25,0xb2,0x3c,0x37,0xac,0x4a,0xc6,0x7d,0x47,0x9d,
+ 0x04,0x20,0x9f,0x87,0xe2,0x3c,0x3d,0x10,0x82,0xee,0x13,0xde,0x40,0x00,0xda,0x2a,0x20,0xbb,0xd2,0xc8,0x22,0x12,0xcf,0x9e,0xe4,0xf6,0x95,0xbd,0x34,0xeb,0x35,0xa7,0x11,0xa9,0x47,0x9d,
+ 0x04,0x20,0x99,0x25,0x3d,0x55,0xd9,0x5d,0xcb,0x96,0xb0,0xb8,0xbe,0x55,0x45,0x97,0x6b,0xf4,0x09,0xe1,0xcd,0x1d,0x3c,0x0a,0x99,0x5c,0x11,0xea,0xd8,0xbe,0x74,0x49,0x6e,0x09,0x47,0x9d,
+ 0x04,0x20,0xa5,0xe6,0xc9,0xb1,0xea,0x28,0x2e,0x2f,0x64,0x57,0x05,0xcd,0x81,0xc6,0x8a,0xc0,0xfa,0x91,0xc4,0x4f,0xd3,0x3a,0xea,0x05,0xe8,0x62,0x13,0x8e,0x72,0x2d,0x4d,0x31,0x47,0x9d,
+ 0x04,0x20,0xbd,0x0e,0xc8,0x73,0x43,0xa7,0xc6,0x25,0x15,0xcf,0x3e,0x23,0xa8,0xb0,0xbf,0xe8,0x20,0xa7,0xec,0x2a,0xf6,0x37,0x6c,0x60,0x5e,0x4d,0xed,0xf4,0xb1,0xef,0xf7,0xb2,0x47,0x9d,
0x04,0x20,0xc8,0x88,0xfe,0x71,0x5f,0xa3,0x6c,0x96,0x6a,0xd7,0x9e,0x38,0x84,0x9f,0x44,0xe1,0x6b,0xdc,0x98,0x31,0xad,0x96,0x29,0xe7,0x00,0x83,0x63,0x03,0xae,0x69,0x2e,0x63,0x47,0x9d,
- 0x04,0x20,0xcb,0x2a,0x8c,0xe7,0xe5,0x1f,0x4e,0x3a,0x13,0xd6,0x9e,0xd7,0x68,0x51,0x83,0xf4,0x2d,0x3e,0x21,0x38,0x63,0x18,0xe9,0x97,0x27,0xff,0x45,0x48,0xc3,0x6c,0xca,0x59,0x47,0x9d,
- 0x04,0x20,0xcb,0x80,0x0d,0xdf,0xf0,0xa6,0x28,0x84,0x98,0xc8,0x47,0x72,0xbe,0x53,0x04,0x43,0x9c,0x3a,0x0e,0x46,0x9c,0x75,0x4c,0x57,0x50,0x98,0xe5,0x25,0x80,0x5d,0xa2,0x91,0x47,0x9d,
- 0x04,0x20,0xcb,0xaa,0x0a,0x5d,0x6e,0x8a,0xfa,0x49,0x5a,0x8c,0x0c,0x9d,0x7a,0xe9,0x9d,0xc6,0xe4,0xcd,0xc1,0x6a,0xff,0xbb,0xf1,0x89,0xf1,0xd5,0x16,0x3f,0xdc,0xbb,0xe9,0x1b,0x47,0x9d,
};
#endif // BITCOIN_CHAINPARAMSSEEDS_H
diff --git a/src/clientversion.cpp b/src/clientversion.cpp
index e7d63e34c6..bf5579ee69 100644
--- a/src/clientversion.cpp
+++ b/src/clientversion.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <clientversion.h>
#include <util/translation.h>
diff --git a/src/common/args.cpp b/src/common/args.cpp
index a9108e5916..c90eb0c685 100644
--- a/src/common/args.cpp
+++ b/src/common/args.cpp
@@ -682,6 +682,18 @@ std::string HelpMessageOpt(const std::string &option, const std::string &message
std::string("\n\n");
}
+const std::vector<std::string> TEST_OPTIONS_DOC{
+ "addrman (use deterministic addrman)",
+};
+
+bool HasTestOption(const ArgsManager& args, const std::string& test_option)
+{
+ const auto options = args.GetArgs("-test");
+ return std::any_of(options.begin(), options.end(), [test_option](const auto& option) {
+ return option == test_option;
+ });
+}
+
fs::path GetDefaultDataDir()
{
// Windows: C:\Users\Username\AppData\Roaming\Bitcoin
diff --git a/src/common/args.h b/src/common/args.h
index 6451b194d1..78a61313b9 100644
--- a/src/common/args.h
+++ b/src/common/args.h
@@ -447,6 +447,11 @@ bool HelpRequested(const ArgsManager& args);
/** Add help options to the args manager */
void SetupHelpOptions(ArgsManager& args);
+extern const std::vector<std::string> TEST_OPTIONS_DOC;
+
+/** Checks if a particular test option is present in -test command-line arg options */
+bool HasTestOption(const ArgsManager& args, const std::string& test_option);
+
/**
* Format a string to be used as group of options in help messages
*
diff --git a/src/common/system.cpp b/src/common/system.cpp
index ba42c6df50..1fa53a5f34 100644
--- a/src/common/system.cpp
+++ b/src/common/system.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <common/system.h>
#include <logging.h>
diff --git a/src/compat/byteswap.h b/src/compat/byteswap.h
index 9ee71ef267..0d0b079230 100644
--- a/src/compat/byteswap.h
+++ b/src/compat/byteswap.h
@@ -5,44 +5,66 @@
#ifndef BITCOIN_COMPAT_BYTESWAP_H
#define BITCOIN_COMPAT_BYTESWAP_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
+#include <cstdint>
+#ifdef _MSC_VER
+#include <cstdlib>
#endif
-#include <cstdint>
-#if defined(HAVE_BYTESWAP_H)
-#include <byteswap.h>
-#endif
+// All internal_bswap_* functions can be replaced with std::byteswap once we
+// require c++23. Both libstdc++ and libc++ implement std::byteswap via these
+// builtins.
-#if defined(MAC_OSX)
+#ifndef DISABLE_BUILTIN_BSWAPS
+# if defined __has_builtin
+# if __has_builtin(__builtin_bswap16)
+# define bitcoin_builtin_bswap16(x) __builtin_bswap16(x)
+# endif
+# if __has_builtin(__builtin_bswap32)
+# define bitcoin_builtin_bswap32(x) __builtin_bswap32(x)
+# endif
+# if __has_builtin(__builtin_bswap64)
+# define bitcoin_builtin_bswap64(x) __builtin_bswap64(x)
+# endif
+# elif defined(_MSC_VER)
+# define bitcoin_builtin_bswap16(x) _byteswap_ushort(x)
+# define bitcoin_builtin_bswap32(x) _byteswap_ulong(x)
+# define bitcoin_builtin_bswap64(x) _byteswap_uint64(x)
+# endif
+#endif
-#include <libkern/OSByteOrder.h>
-#define bswap_16(x) OSSwapInt16(x)
-#define bswap_32(x) OSSwapInt32(x)
-#define bswap_64(x) OSSwapInt64(x)
+// MSVC's _byteswap_* functions are not constexpr
+#ifndef _MSC_VER
+#define BSWAP_CONSTEXPR constexpr
#else
-// Non-MacOS / non-Darwin
+#define BSWAP_CONSTEXPR
+#endif
-#if HAVE_DECL_BSWAP_16 == 0
-inline uint16_t bswap_16(uint16_t x)
+inline BSWAP_CONSTEXPR uint16_t internal_bswap_16(uint16_t x)
{
+#ifdef bitcoin_builtin_bswap16
+ return bitcoin_builtin_bswap16(x);
+#else
return (x >> 8) | (x << 8);
+#endif
}
-#endif // HAVE_DECL_BSWAP16 == 0
-#if HAVE_DECL_BSWAP_32 == 0
-inline uint32_t bswap_32(uint32_t x)
+inline BSWAP_CONSTEXPR uint32_t internal_bswap_32(uint32_t x)
{
+#ifdef bitcoin_builtin_bswap32
+ return bitcoin_builtin_bswap32(x);
+#else
return (((x & 0xff000000U) >> 24) | ((x & 0x00ff0000U) >> 8) |
((x & 0x0000ff00U) << 8) | ((x & 0x000000ffU) << 24));
+#endif
}
-#endif // HAVE_DECL_BSWAP32 == 0
-#if HAVE_DECL_BSWAP_64 == 0
-inline uint64_t bswap_64(uint64_t x)
+inline BSWAP_CONSTEXPR uint64_t internal_bswap_64(uint64_t x)
{
+#ifdef bitcoin_builtin_bswap64
+ return bitcoin_builtin_bswap64(x);
+#else
return (((x & 0xff00000000000000ull) >> 56)
| ((x & 0x00ff000000000000ull) >> 40)
| ((x & 0x0000ff0000000000ull) >> 24)
@@ -51,9 +73,7 @@ inline uint64_t bswap_64(uint64_t x)
| ((x & 0x0000000000ff0000ull) << 24)
| ((x & 0x000000000000ff00ull) << 40)
| ((x & 0x00000000000000ffull) << 56));
+#endif
}
-#endif // HAVE_DECL_BSWAP64 == 0
-
-#endif // defined(MAC_OSX)
#endif // BITCOIN_COMPAT_BYTESWAP_H
diff --git a/src/compat/compat.h b/src/compat/compat.h
index 435a403552..366c648ae7 100644
--- a/src/compat/compat.h
+++ b/src/compat/compat.h
@@ -6,10 +6,6 @@
#ifndef BITCOIN_COMPAT_COMPAT_H
#define BITCOIN_COMPAT_COMPAT_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
// Windows defines FD_SETSIZE to 64 (see _fd_types.h in mingw-w64),
// which is too small for our usage, but allows us to redefine it safely.
// We redefine it to be 1024, to match glibc, see typesizes.h.
@@ -36,6 +32,13 @@
#include <unistd.h> // IWYU pragma: export
#endif
+// Windows does not have `sa_family_t` - it defines `sockaddr::sa_family` as `u_short`.
+// Thus define `sa_family_t` on Windows too so that the rest of the code can use `sa_family_t`.
+// See https://learn.microsoft.com/en-us/windows/win32/api/winsock/ns-winsock-sockaddr#syntax
+#ifdef WIN32
+typedef u_short sa_family_t;
+#endif
+
// We map Linux / BSD error functions and codes, to the equivalent
// Windows definitions, and use the WSA* names throughout our code.
// Note that glibc defines EWOULDBLOCK as EAGAIN (see errno.h).
diff --git a/src/compat/endian.h b/src/compat/endian.h
index 882de2dbf0..4f58428153 100644
--- a/src/compat/endian.h
+++ b/src/compat/endian.h
@@ -5,237 +5,70 @@
#ifndef BITCOIN_COMPAT_ENDIAN_H
#define BITCOIN_COMPAT_ENDIAN_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <compat/byteswap.h>
+#include <bit>
#include <cstdint>
-#if defined(HAVE_ENDIAN_H)
-#include <endian.h>
-#elif defined(HAVE_SYS_ENDIAN_H)
-#include <sys/endian.h>
-#endif
-
-#ifndef HAVE_CONFIG_H
-// While not technically a supported configuration, defaulting to defining these
-// DECLs when we were compiled without autotools makes it easier for other build
-// systems to build things like libbitcoinconsensus for strange targets.
-#ifdef htobe16
-#define HAVE_DECL_HTOBE16 1
-#endif
-#ifdef htole16
-#define HAVE_DECL_HTOLE16 1
-#endif
-#ifdef be16toh
-#define HAVE_DECL_BE16TOH 1
-#endif
-#ifdef le16toh
-#define HAVE_DECL_LE16TOH 1
-#endif
-
-#ifdef htobe32
-#define HAVE_DECL_HTOBE32 1
-#endif
-#ifdef htole32
-#define HAVE_DECL_HTOLE32 1
-#endif
-#ifdef be32toh
-#define HAVE_DECL_BE32TOH 1
-#endif
-#ifdef le32toh
-#define HAVE_DECL_LE32TOH 1
-#endif
-
-#ifdef htobe64
-#define HAVE_DECL_HTOBE64 1
-#endif
-#ifdef htole64
-#define HAVE_DECL_HTOLE64 1
-#endif
-#ifdef be64toh
-#define HAVE_DECL_BE64TOH 1
-#endif
-#ifdef le64toh
-#define HAVE_DECL_LE64TOH 1
-#endif
-
-#endif // HAVE_CONFIG_H
-
-#if defined(WORDS_BIGENDIAN)
-
-#if HAVE_DECL_HTOBE16 == 0
-inline uint16_t htobe16(uint16_t host_16bits)
-{
- return host_16bits;
-}
-#endif // HAVE_DECL_HTOBE16
-
-#if HAVE_DECL_HTOLE16 == 0
-inline uint16_t htole16(uint16_t host_16bits)
-{
- return bswap_16(host_16bits);
-}
-#endif // HAVE_DECL_HTOLE16
-
-#if HAVE_DECL_BE16TOH == 0
-inline uint16_t be16toh(uint16_t big_endian_16bits)
-{
- return big_endian_16bits;
-}
-#endif // HAVE_DECL_BE16TOH
-
-#if HAVE_DECL_LE16TOH == 0
-inline uint16_t le16toh(uint16_t little_endian_16bits)
-{
- return bswap_16(little_endian_16bits);
-}
-#endif // HAVE_DECL_LE16TOH
-
-#if HAVE_DECL_HTOBE32 == 0
-inline uint32_t htobe32(uint32_t host_32bits)
-{
- return host_32bits;
-}
-#endif // HAVE_DECL_HTOBE32
-
-#if HAVE_DECL_HTOLE32 == 0
-inline uint32_t htole32(uint32_t host_32bits)
-{
- return bswap_32(host_32bits);
-}
-#endif // HAVE_DECL_HTOLE32
-
-#if HAVE_DECL_BE32TOH == 0
-inline uint32_t be32toh(uint32_t big_endian_32bits)
-{
- return big_endian_32bits;
-}
-#endif // HAVE_DECL_BE32TOH
-
-#if HAVE_DECL_LE32TOH == 0
-inline uint32_t le32toh(uint32_t little_endian_32bits)
+inline BSWAP_CONSTEXPR uint16_t htobe16_internal(uint16_t host_16bits)
{
- return bswap_32(little_endian_32bits);
+ if constexpr (std::endian::native == std::endian::little) return internal_bswap_16(host_16bits);
+ else return host_16bits;
}
-#endif // HAVE_DECL_LE32TOH
-
-#if HAVE_DECL_HTOBE64 == 0
-inline uint64_t htobe64(uint64_t host_64bits)
-{
- return host_64bits;
-}
-#endif // HAVE_DECL_HTOBE64
-
-#if HAVE_DECL_HTOLE64 == 0
-inline uint64_t htole64(uint64_t host_64bits)
-{
- return bswap_64(host_64bits);
-}
-#endif // HAVE_DECL_HTOLE64
-
-#if HAVE_DECL_BE64TOH == 0
-inline uint64_t be64toh(uint64_t big_endian_64bits)
-{
- return big_endian_64bits;
-}
-#endif // HAVE_DECL_BE64TOH
-
-#if HAVE_DECL_LE64TOH == 0
-inline uint64_t le64toh(uint64_t little_endian_64bits)
-{
- return bswap_64(little_endian_64bits);
-}
-#endif // HAVE_DECL_LE64TOH
-
-#else // WORDS_BIGENDIAN
-
-#if HAVE_DECL_HTOBE16 == 0
-inline uint16_t htobe16(uint16_t host_16bits)
+inline BSWAP_CONSTEXPR uint16_t htole16_internal(uint16_t host_16bits)
{
- return bswap_16(host_16bits);
+ if constexpr (std::endian::native == std::endian::big) return internal_bswap_16(host_16bits);
+ else return host_16bits;
}
-#endif // HAVE_DECL_HTOBE16
-
-#if HAVE_DECL_HTOLE16 == 0
-inline uint16_t htole16(uint16_t host_16bits)
+inline BSWAP_CONSTEXPR uint16_t be16toh_internal(uint16_t big_endian_16bits)
{
- return host_16bits;
+ if constexpr (std::endian::native == std::endian::little) return internal_bswap_16(big_endian_16bits);
+ else return big_endian_16bits;
}
-#endif // HAVE_DECL_HTOLE16
-
-#if HAVE_DECL_BE16TOH == 0
-inline uint16_t be16toh(uint16_t big_endian_16bits)
+inline BSWAP_CONSTEXPR uint16_t le16toh_internal(uint16_t little_endian_16bits)
{
- return bswap_16(big_endian_16bits);
+ if constexpr (std::endian::native == std::endian::big) return internal_bswap_16(little_endian_16bits);
+ else return little_endian_16bits;
}
-#endif // HAVE_DECL_BE16TOH
-
-#if HAVE_DECL_LE16TOH == 0
-inline uint16_t le16toh(uint16_t little_endian_16bits)
+inline BSWAP_CONSTEXPR uint32_t htobe32_internal(uint32_t host_32bits)
{
- return little_endian_16bits;
+ if constexpr (std::endian::native == std::endian::little) return internal_bswap_32(host_32bits);
+ else return host_32bits;
}
-#endif // HAVE_DECL_LE16TOH
-
-#if HAVE_DECL_HTOBE32 == 0
-inline uint32_t htobe32(uint32_t host_32bits)
-{
- return bswap_32(host_32bits);
-}
-#endif // HAVE_DECL_HTOBE32
-
-#if HAVE_DECL_HTOLE32 == 0
-inline uint32_t htole32(uint32_t host_32bits)
+inline BSWAP_CONSTEXPR uint32_t htole32_internal(uint32_t host_32bits)
{
- return host_32bits;
+ if constexpr (std::endian::native == std::endian::big) return internal_bswap_32(host_32bits);
+ else return host_32bits;
}
-#endif // HAVE_DECL_HTOLE32
-
-#if HAVE_DECL_BE32TOH == 0
-inline uint32_t be32toh(uint32_t big_endian_32bits)
+inline BSWAP_CONSTEXPR uint32_t be32toh_internal(uint32_t big_endian_32bits)
{
- return bswap_32(big_endian_32bits);
+ if constexpr (std::endian::native == std::endian::little) return internal_bswap_32(big_endian_32bits);
+ else return big_endian_32bits;
}
-#endif // HAVE_DECL_BE32TOH
-
-#if HAVE_DECL_LE32TOH == 0
-inline uint32_t le32toh(uint32_t little_endian_32bits)
+inline BSWAP_CONSTEXPR uint32_t le32toh_internal(uint32_t little_endian_32bits)
{
- return little_endian_32bits;
+ if constexpr (std::endian::native == std::endian::big) return internal_bswap_32(little_endian_32bits);
+ else return little_endian_32bits;
}
-#endif // HAVE_DECL_LE32TOH
-
-#if HAVE_DECL_HTOBE64 == 0
-inline uint64_t htobe64(uint64_t host_64bits)
+inline BSWAP_CONSTEXPR uint64_t htobe64_internal(uint64_t host_64bits)
{
- return bswap_64(host_64bits);
+ if constexpr (std::endian::native == std::endian::little) return internal_bswap_64(host_64bits);
+ else return host_64bits;
}
-#endif // HAVE_DECL_HTOBE64
-
-#if HAVE_DECL_HTOLE64 == 0
-inline uint64_t htole64(uint64_t host_64bits)
+inline BSWAP_CONSTEXPR uint64_t htole64_internal(uint64_t host_64bits)
{
- return host_64bits;
+ if constexpr (std::endian::native == std::endian::big) return internal_bswap_64(host_64bits);
+ else return host_64bits;
}
-#endif // HAVE_DECL_HTOLE64
-
-#if HAVE_DECL_BE64TOH == 0
-inline uint64_t be64toh(uint64_t big_endian_64bits)
+inline BSWAP_CONSTEXPR uint64_t be64toh_internal(uint64_t big_endian_64bits)
{
- return bswap_64(big_endian_64bits);
+ if constexpr (std::endian::native == std::endian::little) return internal_bswap_64(big_endian_64bits);
+ else return big_endian_64bits;
}
-#endif // HAVE_DECL_BE64TOH
-
-#if HAVE_DECL_LE64TOH == 0
-inline uint64_t le64toh(uint64_t little_endian_64bits)
+inline BSWAP_CONSTEXPR uint64_t le64toh_internal(uint64_t little_endian_64bits)
{
- return little_endian_64bits;
+ if constexpr (std::endian::native == std::endian::big) return internal_bswap_64(little_endian_64bits);
+ else return little_endian_64bits;
}
-#endif // HAVE_DECL_LE64TOH
-
-#endif // WORDS_BIGENDIAN
#endif // BITCOIN_COMPAT_ENDIAN_H
diff --git a/src/crc32c/src/crc32c_arm64.cc b/src/crc32c/src/crc32c_arm64.cc
index 1da04ed34a..711616cd2f 100644
--- a/src/crc32c/src/crc32c_arm64.cc
+++ b/src/crc32c/src/crc32c_arm64.cc
@@ -12,6 +12,7 @@
#include <cstddef>
#include <cstdint>
+#include <cstring>
#include "./crc32c_internal.h"
#ifdef CRC32C_HAVE_CONFIG_H
@@ -29,14 +30,14 @@
// compute 8bytes for each segment parallelly
#define CRC32C32BYTES(P, IND) \
do { \
- crc1 = __crc32cd( \
- crc1, *((const uint64_t *)(P) + (SEGMENTBYTES / 8) * 1 + (IND))); \
- crc2 = __crc32cd( \
- crc2, *((const uint64_t *)(P) + (SEGMENTBYTES / 8) * 2 + (IND))); \
- crc3 = __crc32cd( \
- crc3, *((const uint64_t *)(P) + (SEGMENTBYTES / 8) * 3 + (IND))); \
- crc0 = __crc32cd( \
- crc0, *((const uint64_t *)(P) + (SEGMENTBYTES / 8) * 0 + (IND))); \
+ std::memcpy(&d64, (P) + SEGMENTBYTES * 1 + (IND) * 8, sizeof(d64)); \
+ crc1 = __crc32cd(crc1, d64); \
+ std::memcpy(&d64, (P) + SEGMENTBYTES * 2 + (IND) * 8, sizeof(d64)); \
+ crc2 = __crc32cd(crc2, d64); \
+ std::memcpy(&d64, (P) + SEGMENTBYTES * 3 + (IND) * 8, sizeof(d64)); \
+ crc3 = __crc32cd(crc3, d64); \
+ std::memcpy(&d64, (P) + SEGMENTBYTES * 0 + (IND) * 8, sizeof(d64)); \
+ crc0 = __crc32cd(crc0, d64); \
} while (0);
// compute 8*8 bytes for each segment parallelly
@@ -68,6 +69,9 @@ uint32_t ExtendArm64(uint32_t crc, const uint8_t *data, size_t size) {
int64_t length = size;
uint32_t crc0, crc1, crc2, crc3;
uint64_t t0, t1, t2;
+ uint16_t d16;
+ uint32_t d32;
+ uint64_t d64;
// k0=CRC(x^(3*SEGMENTBYTES*8)), k1=CRC(x^(2*SEGMENTBYTES*8)),
// k2=CRC(x^(SEGMENTBYTES*8))
@@ -88,7 +92,8 @@ uint32_t ExtendArm64(uint32_t crc, const uint8_t *data, size_t size) {
t2 = (uint64_t)vmull_p64(crc2, k2);
t1 = (uint64_t)vmull_p64(crc1, k1);
t0 = (uint64_t)vmull_p64(crc0, k0);
- crc = __crc32cd(crc3, *(uint64_t *)data);
+ std::memcpy(&d64, data, sizeof(d64));
+ crc = __crc32cd(crc3, d64);
data += sizeof(uint64_t);
crc ^= __crc32cd(0, t2);
crc ^= __crc32cd(0, t1);
@@ -98,18 +103,21 @@ uint32_t ExtendArm64(uint32_t crc, const uint8_t *data, size_t size) {
}
while (length >= 8) {
- crc = __crc32cd(crc, *(uint64_t *)data);
+ std::memcpy(&d64, data, sizeof(d64));
+ crc = __crc32cd(crc, d64);
data += 8;
length -= 8;
}
if (length & 4) {
- crc = __crc32cw(crc, *(uint32_t *)data);
+ std::memcpy(&d32, data, sizeof(d32));
+ crc = __crc32cw(crc, d32);
data += 4;
}
if (length & 2) {
- crc = __crc32ch(crc, *(uint16_t *)data);
+ std::memcpy(&d16, data, sizeof(d16));
+ crc = __crc32ch(crc, d16);
data += 2;
}
diff --git a/src/crypto/chacha20poly1305.cpp b/src/crypto/chacha20poly1305.cpp
index 59671d304c..3e8051c2dc 100644
--- a/src/crypto/chacha20poly1305.cpp
+++ b/src/crypto/chacha20poly1305.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <crypto/chacha20poly1305.h>
#include <crypto/common.h>
diff --git a/src/crypto/common.h b/src/crypto/common.h
index 6ae5d4cd24..1dc4f3f55c 100644
--- a/src/crypto/common.h
+++ b/src/crypto/common.h
@@ -5,51 +5,47 @@
#ifndef BITCOIN_CRYPTO_COMMON_H
#define BITCOIN_CRYPTO_COMMON_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
-#include <stdint.h>
-#include <string.h>
-
#include <compat/endian.h>
+#include <cstdint>
+#include <cstring>
+
uint16_t static inline ReadLE16(const unsigned char* ptr)
{
uint16_t x;
memcpy(&x, ptr, 2);
- return le16toh(x);
+ return le16toh_internal(x);
}
uint32_t static inline ReadLE32(const unsigned char* ptr)
{
uint32_t x;
memcpy(&x, ptr, 4);
- return le32toh(x);
+ return le32toh_internal(x);
}
uint64_t static inline ReadLE64(const unsigned char* ptr)
{
uint64_t x;
memcpy(&x, ptr, 8);
- return le64toh(x);
+ return le64toh_internal(x);
}
void static inline WriteLE16(unsigned char* ptr, uint16_t x)
{
- uint16_t v = htole16(x);
+ uint16_t v = htole16_internal(x);
memcpy(ptr, &v, 2);
}
void static inline WriteLE32(unsigned char* ptr, uint32_t x)
{
- uint32_t v = htole32(x);
+ uint32_t v = htole32_internal(x);
memcpy(ptr, &v, 4);
}
void static inline WriteLE64(unsigned char* ptr, uint64_t x)
{
- uint64_t v = htole64(x);
+ uint64_t v = htole64_internal(x);
memcpy(ptr, &v, 8);
}
@@ -57,54 +53,33 @@ uint16_t static inline ReadBE16(const unsigned char* ptr)
{
uint16_t x;
memcpy(&x, ptr, 2);
- return be16toh(x);
+ return be16toh_internal(x);
}
uint32_t static inline ReadBE32(const unsigned char* ptr)
{
uint32_t x;
memcpy(&x, ptr, 4);
- return be32toh(x);
+ return be32toh_internal(x);
}
uint64_t static inline ReadBE64(const unsigned char* ptr)
{
uint64_t x;
memcpy(&x, ptr, 8);
- return be64toh(x);
+ return be64toh_internal(x);
}
void static inline WriteBE32(unsigned char* ptr, uint32_t x)
{
- uint32_t v = htobe32(x);
+ uint32_t v = htobe32_internal(x);
memcpy(ptr, &v, 4);
}
void static inline WriteBE64(unsigned char* ptr, uint64_t x)
{
- uint64_t v = htobe64(x);
+ uint64_t v = htobe64_internal(x);
memcpy(ptr, &v, 8);
}
-/** Return the smallest number n such that (x >> n) == 0 (or 64 if the highest bit in x is set. */
-uint64_t static inline CountBits(uint64_t x)
-{
-#if HAVE_BUILTIN_CLZL
- if (sizeof(unsigned long) >= sizeof(uint64_t)) {
- return x ? 8 * sizeof(unsigned long) - __builtin_clzl(x) : 0;
- }
-#endif
-#if HAVE_BUILTIN_CLZLL
- if (sizeof(unsigned long long) >= sizeof(uint64_t)) {
- return x ? 8 * sizeof(unsigned long long) - __builtin_clzll(x) : 0;
- }
-#endif
- int ret = 0;
- while (x) {
- x >>= 1;
- ++ret;
- }
- return ret;
-}
-
#endif // BITCOIN_CRYPTO_COMMON_H
diff --git a/src/crypto/muhash.h b/src/crypto/muhash.h
index 53c5a91a03..cb53e1743e 100644
--- a/src/crypto/muhash.h
+++ b/src/crypto/muhash.h
@@ -5,10 +5,6 @@
#ifndef BITCOIN_CRYPTO_MUHASH_H
#define BITCOIN_CRYPTO_MUHASH_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <serialize.h>
#include <uint256.h>
diff --git a/src/crypto/sha256.cpp b/src/crypto/sha256.cpp
index 11aabeb1da..4c7bb6f20f 100644
--- a/src/crypto/sha256.cpp
+++ b/src/crypto/sha256.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <crypto/sha256.h>
#include <crypto/common.h>
@@ -22,13 +26,11 @@
#endif
#if defined(__x86_64__) || defined(__amd64__) || defined(__i386__)
-#if defined(USE_ASM)
namespace sha256_sse4
{
void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks);
}
#endif
-#endif
namespace sha256d64_sse41
{
@@ -570,7 +572,7 @@ bool SelfTest() {
}
#if !defined(DISABLE_OPTIMIZED_SHA256)
-#if defined(USE_ASM) && (defined(__x86_64__) || defined(__amd64__) || defined(__i386__))
+#if (defined(__x86_64__) || defined(__amd64__) || defined(__i386__))
/** Check whether the OS has enabled AVX registers. */
bool AVXEnabled()
{
@@ -593,7 +595,7 @@ std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implem
TransformD64_8way = nullptr;
#if !defined(DISABLE_OPTIMIZED_SHA256)
-#if defined(USE_ASM) && defined(HAVE_GETCPUID)
+#if defined(HAVE_GETCPUID)
bool have_sse4 = false;
bool have_xsave = false;
bool have_avx = false;
@@ -650,7 +652,7 @@ std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implem
ret += ",avx2(8way)";
}
#endif
-#endif // defined(USE_ASM) && defined(HAVE_GETCPUID)
+#endif // defined(HAVE_GETCPUID)
#if defined(ENABLE_ARM_SHANI)
bool have_arm_shani = false;
diff --git a/src/cuckoocache.h b/src/cuckoocache.h
index cb0b362143..df320ed465 100644
--- a/src/cuckoocache.h
+++ b/src/cuckoocache.h
@@ -359,7 +359,7 @@ public:
* @param bytes the approximate number of bytes to use for this data
* structure
* @returns A pair of the maximum number of elements storable (see setup()
- * documentation for more detail) and the approxmiate total size of these
+ * documentation for more detail) and the approximate total size of these
* elements in bytes or std::nullopt if the size requested is too large.
*/
std::optional<std::pair<uint32_t, size_t>> setup_bytes(size_t bytes)
diff --git a/src/flatfile.cpp b/src/flatfile.cpp
index 59861a08ad..2bff663d8b 100644
--- a/src/flatfile.cpp
+++ b/src/flatfile.cpp
@@ -82,15 +82,18 @@ bool FlatFileSeq::Flush(const FlatFilePos& pos, bool finalize)
{
FILE* file = Open(FlatFilePos(pos.nFile, 0)); // Avoid fseek to nPos
if (!file) {
- return error("%s: failed to open file %d", __func__, pos.nFile);
+ LogError("%s: failed to open file %d\n", __func__, pos.nFile);
+ return false;
}
if (finalize && !TruncateFile(file, pos.nPos)) {
fclose(file);
- return error("%s: failed to truncate file %d", __func__, pos.nFile);
+ LogError("%s: failed to truncate file %d\n", __func__, pos.nFile);
+ return false;
}
if (!FileCommit(file)) {
fclose(file);
- return error("%s: failed to commit file %d", __func__, pos.nFile);
+ LogError("%s: failed to commit file %d\n", __func__, pos.nFile);
+ return false;
}
DirectoryCommit(m_dir);
diff --git a/src/i2p.cpp b/src/i2p.cpp
index c891562d00..962adb124d 100644
--- a/src/i2p.cpp
+++ b/src/i2p.cpp
@@ -115,7 +115,7 @@ static CNetAddr DestB64ToAddr(const std::string& dest)
namespace sam {
Session::Session(const fs::path& private_key_file,
- const CService& control_host,
+ const Proxy& control_host,
CThreadInterrupt* interrupt)
: m_private_key_file{private_key_file},
m_control_host{control_host},
@@ -124,7 +124,7 @@ Session::Session(const fs::path& private_key_file,
{
}
-Session::Session(const CService& control_host, CThreadInterrupt* interrupt)
+Session::Session(const Proxy& control_host, CThreadInterrupt* interrupt)
: m_control_host{control_host},
m_interrupt{interrupt},
m_transient{true}
@@ -217,6 +217,7 @@ bool Session::Connect(const CService& to, Connection& conn, bool& proxy_error)
// Refuse connecting to arbitrary ports. We don't specify any destination port to the SAM proxy
// when connecting (SAM 3.1 does not use ports) and it forces/defaults it to I2P_SAM31_PORT.
if (to.GetPort() != I2P_SAM31_PORT) {
+ Log("Error connecting to %s, connection refused due to arbitrary port %s", to.ToStringAddrPort(), to.GetPort());
proxy_error = false;
return false;
}
@@ -326,14 +327,10 @@ Session::Reply Session::SendRequestAndGetReply(const Sock& sock,
std::unique_ptr<Sock> Session::Hello() const
{
- auto sock = CreateSock(m_control_host);
+ auto sock = m_control_host.Connect();
if (!sock) {
- throw std::runtime_error("Cannot create socket");
- }
-
- if (!ConnectSocketDirectly(m_control_host, *sock, nConnectTimeout, true)) {
- throw std::runtime_error(strprintf("Cannot connect to %s", m_control_host.ToStringAddrPort()));
+ throw std::runtime_error(strprintf("Cannot connect to %s", m_control_host.ToString()));
}
SendRequestAndGetReply(*sock, "HELLO VERSION MIN=3.1 MAX=3.1");
@@ -392,7 +389,7 @@ Binary Session::MyDestination() const
}
memcpy(&cert_len, &m_private_key.at(CERT_LEN_POS), sizeof(cert_len));
- cert_len = be16toh(cert_len);
+ cert_len = be16toh_internal(cert_len);
const size_t dest_len = DEST_LEN_BASE + cert_len;
@@ -417,7 +414,7 @@ void Session::CreateIfNotCreatedAlready()
const auto session_type = m_transient ? "transient" : "persistent";
const auto session_id = GetRandHash().GetHex().substr(0, 10); // full is overkill, too verbose in the logs
- Log("Creating %s SAM session %s with %s", session_type, session_id, m_control_host.ToStringAddrPort());
+ Log("Creating %s SAM session %s with %s", session_type, session_id, m_control_host.ToString());
auto sock = Hello();
diff --git a/src/i2p.h b/src/i2p.h
index 375abaccfc..8b0f1e1182 100644
--- a/src/i2p.h
+++ b/src/i2p.h
@@ -7,6 +7,7 @@
#include <compat/compat.h>
#include <netaddress.h>
+#include <netbase.h>
#include <sync.h>
#include <util/fs.h>
#include <util/sock.h>
@@ -67,7 +68,7 @@ public:
* `Session` object.
*/
Session(const fs::path& private_key_file,
- const CService& control_host,
+ const Proxy& control_host,
CThreadInterrupt* interrupt);
/**
@@ -81,7 +82,7 @@ public:
* `CThreadInterrupt` object is saved, so it must not be destroyed earlier than this
* `Session` object.
*/
- Session(const CService& control_host, CThreadInterrupt* interrupt);
+ Session(const Proxy& control_host, CThreadInterrupt* interrupt);
/**
* Destroy the session, closing the internally used sockets. The sockets that have been
@@ -235,9 +236,9 @@ private:
const fs::path m_private_key_file;
/**
- * The host and port of the SAM control service.
+ * The SAM control service proxy.
*/
- const CService m_control_host;
+ const Proxy m_control_host;
/**
* Cease network activity when this is signaled.
diff --git a/src/index/base.cpp b/src/index/base.cpp
index bcfe7215be..13d8ba5a01 100644
--- a/src/index/base.cpp
+++ b/src/index/base.cpp
@@ -31,7 +31,7 @@ template <typename... Args>
void BaseIndex::FatalErrorf(const char* fmt, const Args&... args)
{
auto message = tfm::format(fmt, args...);
- node::AbortNode(m_chain->context()->shutdown, m_chain->context()->exit_status, message);
+ node::AbortNode(m_chain->context()->shutdown, m_chain->context()->exit_status, Untranslated(message));
}
CBlockLocator GetLocator(interfaces::Chain& chain, const uint256& block_hash)
@@ -89,7 +89,7 @@ bool BaseIndex::Init()
return &m_chain->context()->chainman->GetChainstateForIndexing());
// Register to validation interface before setting the 'm_synced' flag, so that
// callbacks are not missed once m_synced is true.
- RegisterValidationInterface(this);
+ m_chain->context()->validation_signals->RegisterValidationInterface(this);
CBlockLocator locator;
if (!GetDB().ReadBestBlock(locator)) {
@@ -141,7 +141,7 @@ static const CBlockIndex* NextSyncBlock(const CBlockIndex* pindex_prev, CChain&
return chain.Next(chain.FindFork(pindex_prev));
}
-void BaseIndex::ThreadSync()
+void BaseIndex::Sync()
{
const CBlockIndex* pindex = m_best_block_index.load();
if (!m_synced) {
@@ -159,37 +159,20 @@ void BaseIndex::ThreadSync()
return;
}
- {
- LOCK(cs_main);
- const CBlockIndex* pindex_next = NextSyncBlock(pindex, m_chainstate->m_chain);
- if (!pindex_next) {
- SetBestBlockIndex(pindex);
- m_synced = true;
- // No need to handle errors in Commit. See rationale above.
- Commit();
- break;
- }
- if (pindex_next->pprev != pindex && !Rewind(pindex, pindex_next->pprev)) {
- FatalErrorf("%s: Failed to rewind index %s to a previous chain tip",
- __func__, GetName());
- return;
- }
- pindex = pindex_next;
- }
-
- auto current_time{std::chrono::steady_clock::now()};
- if (last_log_time + SYNC_LOG_INTERVAL < current_time) {
- LogPrintf("Syncing %s with block chain from height %d\n",
- GetName(), pindex->nHeight);
- last_log_time = current_time;
- }
-
- if (last_locator_write_time + SYNC_LOCATOR_WRITE_INTERVAL < current_time) {
- SetBestBlockIndex(pindex->pprev);
- last_locator_write_time = current_time;
+ const CBlockIndex* pindex_next = WITH_LOCK(cs_main, return NextSyncBlock(pindex, m_chainstate->m_chain));
+ if (!pindex_next) {
+ SetBestBlockIndex(pindex);
+ m_synced = true;
// No need to handle errors in Commit. See rationale above.
Commit();
+ break;
}
+ if (pindex_next->pprev != pindex && !Rewind(pindex, pindex_next->pprev)) {
+ FatalErrorf("%s: Failed to rewind index %s to a previous chain tip", __func__, GetName());
+ return;
+ }
+ pindex = pindex_next;
+
CBlock block;
interfaces::BlockInfo block_info = kernel::MakeBlockInfo(pindex);
@@ -205,6 +188,20 @@ void BaseIndex::ThreadSync()
__func__, pindex->GetBlockHash().ToString());
return;
}
+
+ auto current_time{std::chrono::steady_clock::now()};
+ if (last_log_time + SYNC_LOG_INTERVAL < current_time) {
+ LogPrintf("Syncing %s with block chain from height %d\n",
+ GetName(), pindex->nHeight);
+ last_log_time = current_time;
+ }
+
+ if (last_locator_write_time + SYNC_LOCATOR_WRITE_INTERVAL < current_time) {
+ SetBestBlockIndex(pindex);
+ last_locator_write_time = current_time;
+ // No need to handle errors in Commit. See rationale above.
+ Commit();
+ }
}
}
@@ -229,7 +226,8 @@ bool BaseIndex::Commit()
}
}
if (!ok) {
- return error("%s: Failed to commit latest %s state", __func__, GetName());
+ LogError("%s: Failed to commit latest %s state\n", __func__, GetName());
+ return false;
}
return true;
}
@@ -380,7 +378,7 @@ bool BaseIndex::BlockUntilSyncedToCurrentChain() const
}
LogPrintf("%s: %s is catching up on block notifications\n", __func__, GetName());
- SyncWithValidationInterfaceQueue();
+ m_chain->context()->validation_signals->SyncWithValidationInterfaceQueue();
return true;
}
@@ -393,13 +391,15 @@ bool BaseIndex::StartBackgroundSync()
{
if (!m_init) throw std::logic_error("Error: Cannot start a non-initialized index");
- m_thread_sync = std::thread(&util::TraceThread, GetName(), [this] { ThreadSync(); });
+ m_thread_sync = std::thread(&util::TraceThread, GetName(), [this] { Sync(); });
return true;
}
void BaseIndex::Stop()
{
- UnregisterValidationInterface(this);
+ if (m_chain->context()->validation_signals) {
+ m_chain->context()->validation_signals->UnregisterValidationInterface(this);
+ }
if (m_thread_sync.joinable()) {
m_thread_sync.join();
diff --git a/src/index/base.h b/src/index/base.h
index 154061fb19..0eb1d9ca3b 100644
--- a/src/index/base.h
+++ b/src/index/base.h
@@ -78,13 +78,6 @@ private:
std::thread m_thread_sync;
CThreadInterrupt m_interrupt;
- /// Sync the index with the block index starting from the current best block.
- /// Intended to be run in its own thread, m_thread_sync, and can be
- /// interrupted with m_interrupt. Once the index gets in sync, the m_synced
- /// flag is set and the BlockConnected ValidationInterface callback takes
- /// over and the sync thread exits.
- void ThreadSync();
-
/// Write the current index state (eg. chain block locator and subclass-specific items) to disk.
///
/// Recommendations for error handling:
@@ -152,9 +145,16 @@ public:
/// validation interface so that it stays in sync with blockchain updates.
[[nodiscard]] bool Init();
- /// Starts the initial sync process.
+ /// Starts the initial sync process on a background thread.
[[nodiscard]] bool StartBackgroundSync();
+ /// Sync the index with the block index starting from the current best block.
+ /// Intended to be run in its own thread, m_thread_sync, and can be
+ /// interrupted with m_interrupt. Once the index gets in sync, the m_synced
+ /// flag is set and the BlockConnected ValidationInterface callback takes
+ /// over and the sync thread exits.
+ void Sync();
+
/// Stops the instance from staying in sync with blockchain updates.
void Stop();
diff --git a/src/index/blockfilterindex.cpp b/src/index/blockfilterindex.cpp
index 58f777b326..41bdca9df5 100644
--- a/src/index/blockfilterindex.cpp
+++ b/src/index/blockfilterindex.cpp
@@ -119,14 +119,25 @@ bool BlockFilterIndex::CustomInit(const std::optional<interfaces::BlockKey>& blo
// indicate database corruption or a disk failure, and starting the index would cause
// further corruption.
if (m_db->Exists(DB_FILTER_POS)) {
- return error("%s: Cannot read current %s state; index may be corrupted",
+ LogError("%s: Cannot read current %s state; index may be corrupted\n",
__func__, GetName());
+ return false;
}
// If the DB_FILTER_POS is not set, then initialize to the first location.
m_next_filter_pos.nFile = 0;
m_next_filter_pos.nPos = 0;
}
+
+ if (block) {
+ auto op_last_header = ReadFilterHeader(block->height, block->hash);
+ if (!op_last_header) {
+ LogError("Cannot read last block filter header; index may be corrupted\n");
+ return false;
+ }
+ m_last_header = *op_last_header;
+ }
+
return true;
}
@@ -137,10 +148,12 @@ bool BlockFilterIndex::CustomCommit(CDBBatch& batch)
// Flush current filter file to disk.
AutoFile file{m_filter_fileseq->Open(pos)};
if (file.IsNull()) {
- return error("%s: Failed to open filter file %d", __func__, pos.nFile);
+ LogError("%s: Failed to open filter file %d\n", __func__, pos.nFile);
+ return false;
}
if (!FileCommit(file.Get())) {
- return error("%s: Failed to commit filter file %d", __func__, pos.nFile);
+ LogError("%s: Failed to commit filter file %d\n", __func__, pos.nFile);
+ return false;
}
batch.Write(DB_FILTER_POS, pos);
@@ -159,11 +172,15 @@ bool BlockFilterIndex::ReadFilterFromDisk(const FlatFilePos& pos, const uint256&
std::vector<uint8_t> encoded_filter;
try {
filein >> block_hash >> encoded_filter;
- if (Hash(encoded_filter) != hash) return error("Checksum mismatch in filter decode.");
+ if (Hash(encoded_filter) != hash) {
+ LogError("Checksum mismatch in filter decode.\n");
+ return false;
+ }
filter = BlockFilter(GetFilterType(), block_hash, std::move(encoded_filter), /*skip_decode_check=*/true);
}
catch (const std::exception& e) {
- return error("%s: Failed to deserialize block filter from disk: %s", __func__, e.what());
+ LogError("%s: Failed to deserialize block filter from disk: %s\n", __func__, e.what());
+ return false;
}
return true;
@@ -215,10 +232,25 @@ size_t BlockFilterIndex::WriteFilterToDisk(FlatFilePos& pos, const BlockFilter&
return data_size;
}
+std::optional<uint256> BlockFilterIndex::ReadFilterHeader(int height, const uint256& expected_block_hash)
+{
+ std::pair<uint256, DBVal> read_out;
+ if (!m_db->Read(DBHeightKey(height), read_out)) {
+ return std::nullopt;
+ }
+
+ if (read_out.first != expected_block_hash) {
+ LogError("%s: previous block header belongs to unexpected block %s; expected %s\n",
+ __func__, read_out.first.ToString(), expected_block_hash.ToString());
+ return std::nullopt;
+ }
+
+ return read_out.second.header;
+}
+
bool BlockFilterIndex::CustomAppend(const interfaces::BlockInfo& block)
{
CBlockUndo block_undo;
- uint256 prev_header;
if (block.height > 0) {
// pindex variable gives indexing code access to node internals. It
@@ -227,33 +259,28 @@ bool BlockFilterIndex::CustomAppend(const interfaces::BlockInfo& block)
if (!m_chainstate->m_blockman.UndoReadFromDisk(block_undo, *pindex)) {
return false;
}
-
- std::pair<uint256, DBVal> read_out;
- if (!m_db->Read(DBHeightKey(block.height - 1), read_out)) {
- return false;
- }
-
- uint256 expected_block_hash = *Assert(block.prev_hash);
- if (read_out.first != expected_block_hash) {
- return error("%s: previous block header belongs to unexpected block %s; expected %s",
- __func__, read_out.first.ToString(), expected_block_hash.ToString());
- }
-
- prev_header = read_out.second.header;
}
BlockFilter filter(m_filter_type, *Assert(block.data), block_undo);
+ const uint256& header = filter.ComputeHeader(m_last_header);
+ bool res = Write(filter, block.height, header);
+ if (res) m_last_header = header; // update last header
+ return res;
+}
+
+bool BlockFilterIndex::Write(const BlockFilter& filter, uint32_t block_height, const uint256& filter_header)
+{
size_t bytes_written = WriteFilterToDisk(m_next_filter_pos, filter);
if (bytes_written == 0) return false;
std::pair<uint256, DBVal> value;
- value.first = block.hash;
+ value.first = filter.GetBlockHash();
value.second.hash = filter.GetHash();
- value.second.header = filter.ComputeHeader(prev_header);
+ value.second.header = filter_header;
value.second.pos = m_next_filter_pos;
- if (!m_db->Write(DBHeightKey(block.height), value)) {
+ if (!m_db->Write(DBHeightKey(block_height), value)) {
return false;
}
@@ -270,14 +297,16 @@ bool BlockFilterIndex::CustomAppend(const interfaces::BlockInfo& block)
for (int height = start_height; height <= stop_height; ++height) {
if (!db_it.GetKey(key) || key.height != height) {
- return error("%s: unexpected key in %s: expected (%c, %d)",
+ LogError("%s: unexpected key in %s: expected (%c, %d)\n",
__func__, index_name, DB_BLOCK_HEIGHT, height);
+ return false;
}
std::pair<uint256, DBVal> value;
if (!db_it.GetValue(value)) {
- return error("%s: unable to read value in %s at key (%c, %d)",
+ LogError("%s: unable to read value in %s at key (%c, %d)\n",
__func__, index_name, DB_BLOCK_HEIGHT, height);
+ return false;
}
batch.Write(DBHashKey(value.first), std::move(value.second));
@@ -305,6 +334,8 @@ bool BlockFilterIndex::CustomRewind(const interfaces::BlockKey& current_tip, con
batch.Write(DB_FILTER_POS, m_next_filter_pos);
if (!m_db->WriteBatch(batch)) return false;
+ // Update cached header
+ m_last_header = *Assert(ReadFilterHeader(new_tip.height, new_tip.hash));
return true;
}
@@ -330,11 +361,13 @@ static bool LookupRange(CDBWrapper& db, const std::string& index_name, int start
const CBlockIndex* stop_index, std::vector<DBVal>& results)
{
if (start_height < 0) {
- return error("%s: start height (%d) is negative", __func__, start_height);
+ LogError("%s: start height (%d) is negative\n", __func__, start_height);
+ return false;
}
if (start_height > stop_index->nHeight) {
- return error("%s: start height (%d) is greater than stop height (%d)",
+ LogError("%s: start height (%d) is greater than stop height (%d)\n",
__func__, start_height, stop_index->nHeight);
+ return false;
}
size_t results_size = static_cast<size_t>(stop_index->nHeight - start_height + 1);
@@ -350,8 +383,9 @@ static bool LookupRange(CDBWrapper& db, const std::string& index_name, int start
size_t i = static_cast<size_t>(height - start_height);
if (!db_it->GetValue(values[i])) {
- return error("%s: unable to read value in %s at key (%c, %d)",
+ LogError("%s: unable to read value in %s at key (%c, %d)\n",
__func__, index_name, DB_BLOCK_HEIGHT, height);
+ return false;
}
db_it->Next();
@@ -373,8 +407,9 @@ static bool LookupRange(CDBWrapper& db, const std::string& index_name, int start
}
if (!db.Read(DBHashKey(block_hash), results[i])) {
- return error("%s: unable to read value in %s at key (%c, %s)",
+ LogError("%s: unable to read value in %s at key (%c, %s)\n",
__func__, index_name, DB_BLOCK_HASH, block_hash.ToString());
+ return false;
}
}
diff --git a/src/index/blockfilterindex.h b/src/index/blockfilterindex.h
index 10a1cfd2ee..cdb9563fb8 100644
--- a/src/index/blockfilterindex.h
+++ b/src/index/blockfilterindex.h
@@ -42,8 +42,15 @@ private:
/** cache of block hash to filter header, to avoid disk access when responding to getcfcheckpt. */
std::unordered_map<uint256, uint256, FilterHeaderHasher> m_headers_cache GUARDED_BY(m_cs_headers_cache);
+ // Last computed header to avoid disk reads on every new block.
+ uint256 m_last_header{};
+
bool AllowPrune() const override { return true; }
+ bool Write(const BlockFilter& filter, uint32_t block_height, const uint256& filter_header);
+
+ std::optional<uint256> ReadFilterHeader(int height, const uint256& expected_block_hash);
+
protected:
bool CustomInit(const std::optional<interfaces::BlockKey>& block) override;
diff --git a/src/index/coinstatsindex.cpp b/src/index/coinstatsindex.cpp
index ecd3fd21b5..dff8e50a4e 100644
--- a/src/index/coinstatsindex.cpp
+++ b/src/index/coinstatsindex.cpp
@@ -138,8 +138,9 @@ bool CoinStatsIndex::CustomAppend(const interfaces::BlockInfo& block)
read_out.first.ToString(), expected_block_hash.ToString());
if (!m_db->Read(DBHashKey(expected_block_hash), read_out)) {
- return error("%s: previous block header not found; expected %s",
+ LogError("%s: previous block header not found; expected %s\n",
__func__, expected_block_hash.ToString());
+ return false;
}
}
@@ -245,14 +246,16 @@ bool CoinStatsIndex::CustomAppend(const interfaces::BlockInfo& block)
for (int height = start_height; height <= stop_height; ++height) {
if (!db_it.GetKey(key) || key.height != height) {
- return error("%s: unexpected key in %s: expected (%c, %d)",
+ LogError("%s: unexpected key in %s: expected (%c, %d)\n",
__func__, index_name, DB_BLOCK_HEIGHT, height);
+ return false;
}
std::pair<uint256, DBVal> value;
if (!db_it.GetValue(value)) {
- return error("%s: unable to read value in %s at key (%c, %d)",
+ LogError("%s: unable to read value in %s at key (%c, %d)\n",
__func__, index_name, DB_BLOCK_HEIGHT, height);
+ return false;
}
batch.Write(DBHashKey(value.first), std::move(value.second));
@@ -285,8 +288,9 @@ bool CoinStatsIndex::CustomRewind(const interfaces::BlockKey& current_tip, const
CBlock block;
if (!m_chainstate->m_blockman.ReadBlockFromDisk(block, *iter_tip)) {
- return error("%s: Failed to read block %s from disk",
+ LogError("%s: Failed to read block %s from disk\n",
__func__, iter_tip->GetBlockHash().ToString());
+ return false;
}
if (!ReverseBlock(block, iter_tip)) {
@@ -353,23 +357,26 @@ bool CoinStatsIndex::CustomInit(const std::optional<interfaces::BlockKey>& block
// exist. Any other errors indicate database corruption or a disk
// failure, and starting the index would cause further corruption.
if (m_db->Exists(DB_MUHASH)) {
- return error("%s: Cannot read current %s state; index may be corrupted",
+ LogError("%s: Cannot read current %s state; index may be corrupted\n",
__func__, GetName());
+ return false;
}
}
if (block) {
DBVal entry;
if (!LookUpOne(*m_db, *block, entry)) {
- return error("%s: Cannot read current %s state; index may be corrupted",
+ LogError("%s: Cannot read current %s state; index may be corrupted\n",
__func__, GetName());
+ return false;
}
uint256 out;
m_muhash.Finalize(out);
if (entry.muhash != out) {
- return error("%s: Cannot read current %s state; index may be corrupted",
+ LogError("%s: Cannot read current %s state; index may be corrupted\n",
__func__, GetName());
+ return false;
}
m_transaction_output_count = entry.transaction_output_count;
@@ -422,8 +429,9 @@ bool CoinStatsIndex::ReverseBlock(const CBlock& block, const CBlockIndex* pindex
read_out.first.ToString(), expected_block_hash.ToString());
if (!m_db->Read(DBHashKey(expected_block_hash), read_out)) {
- return error("%s: previous block header not found; expected %s",
+ LogError("%s: previous block header not found; expected %s\n",
__func__, expected_block_hash.ToString());
+ return false;
}
}
}
diff --git a/src/index/txindex.cpp b/src/index/txindex.cpp
index 4983926e68..80f615ed0e 100644
--- a/src/index/txindex.cpp
+++ b/src/index/txindex.cpp
@@ -81,20 +81,24 @@ bool TxIndex::FindTx(const uint256& tx_hash, uint256& block_hash, CTransactionRe
AutoFile file{m_chainstate->m_blockman.OpenBlockFile(postx, true)};
if (file.IsNull()) {
- return error("%s: OpenBlockFile failed", __func__);
+ LogError("%s: OpenBlockFile failed\n", __func__);
+ return false;
}
CBlockHeader header;
try {
file >> header;
if (fseek(file.Get(), postx.nTxOffset, SEEK_CUR)) {
- return error("%s: fseek(...) failed", __func__);
+ LogError("%s: fseek(...) failed\n", __func__);
+ return false;
}
file >> TX_WITH_WITNESS(tx);
} catch (const std::exception& e) {
- return error("%s: Deserialize or I/O error - %s", __func__, e.what());
+ LogError("%s: Deserialize or I/O error - %s\n", __func__, e.what());
+ return false;
}
if (tx->GetHash() != tx_hash) {
- return error("%s: txid mismatch", __func__);
+ LogError("%s: txid mismatch\n", __func__);
+ return false;
}
block_hash = header.GetHash();
return true;
diff --git a/src/init.cpp b/src/init.cpp
index 988daefeec..885c0673dd 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -256,12 +256,8 @@ void Interrupt(NodeContext& node)
InterruptMapPort();
if (node.connman)
node.connman->Interrupt();
- if (g_txindex) {
- g_txindex->Interrupt();
- }
- ForEachBlockFilterIndex([](BlockFilterIndex& index) { index.Interrupt(); });
- if (g_coin_stats_index) {
- g_coin_stats_index->Interrupt();
+ for (auto* index : node.indexes) {
+ index->Interrupt();
}
}
@@ -291,7 +287,7 @@ void Shutdown(NodeContext& node)
// Because these depend on each-other, we make sure that neither can be
// using the other before destroying them.
- if (node.peerman) UnregisterValidationInterface(node.peerman.get());
+ if (node.peerman && node.validation_signals) node.validation_signals->UnregisterValidationInterface(node.peerman.get());
if (node.connman) node.connman->Stop();
StopTorControl();
@@ -317,7 +313,9 @@ void Shutdown(NodeContext& node)
// fee estimator from validation interface.
if (node.fee_estimator) {
node.fee_estimator->Flush();
- UnregisterValidationInterface(node.fee_estimator.get());
+ if (node.validation_signals) {
+ node.validation_signals->UnregisterValidationInterface(node.fee_estimator.get());
+ }
}
// FlushStateToDisk generates a ChainStateFlushed callback, which we should avoid missing
@@ -332,19 +330,14 @@ void Shutdown(NodeContext& node)
// After there are no more peers/RPC left to give us new data which may generate
// CValidationInterface callbacks, flush them...
- GetMainSignals().FlushBackgroundCallbacks();
+ if (node.validation_signals) node.validation_signals->FlushBackgroundCallbacks();
// Stop and delete all indexes only after flushing background callbacks.
- if (g_txindex) {
- g_txindex->Stop();
- g_txindex.reset();
- }
- if (g_coin_stats_index) {
- g_coin_stats_index->Stop();
- g_coin_stats_index.reset();
- }
- ForEachBlockFilterIndex([](BlockFilterIndex& index) { index.Stop(); });
+ for (auto* index : node.indexes) index->Stop();
+ if (g_txindex) g_txindex.reset();
+ if (g_coin_stats_index) g_coin_stats_index.reset();
DestroyAllBlockFilterIndexes();
+ node.indexes.clear(); // all instances are nullptr now
// Any future callbacks will be dropped. This should absolutely be safe - if
// missing a callback results in an unrecoverable situation, unclean shutdown
@@ -367,17 +360,19 @@ void Shutdown(NodeContext& node)
#if ENABLE_ZMQ
if (g_zmq_notification_interface) {
- UnregisterValidationInterface(g_zmq_notification_interface.get());
+ if (node.validation_signals) node.validation_signals->UnregisterValidationInterface(g_zmq_notification_interface.get());
g_zmq_notification_interface.reset();
}
#endif
node.chain_clients.clear();
- UnregisterAllValidationInterfaces();
- GetMainSignals().UnregisterBackgroundSignalScheduler();
+ if (node.validation_signals) {
+ node.validation_signals->UnregisterAllValidationInterfaces();
+ }
node.mempool.reset();
node.fee_estimator.reset();
node.chainman.reset();
+ node.validation_signals.reset();
node.scheduler.reset();
node.kernel.reset();
@@ -473,7 +468,7 @@ void SetupServerArgs(ArgsManager& argsman)
argsman.AddArg("-blocknotify=<cmd>", "Execute command when the best block changes (%s in cmd is replaced by block hash)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
#endif
argsman.AddArg("-blockreconstructionextratxn=<n>", strprintf("Extra transactions to keep in memory for compact block reconstructions (default: %u)", DEFAULT_BLOCK_RECONSTRUCTION_EXTRA_TXN), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
- argsman.AddArg("-blocksonly", strprintf("Whether to reject transactions from network peers. Automatic broadcast and rebroadcast of any transactions from inbound peers is disabled, unless the peer has the 'forcerelay' permission. RPC transactions are not affected. (default: %u)", DEFAULT_BLOCKSONLY), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
+ argsman.AddArg("-blocksonly", strprintf("Whether to reject transactions from network peers. Disables automatic broadcast and rebroadcast of transactions, unless the source peer has the 'forcerelay' permission. RPC transactions are not affected. (default: %u)", DEFAULT_BLOCKSONLY), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-coinstatsindex", strprintf("Maintain coinstats index used by the gettxoutsetinfo RPC (default: %u)", DEFAULT_COINSTATSINDEX), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-conf=<file>", strprintf("Specify path to read-only configuration file. Relative paths will be prefixed by datadir location (only useable from command line, not configuration file) (default: %s)", BITCOIN_CONF_FILENAME), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
argsman.AddArg("-datadir=<dir>", "Specify data directory", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
@@ -530,7 +525,11 @@ void SetupServerArgs(ArgsManager& argsman)
argsman.AddArg("-maxsendbuffer=<n>", strprintf("Maximum per-connection memory usage for the send buffer, <n>*1000 bytes (default: %u)", DEFAULT_MAXSENDBUFFER), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-maxtimeadjustment", strprintf("Maximum allowed median peer time offset adjustment. Local perspective of time may be influenced by outbound peers forward or backward by this amount (default: %u seconds).", DEFAULT_MAX_TIME_ADJUSTMENT), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-maxuploadtarget=<n>", strprintf("Tries to keep outbound traffic under the given target per 24h. Limit does not apply to peers with 'download' permission or blocks created within past week. 0 = no limit (default: %s). Optional suffix units [k|K|m|M|g|G|t|T] (default: M). Lowercase is 1000 base while uppercase is 1024 base", DEFAULT_MAX_UPLOAD_TARGET), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
+#if HAVE_SOCKADDR_UN
+ argsman.AddArg("-onion=<ip:port|path>", "Use separate SOCKS5 proxy to reach peers via Tor onion services, set -noonion to disable (default: -proxy). May be a local file path prefixed with 'unix:'.", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
+#else
argsman.AddArg("-onion=<ip:port>", "Use separate SOCKS5 proxy to reach peers via Tor onion services, set -noonion to disable (default: -proxy)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
+#endif
argsman.AddArg("-i2psam=<ip:port>", "I2P SAM proxy to reach I2P peers and accept I2P connections (default: none)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-i2pacceptincoming", strprintf("Whether to accept inbound I2P connections (default: %i). Ignored if -i2psam is not set. Listening for inbound I2P connections is done through the SAM proxy, not by binding to a local address and port.", DEFAULT_I2P_ACCEPT_INCOMING), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-onlynet=<net>", "Make automatic outbound connections only to network <net> (" + Join(GetNetworkNames(), ", ") + "). Inbound and manual connections are not affected by this option. It can be specified multiple times to allow multiple networks.", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
@@ -541,7 +540,11 @@ void SetupServerArgs(ArgsManager& argsman)
// TODO: remove the sentence "Nodes not using ... incoming connections." once the changes from
// https://github.com/bitcoin/bitcoin/pull/23542 have become widespread.
argsman.AddArg("-port=<port>", strprintf("Listen for connections on <port>. Nodes not using the default ports (default: %u, testnet: %u, signet: %u, regtest: %u) are unlikely to get incoming connections. Not relevant for I2P (see doc/i2p.md).", defaultChainParams->GetDefaultPort(), testnetChainParams->GetDefaultPort(), signetChainParams->GetDefaultPort(), regtestChainParams->GetDefaultPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION);
+#if HAVE_SOCKADDR_UN
+ argsman.AddArg("-proxy=<ip:port|path>", "Connect through SOCKS5 proxy, set -noproxy to disable (default: disabled). May be a local file path prefixed with 'unix:' if the proxy supports it.", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_ELISION, OptionsCategory::CONNECTION);
+#else
argsman.AddArg("-proxy=<ip:port>", "Connect through SOCKS5 proxy, set -noproxy to disable (default: disabled)", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_ELISION, OptionsCategory::CONNECTION);
+#endif
argsman.AddArg("-proxyrandomize", strprintf("Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)", DEFAULT_PROXYRANDOMIZE), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-seednode=<ip>", "Connect to a node to retrieve peer addresses, and disconnect. This option can be specified multiple times to connect to multiple nodes.", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-networkactive", "Enable all P2P network activity (default: 1). Can be changed by the setnetworkactive RPC command", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
@@ -567,9 +570,11 @@ void SetupServerArgs(ArgsManager& argsman)
"Use [host]:port notation for IPv6. Allowed permissions: " + Join(NET_PERMISSIONS_DOC, ", ") + ". "
"Specify multiple permissions separated by commas (default: download,noban,mempool,relay). Can be specified multiple times.", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
- argsman.AddArg("-whitelist=<[permissions@]IP address or network>", "Add permission flags to the peers connecting from the given IP address (e.g. 1.2.3.4) or "
+ argsman.AddArg("-whitelist=<[permissions@]IP address or network>", "Add permission flags to the peers using the given IP address (e.g. 1.2.3.4) or "
"CIDR-notated network (e.g. 1.2.3.0/24). Uses the same permissions as "
- "-whitebind. Can be specified multiple times." , ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
+ "-whitebind. "
+ "Additional flags \"in\" and \"out\" control whether permissions apply to incoming connections and/or manual (default: incoming only). "
+ "Can be specified multiple times.", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
g_wallet_init_interface.AddWalletOptions(argsman);
@@ -610,7 +615,7 @@ void SetupServerArgs(ArgsManager& argsman)
argsman.AddArg("-limitancestorsize=<n>", strprintf("Do not accept transactions whose size with all in-mempool ancestors exceeds <n> kilobytes (default: %u)", DEFAULT_ANCESTOR_SIZE_LIMIT_KVB), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-limitdescendantcount=<n>", strprintf("Do not accept transactions if any ancestor would have <n> or more in-mempool descendants (default: %u)", DEFAULT_DESCENDANT_LIMIT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-limitdescendantsize=<n>", strprintf("Do not accept transactions if any ancestor would have more than <n> kilobytes of in-mempool descendants (default: %u).", DEFAULT_DESCENDANT_SIZE_LIMIT_KVB), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
- argsman.AddArg("-addrmantest", "Allows to test address relay on localhost", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
+ argsman.AddArg("-test=<option>", "Pass a test-only option. Options include : " + Join(TEST_OPTIONS_DOC, ", ") + ".", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-capturemessages", "Capture all P2P messages to disk", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-mocktime=<n>", "Replace actual time with " + UNIX_EPOCH_TIME + " (default: 0)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-maxsigcachesize=<n>", strprintf("Limit sum of signature cache and script execution cache sizes to <n> MiB (default: %u)", DEFAULT_MAX_SIG_CACHE_BYTES >> 20), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
@@ -639,8 +644,8 @@ void SetupServerArgs(ArgsManager& argsman)
OptionsCategory::NODE_RELAY);
argsman.AddArg("-minrelaytxfee=<amt>", strprintf("Fees (in %s/kvB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)",
CURRENCY_UNIT, FormatMoney(DEFAULT_MIN_RELAY_TX_FEE)), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
- argsman.AddArg("-whitelistforcerelay", strprintf("Add 'forcerelay' permission to whitelisted inbound peers with default permissions. This will relay transactions even if the transactions were already in the mempool. (default: %d)", DEFAULT_WHITELISTFORCERELAY), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
- argsman.AddArg("-whitelistrelay", strprintf("Add 'relay' permission to whitelisted inbound peers with default permissions. This will accept relayed transactions even when not relaying transactions (default: %d)", DEFAULT_WHITELISTRELAY), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
+ argsman.AddArg("-whitelistforcerelay", strprintf("Add 'forcerelay' permission to whitelisted peers with default permissions. This will relay transactions even if the transactions were already in the mempool. (default: %d)", DEFAULT_WHITELISTFORCERELAY), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
+ argsman.AddArg("-whitelistrelay", strprintf("Add 'relay' permission to whitelisted peers with default permissions. This will accept relayed transactions even when not relaying transactions (default: %d)", DEFAULT_WHITELISTRELAY), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
argsman.AddArg("-blockmaxweight=<n>", strprintf("Set maximum BIP141 block weight (default: %d)", DEFAULT_BLOCK_MAX_WEIGHT), ArgsManager::ALLOW_ANY, OptionsCategory::BLOCK_CREATION);
@@ -1024,6 +1029,22 @@ bool AppInitParameterInteraction(const ArgsManager& args)
if (args.GetBoolArg("-peerbloomfilters", DEFAULT_PEERBLOOMFILTERS))
nLocalServices = ServiceFlags(nLocalServices | NODE_BLOOM);
+ if (args.IsArgSet("-test")) {
+ if (chainparams.GetChainType() != ChainType::REGTEST) {
+ return InitError(Untranslated("-test=<option> can only be used with regtest"));
+ }
+ const std::vector<std::string> options = args.GetArgs("-test");
+ for (const std::string& option : options) {
+ auto it = std::find_if(TEST_OPTIONS_DOC.begin(), TEST_OPTIONS_DOC.end(), [&option](const std::string& doc_option) {
+ size_t pos = doc_option.find(" (");
+ return (pos != std::string::npos) && (doc_option.substr(0, pos) == option);
+ });
+ if (it == TEST_OPTIONS_DOC.end()) {
+ InitWarning(strprintf(_("Unrecognised option \"%s\" provided in -test=<option>."), option));
+ }
+ }
+ }
+
// Also report errors from parsing before daemonization
{
kernel::Notifications notifications{};
@@ -1138,17 +1159,18 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
assert(!node.scheduler);
node.scheduler = std::make_unique<CScheduler>();
+ auto& scheduler = *node.scheduler;
// Start the lightweight task scheduler thread
- node.scheduler->m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { node.scheduler->serviceQueue(); });
+ scheduler.m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { scheduler.serviceQueue(); });
// Gather some entropy once per minute.
- node.scheduler->scheduleEvery([]{
+ scheduler.scheduleEvery([]{
RandAddPeriodic();
}, std::chrono::minutes{1});
// Check disk space every 5 minutes to avoid db corruption.
- node.scheduler->scheduleEvery([&args, &node]{
+ scheduler.scheduleEvery([&args, &node]{
constexpr uint64_t min_disk_space = 50 << 20; // 50 MB
if (!CheckDiskSpace(args.GetBlocksDirPath(), min_disk_space)) {
LogPrintf("Shutting down due to lack of disk space!\n");
@@ -1158,7 +1180,9 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
}
}, std::chrono::minutes{5});
- GetMainSignals().RegisterBackgroundSignalScheduler(*node.scheduler);
+ assert(!node.validation_signals);
+ node.validation_signals = std::make_unique<ValidationSignals>(std::make_unique<SerialTaskRunner>(scheduler));
+ auto& validation_signals = *node.validation_signals;
// Create client interfaces for wallets that are supposed to be loaded
// according to -wallet and -disablewallet options. This only constructs
@@ -1263,8 +1287,8 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
// Flush estimates to disk periodically
CBlockPolicyEstimator* fee_estimator = node.fee_estimator.get();
- node.scheduler->scheduleEvery([fee_estimator] { fee_estimator->FlushFeeEstimates(); }, FEE_FLUSH_INTERVAL);
- RegisterValidationInterface(fee_estimator);
+ scheduler.scheduleEvery([fee_estimator] { fee_estimator->FlushFeeEstimates(); }, FEE_FLUSH_INTERVAL);
+ validation_signals.RegisterValidationInterface(fee_estimator);
}
// Check port numbers
@@ -1298,7 +1322,14 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
std::string host_out;
uint16_t port_out{0};
if (!SplitHostPort(socket_addr, port_out, host_out)) {
+#if HAVE_SOCKADDR_UN
+ // Allow unix domain sockets for -proxy and -onion e.g. unix:/some/file/path
+ if ((port_option != "-proxy" && port_option != "-onion") || socket_addr.find(ADDR_PREFIX_UNIX) != 0) {
+ return InitError(InvalidPortErrMsg(port_option, socket_addr));
+ }
+#else
return InitError(InvalidPortErrMsg(port_option, socket_addr));
+#endif
}
}
}
@@ -1365,12 +1396,18 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
// -noproxy (or -proxy=0) as well as the empty string can be used to not set a proxy, this is the default
std::string proxyArg = args.GetArg("-proxy", "");
if (proxyArg != "" && proxyArg != "0") {
- const std::optional<CService> proxyAddr{Lookup(proxyArg, 9050, fNameLookup)};
- if (!proxyAddr.has_value()) {
- return InitError(strprintf(_("Invalid -proxy address or hostname: '%s'"), proxyArg));
+ Proxy addrProxy;
+ if (IsUnixSocketPath(proxyArg)) {
+ addrProxy = Proxy(proxyArg, proxyRandomize);
+ } else {
+ const std::optional<CService> proxyAddr{Lookup(proxyArg, 9050, fNameLookup)};
+ if (!proxyAddr.has_value()) {
+ return InitError(strprintf(_("Invalid -proxy address or hostname: '%s'"), proxyArg));
+ }
+
+ addrProxy = Proxy(proxyAddr.value(), proxyRandomize);
}
- Proxy addrProxy = Proxy(proxyAddr.value(), proxyRandomize);
if (!addrProxy.IsValid())
return InitError(strprintf(_("Invalid -proxy address or hostname: '%s'"), proxyArg));
@@ -1396,11 +1433,16 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
"reaching the Tor network is explicitly forbidden: -onion=0"));
}
} else {
- const std::optional<CService> addr{Lookup(onionArg, 9050, fNameLookup)};
- if (!addr.has_value() || !addr->IsValid()) {
- return InitError(strprintf(_("Invalid -onion address or hostname: '%s'"), onionArg));
+ if (IsUnixSocketPath(onionArg)) {
+ onion_proxy = Proxy(onionArg, proxyRandomize);
+ } else {
+ const std::optional<CService> addr{Lookup(onionArg, 9050, fNameLookup)};
+ if (!addr.has_value() || !addr->IsValid()) {
+ return InitError(strprintf(_("Invalid -onion address or hostname: '%s'"), onionArg));
+ }
+
+ onion_proxy = Proxy(addr.value(), proxyRandomize);
}
- onion_proxy = Proxy{addr.value(), proxyRandomize};
}
}
@@ -1429,13 +1471,13 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
#if ENABLE_ZMQ
g_zmq_notification_interface = CZMQNotificationInterface::Create(
- [&chainman = node.chainman](CBlock& block, const CBlockIndex& index) {
+ [&chainman = node.chainman](std::vector<uint8_t>& block, const CBlockIndex& index) {
assert(chainman);
- return chainman->m_blockman.ReadBlockFromDisk(block, index);
+ return chainman->m_blockman.ReadRawBlockFromDisk(block, WITH_LOCK(cs_main, return index.GetBlockPos()));
});
if (g_zmq_notification_interface) {
- RegisterValidationInterface(g_zmq_notification_interface.get());
+ validation_signals.RegisterValidationInterface(g_zmq_notification_interface.get());
}
#endif
@@ -1449,6 +1491,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
.chainparams = chainparams,
.datadir = args.GetDataDirNet(),
.notifications = *node.notifications,
+ .signals = &validation_signals,
};
Assert(ApplyArgsManOptions(args, chainman_opts)); // no error can happen, already checked in AppInitParameterInteraction
@@ -1478,6 +1521,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
CTxMemPool::Options mempool_opts{
.check_ratio = chainparams.DefaultConsistencyChecks() ? 1 : 0,
+ .signals = &validation_signals,
};
auto result{ApplyArgsManOptions(args, chainparams, mempool_opts)};
if (!result) {
@@ -1505,7 +1549,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
// Drain the validation interface queue to ensure that the old indexes
// don't have any pending work.
- SyncWithValidationInterfaceQueue();
+ Assert(node.validation_signals)->SyncWithValidationInterfaceQueue();
for (auto* index : node.indexes) {
index->Interrupt();
@@ -1594,7 +1638,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
node.peerman = PeerManager::make(*node.connman, *node.addrman,
node.banman.get(), chainman,
*node.mempool, peerman_opts);
- RegisterValidationInterface(node.peerman.get());
+ validation_signals.RegisterValidationInterface(node.peerman.get());
// ********************************************************* Step 8: start indexers
@@ -1713,7 +1757,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
// Start indexes initial sync
if (!StartIndexBackgroundSync(node)) {
bilingual_str err_str = _("Failed to start indexes, shutting down..");
- chainman.GetNotifications().fatalError(err_str.original, err_str);
+ chainman.GetNotifications().fatalError(err_str);
return;
}
// Load mempool from disk
@@ -1775,6 +1819,8 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
connOptions.m_added_nodes = args.GetArgs("-addnode");
connOptions.nMaxOutboundLimit = *opt_max_upload;
connOptions.m_peer_connect_timeout = peer_connect_timeout;
+ connOptions.whitelist_forcerelay = args.GetBoolArg("-whitelistforcerelay", DEFAULT_WHITELISTFORCERELAY);
+ connOptions.whitelist_relay = args.GetBoolArg("-whitelistrelay", DEFAULT_WHITELISTRELAY);
// Port to bind to if `-bind=addr` is provided without a `:port` suffix.
const uint16_t default_bind_port =
@@ -1859,9 +1905,15 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
for (const auto& net : args.GetArgs("-whitelist")) {
NetWhitelistPermissions subnet;
+ ConnectionDirection connection_direction;
bilingual_str error;
- if (!NetWhitelistPermissions::TryParse(net, subnet, error)) return InitError(error);
- connOptions.vWhitelistedRange.push_back(subnet);
+ if (!NetWhitelistPermissions::TryParse(net, subnet, connection_direction, error)) return InitError(error);
+ if (connection_direction & ConnectionDirection::In) {
+ connOptions.vWhitelistedRangeIncoming.push_back(subnet);
+ }
+ if (connection_direction & ConnectionDirection::Out) {
+ connOptions.vWhitelistedRangeOutgoing.push_back(subnet);
+ }
}
connOptions.vSeedNodes = args.GetArgs("-seednode");
@@ -1900,7 +1952,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
connOptions.m_i2p_accept_incoming = args.GetBoolArg("-i2pacceptincoming", DEFAULT_I2P_ACCEPT_INCOMING);
- if (!node.connman->Start(*node.scheduler, connOptions)) {
+ if (!node.connman->Start(scheduler, connOptions)) {
return false;
}
@@ -1920,15 +1972,15 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
uiInterface.InitMessage(_("Done loading").translated);
for (const auto& client : node.chain_clients) {
- client->start(*node.scheduler);
+ client->start(scheduler);
}
BanMan* banman = node.banman.get();
- node.scheduler->scheduleEvery([banman]{
+ scheduler.scheduleEvery([banman]{
banman->DumpBanlist();
}, DUMP_BANS_INTERVAL);
- if (node.peerman) node.peerman->StartScheduledTasks(*node.scheduler);
+ if (node.peerman) node.peerman->StartScheduledTasks(scheduler);
#if HAVE_SYSTEM
StartupNotify(args);
diff --git a/src/kernel/chainparams.cpp b/src/kernel/chainparams.cpp
index b0e657ba45..264a2fd681 100644
--- a/src/kernel/chainparams.cpp
+++ b/src/kernel/chainparams.cpp
@@ -104,8 +104,8 @@ public:
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = 1628640000; // August 11th, 2021
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 709632; // Approximately November 12th, 2021
- consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000052b2559353df4117b7348b64");
- consensus.defaultAssumeValid = uint256S("0x00000000000000000001a0a448d6cf2546b06801389cc030b2b18c6491266815"); // 804000
+ consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000063c4ebd298db40af57541800");
+ consensus.defaultAssumeValid = uint256S("0x000000000000000000026811d149d4d261995ec5b3f64f439a0a10e1a464af9a"); // 824000
/**
* The message start string is designed to be unlikely to occur in normal data.
@@ -118,8 +118,8 @@ public:
pchMessageStart[3] = 0xd9;
nDefaultPort = 8333;
nPruneAfterHeight = 100000;
- m_assumed_blockchain_size = 590;
- m_assumed_chain_state_size = 9;
+ m_assumed_blockchain_size = 600;
+ m_assumed_chain_state_size = 10;
genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);
consensus.hashGenesisBlock = genesis.GetHash();
@@ -177,10 +177,10 @@ public:
};
chainTxData = ChainTxData{
- // Data from RPC: getchaintxstats 4096 00000000000000000001a0a448d6cf2546b06801389cc030b2b18c6491266815
- .nTime = 1692502494,
- .nTxCount = 881818374,
- .dTxRate = 5.521964628130412,
+ // Data from RPC: getchaintxstats 4096 000000000000000000026811d149d4d261995ec5b3f64f439a0a10e1a464af9a
+ .nTime = 1704194835,
+ .nTxCount = 946728933,
+ .dTxRate = 6.569290261471664,
};
}
};
@@ -222,8 +222,8 @@ public:
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = 1628640000; // August 11th, 2021
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 0; // No activation delay
- consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000b6a51f415a67c0da307");
- consensus.defaultAssumeValid = uint256S("0x0000000000000093bcb68c03a9a168ae252572d348a2eaeba2cdf9231d73206f"); // 2500000
+ consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000c59b14e264ba6c15db9");
+ consensus.defaultAssumeValid = uint256S("0x000000000001323071f38f21ea5aae529ece491eadaccce506a59bcc2d968917"); // 2550000
pchMessageStart[0] = 0x0b;
pchMessageStart[1] = 0x11;
@@ -276,10 +276,10 @@ public:
};
chainTxData = ChainTxData{
- // Data from RPC: getchaintxstats 4096 0000000000000093bcb68c03a9a168ae252572d348a2eaeba2cdf9231d73206f
- .nTime = 1694733634,
- .nTxCount = 66484552,
- .dTxRate = 0.1804908356632494,
+ // Data from RPC: getchaintxstats 4096 000000000001323071f38f21ea5aae529ece491eadaccce506a59bcc2d968917
+ .nTime = 1703579240,
+ .nTxCount = 67845391,
+ .dTxRate = 1.464436832560951,
};
}
};
@@ -302,15 +302,15 @@ public:
vSeeds.emplace_back("178.128.221.177");
vSeeds.emplace_back("v7ajjeirttkbnt32wpy3c6w3emwnfr3fkla7hpxcfokr3ysd3kqtzmqd.onion:38333");
- consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000000000001ad46be4862");
- consensus.defaultAssumeValid = uint256S("0x0000013d778ba3f914530f11f6b69869c9fab54acff85acd7b8201d111f19b7f"); // 150000
+ consensus.nMinimumChainWork = uint256S("0x00000000000000000000000000000000000000000000000000000206e86f08e8");
+ consensus.defaultAssumeValid = uint256S("0x0000000870f15246ba23c16e370a7ffb1fc8a3dcf8cb4492882ed4b0e3d4cd26"); // 180000
m_assumed_blockchain_size = 1;
m_assumed_chain_state_size = 0;
chainTxData = ChainTxData{
- // Data from RPC: getchaintxstats 4096 0000013d778ba3f914530f11f6b69869c9fab54acff85acd7b8201d111f19b7f
- .nTime = 1688366339,
- .nTxCount = 2262750,
- .dTxRate = 0.003414084572046456,
+ // Data from RPC: getchaintxstats 4096 0000000870f15246ba23c16e370a7ffb1fc8a3dcf8cb4492882ed4b0e3d4cd26
+ .nTime = 1706331472,
+ .nTxCount = 2425380,
+ .dTxRate = 0.008277759863833788,
};
} else {
bin = *options.challenge;
diff --git a/src/kernel/chainstatemanager_opts.h b/src/kernel/chainstatemanager_opts.h
index 864aac336e..de5f78494a 100644
--- a/src/kernel/chainstatemanager_opts.h
+++ b/src/kernel/chainstatemanager_opts.h
@@ -18,6 +18,7 @@
#include <optional>
class CChainParams;
+class ValidationSignals;
static constexpr bool DEFAULT_CHECKPOINTS_ENABLED{true};
static constexpr auto DEFAULT_MAX_TIP_AGE{24h};
@@ -44,6 +45,7 @@ struct ChainstateManagerOpts {
DBOptions coins_db{};
CoinsViewOptions coins_view{};
Notifications& notifications;
+ ValidationSignals* signals{nullptr};
//! Number of script check worker threads. Zero means no parallel verification.
int worker_threads_num{0};
};
diff --git a/src/kernel/coinstats.cpp b/src/kernel/coinstats.cpp
index ff8a33e804..81c496ab34 100644
--- a/src/kernel/coinstats.cpp
+++ b/src/kernel/coinstats.cpp
@@ -134,7 +134,8 @@ static bool ComputeUTXOStats(CCoinsView* view, CCoinsStats& stats, T hash_obj, c
outputs[key.n] = std::move(coin);
stats.coins_count++;
} else {
- return error("%s: unable to read value", __func__);
+ LogError("%s: unable to read value\n", __func__);
+ return false;
}
pcursor->Next();
}
diff --git a/src/kernel/mempool_options.h b/src/kernel/mempool_options.h
index 753aebd455..0850b2e60e 100644
--- a/src/kernel/mempool_options.h
+++ b/src/kernel/mempool_options.h
@@ -13,6 +13,8 @@
#include <cstdint>
#include <optional>
+class ValidationSignals;
+
/** Default for -maxmempool, maximum megabytes of mempool memory usage */
static constexpr unsigned int DEFAULT_MAX_MEMPOOL_SIZE_MB{300};
/** Default for -maxmempool when blocksonly is set */
@@ -56,6 +58,8 @@ struct MemPoolOptions {
bool full_rbf{DEFAULT_MEMPOOL_FULL_RBF};
bool persist_v1_dat{DEFAULT_PERSIST_V1_DAT};
MemPoolLimits limits{};
+
+ ValidationSignals* signals{nullptr};
};
} // namespace kernel
diff --git a/src/kernel/mempool_persist.cpp b/src/kernel/mempool_persist.cpp
index 57c5168e9f..f06f609379 100644
--- a/src/kernel/mempool_persist.cpp
+++ b/src/kernel/mempool_persist.cpp
@@ -44,7 +44,7 @@ bool LoadMempool(CTxMemPool& pool, const fs::path& load_path, Chainstate& active
AutoFile file{opts.mockable_fopen_function(load_path, "rb")};
if (file.IsNull()) {
- LogPrintf("Failed to open mempool file from disk. Continuing anyway.\n");
+ LogInfo("Failed to open mempool file. Continuing anyway.\n");
return false;
}
@@ -70,12 +70,12 @@ bool LoadMempool(CTxMemPool& pool, const fs::path& load_path, Chainstate& active
uint64_t total_txns_to_load;
file >> total_txns_to_load;
uint64_t txns_tried = 0;
- LogInfo("Loading %u mempool transactions from disk...\n", total_txns_to_load);
+ LogInfo("Loading %u mempool transactions from file...\n", total_txns_to_load);
int next_tenth_to_report = 0;
while (txns_tried < total_txns_to_load) {
const int percentage_done(100.0 * txns_tried / total_txns_to_load);
if (next_tenth_to_report < percentage_done / 10) {
- LogInfo("Progress loading mempool transactions from disk: %d%% (tried %u, %u remaining)\n",
+ LogInfo("Progress loading mempool transactions from file: %d%% (tried %u, %u remaining)\n",
percentage_done, txns_tried, total_txns_to_load - txns_tried);
next_tenth_to_report = percentage_done / 10;
}
@@ -138,11 +138,11 @@ bool LoadMempool(CTxMemPool& pool, const fs::path& load_path, Chainstate& active
}
}
} catch (const std::exception& e) {
- LogPrintf("Failed to deserialize mempool data on disk: %s. Continuing anyway.\n", e.what());
+ LogInfo("Failed to deserialize mempool data on file: %s. Continuing anyway.\n", e.what());
return false;
}
- LogPrintf("Imported mempool transactions from disk: %i succeeded, %i failed, %i expired, %i already there, %i waiting for initial broadcast\n", count, failed, expired, already_there, unbroadcast);
+ LogInfo("Imported mempool transactions from file: %i succeeded, %i failed, %i expired, %i already there, %i waiting for initial broadcast\n", count, failed, expired, already_there, unbroadcast);
return true;
}
@@ -184,7 +184,9 @@ bool DumpMempool(const CTxMemPool& pool, const fs::path& dump_path, FopenFn mock
}
file.SetXor(xor_key);
- file << (uint64_t)vinfo.size();
+ uint64_t mempool_transactions_to_write(vinfo.size());
+ file << mempool_transactions_to_write;
+ LogInfo("Writing %u mempool transactions to file...\n", mempool_transactions_to_write);
for (const auto& i : vinfo) {
file << TX_WITH_WITNESS(*(i.tx));
file << int64_t{count_seconds(i.m_time)};
@@ -194,7 +196,7 @@ bool DumpMempool(const CTxMemPool& pool, const fs::path& dump_path, FopenFn mock
file << mapDeltas;
- LogPrintf("Writing %d unbroadcast transactions to disk.\n", unbroadcast_txids.size());
+ LogInfo("Writing %d unbroadcast transactions to file.\n", unbroadcast_txids.size());
file << unbroadcast_txids;
if (!skip_file_commit && !FileCommit(file.Get()))
@@ -205,11 +207,12 @@ bool DumpMempool(const CTxMemPool& pool, const fs::path& dump_path, FopenFn mock
}
auto last = SteadyClock::now();
- LogPrintf("Dumped mempool: %.3fs to copy, %.3fs to dump\n",
+ LogInfo("Dumped mempool: %.3fs to copy, %.3fs to dump, %d bytes dumped to file\n",
Ticks<SecondsDouble>(mid - start),
- Ticks<SecondsDouble>(last - mid));
+ Ticks<SecondsDouble>(last - mid),
+ fs::file_size(dump_path));
} catch (const std::exception& e) {
- LogPrintf("Failed to dump mempool: %s. Continuing anyway.\n", e.what());
+ LogInfo("Failed to dump mempool: %s. Continuing anyway.\n", e.what());
return false;
}
return true;
diff --git a/src/kernel/notifications_interface.h b/src/kernel/notifications_interface.h
index c5e77b0df9..7283a88e86 100644
--- a/src/kernel/notifications_interface.h
+++ b/src/kernel/notifications_interface.h
@@ -5,14 +5,12 @@
#ifndef BITCOIN_KERNEL_NOTIFICATIONS_INTERFACE_H
#define BITCOIN_KERNEL_NOTIFICATIONS_INTERFACE_H
-#include <util/translation.h>
-
#include <cstdint>
-#include <string>
#include <variant>
class CBlockIndex;
enum class SynchronizationState;
+struct bilingual_str;
namespace kernel {
@@ -48,7 +46,7 @@ public:
//! perform. Applications can choose to handle the flush error notification
//! by logging the error, or notifying the user, or triggering an early
//! shutdown as a precaution against causing more errors.
- virtual void flushError(const std::string& debug_message) {}
+ virtual void flushError(const bilingual_str& message) {}
//! The fatal error notification is sent to notify the user when an error
//! occurs in kernel code that can't be recovered from. After this
@@ -57,7 +55,7 @@ public:
//! handle the fatal error notification by logging the error, or notifying
//! the user, or triggering an early shutdown as a precaution against
//! causing more errors.
- virtual void fatalError(const std::string& debug_message, const bilingual_str& user_message = {}) {}
+ virtual void fatalError(const bilingual_str& message) {}
};
} // namespace kernel
diff --git a/src/key.h b/src/key.h
index d6b26f891d..53acd179ba 100644
--- a/src/key.h
+++ b/src/key.h
@@ -223,6 +223,12 @@ struct CExtKey {
a.key == b.key;
}
+ CExtKey() = default;
+ CExtKey(const CExtPubKey& xpub, const CKey& key_in) : nDepth(xpub.nDepth), nChild(xpub.nChild), chaincode(xpub.chaincode), key(key_in)
+ {
+ std::copy(xpub.vchFingerprint, xpub.vchFingerprint + sizeof(xpub.vchFingerprint), vchFingerprint);
+ }
+
void Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const;
void Decode(const unsigned char code[BIP32_EXTKEY_SIZE]);
[[nodiscard]] bool Derive(CExtKey& out, unsigned int nChild) const;
diff --git a/src/logging.h b/src/logging.h
index 54af9d3a42..cfef65221f 100644
--- a/src/logging.h
+++ b/src/logging.h
@@ -214,7 +214,7 @@ static inline bool LogAcceptCategory(BCLog::LogFlags category, BCLog::Level leve
/** Return true if str parses as a log category and set the flag */
bool GetLogCategory(BCLog::LogFlags& flag, const std::string& str);
-// Be conservative when using LogPrintf/error or other things which
+// Be conservative when using functions that
// unconditionally log to debug.log! It should not be the case that an inbound
// peer can fill up a user's disk with debug.log entries.
@@ -262,11 +262,4 @@ static inline void LogPrintf_(const std::string& logging_function, const std::st
// Deprecated conditional logging
#define LogPrint(category, ...) LogDebug(category, __VA_ARGS__)
-template <typename... Args>
-bool error(const char* fmt, const Args&... args)
-{
- LogPrintf("ERROR: %s\n", tfm::format(fmt, args...));
- return false;
-}
-
#endif // BITCOIN_LOGGING_H
diff --git a/src/net.cpp b/src/net.cpp
index 7c82f01d75..e388f05b03 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -238,10 +238,6 @@ static int GetnScore(const CService& addr)
std::optional<CService> GetLocalAddrForPeer(CNode& node)
{
CService addrLocal{GetLocalAddress(node)};
- if (gArgs.GetBoolArg("-addrmantest", false)) {
- // use IPv4 loopback during addrmantest
- addrLocal = CService(LookupNumeric("127.0.0.1", GetListenPort()));
- }
// If discovery is enabled, sometimes give our peer the address it
// tells us that it sees us as in case it has a better idea of our
// address than we do.
@@ -261,8 +257,7 @@ std::optional<CService> GetLocalAddrForPeer(CNode& node)
addrLocal.SetIP(node.GetAddrLocal());
}
}
- if (addrLocal.IsRoutable() || gArgs.GetBoolArg("-addrmantest", false))
- {
+ if (addrLocal.IsRoutable()) {
LogPrint(BCLog::NET, "Advertising address %s to peer=%d\n", addrLocal.ToStringAddrPort(), node.GetId());
return addrLocal;
}
@@ -442,7 +437,6 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
}
// Connect
- bool connected = false;
std::unique_ptr<Sock> sock;
Proxy proxy;
CAddress addr_bind;
@@ -455,6 +449,7 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
if (addrConnect.IsI2P() && use_proxy) {
i2p::Connection conn;
+ bool connected{false};
if (m_i2p_sam_session) {
connected = m_i2p_sam_session->Connect(addrConnect, conn, proxyConnectionFailed);
@@ -463,7 +458,7 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
LOCK(m_unused_i2p_sessions_mutex);
if (m_unused_i2p_sessions.empty()) {
i2p_transient_session =
- std::make_unique<i2p::sam::Session>(proxy.proxy, &interruptNet);
+ std::make_unique<i2p::sam::Session>(proxy, &interruptNet);
} else {
i2p_transient_session.swap(m_unused_i2p_sessions.front());
m_unused_i2p_sessions.pop();
@@ -483,20 +478,11 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
addr_bind = CAddress{conn.me, NODE_NONE};
}
} else if (use_proxy) {
- sock = CreateSock(proxy.proxy);
- if (!sock) {
- return nullptr;
- }
- connected = ConnectThroughProxy(proxy, addrConnect.ToStringAddr(), addrConnect.GetPort(),
- *sock, nConnectTimeout, proxyConnectionFailed);
+ LogPrintLevel(BCLog::PROXY, BCLog::Level::Debug, "Using proxy: %s to connect to %s:%s\n", proxy.ToString(), addrConnect.ToStringAddr(), addrConnect.GetPort());
+ sock = ConnectThroughProxy(proxy, addrConnect.ToStringAddr(), addrConnect.GetPort(), proxyConnectionFailed);
} else {
// no proxy needed (none set for target network)
- sock = CreateSock(addrConnect);
- if (!sock) {
- return nullptr;
- }
- connected = ConnectSocketDirectly(addrConnect, *sock, nConnectTimeout,
- conn_type == ConnectionType::MANUAL);
+ sock = ConnectDirectly(addrConnect, conn_type == ConnectionType::MANUAL);
}
if (!proxyConnectionFailed) {
// If a connection to the node was attempted, and failure (if any) is not caused by a problem connecting to
@@ -504,21 +490,20 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
addrman.Attempt(addrConnect, fCountFailure);
}
} else if (pszDest && GetNameProxy(proxy)) {
- sock = CreateSock(proxy.proxy);
- if (!sock) {
- return nullptr;
- }
std::string host;
uint16_t port{default_port};
SplitHostPort(std::string(pszDest), port, host);
bool proxyConnectionFailed;
- connected = ConnectThroughProxy(proxy, host, port, *sock, nConnectTimeout,
- proxyConnectionFailed);
+ sock = ConnectThroughProxy(proxy, host, port, proxyConnectionFailed);
}
- if (!connected) {
+ if (!sock) {
return nullptr;
}
+ NetPermissionFlags permission_flags = NetPermissionFlags::None;
+ std::vector<NetWhitelistPermissions> whitelist_permissions = conn_type == ConnectionType::MANUAL ? vWhitelistedRangeOutgoing : std::vector<NetWhitelistPermissions>{};
+ AddWhitelistPermissionFlags(permission_flags, addrConnect, whitelist_permissions);
+
// Add node
NodeId id = GetNewNodeId();
uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize();
@@ -535,6 +520,7 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
conn_type,
/*inbound_onion=*/false,
CNodeOptions{
+ .permission_flags = permission_flags,
.i2p_sam_session = std::move(i2p_transient_session),
.recv_flood_size = nReceiveFloodSize,
.use_v2transport = use_v2transport,
@@ -558,9 +544,18 @@ void CNode::CloseSocketDisconnect()
m_i2p_sam_session.reset();
}
-void CConnman::AddWhitelistPermissionFlags(NetPermissionFlags& flags, const CNetAddr &addr) const {
- for (const auto& subnet : vWhitelistedRange) {
- if (subnet.m_subnet.Match(addr)) NetPermissions::AddFlag(flags, subnet.m_flags);
+void CConnman::AddWhitelistPermissionFlags(NetPermissionFlags& flags, const CNetAddr &addr, const std::vector<NetWhitelistPermissions>& ranges) const {
+ for (const auto& subnet : ranges) {
+ if (subnet.m_subnet.Match(addr)) {
+ NetPermissions::AddFlag(flags, subnet.m_flags);
+ }
+ }
+ if (NetPermissions::HasFlag(flags, NetPermissionFlags::Implicit)) {
+ NetPermissions::ClearFlag(flags, NetPermissionFlags::Implicit);
+ if (whitelist_forcerelay) NetPermissions::AddFlag(flags, NetPermissionFlags::ForceRelay);
+ if (whitelist_relay) NetPermissions::AddFlag(flags, NetPermissionFlags::Relay);
+ NetPermissions::AddFlag(flags, NetPermissionFlags::Mempool);
+ NetPermissions::AddFlag(flags, NetPermissionFlags::NoBan);
}
}
@@ -575,7 +570,7 @@ void CNode::SetAddrLocal(const CService& addrLocalIn) {
AssertLockNotHeld(m_addr_local_mutex);
LOCK(m_addr_local_mutex);
if (addrLocal.IsValid()) {
- error("Addr local already set for node: %i. Refusing to change from %s to %s", id, addrLocal.ToStringAddrPort(), addrLocalIn.ToStringAddrPort());
+ LogError("Addr local already set for node: %i. Refusing to change from %s to %s\n", id, addrLocal.ToStringAddrPort(), addrLocalIn.ToStringAddrPort());
} else {
addrLocal = addrLocalIn;
}
@@ -1726,14 +1721,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
{
int nInbound = 0;
- AddWhitelistPermissionFlags(permission_flags, addr);
- if (NetPermissions::HasFlag(permission_flags, NetPermissionFlags::Implicit)) {
- NetPermissions::ClearFlag(permission_flags, NetPermissionFlags::Implicit);
- if (gArgs.GetBoolArg("-whitelistforcerelay", DEFAULT_WHITELISTFORCERELAY)) NetPermissions::AddFlag(permission_flags, NetPermissionFlags::ForceRelay);
- if (gArgs.GetBoolArg("-whitelistrelay", DEFAULT_WHITELISTRELAY)) NetPermissions::AddFlag(permission_flags, NetPermissionFlags::Relay);
- NetPermissions::AddFlag(permission_flags, NetPermissionFlags::Mempool);
- NetPermissions::AddFlag(permission_flags, NetPermissionFlags::NoBan);
- }
+ AddWhitelistPermissionFlags(permission_flags, addr, vWhitelistedRangeIncoming);
{
LOCK(m_nodes_mutex);
@@ -1788,15 +1776,10 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
NodeId id = GetNewNodeId();
uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize();
- ServiceFlags nodeServices = nLocalServices;
- if (NetPermissions::HasFlag(permission_flags, NetPermissionFlags::BloomFilter)) {
- nodeServices = static_cast<ServiceFlags>(nodeServices | NODE_BLOOM);
- }
-
const bool inbound_onion = std::find(m_onion_binds.begin(), m_onion_binds.end(), addr_bind) != m_onion_binds.end();
// The V2Transport transparently falls back to V1 behavior when an incoming V1 connection is
// detected, so use it whenever we signal NODE_P2P_V2.
- const bool use_v2transport(nodeServices & NODE_P2P_V2);
+ const bool use_v2transport(nLocalServices & NODE_P2P_V2);
CNode* pnode = new CNode(id,
std::move(sock),
@@ -1814,7 +1797,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
.use_v2transport = use_v2transport,
});
pnode->AddRef();
- m_msgproc->InitializeNode(*pnode, nodeServices);
+ m_msgproc->InitializeNode(*pnode, nLocalServices);
LogPrint(BCLog::NET, "connection from %s accepted\n", addr.ToStringAddrPort());
@@ -2993,7 +2976,7 @@ bool CConnman::BindListenPort(const CService& addrBind, bilingual_str& strError,
return false;
}
- std::unique_ptr<Sock> sock = CreateSock(addrBind);
+ std::unique_ptr<Sock> sock = CreateSock(addrBind.GetSAFamily());
if (!sock) {
strError = strprintf(Untranslated("Couldn't open socket for incoming connections (socket returned error %s)"), NetworkErrorString(WSAGetLastError()));
LogPrintLevel(BCLog::NET, BCLog::Level::Error, "%s\n", strError.original);
@@ -3200,7 +3183,7 @@ bool CConnman::Start(CScheduler& scheduler, const Options& connOptions)
Proxy i2p_sam;
if (GetProxy(NET_I2P, i2p_sam) && connOptions.m_i2p_accept_incoming) {
m_i2p_sam_session = std::make_unique<i2p::sam::Session>(gArgs.GetDataDirNet() / "i2p_private_key",
- i2p_sam.proxy, &interruptNet);
+ i2p_sam, &interruptNet);
}
for (const auto& strDest : connOptions.vSeedNodes) {
diff --git a/src/net.h b/src/net.h
index e78e122c44..46d9422695 100644
--- a/src/net.h
+++ b/src/net.h
@@ -53,11 +53,6 @@ class CNode;
class CScheduler;
struct bilingual_str;
-/** Default for -whitelistrelay. */
-static const bool DEFAULT_WHITELISTRELAY = true;
-/** Default for -whitelistforcerelay. */
-static const bool DEFAULT_WHITELISTFORCERELAY = false;
-
/** Time after which to disconnect, after waiting for a ping response (or inactivity). */
static constexpr std::chrono::minutes TIMEOUT_INTERVAL{20};
/** Run the feeler connection loop once every 2 minutes. **/
@@ -1053,7 +1048,8 @@ public:
uint64_t nMaxOutboundLimit = 0;
int64_t m_peer_connect_timeout = DEFAULT_PEER_CONNECT_TIMEOUT;
std::vector<std::string> vSeedNodes;
- std::vector<NetWhitelistPermissions> vWhitelistedRange;
+ std::vector<NetWhitelistPermissions> vWhitelistedRangeIncoming;
+ std::vector<NetWhitelistPermissions> vWhitelistedRangeOutgoing;
std::vector<NetWhitebindPermissions> vWhiteBinds;
std::vector<CService> vBinds;
std::vector<CService> onion_binds;
@@ -1064,6 +1060,8 @@ public:
std::vector<std::string> m_specified_outgoing;
std::vector<std::string> m_added_nodes;
bool m_i2p_accept_incoming;
+ bool whitelist_forcerelay = DEFAULT_WHITELISTFORCERELAY;
+ bool whitelist_relay = DEFAULT_WHITELISTRELAY;
};
void Init(const Options& connOptions) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex, !m_total_bytes_sent_mutex)
@@ -1087,7 +1085,8 @@ public:
LOCK(m_total_bytes_sent_mutex);
nMaxOutboundLimit = connOptions.nMaxOutboundLimit;
}
- vWhitelistedRange = connOptions.vWhitelistedRange;
+ vWhitelistedRangeIncoming = connOptions.vWhitelistedRangeIncoming;
+ vWhitelistedRangeOutgoing = connOptions.vWhitelistedRangeOutgoing;
{
LOCK(m_added_nodes_mutex);
// Attempt v2 connection if we support v2 - we'll reconnect with v1 if our
@@ -1098,6 +1097,8 @@ public:
}
}
m_onion_binds = connOptions.onion_binds;
+ whitelist_forcerelay = connOptions.whitelist_forcerelay;
+ whitelist_relay = connOptions.whitelist_relay;
}
CConnman(uint64_t seed0, uint64_t seed1, AddrMan& addrman, const NetGroupManager& netgroupman,
@@ -1339,7 +1340,7 @@ private:
bool AttemptToEvictConnection();
CNode* ConnectNode(CAddress addrConnect, const char *pszDest, bool fCountFailure, ConnectionType conn_type, bool use_v2transport) EXCLUSIVE_LOCKS_REQUIRED(!m_unused_i2p_sessions_mutex);
- void AddWhitelistPermissionFlags(NetPermissionFlags& flags, const CNetAddr &addr) const;
+ void AddWhitelistPermissionFlags(NetPermissionFlags& flags, const CNetAddr &addr, const std::vector<NetWhitelistPermissions>& ranges) const;
void DeleteNode(CNode* pnode);
@@ -1398,7 +1399,9 @@ private:
// Whitelisted ranges. Any node connecting from these is automatically
// whitelisted (as well as those connecting to whitelisted binds).
- std::vector<NetWhitelistPermissions> vWhitelistedRange;
+ std::vector<NetWhitelistPermissions> vWhitelistedRangeIncoming;
+ // Whitelisted ranges for outgoing connections.
+ std::vector<NetWhitelistPermissions> vWhitelistedRangeOutgoing;
unsigned int nSendBufferMaxSize{0};
unsigned int nReceiveFloodSize{0};
@@ -1552,6 +1555,18 @@ private:
std::vector<CService> m_onion_binds;
/**
+ * flag for adding 'forcerelay' permission to whitelisted inbound
+ * and manual peers with default permissions.
+ */
+ bool whitelist_forcerelay;
+
+ /**
+ * flag for adding 'relay' permission to whitelisted inbound
+ * and manual peers with default permissions.
+ */
+ bool whitelist_relay;
+
+ /**
* Mutex protecting m_i2p_sam_sessions.
*/
Mutex m_unused_i2p_sessions_mutex;
diff --git a/src/net_permissions.cpp b/src/net_permissions.cpp
index a134a55264..b01b2f643d 100644
--- a/src/net_permissions.cpp
+++ b/src/net_permissions.cpp
@@ -21,9 +21,10 @@ const std::vector<std::string> NET_PERMISSIONS_DOC{
namespace {
// Parse the following format: "perm1,perm2@xxxxxx"
-bool TryParsePermissionFlags(const std::string& str, NetPermissionFlags& output, size_t& readen, bilingual_str& error)
+static bool TryParsePermissionFlags(const std::string& str, NetPermissionFlags& output, ConnectionDirection* output_connection_direction, size_t& readen, bilingual_str& error)
{
NetPermissionFlags flags = NetPermissionFlags::None;
+ ConnectionDirection connection_direction = ConnectionDirection::None;
const auto atSeparator = str.find('@');
// if '@' is not found (ie, "xxxxx"), the caller should apply implicit permissions
@@ -52,6 +53,15 @@ bool TryParsePermissionFlags(const std::string& str, NetPermissionFlags& output,
else if (permission == "all") NetPermissions::AddFlag(flags, NetPermissionFlags::All);
else if (permission == "relay") NetPermissions::AddFlag(flags, NetPermissionFlags::Relay);
else if (permission == "addr") NetPermissions::AddFlag(flags, NetPermissionFlags::Addr);
+ else if (permission == "in") connection_direction |= ConnectionDirection::In;
+ else if (permission == "out") {
+ if (output_connection_direction == nullptr) {
+ // Only NetWhitebindPermissions() should pass a nullptr.
+ error = _("whitebind may only be used for incoming connections (\"out\" was passed)");
+ return false;
+ }
+ connection_direction |= ConnectionDirection::Out;
+ }
else if (permission.length() == 0); // Allow empty entries
else {
error = strprintf(_("Invalid P2P permission: '%s'"), permission);
@@ -61,7 +71,16 @@ bool TryParsePermissionFlags(const std::string& str, NetPermissionFlags& output,
readen++;
}
+ // By default, whitelist only applies to incoming connections
+ if (connection_direction == ConnectionDirection::None) {
+ connection_direction = ConnectionDirection::In;
+ } else if (flags == NetPermissionFlags::None) {
+ error = strprintf(_("Only direction was set, no permissions: '%s'"), str);
+ return false;
+ }
+
output = flags;
+ if (output_connection_direction) *output_connection_direction = connection_direction;
error = Untranslated("");
return true;
}
@@ -85,7 +104,7 @@ bool NetWhitebindPermissions::TryParse(const std::string& str, NetWhitebindPermi
{
NetPermissionFlags flags;
size_t offset;
- if (!TryParsePermissionFlags(str, flags, offset, error)) return false;
+ if (!TryParsePermissionFlags(str, flags, /*output_connection_direction=*/nullptr, offset, error)) return false;
const std::string strBind = str.substr(offset);
const std::optional<CService> addrBind{Lookup(strBind, 0, false)};
@@ -104,11 +123,12 @@ bool NetWhitebindPermissions::TryParse(const std::string& str, NetWhitebindPermi
return true;
}
-bool NetWhitelistPermissions::TryParse(const std::string& str, NetWhitelistPermissions& output, bilingual_str& error)
+bool NetWhitelistPermissions::TryParse(const std::string& str, NetWhitelistPermissions& output, ConnectionDirection& output_connection_direction, bilingual_str& error)
{
NetPermissionFlags flags;
size_t offset;
- if (!TryParsePermissionFlags(str, flags, offset, error)) return false;
+ // Only NetWhitebindPermissions should pass a nullptr for output_connection_direction.
+ if (!TryParsePermissionFlags(str, flags, &output_connection_direction, offset, error)) return false;
const std::string net = str.substr(offset);
const CSubNet subnet{LookupSubNet(net)};
diff --git a/src/net_permissions.h b/src/net_permissions.h
index b7f3bffe1c..33babd6204 100644
--- a/src/net_permissions.h
+++ b/src/net_permissions.h
@@ -3,6 +3,7 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <netaddress.h>
+#include <netbase.h>
#include <string>
#include <type_traits>
@@ -15,6 +16,11 @@ struct bilingual_str;
extern const std::vector<std::string> NET_PERMISSIONS_DOC;
+/** Default for -whitelistrelay. */
+constexpr bool DEFAULT_WHITELISTRELAY = true;
+/** Default for -whitelistforcerelay. */
+constexpr bool DEFAULT_WHITELISTFORCERELAY = false;
+
enum class NetPermissionFlags : uint32_t {
None = 0,
// Can query bloomfilter even if -peerbloomfilters is false
@@ -83,7 +89,7 @@ public:
class NetWhitelistPermissions : public NetPermissions
{
public:
- static bool TryParse(const std::string& str, NetWhitelistPermissions& output, bilingual_str& error);
+ static bool TryParse(const std::string& str, NetWhitelistPermissions& output, ConnectionDirection& output_connection_direction, bilingual_str& error);
CSubNet m_subnet;
};
diff --git a/src/net_processing.cpp b/src/net_processing.cpp
index c8da927763..6996af38cb 100644
--- a/src/net_processing.cpp
+++ b/src/net_processing.cpp
@@ -582,6 +582,20 @@ private:
*/
bool MaybeDiscourageAndDisconnect(CNode& pnode, Peer& peer);
+ /** Handle a transaction whose result was not MempoolAcceptResult::ResultType::VALID.
+ * @param[in] maybe_add_extra_compact_tx Whether this tx should be added to vExtraTxnForCompact.
+ * Set to false if the tx has already been rejected before,
+ * e.g. is an orphan, to avoid adding duplicate entries.
+ * Updates m_txrequest, m_recent_rejects, m_orphanage, and vExtraTxnForCompact. */
+ void ProcessInvalidTx(NodeId nodeid, const CTransactionRef& tx, const TxValidationState& result,
+ bool maybe_add_extra_compact_tx)
+ EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, g_msgproc_mutex, cs_main);
+
+ /** Handle a transaction whose result was MempoolAcceptResult::ResultType::VALID.
+ * Updates m_txrequest, m_orphanage, and vExtraTxnForCompact. Also queues the tx for relay. */
+ void ProcessValidTx(NodeId nodeid, const CTransactionRef& tx, const std::list<CTransactionRef>& replaced_transactions)
+ EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, g_msgproc_mutex, cs_main);
+
/**
* Reconsider orphan transactions after a parent has been accepted to the mempool.
*
@@ -1451,6 +1465,7 @@ void PeerManagerImpl::FindNextBlocks(std::vector<const CBlockIndex*>& vBlocks, c
{
std::vector<const CBlockIndex*> vToFetch;
int nMaxHeight = std::min<int>(state->pindexBestKnownBlock->nHeight, nWindowEnd + 1);
+ bool is_limited_peer = IsLimitedPeer(peer);
NodeId waitingfor = -1;
while (pindexWalk->nHeight < nMaxHeight) {
// Read up to 128 (or more, if more blocks than that are needed) successors of pindexWalk (towards
@@ -1473,30 +1488,46 @@ void PeerManagerImpl::FindNextBlocks(std::vector<const CBlockIndex*>& vBlocks, c
// We consider the chain that this peer is on invalid.
return;
}
+
if (!CanServeWitnesses(peer) && DeploymentActiveAt(*pindex, m_chainman, Consensus::DEPLOYMENT_SEGWIT)) {
// We wouldn't download this block or its descendants from this peer.
return;
}
+
if (pindex->nStatus & BLOCK_HAVE_DATA || (activeChain && activeChain->Contains(pindex))) {
- if (activeChain && pindex->HaveNumChainTxs())
+ if (activeChain && pindex->HaveNumChainTxs()) {
state->pindexLastCommonBlock = pindex;
- } else if (!IsBlockRequested(pindex->GetBlockHash())) {
- // The block is not already downloaded, and not yet in flight.
- if (pindex->nHeight > nWindowEnd) {
- // We reached the end of the window.
- if (vBlocks.size() == 0 && waitingfor != peer.m_id) {
- // We aren't able to fetch anything, but we would be if the download window was one larger.
- if (nodeStaller) *nodeStaller = waitingfor;
- }
- return;
}
- vBlocks.push_back(pindex);
- if (vBlocks.size() == count) {
- return;
+ continue;
+ }
+
+ // Is block in-flight?
+ if (IsBlockRequested(pindex->GetBlockHash())) {
+ if (waitingfor == -1) {
+ // This is the first already-in-flight block.
+ waitingfor = mapBlocksInFlight.lower_bound(pindex->GetBlockHash())->second.first;
+ }
+ continue;
+ }
+
+ // The block is not already downloaded, and not yet in flight.
+ if (pindex->nHeight > nWindowEnd) {
+ // We reached the end of the window.
+ if (vBlocks.size() == 0 && waitingfor != peer.m_id) {
+ // We aren't able to fetch anything, but we would be if the download window was one larger.
+ if (nodeStaller) *nodeStaller = waitingfor;
}
- } else if (waitingfor == -1) {
- // This is the first already-in-flight block.
- waitingfor = mapBlocksInFlight.lower_bound(pindex->GetBlockHash())->second.first;
+ return;
+ }
+
+ // Don't request blocks that go further than what limited peers can provide
+ if (is_limited_peer && (state->pindexBestKnownBlock->nHeight - pindex->nHeight >= static_cast<int>(NODE_NETWORK_LIMITED_MIN_BLOCKS) - 2 /* two blocks buffer for possible races */)) {
+ continue;
+ }
+
+ vBlocks.push_back(pindex);
+ if (vBlocks.size() == count) {
+ return;
}
}
}
@@ -1571,6 +1602,11 @@ void PeerManagerImpl::InitializeNode(CNode& node, ServiceFlags our_services)
m_node_states.emplace_hint(m_node_states.end(), std::piecewise_construct, std::forward_as_tuple(nodeid), std::forward_as_tuple(node.IsInboundConn()));
assert(m_txrequest.Count(nodeid) == 0);
}
+
+ if (NetPermissions::HasFlag(node.m_permission_flags, NetPermissionFlags::BloomFilter)) {
+ our_services = static_cast<ServiceFlags>(our_services | NODE_BLOOM);
+ }
+
PeerRef peer = std::make_shared<Peer>(nodeid, our_services);
{
LOCK(m_peer_mutex);
@@ -2690,8 +2726,8 @@ bool PeerManagerImpl::IsContinuationOfLowWorkHeadersSync(Peer& peer, CNode& pfro
bool PeerManagerImpl::TryLowWorkHeadersSync(Peer& peer, CNode& pfrom, const CBlockIndex* chain_start_header, std::vector<CBlockHeader>& headers)
{
- // Calculate the total work on this chain.
- arith_uint256 total_work = chain_start_header->nChainWork + CalculateHeadersWork(headers);
+ // Calculate the claimed total work on this chain.
+ arith_uint256 total_work = chain_start_header->nChainWork + CalculateClaimedHeadersWork(headers);
// Our dynamic anti-DoS threshold (minimum work required on a headers chain
// before we'll store it)
@@ -3032,6 +3068,91 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, Peer& peer,
return;
}
+void PeerManagerImpl::ProcessInvalidTx(NodeId nodeid, const CTransactionRef& ptx, const TxValidationState& state,
+ bool maybe_add_extra_compact_tx)
+{
+ AssertLockNotHeld(m_peer_mutex);
+ AssertLockHeld(g_msgproc_mutex);
+ AssertLockHeld(cs_main);
+
+ LogDebug(BCLog::MEMPOOLREJ, "%s (wtxid=%s) from peer=%d was not accepted: %s\n",
+ ptx->GetHash().ToString(),
+ ptx->GetWitnessHash().ToString(),
+ nodeid,
+ state.ToString());
+
+ if (state.GetResult() == TxValidationResult::TX_MISSING_INPUTS) {
+ return;
+ } else if (state.GetResult() != TxValidationResult::TX_WITNESS_STRIPPED) {
+ // We can add the wtxid of this transaction to our reject filter.
+ // Do not add txids of witness transactions or witness-stripped
+ // transactions to the filter, as they can have been malleated;
+ // adding such txids to the reject filter would potentially
+ // interfere with relay of valid transactions from peers that
+ // do not support wtxid-based relay. See
+ // https://github.com/bitcoin/bitcoin/issues/8279 for details.
+ // We can remove this restriction (and always add wtxids to
+ // the filter even for witness stripped transactions) once
+ // wtxid-based relay is broadly deployed.
+ // See also comments in https://github.com/bitcoin/bitcoin/pull/18044#discussion_r443419034
+ // for concerns around weakening security of unupgraded nodes
+ // if we start doing this too early.
+ m_recent_rejects.insert(ptx->GetWitnessHash().ToUint256());
+ m_txrequest.ForgetTxHash(ptx->GetWitnessHash());
+ // If the transaction failed for TX_INPUTS_NOT_STANDARD,
+ // then we know that the witness was irrelevant to the policy
+ // failure, since this check depends only on the txid
+ // (the scriptPubKey being spent is covered by the txid).
+ // Add the txid to the reject filter to prevent repeated
+ // processing of this transaction in the event that child
+ // transactions are later received (resulting in
+ // parent-fetching by txid via the orphan-handling logic).
+ if (state.GetResult() == TxValidationResult::TX_INPUTS_NOT_STANDARD && ptx->HasWitness()) {
+ m_recent_rejects.insert(ptx->GetHash().ToUint256());
+ m_txrequest.ForgetTxHash(ptx->GetHash());
+ }
+ if (maybe_add_extra_compact_tx && RecursiveDynamicUsage(*ptx) < 100000) {
+ AddToCompactExtraTransactions(ptx);
+ }
+ }
+
+ MaybePunishNodeForTx(nodeid, state);
+
+ // If the tx failed in ProcessOrphanTx, it should be removed from the orphanage unless the
+ // tx was still missing inputs. If the tx was not in the orphanage, EraseTx does nothing and returns 0.
+ if (Assume(state.GetResult() != TxValidationResult::TX_MISSING_INPUTS) && m_orphanage.EraseTx(ptx->GetHash()) > 0) {
+ LogDebug(BCLog::TXPACKAGES, " removed orphan tx %s (wtxid=%s)\n", ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString());
+ }
+}
+
+void PeerManagerImpl::ProcessValidTx(NodeId nodeid, const CTransactionRef& tx, const std::list<CTransactionRef>& replaced_transactions)
+{
+ AssertLockNotHeld(m_peer_mutex);
+ AssertLockHeld(g_msgproc_mutex);
+ AssertLockHeld(cs_main);
+
+ // As this version of the transaction was acceptable, we can forget about any requests for it.
+ // No-op if the tx is not in txrequest.
+ m_txrequest.ForgetTxHash(tx->GetHash());
+ m_txrequest.ForgetTxHash(tx->GetWitnessHash());
+
+ m_orphanage.AddChildrenToWorkSet(*tx);
+ // If it came from the orphanage, remove it. No-op if the tx is not in txorphanage.
+ m_orphanage.EraseTx(tx->GetHash());
+
+ LogDebug(BCLog::MEMPOOL, "AcceptToMemoryPool: peer=%d: accepted %s (wtxid=%s) (poolsz %u txn, %u kB)\n",
+ nodeid,
+ tx->GetHash().ToString(),
+ tx->GetWitnessHash().ToString(),
+ m_mempool.size(), m_mempool.DynamicMemoryUsage() / 1000);
+
+ RelayTransaction(tx->GetHash(), tx->GetWitnessHash());
+
+ for (const CTransactionRef& removedTx : replaced_transactions) {
+ AddToCompactExtraTransactions(removedTx);
+ }
+}
+
bool PeerManagerImpl::ProcessOrphanTx(Peer& peer)
{
AssertLockHeld(g_msgproc_mutex);
@@ -3047,66 +3168,23 @@ bool PeerManagerImpl::ProcessOrphanTx(Peer& peer)
if (result.m_result_type == MempoolAcceptResult::ResultType::VALID) {
LogPrint(BCLog::TXPACKAGES, " accepted orphan tx %s (wtxid=%s)\n", orphanHash.ToString(), orphan_wtxid.ToString());
- LogPrint(BCLog::MEMPOOL, "AcceptToMemoryPool: peer=%d: accepted %s (wtxid=%s) (poolsz %u txn, %u kB)\n",
- peer.m_id,
- orphanHash.ToString(),
- orphan_wtxid.ToString(),
- m_mempool.size(), m_mempool.DynamicMemoryUsage() / 1000);
- RelayTransaction(orphanHash, porphanTx->GetWitnessHash());
- m_orphanage.AddChildrenToWorkSet(*porphanTx);
- m_orphanage.EraseTx(orphanHash);
- for (const CTransactionRef& removedTx : result.m_replaced_transactions.value()) {
- AddToCompactExtraTransactions(removedTx);
- }
+ Assume(result.m_replaced_transactions.has_value());
+ std::list<CTransactionRef> empty_replacement_list;
+ ProcessValidTx(peer.m_id, porphanTx, result.m_replaced_transactions.value_or(empty_replacement_list));
return true;
} else if (state.GetResult() != TxValidationResult::TX_MISSING_INPUTS) {
- if (state.IsInvalid()) {
- LogPrint(BCLog::TXPACKAGES, " invalid orphan tx %s (wtxid=%s) from peer=%d. %s\n",
- orphanHash.ToString(),
- orphan_wtxid.ToString(),
- peer.m_id,
- state.ToString());
- LogPrint(BCLog::MEMPOOLREJ, "%s (wtxid=%s) from peer=%d was not accepted: %s\n",
- orphanHash.ToString(),
- orphan_wtxid.ToString(),
- peer.m_id,
- state.ToString());
- // Maybe punish peer that gave us an invalid orphan tx
- MaybePunishNodeForTx(peer.m_id, state);
- }
- // Has inputs but not accepted to mempool
- // Probably non-standard or insufficient fee
- LogPrint(BCLog::TXPACKAGES, " removed orphan tx %s (wtxid=%s)\n", orphanHash.ToString(), orphan_wtxid.ToString());
- if (state.GetResult() != TxValidationResult::TX_WITNESS_STRIPPED) {
- // We can add the wtxid of this transaction to our reject filter.
- // Do not add txids of witness transactions or witness-stripped
- // transactions to the filter, as they can have been malleated;
- // adding such txids to the reject filter would potentially
- // interfere with relay of valid transactions from peers that
- // do not support wtxid-based relay. See
- // https://github.com/bitcoin/bitcoin/issues/8279 for details.
- // We can remove this restriction (and always add wtxids to
- // the filter even for witness stripped transactions) once
- // wtxid-based relay is broadly deployed.
- // See also comments in https://github.com/bitcoin/bitcoin/pull/18044#discussion_r443419034
- // for concerns around weakening security of unupgraded nodes
- // if we start doing this too early.
- m_recent_rejects.insert(porphanTx->GetWitnessHash().ToUint256());
- // If the transaction failed for TX_INPUTS_NOT_STANDARD,
- // then we know that the witness was irrelevant to the policy
- // failure, since this check depends only on the txid
- // (the scriptPubKey being spent is covered by the txid).
- // Add the txid to the reject filter to prevent repeated
- // processing of this transaction in the event that child
- // transactions are later received (resulting in
- // parent-fetching by txid via the orphan-handling logic).
- if (state.GetResult() == TxValidationResult::TX_INPUTS_NOT_STANDARD && porphanTx->HasWitness()) {
- // We only add the txid if it differs from the wtxid, to
- // avoid wasting entries in the rolling bloom filter.
- m_recent_rejects.insert(porphanTx->GetHash().ToUint256());
- }
+ LogPrint(BCLog::TXPACKAGES, " invalid orphan tx %s (wtxid=%s) from peer=%d. %s\n",
+ orphanHash.ToString(),
+ orphan_wtxid.ToString(),
+ peer.m_id,
+ state.ToString());
+
+ if (Assume(state.IsInvalid() &&
+ state.GetResult() != TxValidationResult::TX_UNKNOWN &&
+ state.GetResult() != TxValidationResult::TX_NO_MEMPOOL &&
+ state.GetResult() != TxValidationResult::TX_RESULT_UNSET)) {
+ ProcessInvalidTx(peer.m_id, porphanTx, state, /*maybe_add_extra_compact_tx=*/false);
}
- m_orphanage.EraseTx(orphanHash);
return true;
}
}
@@ -4276,24 +4354,8 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
const TxValidationState& state = result.m_state;
if (result.m_result_type == MempoolAcceptResult::ResultType::VALID) {
- // As this version of the transaction was acceptable, we can forget about any
- // requests for it.
- m_txrequest.ForgetTxHash(tx.GetHash());
- m_txrequest.ForgetTxHash(tx.GetWitnessHash());
- RelayTransaction(tx.GetHash(), tx.GetWitnessHash());
- m_orphanage.AddChildrenToWorkSet(tx);
-
+ ProcessValidTx(pfrom.GetId(), ptx, result.m_replaced_transactions.value());
pfrom.m_last_tx_time = GetTime<std::chrono::seconds>();
-
- LogPrint(BCLog::MEMPOOL, "AcceptToMemoryPool: peer=%d: accepted %s (wtxid=%s) (poolsz %u txn, %u kB)\n",
- pfrom.GetId(),
- tx.GetHash().ToString(),
- tx.GetWitnessHash().ToString(),
- m_mempool.size(), m_mempool.DynamicMemoryUsage() / 1000);
-
- for (const CTransactionRef& removedTx : result.m_replaced_transactions.value()) {
- AddToCompactExtraTransactions(removedTx);
- }
}
else if (state.GetResult() == TxValidationResult::TX_MISSING_INPUTS)
{
@@ -4354,48 +4416,9 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
m_txrequest.ForgetTxHash(tx.GetHash());
m_txrequest.ForgetTxHash(tx.GetWitnessHash());
}
- } else {
- if (state.GetResult() != TxValidationResult::TX_WITNESS_STRIPPED) {
- // We can add the wtxid of this transaction to our reject filter.
- // Do not add txids of witness transactions or witness-stripped
- // transactions to the filter, as they can have been malleated;
- // adding such txids to the reject filter would potentially
- // interfere with relay of valid transactions from peers that
- // do not support wtxid-based relay. See
- // https://github.com/bitcoin/bitcoin/issues/8279 for details.
- // We can remove this restriction (and always add wtxids to
- // the filter even for witness stripped transactions) once
- // wtxid-based relay is broadly deployed.
- // See also comments in https://github.com/bitcoin/bitcoin/pull/18044#discussion_r443419034
- // for concerns around weakening security of unupgraded nodes
- // if we start doing this too early.
- m_recent_rejects.insert(tx.GetWitnessHash().ToUint256());
- m_txrequest.ForgetTxHash(tx.GetWitnessHash());
- // If the transaction failed for TX_INPUTS_NOT_STANDARD,
- // then we know that the witness was irrelevant to the policy
- // failure, since this check depends only on the txid
- // (the scriptPubKey being spent is covered by the txid).
- // Add the txid to the reject filter to prevent repeated
- // processing of this transaction in the event that child
- // transactions are later received (resulting in
- // parent-fetching by txid via the orphan-handling logic).
- if (state.GetResult() == TxValidationResult::TX_INPUTS_NOT_STANDARD && tx.HasWitness()) {
- m_recent_rejects.insert(tx.GetHash().ToUint256());
- m_txrequest.ForgetTxHash(tx.GetHash());
- }
- if (RecursiveDynamicUsage(*ptx) < 100000) {
- AddToCompactExtraTransactions(ptx);
- }
- }
}
-
if (state.IsInvalid()) {
- LogPrint(BCLog::MEMPOOLREJ, "%s (wtxid=%s) from peer=%d was not accepted: %s\n",
- tx.GetHash().ToString(),
- tx.GetWitnessHash().ToString(),
- pfrom.GetId(),
- state.ToString());
- MaybePunishNodeForTx(pfrom.GetId(), state);
+ ProcessInvalidTx(pfrom.GetId(), ptx, state, /*maybe_add_extra_compact_tx=*/true);
}
return;
}
@@ -4424,7 +4447,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
MaybeSendGetHeaders(pfrom, GetLocator(m_chainman.m_best_header), *peer);
}
return;
- } else if (prev_block->nChainWork + CalculateHeadersWork({cmpctblock.header}) < GetAntiDoSWorkThreshold()) {
+ } else if (prev_block->nChainWork + CalculateClaimedHeadersWork({cmpctblock.header}) < GetAntiDoSWorkThreshold()) {
// If we get a low-work header in a compact block, we can ignore it.
LogPrint(BCLog::NET, "Ignoring low-work compact block from peer %d\n", pfrom.GetId());
return;
@@ -4719,6 +4742,17 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
LogPrint(BCLog::NET, "received block %s peer=%d\n", pblock->GetHash().ToString(), pfrom.GetId());
+ const CBlockIndex* prev_block{WITH_LOCK(m_chainman.GetMutex(), return m_chainman.m_blockman.LookupBlockIndex(pblock->hashPrevBlock))};
+
+ // Check for possible mutation if it connects to something we know so we can check for DEPLOYMENT_SEGWIT being active
+ if (prev_block && IsBlockMutated(/*block=*/*pblock,
+ /*check_witness_root=*/DeploymentActiveAfter(prev_block, m_chainman, Consensus::DEPLOYMENT_SEGWIT))) {
+ LogDebug(BCLog::NET, "Received mutated block from peer=%d\n", peer->m_id);
+ Misbehaving(*peer, 100, "mutated block");
+ WITH_LOCK(cs_main, RemoveBlockRequest(pblock->GetHash(), peer->m_id));
+ return;
+ }
+
bool forceProcessing = false;
const uint256 hash(pblock->GetHash());
bool min_pow_checked = false;
@@ -4733,9 +4767,8 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// cs_main in ProcessNewBlock is fine.
mapBlockSource.emplace(hash, std::make_pair(pfrom.GetId(), true));
- // Check work on this block against our anti-dos thresholds.
- const CBlockIndex* prev_block = m_chainman.m_blockman.LookupBlockIndex(pblock->hashPrevBlock);
- if (prev_block && prev_block->nChainWork + CalculateHeadersWork({pblock->GetBlockHeader()}) >= GetAntiDoSWorkThreshold()) {
+ // Check claimed work on this block against our anti-dos thresholds.
+ if (prev_block && prev_block->nChainWork + CalculateClaimedHeadersWork({pblock->GetBlockHeader()}) >= GetAntiDoSWorkThreshold()) {
min_pow_checked = true;
}
}
diff --git a/src/netaddress.cpp b/src/netaddress.cpp
index 7530334db1..74ab6dd8d8 100644
--- a/src/netaddress.cpp
+++ b/src/netaddress.cpp
@@ -818,6 +818,19 @@ bool CService::SetSockAddr(const struct sockaddr *paddr)
}
}
+sa_family_t CService::GetSAFamily() const
+{
+ switch (m_net) {
+ case NET_IPV4:
+ return AF_INET;
+ case NET_IPV6:
+ case NET_CJDNS:
+ return AF_INET6;
+ default:
+ return AF_UNSPEC;
+ }
+}
+
uint16_t CService::GetPort() const
{
return port;
diff --git a/src/netaddress.h b/src/netaddress.h
index 0bbde43dd7..c63bd4b4e5 100644
--- a/src/netaddress.h
+++ b/src/netaddress.h
@@ -5,10 +5,6 @@
#ifndef BITCOIN_NETADDRESS_H
#define BITCOIN_NETADDRESS_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <compat/compat.h>
#include <crypto/siphash.h>
#include <prevector.h>
@@ -544,6 +540,11 @@ public:
uint16_t GetPort() const;
bool GetSockAddr(struct sockaddr* paddr, socklen_t* addrlen) const;
bool SetSockAddr(const struct sockaddr* paddr);
+ /**
+ * Get the address family
+ * @returns AF_UNSPEC if unspecified
+ */
+ [[nodiscard]] sa_family_t GetSAFamily() const;
friend bool operator==(const CService& a, const CService& b);
friend bool operator!=(const CService& a, const CService& b) { return !(a == b); }
friend bool operator<(const CService& a, const CService& b);
diff --git a/src/netbase.cpp b/src/netbase.cpp
index 9fbd9f7dea..3ca1a5227a 100644
--- a/src/netbase.cpp
+++ b/src/netbase.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <netbase.h>
#include <compat/compat.h>
@@ -21,6 +25,10 @@
#include <limits>
#include <memory>
+#if HAVE_SOCKADDR_UN
+#include <sys/un.h>
+#endif
+
// Settings
static GlobalMutex g_proxyinfo_mutex;
static Proxy proxyInfo[NET_MAX] GUARDED_BY(g_proxyinfo_mutex);
@@ -208,6 +216,24 @@ CService LookupNumeric(const std::string& name, uint16_t portDefault, DNSLookupF
return Lookup(name, portDefault, /*fAllowLookup=*/false, dns_lookup_function).value_or(CService{});
}
+bool IsUnixSocketPath(const std::string& name)
+{
+#if HAVE_SOCKADDR_UN
+ if (name.find(ADDR_PREFIX_UNIX) != 0) return false;
+
+ // Split off "unix:" prefix
+ std::string str{name.substr(ADDR_PREFIX_UNIX.length())};
+
+ // Path size limit is platform-dependent
+ // see https://manpages.ubuntu.com/manpages/xenial/en/man7/unix.7.html
+ if (str.size() + 1 > sizeof(((sockaddr_un*)nullptr)->sun_path)) return false;
+
+ return true;
+#else
+ return false;
+#endif
+}
+
/** SOCKS version */
enum SOCKSVersion: uint8_t {
SOCKS4 = 0x04,
@@ -338,7 +364,8 @@ bool Socks5(const std::string& strDest, uint16_t port, const ProxyCredentials* a
IntrRecvError recvr;
LogPrint(BCLog::NET, "SOCKS5 connecting %s\n", strDest);
if (strDest.size() > 255) {
- return error("Hostname too long");
+ LogError("Hostname too long\n");
+ return false;
}
// Construct the version identifier/method selection message
std::vector<uint8_t> vSocks5Init;
@@ -358,14 +385,17 @@ bool Socks5(const std::string& strDest, uint16_t port, const ProxyCredentials* a
return false;
}
if (pchRet1[0] != SOCKSVersion::SOCKS5) {
- return error("Proxy failed to initialize");
+ LogError("Proxy failed to initialize\n");
+ return false;
}
if (pchRet1[1] == SOCKS5Method::USER_PASS && auth) {
// Perform username/password authentication (as described in RFC1929)
std::vector<uint8_t> vAuth;
vAuth.push_back(0x01); // Current (and only) version of user/pass subnegotiation
- if (auth->username.size() > 255 || auth->password.size() > 255)
- return error("Proxy username or password too long");
+ if (auth->username.size() > 255 || auth->password.size() > 255) {
+ LogError("Proxy username or password too long\n");
+ return false;
+ }
vAuth.push_back(auth->username.size());
vAuth.insert(vAuth.end(), auth->username.begin(), auth->username.end());
vAuth.push_back(auth->password.size());
@@ -374,15 +404,18 @@ bool Socks5(const std::string& strDest, uint16_t port, const ProxyCredentials* a
LogPrint(BCLog::PROXY, "SOCKS5 sending proxy authentication %s:%s\n", auth->username, auth->password);
uint8_t pchRetA[2];
if (InterruptibleRecv(pchRetA, 2, g_socks5_recv_timeout, sock) != IntrRecvError::OK) {
- return error("Error reading proxy authentication response");
+ LogError("Error reading proxy authentication response\n");
+ return false;
}
if (pchRetA[0] != 0x01 || pchRetA[1] != 0x00) {
- return error("Proxy authentication unsuccessful");
+ LogError("Proxy authentication unsuccessful\n");
+ return false;
}
} else if (pchRet1[1] == SOCKS5Method::NOAUTH) {
// Perform no authentication
} else {
- return error("Proxy requested wrong authentication method %02x", pchRet1[1]);
+ LogError("Proxy requested wrong authentication method %02x\n", pchRet1[1]);
+ return false;
}
std::vector<uint8_t> vSocks5;
vSocks5.push_back(SOCKSVersion::SOCKS5); // VER protocol version
@@ -402,11 +435,13 @@ bool Socks5(const std::string& strDest, uint16_t port, const ProxyCredentials* a
* error message. */
return false;
} else {
- return error("Error while reading proxy response");
+ LogError("Error while reading proxy response\n");
+ return false;
}
}
if (pchRet2[0] != SOCKSVersion::SOCKS5) {
- return error("Proxy failed to accept request");
+ LogError("Proxy failed to accept request\n");
+ return false;
}
if (pchRet2[1] != SOCKS5Reply::SUCCEEDED) {
// Failures to connect to a peer that are not proxy errors
@@ -414,7 +449,8 @@ bool Socks5(const std::string& strDest, uint16_t port, const ProxyCredentials* a
return false;
}
if (pchRet2[2] != 0x00) { // Reserved field must be 0
- return error("Error: malformed proxy response");
+ LogError("Error: malformed proxy response\n");
+ return false;
}
uint8_t pchRet3[256];
switch (pchRet2[3]) {
@@ -423,39 +459,46 @@ bool Socks5(const std::string& strDest, uint16_t port, const ProxyCredentials* a
case SOCKS5Atyp::DOMAINNAME: {
recvr = InterruptibleRecv(pchRet3, 1, g_socks5_recv_timeout, sock);
if (recvr != IntrRecvError::OK) {
- return error("Error reading from proxy");
+ LogError("Error reading from proxy\n");
+ return false;
}
int nRecv = pchRet3[0];
recvr = InterruptibleRecv(pchRet3, nRecv, g_socks5_recv_timeout, sock);
break;
}
- default: return error("Error: malformed proxy response");
+ default: {
+ LogError("Error: malformed proxy response\n");
+ return false;
+ }
}
if (recvr != IntrRecvError::OK) {
- return error("Error reading from proxy");
+ LogError("Error reading from proxy\n");
+ return false;
}
if (InterruptibleRecv(pchRet3, 2, g_socks5_recv_timeout, sock) != IntrRecvError::OK) {
- return error("Error reading from proxy");
+ LogError("Error reading from proxy\n");
+ return false;
}
LogPrint(BCLog::NET, "SOCKS5 connected %s\n", strDest);
return true;
} catch (const std::runtime_error& e) {
- return error("Error during SOCKS5 proxy handshake: %s", e.what());
+ LogError("Error during SOCKS5 proxy handshake: %s\n", e.what());
+ return false;
}
}
-std::unique_ptr<Sock> CreateSockTCP(const CService& address_family)
+std::unique_ptr<Sock> CreateSockOS(sa_family_t address_family)
{
- // Create a sockaddr from the specified service.
- struct sockaddr_storage sockaddr;
- socklen_t len = sizeof(sockaddr);
- if (!address_family.GetSockAddr((struct sockaddr*)&sockaddr, &len)) {
- LogPrintf("Cannot create socket for %s: unsupported network\n", address_family.ToStringAddrPort());
- return nullptr;
- }
+ // Not IPv4, IPv6 or UNIX
+ if (address_family == AF_UNSPEC) return nullptr;
+
+ int protocol{IPPROTO_TCP};
+#if HAVE_SOCKADDR_UN
+ if (address_family == AF_UNIX) protocol = 0;
+#endif
- // Create a TCP socket in the address family of the specified service.
- SOCKET hSocket = socket(((struct sockaddr*)&sockaddr)->sa_family, SOCK_STREAM, IPPROTO_TCP);
+ // Create a socket in the specified address family.
+ SOCKET hSocket = socket(address_family, SOCK_STREAM, protocol);
if (hSocket == INVALID_SOCKET) {
return nullptr;
}
@@ -479,21 +522,25 @@ std::unique_ptr<Sock> CreateSockTCP(const CService& address_family)
}
#endif
- // Set the no-delay option (disable Nagle's algorithm) on the TCP socket.
- const int on{1};
- if (sock->SetSockOpt(IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) == SOCKET_ERROR) {
- LogPrint(BCLog::NET, "Unable to set TCP_NODELAY on a newly created socket, continuing anyway\n");
- }
-
// Set the non-blocking option on the socket.
if (!sock->SetNonBlocking()) {
LogPrintf("Error setting socket to non-blocking: %s\n", NetworkErrorString(WSAGetLastError()));
return nullptr;
}
+
+#if HAVE_SOCKADDR_UN
+ if (address_family == AF_UNIX) return sock;
+#endif
+
+ // Set the no-delay option (disable Nagle's algorithm) on the TCP socket.
+ const int on{1};
+ if (sock->SetSockOpt(IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) == SOCKET_ERROR) {
+ LogPrint(BCLog::NET, "Unable to set TCP_NODELAY on a newly created socket, continuing anyway\n");
+ }
return sock;
}
-std::function<std::unique_ptr<Sock>(const CService&)> CreateSock = CreateSockTCP;
+std::function<std::unique_ptr<Sock>(const sa_family_t&)> CreateSock = CreateSockOS;
template<typename... Args>
static void LogConnectFailure(bool manual_connection, const char* fmt, const Args&... args) {
@@ -505,18 +552,10 @@ static void LogConnectFailure(bool manual_connection, const char* fmt, const Arg
}
}
-bool ConnectSocketDirectly(const CService &addrConnect, const Sock& sock, int nTimeout, bool manual_connection)
+static bool ConnectToSocket(const Sock& sock, struct sockaddr* sockaddr, socklen_t len, const std::string& dest_str, bool manual_connection)
{
- // Create a sockaddr from the specified service.
- struct sockaddr_storage sockaddr;
- socklen_t len = sizeof(sockaddr);
- if (!addrConnect.GetSockAddr((struct sockaddr*)&sockaddr, &len)) {
- LogPrintf("Cannot connect to %s: unsupported network\n", addrConnect.ToStringAddrPort());
- return false;
- }
-
- // Connect to the addrConnect service on the hSocket socket.
- if (sock.Connect(reinterpret_cast<struct sockaddr*>(&sockaddr), len) == SOCKET_ERROR) {
+ // Connect to `sockaddr` using `sock`.
+ if (sock.Connect(sockaddr, len) == SOCKET_ERROR) {
int nErr = WSAGetLastError();
// WSAEINVAL is here because some legacy version of winsock uses it
if (nErr == WSAEINPROGRESS || nErr == WSAEWOULDBLOCK || nErr == WSAEINVAL)
@@ -526,13 +565,13 @@ bool ConnectSocketDirectly(const CService &addrConnect, const Sock& sock, int nT
// synchronously to check for successful connection with a timeout.
const Sock::Event requested = Sock::RECV | Sock::SEND;
Sock::Event occurred;
- if (!sock.Wait(std::chrono::milliseconds{nTimeout}, requested, &occurred)) {
+ if (!sock.Wait(std::chrono::milliseconds{nConnectTimeout}, requested, &occurred)) {
LogPrintf("wait for connect to %s failed: %s\n",
- addrConnect.ToStringAddrPort(),
+ dest_str,
NetworkErrorString(WSAGetLastError()));
return false;
} else if (occurred == 0) {
- LogPrint(BCLog::NET, "connection attempt to %s timed out\n", addrConnect.ToStringAddrPort());
+ LogPrint(BCLog::NET, "connection attempt to %s timed out\n", dest_str);
return false;
}
@@ -544,13 +583,13 @@ bool ConnectSocketDirectly(const CService &addrConnect, const Sock& sock, int nT
socklen_t sockerr_len = sizeof(sockerr);
if (sock.GetSockOpt(SOL_SOCKET, SO_ERROR, (sockopt_arg_type)&sockerr, &sockerr_len) ==
SOCKET_ERROR) {
- LogPrintf("getsockopt() for %s failed: %s\n", addrConnect.ToStringAddrPort(), NetworkErrorString(WSAGetLastError()));
+ LogPrintf("getsockopt() for %s failed: %s\n", dest_str, NetworkErrorString(WSAGetLastError()));
return false;
}
if (sockerr != 0) {
LogConnectFailure(manual_connection,
"connect() to %s failed after wait: %s",
- addrConnect.ToStringAddrPort(),
+ dest_str,
NetworkErrorString(sockerr));
return false;
}
@@ -561,13 +600,72 @@ bool ConnectSocketDirectly(const CService &addrConnect, const Sock& sock, int nT
else
#endif
{
- LogConnectFailure(manual_connection, "connect() to %s failed: %s", addrConnect.ToStringAddrPort(), NetworkErrorString(WSAGetLastError()));
+ LogConnectFailure(manual_connection, "connect() to %s failed: %s", dest_str, NetworkErrorString(WSAGetLastError()));
return false;
}
}
return true;
}
+std::unique_ptr<Sock> ConnectDirectly(const CService& dest, bool manual_connection)
+{
+ auto sock = CreateSock(dest.GetSAFamily());
+ if (!sock) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Error, "Cannot create a socket for connecting to %s\n", dest.ToStringAddrPort());
+ return {};
+ }
+
+ // Create a sockaddr from the specified service.
+ struct sockaddr_storage sockaddr;
+ socklen_t len = sizeof(sockaddr);
+ if (!dest.GetSockAddr((struct sockaddr*)&sockaddr, &len)) {
+ LogPrintf("Cannot get sockaddr for %s: unsupported network\n", dest.ToStringAddrPort());
+ return {};
+ }
+
+ if (!ConnectToSocket(*sock, (struct sockaddr*)&sockaddr, len, dest.ToStringAddrPort(), manual_connection)) {
+ return {};
+ }
+
+ return sock;
+}
+
+std::unique_ptr<Sock> Proxy::Connect() const
+{
+ if (!IsValid()) {
+ LogPrintf("Cannot connect to invalid Proxy\n");
+ return {};
+ }
+
+ if (!m_is_unix_socket) return ConnectDirectly(proxy, /*manual_connection=*/true);
+
+#if HAVE_SOCKADDR_UN
+ auto sock = CreateSock(AF_UNIX);
+ if (!sock) {
+ LogPrintLevel(BCLog::NET, BCLog::Level::Error, "Cannot create a socket for connecting to %s\n", m_unix_socket_path);
+ return {};
+ }
+
+ const std::string path{m_unix_socket_path.substr(ADDR_PREFIX_UNIX.length())};
+
+ struct sockaddr_un addrun;
+ memset(&addrun, 0, sizeof(addrun));
+ addrun.sun_family = AF_UNIX;
+ // leave the last char in addrun.sun_path[] to be always '\0'
+ memcpy(addrun.sun_path, path.c_str(), std::min(sizeof(addrun.sun_path) - 1, path.length()));
+ socklen_t len = sizeof(addrun);
+
+ if(!ConnectToSocket(*sock, (struct sockaddr*)&addrun, len, path, /*manual_connection=*/true)) {
+ LogPrintf("Cannot connect to socket for %s\n", path);
+ return {};
+ }
+
+ return sock;
+#else
+ return {};
+#endif
+}
+
bool SetProxy(enum Network net, const Proxy &addrProxy) {
assert(net >= 0 && net < NET_MAX);
if (!addrProxy.IsValid())
@@ -616,27 +714,32 @@ bool IsProxy(const CNetAddr &addr) {
return false;
}
-bool ConnectThroughProxy(const Proxy& proxy, const std::string& strDest, uint16_t port, const Sock& sock, int nTimeout, bool& outProxyConnectionFailed)
+std::unique_ptr<Sock> ConnectThroughProxy(const Proxy& proxy,
+ const std::string& dest,
+ uint16_t port,
+ bool& proxy_connection_failed)
{
// first connect to proxy server
- if (!ConnectSocketDirectly(proxy.proxy, sock, nTimeout, true)) {
- outProxyConnectionFailed = true;
- return false;
+ auto sock = proxy.Connect();
+ if (!sock) {
+ proxy_connection_failed = true;
+ return {};
}
+
// do socks negotiation
- if (proxy.randomize_credentials) {
+ if (proxy.m_randomize_credentials) {
ProxyCredentials random_auth;
static std::atomic_int counter(0);
random_auth.username = random_auth.password = strprintf("%i", counter++);
- if (!Socks5(strDest, port, &random_auth, sock)) {
- return false;
+ if (!Socks5(dest, port, &random_auth, *sock)) {
+ return {};
}
} else {
- if (!Socks5(strDest, port, nullptr, sock)) {
- return false;
+ if (!Socks5(dest, port, nullptr, *sock)) {
+ return {};
}
}
- return true;
+ return sock;
}
CSubNet LookupSubNet(const std::string& subnet_str)
diff --git a/src/netbase.h b/src/netbase.h
index 8523f59b4d..321c288f67 100644
--- a/src/netbase.h
+++ b/src/netbase.h
@@ -5,10 +5,6 @@
#ifndef BITCOIN_NETBASE_H
#define BITCOIN_NETBASE_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <compat/compat.h>
#include <netaddress.h>
#include <serialize.h>
@@ -31,6 +27,9 @@ static const int DEFAULT_CONNECT_TIMEOUT = 5000;
//! -dns default
static const int DEFAULT_NAME_LOOKUP = true;
+/** Prefix for unix domain socket addresses (which are local filesystem paths) */
+const std::string ADDR_PREFIX_UNIX = "unix:";
+
enum class ConnectionDirection {
None = 0,
In = (1U << 0),
@@ -47,16 +46,46 @@ static inline bool operator&(ConnectionDirection a, ConnectionDirection b) {
return (underlying(a) & underlying(b));
}
+/**
+ * Check if a string is a valid UNIX domain socket path
+ *
+ * @param name The string provided by the user representing a local path
+ *
+ * @returns Whether the string has proper format, length, and points to an existing file path
+ */
+bool IsUnixSocketPath(const std::string& name);
+
class Proxy
{
public:
- Proxy(): randomize_credentials(false) {}
- explicit Proxy(const CService &_proxy, bool _randomize_credentials=false): proxy(_proxy), randomize_credentials(_randomize_credentials) {}
-
- bool IsValid() const { return proxy.IsValid(); }
+ Proxy() : m_is_unix_socket(false), m_randomize_credentials(false) {}
+ explicit Proxy(const CService& _proxy, bool _randomize_credentials = false) : proxy(_proxy), m_is_unix_socket(false), m_randomize_credentials(_randomize_credentials) {}
+ explicit Proxy(const std::string path, bool _randomize_credentials = false) : m_unix_socket_path(path), m_is_unix_socket(true), m_randomize_credentials(_randomize_credentials) {}
CService proxy;
- bool randomize_credentials;
+ std::string m_unix_socket_path;
+ bool m_is_unix_socket;
+ bool m_randomize_credentials;
+
+ bool IsValid() const
+ {
+ if (m_is_unix_socket) return IsUnixSocketPath(m_unix_socket_path);
+ return proxy.IsValid();
+ }
+
+ sa_family_t GetFamily() const
+ {
+ if (m_is_unix_socket) return AF_UNIX;
+ return proxy.GetSAFamily();
+ }
+
+ std::string ToString() const
+ {
+ if (m_is_unix_socket) return m_unix_socket_path;
+ return proxy.ToStringAddrPort();
+ }
+
+ std::unique_ptr<Sock> Connect() const;
};
/** Credentials for proxy authentication */
@@ -233,47 +262,42 @@ CService LookupNumeric(const std::string& name, uint16_t portDefault = 0, DNSLoo
CSubNet LookupSubNet(const std::string& subnet_str);
/**
- * Create a TCP socket in the given address family.
- * @param[in] address_family The socket is created in the same address family as this address.
+ * Create a TCP or UNIX socket in the given address family.
+ * @param[in] address_family to use for the socket.
* @return pointer to the created Sock object or unique_ptr that owns nothing in case of failure
*/
-std::unique_ptr<Sock> CreateSockTCP(const CService& address_family);
+std::unique_ptr<Sock> CreateSockOS(sa_family_t address_family);
/**
- * Socket factory. Defaults to `CreateSockTCP()`, but can be overridden by unit tests.
+ * Socket factory. Defaults to `CreateSockOS()`, but can be overridden by unit tests.
*/
-extern std::function<std::unique_ptr<Sock>(const CService&)> CreateSock;
+extern std::function<std::unique_ptr<Sock>(const sa_family_t&)> CreateSock;
/**
- * Try to connect to the specified service on the specified socket.
+ * Create a socket and try to connect to the specified service.
*
- * @param addrConnect The service to which to connect.
- * @param sock The socket on which to connect.
- * @param nTimeout Wait this many milliseconds for the connection to be
- * established.
- * @param manual_connection Whether or not the connection was manually requested
- * (e.g. through the addnode RPC)
+ * @param[in] dest The service to which to connect.
+ * @param[in] manual_connection Whether or not the connection was manually requested (e.g. through the addnode RPC)
*
- * @returns Whether or not a connection was successfully made.
+ * @returns the connected socket if the operation succeeded, empty unique_ptr otherwise
*/
-bool ConnectSocketDirectly(const CService &addrConnect, const Sock& sock, int nTimeout, bool manual_connection);
+std::unique_ptr<Sock> ConnectDirectly(const CService& dest, bool manual_connection);
/**
* Connect to a specified destination service through a SOCKS5 proxy by first
* connecting to the SOCKS5 proxy.
*
- * @param proxy The SOCKS5 proxy.
- * @param strDest The destination service to which to connect.
- * @param port The destination port.
- * @param sock The socket on which to connect to the SOCKS5 proxy.
- * @param nTimeout Wait this many milliseconds for the connection to the SOCKS5
- * proxy to be established.
- * @param[out] outProxyConnectionFailed Whether or not the connection to the
- * SOCKS5 proxy failed.
+ * @param[in] proxy The SOCKS5 proxy.
+ * @param[in] dest The destination service to which to connect.
+ * @param[in] port The destination port.
+ * @param[out] proxy_connection_failed Whether or not the connection to the SOCKS5 proxy failed.
*
- * @returns Whether or not the operation succeeded.
+ * @returns the connected socket if the operation succeeded. Otherwise an empty unique_ptr.
*/
-bool ConnectThroughProxy(const Proxy& proxy, const std::string& strDest, uint16_t port, const Sock& sock, int nTimeout, bool& outProxyConnectionFailed);
+std::unique_ptr<Sock> ConnectThroughProxy(const Proxy& proxy,
+ const std::string& dest,
+ uint16_t port,
+ bool& proxy_connection_failed);
/**
* Interrupt SOCKS5 reads or writes.
diff --git a/src/node/abort.cpp b/src/node/abort.cpp
index 1bdc91670d..b727608384 100644
--- a/src/node/abort.cpp
+++ b/src/node/abort.cpp
@@ -16,14 +16,13 @@
namespace node {
-void AbortNode(util::SignalInterrupt* shutdown, std::atomic<int>& exit_status, const std::string& debug_message, const bilingual_str& user_message)
+void AbortNode(util::SignalInterrupt* shutdown, std::atomic<int>& exit_status, const bilingual_str& message)
{
- SetMiscWarning(Untranslated(debug_message));
- LogPrintf("*** %s\n", debug_message);
- InitError(user_message.empty() ? _("A fatal internal error occurred, see debug.log for details") : user_message);
+ SetMiscWarning(message);
+ InitError(_("A fatal internal error occurred, see debug.log for details: ") + message);
exit_status.store(EXIT_FAILURE);
if (shutdown && !(*shutdown)()) {
- LogPrintf("Error: failed to send shutdown signal\n");
+ LogError("Failed to send shutdown signal\n");
};
}
} // namespace node
diff --git a/src/node/abort.h b/src/node/abort.h
index 28d021cc78..1092279142 100644
--- a/src/node/abort.h
+++ b/src/node/abort.h
@@ -5,17 +5,16 @@
#ifndef BITCOIN_NODE_ABORT_H
#define BITCOIN_NODE_ABORT_H
-#include <util/translation.h>
-
#include <atomic>
-#include <string>
+
+struct bilingual_str;
namespace util {
class SignalInterrupt;
} // namespace util
namespace node {
-void AbortNode(util::SignalInterrupt* shutdown, std::atomic<int>& exit_status, const std::string& debug_message, const bilingual_str& user_message = {});
+void AbortNode(util::SignalInterrupt* shutdown, std::atomic<int>& exit_status, const bilingual_str& message);
} // namespace node
#endif // BITCOIN_NODE_ABORT_H
diff --git a/src/node/blockstorage.cpp b/src/node/blockstorage.cpp
index c499bbfa6a..576c07a833 100644
--- a/src/node/blockstorage.cpp
+++ b/src/node/blockstorage.cpp
@@ -131,12 +131,14 @@ bool BlockTreeDB::LoadBlockIndexGuts(const Consensus::Params& consensusParams, s
pindexNew->nTx = diskindex.nTx;
if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits, consensusParams)) {
- return error("%s: CheckProofOfWork failed: %s", __func__, pindexNew->ToString());
+ LogError("%s: CheckProofOfWork failed: %s\n", __func__, pindexNew->ToString());
+ return false;
}
pcursor->Next();
} else {
- return error("%s: failed to read value", __func__);
+ LogError("%s: failed to read value\n", __func__);
+ return false;
}
} else {
break;
@@ -402,7 +404,7 @@ bool BlockManager::LoadBlockIndex(const std::optional<uint256>& snapshot_blockha
if (snapshot_blockhash) {
const std::optional<AssumeutxoData> maybe_au_data = GetParams().AssumeutxoForBlockhash(*snapshot_blockhash);
if (!maybe_au_data) {
- m_opts.notifications.fatalError(strprintf("Assumeutxo data not found for the given blockhash '%s'.", snapshot_blockhash->ToString()));
+ m_opts.notifications.fatalError(strprintf(_("Assumeutxo data not found for the given blockhash '%s'."), snapshot_blockhash->ToString()));
return false;
}
const AssumeutxoData& au_data = *Assert(maybe_au_data);
@@ -432,7 +434,8 @@ bool BlockManager::LoadBlockIndex(const std::optional<uint256>& snapshot_blockha
for (CBlockIndex* pindex : vSortedByHeight) {
if (m_interrupt) return false;
if (previous_index && pindex->nHeight > previous_index->nHeight + 1) {
- return error("%s: block index is non-contiguous, index of height %d missing", __func__, previous_index->nHeight + 1);
+ LogError("%s: block index is non-contiguous, index of height %d missing\n", __func__, previous_index->nHeight + 1);
+ return false;
}
previous_index = pindex;
pindex->nChainWork = (pindex->pprev ? pindex->pprev->nChainWork : 0) + GetBlockProof(*pindex);
@@ -671,7 +674,8 @@ bool BlockManager::UndoWriteToDisk(const CBlockUndo& blockundo, FlatFilePos& pos
// Open history file to append
AutoFile fileout{OpenUndoFile(pos)};
if (fileout.IsNull()) {
- return error("%s: OpenUndoFile failed", __func__);
+ LogError("%s: OpenUndoFile failed\n", __func__);
+ return false;
}
// Write index header
@@ -681,7 +685,8 @@ bool BlockManager::UndoWriteToDisk(const CBlockUndo& blockundo, FlatFilePos& pos
// Write undo data
long fileOutPos = ftell(fileout.Get());
if (fileOutPos < 0) {
- return error("%s: ftell failed", __func__);
+ LogError("%s: ftell failed\n", __func__);
+ return false;
}
pos.nPos = (unsigned int)fileOutPos;
fileout << blockundo;
@@ -700,13 +705,15 @@ bool BlockManager::UndoReadFromDisk(CBlockUndo& blockundo, const CBlockIndex& in
const FlatFilePos pos{WITH_LOCK(::cs_main, return index.GetUndoPos())};
if (pos.IsNull()) {
- return error("%s: no undo data available", __func__);
+ LogError("%s: no undo data available\n", __func__);
+ return false;
}
// Open history file to read
AutoFile filein{OpenUndoFile(pos, true)};
if (filein.IsNull()) {
- return error("%s: OpenUndoFile failed", __func__);
+ LogError("%s: OpenUndoFile failed\n", __func__);
+ return false;
}
// Read block
@@ -717,12 +724,14 @@ bool BlockManager::UndoReadFromDisk(CBlockUndo& blockundo, const CBlockIndex& in
verifier >> blockundo;
filein >> hashChecksum;
} catch (const std::exception& e) {
- return error("%s: Deserialize or I/O error - %s", __func__, e.what());
+ LogError("%s: Deserialize or I/O error - %s\n", __func__, e.what());
+ return false;
}
// Verify checksum
if (hashChecksum != verifier.GetHash()) {
- return error("%s: Checksum mismatch", __func__);
+ LogError("%s: Checksum mismatch\n", __func__);
+ return false;
}
return true;
@@ -732,7 +741,7 @@ bool BlockManager::FlushUndoFile(int block_file, bool finalize)
{
FlatFilePos undo_pos_old(block_file, m_blockfile_info[block_file].nUndoSize);
if (!UndoFileSeq().Flush(undo_pos_old, finalize)) {
- m_opts.notifications.flushError("Flushing undo file to disk failed. This is likely the result of an I/O error.");
+ m_opts.notifications.flushError(_("Flushing undo file to disk failed. This is likely the result of an I/O error."));
return false;
}
return true;
@@ -754,7 +763,7 @@ bool BlockManager::FlushBlockFile(int blockfile_num, bool fFinalize, bool finali
FlatFilePos block_pos_old(blockfile_num, m_blockfile_info[blockfile_num].nSize);
if (!BlockFileSeq().Flush(block_pos_old, fFinalize)) {
- m_opts.notifications.flushError("Flushing block file to disk failed. This is likely the result of an I/O error.");
+ m_opts.notifications.flushError(_("Flushing block file to disk failed. This is likely the result of an I/O error."));
success = false;
}
// we do not always flush the undo file, as the chain tip may be lagging behind the incoming blocks,
@@ -897,19 +906,19 @@ bool BlockManager::FindBlockPos(FlatFilePos& pos, unsigned int nAddSize, unsigne
if (!fKnown) {
LogPrint(BCLog::BLOCKSTORAGE, "Leaving block file %i: %s (onto %i) (height %i)\n",
last_blockfile, m_blockfile_info[last_blockfile].ToString(), nFile, nHeight);
- }
- // Do not propagate the return code. The flush concerns a previous block
- // and undo file that has already been written to. If a flush fails
- // here, and we crash, there is no expected additional block data
- // inconsistency arising from the flush failure here. However, the undo
- // data may be inconsistent after a crash if the flush is called during
- // a reindex. A flush error might also leave some of the data files
- // untrimmed.
- if (!FlushBlockFile(last_blockfile, !fKnown, finalize_undo)) {
- LogPrintLevel(BCLog::BLOCKSTORAGE, BCLog::Level::Warning,
- "Failed to flush previous block file %05i (finalize=%i, finalize_undo=%i) before opening new block file %05i\n",
- last_blockfile, !fKnown, finalize_undo, nFile);
+ // Do not propagate the return code. The flush concerns a previous block
+ // and undo file that has already been written to. If a flush fails
+ // here, and we crash, there is no expected additional block data
+ // inconsistency arising from the flush failure here. However, the undo
+ // data may be inconsistent after a crash if the flush is called during
+ // a reindex. A flush error might also leave some of the data files
+ // untrimmed.
+ if (!FlushBlockFile(last_blockfile, !fKnown, finalize_undo)) {
+ LogPrintLevel(BCLog::BLOCKSTORAGE, BCLog::Level::Warning,
+ "Failed to flush previous block file %05i (finalize=%i, finalize_undo=%i) before opening new block file %05i\n",
+ last_blockfile, !fKnown, finalize_undo, nFile);
+ }
}
// No undo data yet in the new file, so reset our undo-height tracking.
m_blockfile_cursors[chain_type] = BlockfileCursor{nFile};
@@ -926,7 +935,7 @@ bool BlockManager::FindBlockPos(FlatFilePos& pos, unsigned int nAddSize, unsigne
bool out_of_space;
size_t bytes_allocated = BlockFileSeq().Allocate(pos, nAddSize, out_of_space);
if (out_of_space) {
- m_opts.notifications.fatalError("Disk space is too low!", _("Disk space is too low!"));
+ m_opts.notifications.fatalError(_("Disk space is too low!"));
return false;
}
if (bytes_allocated != 0 && IsPruneMode()) {
@@ -951,7 +960,7 @@ bool BlockManager::FindUndoPos(BlockValidationState& state, int nFile, FlatFileP
bool out_of_space;
size_t bytes_allocated = UndoFileSeq().Allocate(pos, nAddSize, out_of_space);
if (out_of_space) {
- return FatalError(m_opts.notifications, state, "Disk space is too low!", _("Disk space is too low!"));
+ return FatalError(m_opts.notifications, state, _("Disk space is too low!"));
}
if (bytes_allocated != 0 && IsPruneMode()) {
m_check_for_pruning = true;
@@ -965,7 +974,8 @@ bool BlockManager::WriteBlockToDisk(const CBlock& block, FlatFilePos& pos) const
// Open history file to append
AutoFile fileout{OpenBlockFile(pos)};
if (fileout.IsNull()) {
- return error("WriteBlockToDisk: OpenBlockFile failed");
+ LogError("WriteBlockToDisk: OpenBlockFile failed\n");
+ return false;
}
// Write index header
@@ -975,7 +985,8 @@ bool BlockManager::WriteBlockToDisk(const CBlock& block, FlatFilePos& pos) const
// Write block
long fileOutPos = ftell(fileout.Get());
if (fileOutPos < 0) {
- return error("WriteBlockToDisk: ftell failed");
+ LogError("WriteBlockToDisk: ftell failed\n");
+ return false;
}
pos.nPos = (unsigned int)fileOutPos;
fileout << TX_WITH_WITNESS(block);
@@ -993,10 +1004,11 @@ bool BlockManager::WriteUndoDataForBlock(const CBlockUndo& blockundo, BlockValid
if (block.GetUndoPos().IsNull()) {
FlatFilePos _pos;
if (!FindUndoPos(state, block.nFile, _pos, ::GetSerializeSize(blockundo) + 40)) {
- return error("ConnectBlock(): FindUndoPos failed");
+ LogError("ConnectBlock(): FindUndoPos failed\n");
+ return false;
}
if (!UndoWriteToDisk(blockundo, _pos, block.pprev->GetBlockHash())) {
- return FatalError(m_opts.notifications, state, "Failed to write undo data");
+ return FatalError(m_opts.notifications, state, _("Failed to write undo data."));
}
// rev files are written in block height order, whereas blk files are written as blocks come in (often out of order)
// we want to flush the rev (undo) file once we've written the last block, which is indicated by the last height
@@ -1031,24 +1043,28 @@ bool BlockManager::ReadBlockFromDisk(CBlock& block, const FlatFilePos& pos) cons
// Open history file to read
AutoFile filein{OpenBlockFile(pos, true)};
if (filein.IsNull()) {
- return error("ReadBlockFromDisk: OpenBlockFile failed for %s", pos.ToString());
+ LogError("ReadBlockFromDisk: OpenBlockFile failed for %s\n", pos.ToString());
+ return false;
}
// Read block
try {
filein >> TX_WITH_WITNESS(block);
} catch (const std::exception& e) {
- return error("%s: Deserialize or I/O error - %s at %s", __func__, e.what(), pos.ToString());
+ LogError("%s: Deserialize or I/O error - %s at %s\n", __func__, e.what(), pos.ToString());
+ return false;
}
// Check the header
if (!CheckProofOfWork(block.GetHash(), block.nBits, GetConsensus())) {
- return error("ReadBlockFromDisk: Errors in block header at %s", pos.ToString());
+ LogError("ReadBlockFromDisk: Errors in block header at %s\n", pos.ToString());
+ return false;
}
// Signet only: check block solution
if (GetConsensus().signet_blocks && !CheckSignetBlockSolution(block, GetConsensus())) {
- return error("ReadBlockFromDisk: Errors in block solution at %s", pos.ToString());
+ LogError("ReadBlockFromDisk: Errors in block solution at %s\n", pos.ToString());
+ return false;
}
return true;
@@ -1062,8 +1078,9 @@ bool BlockManager::ReadBlockFromDisk(CBlock& block, const CBlockIndex& index) co
return false;
}
if (block.GetHash() != index.GetBlockHash()) {
- return error("ReadBlockFromDisk(CBlock&, CBlockIndex*): GetHash() doesn't match index for %s at %s",
+ LogError("ReadBlockFromDisk(CBlock&, CBlockIndex*): GetHash() doesn't match index for %s at %s\n",
index.ToString(), block_pos.ToString());
+ return false;
}
return true;
}
@@ -1071,10 +1088,17 @@ bool BlockManager::ReadBlockFromDisk(CBlock& block, const CBlockIndex& index) co
bool BlockManager::ReadRawBlockFromDisk(std::vector<uint8_t>& block, const FlatFilePos& pos) const
{
FlatFilePos hpos = pos;
+ // If nPos is less than 8 the pos is null and we don't have the block data
+ // Return early to prevent undefined behavior of unsigned int underflow
+ if (hpos.nPos < 8) {
+ LogError("%s: OpenBlockFile failed for %s\n", __func__, pos.ToString());
+ return false;
+ }
hpos.nPos -= 8; // Seek back 8 bytes for meta header
AutoFile filein{OpenBlockFile(hpos, true)};
if (filein.IsNull()) {
- return error("%s: OpenBlockFile failed for %s", __func__, pos.ToString());
+ LogError("%s: OpenBlockFile failed for %s\n", __func__, pos.ToString());
+ return false;
}
try {
@@ -1084,20 +1108,23 @@ bool BlockManager::ReadRawBlockFromDisk(std::vector<uint8_t>& block, const FlatF
filein >> blk_start >> blk_size;
if (blk_start != GetParams().MessageStart()) {
- return error("%s: Block magic mismatch for %s: %s versus expected %s", __func__, pos.ToString(),
+ LogError("%s: Block magic mismatch for %s: %s versus expected %s\n", __func__, pos.ToString(),
HexStr(blk_start),
HexStr(GetParams().MessageStart()));
+ return false;
}
if (blk_size > MAX_SIZE) {
- return error("%s: Block data is larger than maximum deserialization size for %s: %s versus %s", __func__, pos.ToString(),
+ LogError("%s: Block data is larger than maximum deserialization size for %s: %s versus %s\n", __func__, pos.ToString(),
blk_size, MAX_SIZE);
+ return false;
}
block.resize(blk_size); // Zeroing of memory is intentional here
filein.read(MakeWritableByteSpan(block));
} catch (const std::exception& e) {
- return error("%s: Read from block file failed: %s for %s", __func__, e.what(), pos.ToString());
+ LogError("%s: Read from block file failed: %s for %s\n", __func__, e.what(), pos.ToString());
+ return false;
}
return true;
@@ -1117,12 +1144,12 @@ FlatFilePos BlockManager::SaveBlockToDisk(const CBlock& block, int nHeight, cons
nBlockSize += static_cast<unsigned int>(BLOCK_SERIALIZATION_HEADER_SIZE);
}
if (!FindBlockPos(blockPos, nBlockSize, nHeight, block.GetBlockTime(), position_known)) {
- error("%s: FindBlockPos failed", __func__);
+ LogError("%s: FindBlockPos failed\n", __func__);
return FlatFilePos();
}
if (!position_known) {
if (!WriteBlockToDisk(block, blockPos)) {
- m_opts.notifications.fatalError("Failed to write block");
+ m_opts.notifications.fatalError(_("Failed to write block."));
return FlatFilePos();
}
}
@@ -1206,7 +1233,7 @@ void ImportBlocks(ChainstateManager& chainman, std::vector<fs::path> vImportFile
for (Chainstate* chainstate : WITH_LOCK(::cs_main, return chainman.GetAll())) {
BlockValidationState state;
if (!chainstate->ActivateBestChain(state, nullptr)) {
- chainman.GetNotifications().fatalError(strprintf("Failed to connect best block (%s)", state.ToString()));
+ chainman.GetNotifications().fatalError(strprintf(_("Failed to connect best block (%s)."), state.ToString()));
return;
}
}
diff --git a/src/node/context.h b/src/node/context.h
index 4f3b640b2d..245f230aec 100644
--- a/src/node/context.h
+++ b/src/node/context.h
@@ -20,6 +20,7 @@ class BanMan;
class BaseIndex;
class CBlockPolicyEstimator;
class CConnman;
+class ValidationSignals;
class CScheduler;
class CTxMemPool;
class ChainstateManager;
@@ -70,7 +71,10 @@ struct NodeContext {
interfaces::WalletLoader* wallet_loader{nullptr};
std::unique_ptr<CScheduler> scheduler;
std::function<void()> rpc_interruption_point = [] {};
+ //! Issues blocking calls about sync status, errors and warnings
std::unique_ptr<KernelNotifications> notifications;
+ //! Issues calls about blocks and transactions
+ std::unique_ptr<ValidationSignals> validation_signals;
std::atomic<int> exit_status{EXIT_SUCCESS};
//! Declare default constructor and destructor that are not inline, so code
diff --git a/src/node/interfaces.cpp b/src/node/interfaces.cpp
index 5a8b7fc105..f9a372e3de 100644
--- a/src/node/interfaces.cpp
+++ b/src/node/interfaces.cpp
@@ -460,19 +460,20 @@ public:
class NotificationsHandlerImpl : public Handler
{
public:
- explicit NotificationsHandlerImpl(std::shared_ptr<Chain::Notifications> notifications)
- : m_proxy(std::make_shared<NotificationsProxy>(std::move(notifications)))
+ explicit NotificationsHandlerImpl(ValidationSignals& signals, std::shared_ptr<Chain::Notifications> notifications)
+ : m_signals{signals}, m_proxy{std::make_shared<NotificationsProxy>(std::move(notifications))}
{
- RegisterSharedValidationInterface(m_proxy);
+ m_signals.RegisterSharedValidationInterface(m_proxy);
}
~NotificationsHandlerImpl() override { disconnect(); }
void disconnect() override
{
if (m_proxy) {
- UnregisterSharedValidationInterface(m_proxy);
+ m_signals.UnregisterSharedValidationInterface(m_proxy);
m_proxy.reset();
}
}
+ ValidationSignals& m_signals;
std::shared_ptr<NotificationsProxy> m_proxy;
};
@@ -761,12 +762,12 @@ public:
}
std::unique_ptr<Handler> handleNotifications(std::shared_ptr<Notifications> notifications) override
{
- return std::make_unique<NotificationsHandlerImpl>(std::move(notifications));
+ return std::make_unique<NotificationsHandlerImpl>(validation_signals(), std::move(notifications));
}
void waitForNotificationsIfTipChanged(const uint256& old_tip) override
{
if (!old_tip.IsNull() && old_tip == WITH_LOCK(::cs_main, return chainman().ActiveChain().Tip()->GetBlockHash())) return;
- SyncWithValidationInterfaceQueue();
+ validation_signals().SyncWithValidationInterfaceQueue();
}
std::unique_ptr<Handler> handleRpc(const CRPCCommand& command) override
{
@@ -822,6 +823,7 @@ public:
NodeContext* context() override { return &m_node; }
ArgsManager& args() { return *Assert(m_node.args); }
ChainstateManager& chainman() { return *Assert(m_node.chainman); }
+ ValidationSignals& validation_signals() { return *Assert(m_node.validation_signals); }
NodeContext& m_node;
};
} // namespace
diff --git a/src/node/kernel_notifications.cpp b/src/node/kernel_notifications.cpp
index 1fd3bad296..99f909ff75 100644
--- a/src/node/kernel_notifications.cpp
+++ b/src/node/kernel_notifications.cpp
@@ -84,15 +84,15 @@ void KernelNotifications::warning(const bilingual_str& warning)
DoWarning(warning);
}
-void KernelNotifications::flushError(const std::string& debug_message)
+void KernelNotifications::flushError(const bilingual_str& message)
{
- AbortNode(&m_shutdown, m_exit_status, debug_message);
+ AbortNode(&m_shutdown, m_exit_status, message);
}
-void KernelNotifications::fatalError(const std::string& debug_message, const bilingual_str& user_message)
+void KernelNotifications::fatalError(const bilingual_str& message)
{
node::AbortNode(m_shutdown_on_fatal_error ? &m_shutdown : nullptr,
- m_exit_status, debug_message, user_message);
+ m_exit_status, message);
}
void ReadNotificationArgs(const ArgsManager& args, KernelNotifications& notifications)
diff --git a/src/node/kernel_notifications.h b/src/node/kernel_notifications.h
index 38d8600ac6..f4d97a0fff 100644
--- a/src/node/kernel_notifications.h
+++ b/src/node/kernel_notifications.h
@@ -9,7 +9,6 @@
#include <atomic>
#include <cstdint>
-#include <string>
class ArgsManager;
class CBlockIndex;
@@ -37,9 +36,9 @@ public:
void warning(const bilingual_str& warning) override;
- void flushError(const std::string& debug_message) override;
+ void flushError(const bilingual_str& message) override;
- void fatalError(const std::string& debug_message, const bilingual_str& user_message = {}) override;
+ void fatalError(const bilingual_str& message) override;
//! Block height after which blockTip notification will return Interrupted{}, if >0.
int m_stop_at_height{DEFAULT_STOPATHEIGHT};
diff --git a/src/node/transaction.cpp b/src/node/transaction.cpp
index ef9a30a076..b66a4f2f39 100644
--- a/src/node/transaction.cpp
+++ b/src/node/transaction.cpp
@@ -92,7 +92,7 @@ TransactionError BroadcastTransaction(NodeContext& node, const CTransactionRef t
node.mempool->AddUnbroadcastTx(txid);
}
- if (wait_callback) {
+ if (wait_callback && node.validation_signals) {
// For transactions broadcast from outside the wallet, make sure
// that the wallet has been notified of the transaction before
// continuing.
@@ -101,7 +101,7 @@ TransactionError BroadcastTransaction(NodeContext& node, const CTransactionRef t
// with a transaction to/from their wallet, immediately call some
// wallet RPC, and get a stale result because callbacks have not
// yet been processed.
- CallFunctionInValidationInterfaceQueue([&promise] {
+ node.validation_signals->CallFunctionInValidationInterfaceQueue([&promise] {
promise.set_value();
});
callback_set = true;
diff --git a/src/node/transaction.h b/src/node/transaction.h
index 168273594c..6782536ace 100644
--- a/src/node/transaction.h
+++ b/src/node/transaction.h
@@ -26,6 +26,12 @@ struct NodeContext;
*/
static const CFeeRate DEFAULT_MAX_RAW_TX_FEE_RATE{COIN / 10};
+/** Maximum burn value for sendrawtransaction, submitpackage, and testmempoolaccept RPC calls.
+ * By default, a transaction with a burn value higher than this will be rejected
+ * by these RPCs and the GUI. This can be overridden with the maxburnamount argument.
+ */
+static const CAmount DEFAULT_MAX_BURN_AMOUNT{0};
+
/**
* Submit a transaction to the mempool and (optionally) relay it to all P2P peers.
*
diff --git a/src/noui.cpp b/src/noui.cpp
index af5a180ce3..23637dfa1f 100644
--- a/src/noui.cpp
+++ b/src/noui.cpp
@@ -28,20 +28,21 @@ bool noui_ThreadSafeMessageBox(const bilingual_str& message, const std::string&
switch (style) {
case CClientUIInterface::MSG_ERROR:
strCaption = "Error: ";
+ if (!fSecure) LogError("%s\n", message.original);
break;
case CClientUIInterface::MSG_WARNING:
strCaption = "Warning: ";
+ if (!fSecure) LogWarning("%s\n", message.original);
break;
case CClientUIInterface::MSG_INFORMATION:
strCaption = "Information: ";
+ if (!fSecure) LogInfo("%s\n", message.original);
break;
default:
strCaption = caption + ": "; // Use supplied caption (can be empty)
+ if (!fSecure) LogInfo("%s%s\n", strCaption, message.original);
}
- if (!fSecure) {
- LogPrintf("%s%s\n", strCaption, message.original);
- }
tfm::format(std::cerr, "%s%s\n", strCaption, message.original);
return false;
}
diff --git a/src/policy/rbf.cpp b/src/policy/rbf.cpp
index f0830d8f22..84c3352b9d 100644
--- a/src/policy/rbf.cpp
+++ b/src/policy/rbf.cpp
@@ -19,6 +19,8 @@
#include <limits>
#include <vector>
+#include <compare>
+
RBFTransactionState IsRBFOptIn(const CTransaction& tx, const CTxMemPool& pool)
{
AssertLockHeld(pool.cs);
@@ -181,3 +183,22 @@ std::optional<std::string> PaysForRBF(CAmount original_fees,
}
return std::nullopt;
}
+
+std::optional<std::pair<DiagramCheckError, std::string>> ImprovesFeerateDiagram(CTxMemPool& pool,
+ const CTxMemPool::setEntries& direct_conflicts,
+ const CTxMemPool::setEntries& all_conflicts,
+ CAmount replacement_fees,
+ int64_t replacement_vsize)
+{
+ // Require that the replacement strictly improves the mempool's feerate diagram.
+ const auto diagram_results{pool.CalculateFeerateDiagramsForRBF(replacement_fees, replacement_vsize, direct_conflicts, all_conflicts)};
+
+ if (!diagram_results.has_value()) {
+ return std::make_pair(DiagramCheckError::UNCALCULABLE, util::ErrorString(diagram_results).original);
+ }
+
+ if (!std::is_gt(CompareFeerateDiagram(diagram_results.value().second, diagram_results.value().first))) {
+ return std::make_pair(DiagramCheckError::FAILURE, "insufficient feerate: does not improve feerate diagram");
+ }
+ return std::nullopt;
+}
diff --git a/src/policy/rbf.h b/src/policy/rbf.h
index 5a33ed64a3..252fbec8e3 100644
--- a/src/policy/rbf.h
+++ b/src/policy/rbf.h
@@ -9,7 +9,9 @@
#include <primitives/transaction.h>
#include <threadsafety.h>
#include <txmempool.h>
+#include <util/feefrac.h>
+#include <compare>
#include <cstddef>
#include <cstdint>
#include <optional>
@@ -33,6 +35,13 @@ enum class RBFTransactionState {
FINAL,
};
+enum class DiagramCheckError {
+ /** Unable to calculate due to topology or other reason */
+ UNCALCULABLE,
+ /** New diagram wasn't strictly superior */
+ FAILURE,
+};
+
/**
* Determine whether an unconfirmed transaction is signaling opt-in to RBF
* according to BIP 125
@@ -106,4 +115,21 @@ std::optional<std::string> PaysForRBF(CAmount original_fees,
CFeeRate relay_fee,
const uint256& txid);
+/**
+ * The replacement transaction must improve the feerate diagram of the mempool.
+ * @param[in] pool The mempool.
+ * @param[in] direct_conflicts Set of in-mempool txids corresponding to the direct conflicts i.e.
+ * input double-spends with the proposed transaction
+ * @param[in] all_conflicts Set of mempool entries corresponding to all transactions to be evicted
+ * @param[in] replacement_fees Fees of proposed replacement package
+ * @param[in] replacement_vsize Size of proposed replacement package
+ * @returns error type and string if mempool diagram doesn't improve, otherwise std::nullopt.
+ */
+std::optional<std::pair<DiagramCheckError, std::string>> ImprovesFeerateDiagram(CTxMemPool& pool,
+ const CTxMemPool::setEntries& direct_conflicts,
+ const CTxMemPool::setEntries& all_conflicts,
+ CAmount replacement_fees,
+ int64_t replacement_vsize)
+ EXCLUSIVE_LOCKS_REQUIRED(pool.cs);
+
#endif // BITCOIN_POLICY_RBF_H
diff --git a/src/policy/v3_policy.cpp b/src/policy/v3_policy.cpp
index 158881aeb9..3c3942d707 100644
--- a/src/policy/v3_policy.cpp
+++ b/src/policy/v3_policy.cpp
@@ -81,9 +81,9 @@ std::optional<std::string> PackageV3Checks(const CTransactionRef& ptx, int64_t v
vsize, V3_CHILD_MAX_VSIZE);
}
+ // Exactly 1 parent exists, either in mempool or package. Find it.
const auto parent_info = [&] {
if (mempool_ancestors.size() > 0) {
- // There's a parent in the mempool.
auto& mempool_parent = *mempool_ancestors.begin();
Assume(mempool_parent->GetCountWithDescendants() == 1);
return ParentInfo{mempool_parent->GetTx().GetHash(),
@@ -91,7 +91,6 @@ std::optional<std::string> PackageV3Checks(const CTransactionRef& ptx, int64_t v
mempool_parent->GetTx().nVersion,
/*has_mempool_descendant=*/mempool_parent->GetCountWithDescendants() > 1};
} else {
- // Ancestor must be in the package. Find it.
auto& parent_index = in_package_parents.front();
auto& package_parent = package.at(parent_index);
return ParentInfo{package_parent->GetHash(),
@@ -131,10 +130,11 @@ std::optional<std::string> PackageV3Checks(const CTransactionRef& ptx, int64_t v
}
// It shouldn't be possible to have any mempool siblings at this point. SingleV3Checks
- // catches mempool siblings. Also, if the package consists of connected transactions,
+ // catches mempool siblings and sibling eviction is not extended to packages. Also, if the package consists of connected transactions,
// any tx having a mempool ancestor would mean the package exceeds ancestor limits.
if (!Assume(!parent_info.m_has_mempool_descendant)) {
- return strprintf("tx %u would exceed descendant count limit", parent_info.m_wtxid.ToString());
+ return strprintf("tx %s (wtxid=%s) would exceed descendant count limit",
+ parent_info.m_txid.ToString(), parent_info.m_wtxid.ToString());
}
}
} else {
@@ -159,7 +159,7 @@ std::optional<std::string> PackageV3Checks(const CTransactionRef& ptx, int64_t v
return std::nullopt;
}
-std::optional<std::string> SingleV3Checks(const CTransactionRef& ptx,
+std::optional<std::pair<std::string, CTransactionRef>> SingleV3Checks(const CTransactionRef& ptx,
const CTxMemPool::setEntries& mempool_ancestors,
const std::set<Txid>& direct_conflicts,
int64_t vsize)
@@ -167,13 +167,15 @@ std::optional<std::string> SingleV3Checks(const CTransactionRef& ptx,
// Check v3 and non-v3 inheritance.
for (const auto& entry : mempool_ancestors) {
if (ptx->nVersion != 3 && entry->GetTx().nVersion == 3) {
- return strprintf("non-v3 tx %s (wtxid=%s) cannot spend from v3 tx %s (wtxid=%s)",
+ return std::make_pair(strprintf("non-v3 tx %s (wtxid=%s) cannot spend from v3 tx %s (wtxid=%s)",
ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(),
- entry->GetSharedTx()->GetHash().ToString(), entry->GetSharedTx()->GetWitnessHash().ToString());
+ entry->GetSharedTx()->GetHash().ToString(), entry->GetSharedTx()->GetWitnessHash().ToString()),
+ nullptr);
} else if (ptx->nVersion == 3 && entry->GetTx().nVersion != 3) {
- return strprintf("v3 tx %s (wtxid=%s) cannot spend from non-v3 tx %s (wtxid=%s)",
+ return std::make_pair(strprintf("v3 tx %s (wtxid=%s) cannot spend from non-v3 tx %s (wtxid=%s)",
ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(),
- entry->GetSharedTx()->GetHash().ToString(), entry->GetSharedTx()->GetWitnessHash().ToString());
+ entry->GetSharedTx()->GetHash().ToString(), entry->GetSharedTx()->GetWitnessHash().ToString()),
+ nullptr);
}
}
@@ -184,18 +186,20 @@ std::optional<std::string> SingleV3Checks(const CTransactionRef& ptx,
// The rest of the rules only apply to transactions with nVersion=3.
if (ptx->nVersion != 3) return std::nullopt;
- // Check that V3_ANCESTOR_LIMIT would not be violated, including both in-package and in-mempool.
+ // Check that V3_ANCESTOR_LIMIT would not be violated.
if (mempool_ancestors.size() + 1 > V3_ANCESTOR_LIMIT) {
- return strprintf("tx %s (wtxid=%s) would have too many ancestors",
- ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString());
+ return std::make_pair(strprintf("tx %s (wtxid=%s) would have too many ancestors",
+ ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString()),
+ nullptr);
}
// Remaining checks only pertain to transactions with unconfirmed ancestors.
if (mempool_ancestors.size() > 0) {
// If this transaction spends V3 parents, it cannot be too large.
if (vsize > V3_CHILD_MAX_VSIZE) {
- return strprintf("v3 child tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
- ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(), vsize, V3_CHILD_MAX_VSIZE);
+ return std::make_pair(strprintf("v3 child tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
+ ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(), vsize, V3_CHILD_MAX_VSIZE),
+ nullptr);
}
// Check the descendant counts of in-mempool ancestors.
@@ -211,9 +215,20 @@ std::optional<std::string> SingleV3Checks(const CTransactionRef& ptx,
std::any_of(children.cbegin(), children.cend(),
[&direct_conflicts](const CTxMemPoolEntry& child){return direct_conflicts.count(child.GetTx().GetHash()) > 0;});
if (parent_entry->GetCountWithDescendants() + 1 > V3_DESCENDANT_LIMIT && !child_will_be_replaced) {
- return strprintf("tx %u (wtxid=%s) would exceed descendant count limit",
- parent_entry->GetSharedTx()->GetHash().ToString(),
- parent_entry->GetSharedTx()->GetWitnessHash().ToString());
+ // Allow sibling eviction for v3 transaction: if another child already exists, even if
+ // we don't conflict inputs with it, consider evicting it under RBF rules. We rely on v3 rules
+ // only permitting 1 descendant, as otherwise we would need to have logic for deciding
+ // which descendant to evict. Skip if this isn't true, e.g. if the transaction has
+ // multiple children or the sibling also has descendants due to a reorg.
+ const bool consider_sibling_eviction{parent_entry->GetCountWithDescendants() == 2 &&
+ children.begin()->get().GetCountWithAncestors() == 2};
+
+ // Return the sibling if its eviction can be considered. Provide the "descendant count
+ // limit" string either way, as the caller may decide not to do sibling eviction.
+ return std::make_pair(strprintf("tx %u (wtxid=%s) would exceed descendant count limit",
+ parent_entry->GetSharedTx()->GetHash().ToString(),
+ parent_entry->GetSharedTx()->GetWitnessHash().ToString()),
+ consider_sibling_eviction ? children.begin()->get().GetSharedTx() : nullptr);
}
}
return std::nullopt;
diff --git a/src/policy/v3_policy.h b/src/policy/v3_policy.h
index 9e871915e5..2e56f8822b 100644
--- a/src/policy/v3_policy.h
+++ b/src/policy/v3_policy.h
@@ -48,9 +48,15 @@ static_assert(V3_CHILD_MAX_VSIZE + MAX_STANDARD_TX_WEIGHT / WITNESS_SCALE_FACTOR
* count of in-mempool ancestors.
* @param[in] vsize The sigop-adjusted virtual size of ptx.
*
- * @returns debug string if an error occurs, std::nullopt otherwise.
+ * @returns 3 possibilities:
+ * - std::nullopt if all v3 checks were applied successfully
+ * - debug string + pointer to a mempool sibling if this transaction would be the second child in a
+ * 1-parent-1-child cluster; the caller may consider evicting the specified sibling or return an
+ * error with the debug string.
+ * - debug string + nullptr if this transaction violates some v3 rule and sibling eviction is not
+ * applicable.
*/
-std::optional<std::string> SingleV3Checks(const CTransactionRef& ptx,
+std::optional<std::pair<std::string, CTransactionRef>> SingleV3Checks(const CTransactionRef& ptx,
const CTxMemPool::setEntries& mempool_ancestors,
const std::set<Txid>& direct_conflicts,
int64_t vsize);
diff --git a/src/primitives/block.h b/src/primitives/block.h
index 99accfc7dd..832f8a03f7 100644
--- a/src/primitives/block.h
+++ b/src/primitives/block.h
@@ -71,8 +71,10 @@ public:
// network and disk
std::vector<CTransactionRef> vtx;
- // memory only
- mutable bool fChecked;
+ // Memory-only flags for caching expensive checks
+ mutable bool fChecked; // CheckBlock()
+ mutable bool m_checked_witness_commitment{false}; // CheckWitnessCommitment()
+ mutable bool m_checked_merkle_root{false}; // CheckMerkleRoot()
CBlock()
{
@@ -95,6 +97,8 @@ public:
CBlockHeader::SetNull();
vtx.clear();
fChecked = false;
+ m_checked_witness_commitment = false;
+ m_checked_merkle_root = false;
}
CBlockHeader GetBlockHeader() const
diff --git a/src/qt/addressbookpage.cpp b/src/qt/addressbookpage.cpp
index 05e58191fc..f2f9371c65 100644
--- a/src/qt/addressbookpage.cpp
+++ b/src/qt/addressbookpage.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/addressbookpage.h>
#include <qt/forms/ui_addressbookpage.h>
diff --git a/src/qt/askpassphrasedialog.cpp b/src/qt/askpassphrasedialog.cpp
index 246dff0069..a4771bbb82 100644
--- a/src/qt/askpassphrasedialog.cpp
+++ b/src/qt/askpassphrasedialog.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/askpassphrasedialog.h>
#include <qt/forms/ui_askpassphrasedialog.h>
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp
index 33c305f0d4..b1a8461d02 100644
--- a/src/qt/bitcoin.cpp
+++ b/src/qt/bitcoin.cpp
@@ -372,6 +372,11 @@ void BitcoinApplication::requestShutdown()
// Request node shutdown, which can interrupt long operations, like
// rescanning a wallet.
node().startShutdown();
+ // Prior to unsetting the client model, stop listening backend signals
+ if (clientModel) {
+ clientModel->stop();
+ }
+
// Unsetting the client model can cause the current thread to wait for node
// to complete an operation, like wait for a RPC execution to complete.
window->setClientModel(nullptr);
diff --git a/src/qt/bitcoin_locale.qrc b/src/qt/bitcoin_locale.qrc
index d10387f226..8883134b83 100644
--- a/src/qt/bitcoin_locale.qrc
+++ b/src/qt/bitcoin_locale.qrc
@@ -2,6 +2,7 @@
<qresource prefix="/translations">
<file alias="af">locale/bitcoin_af.qm</file>
<file alias="am">locale/bitcoin_am.qm</file>
+ <file alias="ar">locale/bitcoin_ar.qm</file>
<file alias="az">locale/bitcoin_az.qm</file>
<file alias="az@latin">locale/bitcoin_az@latin.qm</file>
<file alias="be">locale/bitcoin_be.qm</file>
@@ -87,7 +88,6 @@
<file alias="pt_BR">locale/bitcoin_pt_BR.qm</file>
<file alias="ro">locale/bitcoin_ro.qm</file>
<file alias="ru">locale/bitcoin_ru.qm</file>
- <file alias="ru_RU">locale/bitcoin_ru_RU.qm</file>
<file alias="sc">locale/bitcoin_sc.qm</file>
<file alias="sd">locale/bitcoin_sd.qm</file>
<file alias="si">locale/bitcoin_si.qm</file>
@@ -104,7 +104,6 @@
<file alias="szl">locale/bitcoin_szl.qm</file>
<file alias="ta">locale/bitcoin_ta.qm</file>
<file alias="te">locale/bitcoin_te.qm</file>
- <file alias="th">locale/bitcoin_th.qm</file>
<file alias="tk">locale/bitcoin_tk.qm</file>
<file alias="tl">locale/bitcoin_tl.qm</file>
<file alias="tr">locale/bitcoin_tr.qm</file>
diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp
index fd71938b60..5f132b817e 100644
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <qt/bitcoingui.h>
#include <qt/bitcoinunits.h>
@@ -673,8 +677,10 @@ void BitcoinGUI::setClientModel(ClientModel *_clientModel, interfaces::BlockAndH
#ifdef ENABLE_WALLET
void BitcoinGUI::enableHistoryAction(bool privacy)
{
- historyAction->setEnabled(!privacy);
- if (historyAction->isChecked()) gotoOverviewPage();
+ if (walletFrame->currentWalletModel()) {
+ historyAction->setEnabled(!privacy);
+ if (historyAction->isChecked()) gotoOverviewPage();
+ }
}
void BitcoinGUI::setWalletController(WalletController* wallet_controller, bool show_loading_minimized)
@@ -983,6 +989,7 @@ void BitcoinGUI::gotoLoadPSBT(bool from_clipboard)
void BitcoinGUI::updateNetworkState()
{
+ if (!clientModel) return;
int count = clientModel->getNumConnections();
QString icon;
switch(count)
diff --git a/src/qt/bitcoinstrings.cpp b/src/qt/bitcoinstrings.cpp
index f7ba618d21..6035647f1c 100644
--- a/src/qt/bitcoinstrings.cpp
+++ b/src/qt/bitcoinstrings.cpp
@@ -258,6 +258,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Disk space is too low!"),
QT_TRANSLATE_NOOP("bitcoin-core", "Do you want to rebuild the block database now?"),
QT_TRANSLATE_NOOP("bitcoin-core", "Done loading"),
QT_TRANSLATE_NOOP("bitcoin-core", "Dump file %s does not exist."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error committing db txn for wallet transactions removal"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error creating %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error initializing block database"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error initializing wallet database environment %s!"),
@@ -270,9 +271,10 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Error opening block database"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error reading configuration file: %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error reading from database, shutting down."),
QT_TRANSLATE_NOOP("bitcoin-core", "Error reading next record from wallet database"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error starting db txn for wallet transactions removal"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Cannot extract destination from the generated scriptpubkey"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Could not add watchonly tx %s to watchonly wallet"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Error: Could not delete watchonly transactions"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error: Could not delete watchonly transactions. "),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Couldn't create cursor into database"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Disk space is low for %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Dumpfile checksum does not match. Computed %s, expected %s"),
@@ -282,7 +284,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Error: Got value that was not hex: %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Keypool ran out, please call keypoolrefill first"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Missing checksum"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: No %s addresses available."),
-QT_TRANSLATE_NOOP("bitcoin-core", "Error: Not all watchonly txs could be deleted"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: This wallet already uses SQLite"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: This wallet is already a descriptor wallet"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to begin reading all records in the database"),
@@ -294,10 +295,13 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to remove watchonly address boo
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to write record to new wallet"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to write solvable wallet best block locator record"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to write watchonly wallet best block locator record"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error: address book copy failed for wallet %s"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error: database transaction cannot be executed for wallet %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Failed to listen on any port. Use -listen=0 if you want this."),
QT_TRANSLATE_NOOP("bitcoin-core", "Failed to rescan the wallet during initialization"),
QT_TRANSLATE_NOOP("bitcoin-core", "Failed to start indexes, shutting down.."),
QT_TRANSLATE_NOOP("bitcoin-core", "Failed to verify database"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Failure removing transaction: %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Fee rate (%s) is lower than the minimum fee rate setting (%s)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Ignoring duplicate -wallet %s."),
QT_TRANSLATE_NOOP("bitcoin-core", "Importing…"),
@@ -355,6 +359,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "The wallet will avoid paying less than the mi
QT_TRANSLATE_NOOP("bitcoin-core", "This is experimental software."),
QT_TRANSLATE_NOOP("bitcoin-core", "This is the minimum transaction fee you pay on every transaction."),
QT_TRANSLATE_NOOP("bitcoin-core", "This is the transaction fee you will pay if you send a transaction."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Transaction %s does not belong to this wallet"),
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction amount too small"),
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction amounts must not be negative"),
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction change output index out of range"),
diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp
index ff7405d139..05172cfbd2 100644
--- a/src/qt/clientmodel.cpp
+++ b/src/qt/clientmodel.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <qt/clientmodel.h>
#include <qt/bantablemodel.h>
@@ -66,7 +70,7 @@ ClientModel::ClientModel(interfaces::Node& node, OptionsModel *_optionsModel, QO
subscribeToCoreSignals();
}
-ClientModel::~ClientModel()
+void ClientModel::stop()
{
unsubscribeFromCoreSignals();
@@ -74,6 +78,11 @@ ClientModel::~ClientModel()
m_thread->wait();
}
+ClientModel::~ClientModel()
+{
+ stop();
+}
+
int ClientModel::getNumConnections(unsigned int flags) const
{
ConnectionDirection connections = ConnectionDirection::None;
@@ -234,47 +243,41 @@ void ClientModel::TipChanged(SynchronizationState sync_state, interfaces::BlockT
void ClientModel::subscribeToCoreSignals()
{
- m_handler_show_progress = m_node.handleShowProgress(
+ m_event_handlers.emplace_back(m_node.handleShowProgress(
[this](const std::string& title, int progress, [[maybe_unused]] bool resume_possible) {
Q_EMIT showProgress(QString::fromStdString(title), progress);
- });
- m_handler_notify_num_connections_changed = m_node.handleNotifyNumConnectionsChanged(
+ }));
+ m_event_handlers.emplace_back(m_node.handleNotifyNumConnectionsChanged(
[this](int new_num_connections) {
Q_EMIT numConnectionsChanged(new_num_connections);
- });
- m_handler_notify_network_active_changed = m_node.handleNotifyNetworkActiveChanged(
+ }));
+ m_event_handlers.emplace_back(m_node.handleNotifyNetworkActiveChanged(
[this](bool network_active) {
Q_EMIT networkActiveChanged(network_active);
- });
- m_handler_notify_alert_changed = m_node.handleNotifyAlertChanged(
+ }));
+ m_event_handlers.emplace_back(m_node.handleNotifyAlertChanged(
[this]() {
qDebug() << "ClientModel: NotifyAlertChanged";
Q_EMIT alertsChanged(getStatusBarWarnings());
- });
- m_handler_banned_list_changed = m_node.handleBannedListChanged(
+ }));
+ m_event_handlers.emplace_back(m_node.handleBannedListChanged(
[this]() {
qDebug() << "ClienModel: Requesting update for peer banlist";
QMetaObject::invokeMethod(banTableModel, [this] { banTableModel->refresh(); });
- });
- m_handler_notify_block_tip = m_node.handleNotifyBlockTip(
+ }));
+ m_event_handlers.emplace_back(m_node.handleNotifyBlockTip(
[this](SynchronizationState sync_state, interfaces::BlockTip tip, double verification_progress) {
TipChanged(sync_state, tip, verification_progress, SyncType::BLOCK_SYNC);
- });
- m_handler_notify_header_tip = m_node.handleNotifyHeaderTip(
+ }));
+ m_event_handlers.emplace_back(m_node.handleNotifyHeaderTip(
[this](SynchronizationState sync_state, interfaces::BlockTip tip, bool presync) {
TipChanged(sync_state, tip, /*verification_progress=*/0.0, presync ? SyncType::HEADER_PRESYNC : SyncType::HEADER_SYNC);
- });
+ }));
}
void ClientModel::unsubscribeFromCoreSignals()
{
- m_handler_show_progress->disconnect();
- m_handler_notify_num_connections_changed->disconnect();
- m_handler_notify_network_active_changed->disconnect();
- m_handler_notify_alert_changed->disconnect();
- m_handler_banned_list_changed->disconnect();
- m_handler_notify_block_tip->disconnect();
- m_handler_notify_header_tip->disconnect();
+ m_event_handlers.clear();
}
bool ClientModel::getProxyInfo(std::string& ip_port) const
diff --git a/src/qt/clientmodel.h b/src/qt/clientmodel.h
index 493e18a07d..624056b5df 100644
--- a/src/qt/clientmodel.h
+++ b/src/qt/clientmodel.h
@@ -58,6 +58,8 @@ public:
explicit ClientModel(interfaces::Node& node, OptionsModel *optionsModel, QObject *parent = nullptr);
~ClientModel();
+ void stop();
+
interfaces::Node& node() const { return m_node; }
OptionsModel *getOptionsModel();
PeerTableModel *getPeerTableModel();
@@ -95,13 +97,7 @@ public:
private:
interfaces::Node& m_node;
- std::unique_ptr<interfaces::Handler> m_handler_show_progress;
- std::unique_ptr<interfaces::Handler> m_handler_notify_num_connections_changed;
- std::unique_ptr<interfaces::Handler> m_handler_notify_network_active_changed;
- std::unique_ptr<interfaces::Handler> m_handler_notify_alert_changed;
- std::unique_ptr<interfaces::Handler> m_handler_banned_list_changed;
- std::unique_ptr<interfaces::Handler> m_handler_notify_block_tip;
- std::unique_ptr<interfaces::Handler> m_handler_notify_header_tip;
+ std::vector<std::unique_ptr<interfaces::Handler>> m_event_handlers;
OptionsModel *optionsModel;
PeerTableModel* peerTableModel{nullptr};
PeerTableSortProxy* m_peer_table_sort_proxy{nullptr};
diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp
index 9e49fd87fb..5e412bd6b1 100644
--- a/src/qt/coincontroldialog.cpp
+++ b/src/qt/coincontroldialog.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/coincontroldialog.h>
#include <qt/forms/ui_coincontroldialog.h>
diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp
index ebfd14cc25..084b9a6615 100644
--- a/src/qt/guiutil.cpp
+++ b/src/qt/guiutil.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <qt/guiutil.h>
#include <qt/bitcoinaddressvalidator.h>
diff --git a/src/qt/intro.cpp b/src/qt/intro.cpp
index f86b167076..5371dbaa30 100644
--- a/src/qt/intro.cpp
+++ b/src/qt/intro.cpp
@@ -142,8 +142,9 @@ Intro::Intro(QWidget *parent, int64_t blockchain_size_gb, int64_t chain_state_si
const int min_prune_target_GB = std::ceil(MIN_DISK_SPACE_FOR_BLOCK_FILES / 1e9);
ui->pruneGB->setRange(min_prune_target_GB, std::numeric_limits<int>::max());
- if (gArgs.GetIntArg("-prune", 0) > 1) { // -prune=1 means enabled, above that it's a size in MiB
- ui->prune->setChecked(true);
+ if (gArgs.IsArgSet("-prune")) {
+ m_prune_checkbox_is_default = false;
+ ui->prune->setChecked(gArgs.GetIntArg("-prune", 0) >= 1);
ui->prune->setEnabled(false);
}
ui->pruneGB->setValue(m_prune_target_gb);
@@ -152,6 +153,7 @@ Intro::Intro(QWidget *parent, int64_t blockchain_size_gb, int64_t chain_state_si
UpdatePruneLabels(ui->prune->isChecked());
connect(ui->prune, &QCheckBox::toggled, [this](bool prune_checked) {
+ m_prune_checkbox_is_default = false;
UpdatePruneLabels(prune_checked);
UpdateFreeSpaceLabel();
});
@@ -287,7 +289,7 @@ void Intro::setStatus(int status, const QString &message, quint64 bytesAvailable
ui->freeSpace->setText("");
} else {
m_bytes_available = bytesAvailable;
- if (ui->prune->isEnabled() && !(gArgs.IsArgSet("-prune") && gArgs.GetIntArg("-prune", 0) == 0)) {
+ if (ui->prune->isEnabled() && m_prune_checkbox_is_default) {
ui->prune->setChecked(m_bytes_available < (m_blockchain_size_gb + m_chain_state_size_gb + 10) * GB_BYTES);
}
UpdateFreeSpaceLabel();
diff --git a/src/qt/intro.h b/src/qt/intro.h
index 900c657b27..7b34c73b02 100644
--- a/src/qt/intro.h
+++ b/src/qt/intro.h
@@ -64,6 +64,7 @@ private Q_SLOTS:
private:
Ui::Intro *ui;
+ bool m_prune_checkbox_is_default{true};
QThread* thread{nullptr};
QMutex mutex;
bool signalled{false};
diff --git a/src/qt/locale/bitcoin_af.ts b/src/qt/locale/bitcoin_af.ts
index 9535b35bb8..cc4eefbe31 100644
--- a/src/qt/locale/bitcoin_af.ts
+++ b/src/qt/locale/bitcoin_af.ts
@@ -48,18 +48,6 @@ Hierdie is die adresse waar u Bitcoins sal ontvang. Ons beveel aan dat u 'n nuwe
</context>
<context>
<name>QObject</name>
- <message>
- <source>Onion</source>
- <comment>network name</comment>
- <extracomment>Name of Tor network in peer info</extracomment>
- <translation type="unfinished">Ui</translation>
- </message>
- <message>
- <source>CJDNS</source>
- <comment>network name</comment>
- <extracomment>Name of CJDNS network in peer info</extracomment>
- <translation type="unfinished">CJDNS </translation>
- </message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
@@ -203,14 +191,6 @@ Die migrasieproses sal 'n rugsteun van die beursie skep voordat dit migreer. Hie
<translation type="unfinished">Die beursie'%1' is suksesvol gemigreer.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Slegs kyk-skripte is na 'n nuwe beursie genaamd ' gemigreer%1.</translation>
- </message>
- <message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Oplosbare maar nie gekykte skrifte is na 'n nuwe beursie genaamd ' gemigreer %1'.</translation>
- </message>
- <message>
<source>Migration failed</source>
<translation type="unfinished">Migrasie het misluk</translation>
</message>
@@ -263,8 +243,8 @@ Die migrasieproses sal 'n rugsteun van die beursie skep voordat dit migreer. Hie
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n GB of space available</numerusform>
+ <numerusform>%n GB of space available</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -311,139 +291,9 @@ Die migrasieproses sal 'n rugsteun van die beursie skep voordat dit migreer. Hie
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
<translation type="unfinished">Volle pad na 'n%1 versoenbare skrip (bv. C:\Downloads\hwi.exe of /Users/you/Downloads/hwi.py). Pasop: wanware kan jou munte steel!</translation>
</message>
- <message>
- <source>Options set in this dialog are overridden by the command line:</source>
- <translation type="unfinished">Opsies wat in hierdie dialoog gestel word, word deur die opdragreël oorheers:</translation>
- </message>
- <message>
- <source>Current settings will be backed up at "%1".</source>
- <extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
- <translation type="unfinished">Huidige instellings sal gerugsteun word by "%1".</translation>
- </message>
- </context>
-<context>
- <name>OptionsModel</name>
- <message>
- <source>Could not read setting "%1", %2.</source>
- <translation type="unfinished">Kon nie instelling lees nie "%1", %2.</translation>
- </message>
-</context>
-<context>
- <name>PSBTOperationsDialog</name>
- <message>
- <source>PSBT Operations</source>
- <translation type="unfinished">PSBT-bedrywighede</translation>
- </message>
- </context>
-<context>
- <name>PeerTableModel</name>
- <message>
- <source>Age</source>
- <extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
- <translation type="unfinished">Ouderdom</translation>
- </message>
- </context>
-<context>
- <name>RPCConsole</name>
- <message>
- <source>The transport layer version: %1</source>
- <translation type="unfinished">Die vervoerlaag weergawe: %1</translation>
- </message>
- <message>
- <source>Transport</source>
- <translation type="unfinished">Vervoer</translation>
- </message>
- <message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Die BIP324-sessie-ID-string in heks, indien enige.</translation>
- </message>
- <message>
- <source>Session ID</source>
- <translation type="unfinished">Sessie ID</translation>
- </message>
- <message>
- <source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">Of ons transaksies aan hierdie eweknie oordra.</translation>
- </message>
- <message>
- <source>Transaction Relay</source>
- <translation type="unfinished">Transaksie-aflos</translation>
- </message>
- <message>
- <source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
- <extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">Die totale aantal adresse ontvang van hierdie eweknie wat verwerk is (sluit adresse uit wat weens tariefbeperking weggelaat is).</translation>
- </message>
- <message>
- <source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
- <extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">Die totale aantal adresse wat van hierdie eweknie ontvang is wat weggelaat is (nie verwerk nie) as gevolg van tariefbeperking.</translation>
- </message>
- <message>
- <source>detecting: peer could be v1 or v2</source>
- <extracomment>Explanatory text for "detecting" transport type.</extracomment>
- <translation type="unfinished">bespeur: eweknie kan v1 of v2 wees</translation>
- </message>
- <message>
- <source>v1: unencrypted, plaintext transport protocol</source>
- <extracomment>Explanatory text for v1 transport type.</extracomment>
- <translation type="unfinished">v1: ongeënkripteerde, gewone teks vervoer protokol</translation>
- </message>
- <message>
- <source>v2: BIP324 encrypted transport protocol</source>
- <extracomment>Explanatory text for v2 transport type.</extracomment>
- <translation type="unfinished">v2: BIP324 geënkripteerde vervoerprotokol</translation>
- </message>
- </context>
-<context>
- <name>ReceiveCoinsDialog</name>
- <message>
- <source>Base58 (Legacy)</source>
- <translation type="unfinished">Base58 (Nalatenskap)</translation>
- </message>
- <message>
- <source>Not recommended due to higher fees and less protection against typos.</source>
- <translation type="unfinished">Nie aanbeveel nie weens hoër fooie en minder beskerming teen tikfoute.</translation>
- </message>
- <message>
- <source>Generates an address compatible with older wallets.</source>
- <translation type="unfinished">Genereer 'n adres wat versoenbaar is met ouer beursies.</translation>
- </message>
- <message>
- <source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
- <translation type="unfinished">Genereer 'n inheemse segwit-adres (BIP-173). Sommige ou beursies ondersteun dit nie.</translation>
- </message>
- <message>
- <source>Bech32m (Taproot)</source>
- <translation type="unfinished">Bech32m (Penwortel)</translation>
- </message>
- <message>
- <source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
- <translation type="unfinished">Bech32m (BIP-350) is 'n opgradering na Bech32, beursie-ondersteuning is steeds beperk.</translation>
- </message>
</context>
<context>
<name>SendCoinsDialog</name>
- <message>
- <source>%1 kvB</source>
- <comment>PSBT transaction creation</comment>
- <extracomment>When reviewing a newly created PSBT (via Send flow), the transaction fee is shown, with "virtual size" of the transaction displayed for context</extracomment>
- <translation type="unfinished">%1kvB</translation>
- </message>
- <message>
- <source>Unsigned Transaction</source>
- <comment>PSBT copied</comment>
- <extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
- <translation type="unfinished">Ongetekende transaksie</translation>
- </message>
- <message>
- <source>The PSBT has been copied to the clipboard. You can also save it.</source>
- <translation type="unfinished">Die PSBT is na die knipbord gekopieer. Jy kan dit ook stoor.</translation>
- </message>
- <message>
- <source>PSBT saved to disk</source>
- <translation type="unfinished">PSBT gestoor op skyf</translation>
- </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -454,16 +304,6 @@ Die migrasieproses sal 'n rugsteun van die beursie skep voordat dit migreer. Hie
</context>
<context>
<name>TransactionDesc</name>
- <message>
- <source>0/unconfirmed, in memory pool</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
- <translation type="unfinished">0/onbevestig, in geheuepoel</translation>
- </message>
- <message>
- <source>0/unconfirmed, not in memory pool</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
- <translation type="unfinished">0/onbevestig, nie in geheuepoel nie</translation>
- </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -472,277 +312,4 @@ Die migrasieproses sal 'n rugsteun van die beursie skep voordat dit migreer. Hie
</translation>
</message>
</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Gekopieer na knipbord</translation>
- </message>
- </context>
-<context>
- <name>bitcoin-core</name>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s ailed om die -assumeutxo momentopname toestand te bekragtig. Dit dui op 'n hardeware probleem, of 'n fout in die sagteware, of 'n slegte sagteware wysiging wat toegelaat het dat 'n ongeldige momentopname gelaai word. As gevolg hiervan sal die nodus afskakel en ophou om enige toestand te gebruik wat op die momentopname gebou is, en die kettinghoogte vanaf%d aan %d. Met die volgende herbegin, sal die nodus hervat sinkronisering vanaf %d sonder om enige foto-data te gebruik. Rapporteer asseblief hierdie voorval by %s, insluitend hoe jy die momentopname gekry het. Die ongeldige momentopname-kettingtoestand sal op skyf gelaat word ingeval dit nuttig is om die probleem te diagnoseer wat hierdie fout veroorsaak het.</translation>
- </message>
- <message>
- <source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
- <translation type="unfinished">%s versoek om op port te luister %u. hierdie poort word as "sleg" beskou en dit is dus onwaarskynlik dat enige eweknie daaraan sal koppel. Sien doc/p2p-bad-ports.md vir besonderhede en 'n volledige lys.</translation>
- </message>
- <message>
- <source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
- <translation type="unfinished">Skyfspasie vir %s sal dalk nie die bloklêers akkommodeer nie. Ongeveer%u GB se data sal in hierdie gids gestoor word.</translation>
- </message>
- <message>
- <source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
- <translation type="unfinished">Kon nie beursie laai nie. Wallet vereis dat blokke afgelaai word, en sagteware ondersteun tans nie die laai van beursies terwyl blokke buite werking afgelaai word wanneer assumeutxo-kiekies gebruik word nie. Wallet behoort suksesvol te kan laai nadat nodussinkronisering hoogte bereik het %s</translation>
- </message>
- <message>
- <source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
- <translation type="unfinished">Fout: Kan nie beskrywings vir hierdie verouderde beursie produseer nie. Maak seker dat jy die beursie se wagwoordfrase verskaf as dit geïnkripteer is.</translation>
- </message>
- <message>
- <source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
- <translation type="unfinished">Snoeimodus is onversoenbaar met -reindex-chainstate. Gebruik eerder volledige -herindeks.</translation>
- </message>
- <message>
- <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
- <translation type="unfinished">Hernoem van '%s' -&gt; '%s' misluk. Jy behoort dit op te los deur die ongeldige momentopnamegids handmatig te skuif of uit te vee%s, anders sal jy weer dieselfde fout teëkom by die volgende opstart.</translation>
- </message>
- <message>
- <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
- <translation type="unfinished">Ongesteunde kategorie-spesifieke aantekenvlak %1$s=%2$s. verwag%1$s=&lt;category&gt;:&lt;loglevel&gt;.Geldige kategorieë: %3 $s.  Geldige loglevels: %4$s.</translation>
- </message>
- <message>
- <source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
- <translation type="unfinished">Ongesteunde chainstate-databasisformaat gevind. Herbegin asseblief met -reindex-chainstate. Dit sal die chainstate-databasis herbou.</translation>
- </message>
- <message>
- <source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
- <translation type="unfinished">Wallet is suksesvol geskep. Die tipe ou beursie word opgeskort en ondersteuning vir die skep en oopmaak van ou beursies sal in die toekoms verwyder word.</translation>
- </message>
- <message>
- <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
- <translation type="unfinished">Wallet is suksesvol gelaai. Die tipe ou beursie word opgeskort en ondersteuning vir die skep en oopmaak van ou beursies sal in die toekoms verwyder word. Ouderwetse beursies kan na 'n beskrywer-beursie met migratewallet gemigreer word.</translation>
- </message>
- <message>
- <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
- <translation type="unfinished">%s is baie hoog gestel! So groot fooie kan op 'n enkele transaksie betaal word.</translation>
- </message>
- <message>
- <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
- <translation type="unfinished">Kon nie lees nie %s! Alle sleutels lees korrek, maar transaksiedata of adresmetadata kan ontbreek of verkeerd wees.</translation>
- </message>
- <message>
- <source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Fout: adresboekdata in beursie kan nie geïdentifiseer word om aan gemigreerde beursies te behoort nie</translation>
- </message>
- <message>
- <source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
- <translation type="unfinished">Fout: Duplikaatbeskrywings wat tydens migrasie geskep is. Jou beursie is dalk korrup.</translation>
- </message>
- <message>
- <source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Fout: Transaksie %s in beursie kan nie geïdentifiseer word om aan gemigreerde beursies te behoort nie</translation>
- </message>
- <message>
- <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
- <translation type="unfinished">Kon nie stampfooie bereken nie, want onbevestigde UTXO's is afhanklik van 'n enorme groep onbevestigde transaksies.</translation>
- </message>
- <message>
- <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
- <translation type="unfinished">Fooiberaming het misluk. Terugvalfooi is gedeaktiveer. Wag 'n paar blokke of aktiveer %s.</translation>
- </message>
- <message>
- <source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
- <translation type="unfinished">Onversoenbare opsies: -dnsseed=1 is uitdruklik gespesifiseer, maar -onlynet verbied verbindings met IPv4/IPv6</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
- <translation type="unfinished">Ongeldige bedrag vir %s=&lt;amount&gt;: '%s' (moet ten minste die minaflosfooi van%s om vasgekeerde transaksies te voorkom)</translation>
- </message>
- <message>
- <source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
- <translation type="unfinished">Uitgaande verbindings beperk tot CJDNS (-onlynet=cjdns) maar -cjdnsreachable word nie verskaf nie</translation>
- </message>
- <message>
- <source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is explicitly forbidden: -onion=0</source>
- <translation type="unfinished">Uitgaande verbindings beperk tot Tor (-onlynet=ui), maar die proxy om die Tor-netwerk te bereik is uitdruklik verbode: -onion=0</translation>
- </message>
- <message>
- <source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is not provided: none of -proxy, -onion or -listenonion is given</source>
- <translation type="unfinished">Uitgaande verbindings beperk tot Tor (-onlynet=ui), maar die proxy om die Tor-netwerk te bereik word nie verskaf nie: geen van -proxy, -onion of -listenonion word gegee nie</translation>
- </message>
- <message>
- <source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
- <translation type="unfinished">Uitgaande verbindings beperk tot i2p (-onlynet=i2p), maar -i2psam word nie verskaf nie</translation>
- </message>
- <message>
- <source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
- <translation type="unfinished">Die invoergrootte oorskry die maksimum gewig. Probeer asseblief om 'n kleiner bedrag te stuur of handmatig jou beursie se UTXO's te konsolideer</translation>
- </message>
- <message>
- <source>The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
- <translation type="unfinished">Die voorafgeselekteerde munte totale bedrag dek nie die transaksiedoelwit nie. Laat asseblief toe dat ander insette outomaties gekies word of sluit meer munte handmatig in</translation>
- </message>
- <message>
- <source>Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
- <translation type="unfinished">Transaksie vereis een bestemming van nie-0 waarde, 'n nie-0 fooi, of 'n vooraf geselekteerde invoer</translation>
- </message>
- <message>
- <source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
- <translation type="unfinished">UTXO-kiekie kon nie bekragtig nie. Herbegin om normale aanvanklike blokaflaai te hervat, of probeer om 'n ander momentopname te laai.</translation>
- </message>
- <message>
- <source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">Onbevestigde UTXO's is beskikbaar, maar die besteding daarvan skep 'n ketting van transaksies wat deur die mempool verwerp sal word</translation>
- </message>
- <message>
- <source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
-
-The wallet might have been tampered with or created with malicious intent.
-</source>
- <translation type="unfinished">Onverwagte erfenisinskrywing in beskrywerbeursie gevind. Laai beursie %s
-
-Daar is dalk met die beursie gepeuter of met kwaadwillige opset geskep.
-</translation>
- </message>
- <message>
- <source>Unrecognized descriptor found. Loading wallet %s
-
-The wallet might had been created on a newer version.
-Please try running the latest software version.
-</source>
- <translation type="unfinished">Onherkende beskrywing gevind. Laai beursie %s
-
-Die beursie is moontlik op 'n nuwer weergawe geskep.
-Probeer asseblief om die nuutste sagteware weergawe te laat loop.
-</translation>
- </message>
- <message>
- <source>
-Unable to cleanup failed migration</source>
- <translation type="unfinished">
-Kon nie skoonmaak nie, mislukte migrasie</translation>
- </message>
- <message>
- <source>
-Unable to restore backup of wallet.</source>
- <translation type="unfinished">
-Kan nie rugsteun van beursie herstel nie.</translation>
- </message>
- <message>
- <source>Block verification was interrupted</source>
- <translation type="unfinished">Blokverifikasie is onderbreek</translation>
- </message>
- <message>
- <source>Error reading configuration file: %s</source>
- <translation type="unfinished">Kon nie konfigurasielêer lees nie: %s</translation>
- </message>
- <message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Fout: Kan nie bestemming uit die gegenereerde scriptpubkey onttrek nie</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Fout: kon nie watchonly tx by watchonly wallet voeg nie</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Fout: Kon nie net kyktransaksies uitvee nie</translation>
- </message>
- <message>
- <source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Fout: Kon nie nuwe kyk-alleen-beursie skep nie</translation>
- </message>
- <message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Fout: Nie alle watchonly txs kon uitgevee word nie</translation>
- </message>
- <message>
- <source>Error: This wallet already uses SQLite</source>
- <translation type="unfinished">Fout: Hierdie beursie gebruik reeds SQLite</translation>
- </message>
- <message>
- <source>Error: This wallet is already a descriptor wallet</source>
- <translation type="unfinished">Fout: Hierdie beursie is reeds 'n beskrywer-beursie</translation>
- </message>
- <message>
- <source>Error: Unable to begin reading all records in the database</source>
- <translation type="unfinished">Fout: Kan nie alle rekords in die databasis lees nie</translation>
- </message>
- <message>
- <source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">Fout: Kan nie 'n rugsteun van jou beursie maak nie</translation>
- </message>
- <message>
- <source>Error: Unable to read all records in the database</source>
- <translation type="unfinished">Fout: Kan nie alle rekords in die databasis lees nie</translation>
- </message>
- <message>
- <source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">Fout: Kan nie net kykadresboekdata verwyder nie</translation>
- </message>
- <message>
- <source>Failed to start indexes, shutting down..</source>
- <translation type="unfinished">Kon nie indekse begin nie, sluit af..</translation>
- </message>
- <message>
- <source>Insufficient dbcache for block verification</source>
- <translation type="unfinished">Onvoldoende dbcache vir blokverifikasie</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
- <translation type="unfinished">Ongeldige bedrag vir %s=&lt;amount&gt;: '%s' (moet ten minste wees%s)</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">Ongeldige bedrag vir %s=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid port specified in %s: '%s'</source>
- <translation type="unfinished">Ongeldige poort gespesifiseer in %s: '%s'</translation>
- </message>
- <message>
- <source>Invalid pre-selected input %s</source>
- <translation type="unfinished">Ongeldige vooraf geselekteerde invoer %s</translation>
- </message>
- <message>
- <source>Listening for incoming connections failed (listen returned error %s)</source>
- <translation type="unfinished">Kon nie luister na inkomende verbindings nie (luister het fout teruggegee %s)</translation>
- </message>
- <message>
- <source>Not found pre-selected input %s</source>
- <translation type="unfinished">Nie voorafgeselekteerde invoer gevind nie %s</translation>
- </message>
- <message>
- <source>Not solvable pre-selected input %s</source>
- <translation type="unfinished">Nie oplosbare vooraf geselekteerde insette nie %s</translation>
- </message>
- <message>
- <source>Specified data directory "%s" does not exist.</source>
- <translation type="unfinished">Gespesifiseerde datagids "%s" bestaan ​​nie.</translation>
- </message>
- <message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Kan nie geheue vir -maxsigcachesize toewys nie: '%s'MiB</translation>
- </message>
- <message>
- <source>Unable to find UTXO for external input</source>
- <translation type="unfinished">Kan nie UTXO vir eksterne invoer vind nie</translation>
- </message>
- <message>
- <source>Unable to unload the wallet before migrating</source>
- <translation type="unfinished">Kan nie die beursie aflaai voor migreer nie</translation>
- </message>
- <message>
- <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
- <translation type="unfinished">Ongesteunde globale logvlak %s=%s. Geldige waardes: %s.</translation>
- </message>
- <message>
- <source>acceptstalefeeestimates is not supported on %s chain.</source>
- <translation type="unfinished">acceptstalefeeestimates is not supported on %s ketting.</translation>
- </message>
- </context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_am.ts b/src/qt/locale/bitcoin_am.ts
index b26a837a30..502acb9879 100644
--- a/src/qt/locale/bitcoin_am.ts
+++ b/src/qt/locale/bitcoin_am.ts
@@ -15,19 +15,19 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">አሁን የተመረጠውን አድራሻ ወደ ስርዓቱ ቅንጥብ ሰሌዳ ቅዳ</translation>
+ <translation type="unfinished">አሁን የተመረጠውን አድራሻ ወደ ስርዓቱ ቅንጥብ ሰሌዳ ይቅዱ</translation>
</message>
<message>
<source>&amp;Copy</source>
- <translation type="unfinished">&amp;ቅዳ</translation>
+ <translation type="unfinished">&amp;ይቅዱ</translation>
</message>
<message>
<source>C&amp;lose</source>
- <translation type="unfinished">ዝጋ</translation>
+ <translation type="unfinished">ይዝጉ</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">አሁን የተመረጠውን አድራሻ ከዝርዝሩ ውስጥ አጥፋ</translation>
+ <translation type="unfinished">አሁን የተመረጠውን አድራሻ ከዝርዝሩ ውስጥ ያጥፉ</translation>
</message>
<message>
<source>Enter address or label to search</source>
@@ -35,15 +35,15 @@
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">በዚህ ማውጫ ውስጥ ያለውን ውሂብ ወደ አንድ ፋይል ቀይረህ አስቀምጥ</translation>
+ <translation type="unfinished">በዚህ ማውጫ ውስጥ ያለውን ውሂብ ወደ ፋይል አዛውረው ያስቀምጡ</translation>
</message>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;ላክ</translation>
+ <translation type="unfinished">&amp;ይላኩ</translation>
</message>
<message>
<source>&amp;Delete</source>
- <translation type="unfinished">&amp;ሰርዝ</translation>
+ <translation type="unfinished">&amp;ይሰርዙ</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
@@ -756,11 +756,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;ላክ</translation>
+ <translation type="unfinished">&amp;ይላኩ</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">በዚህ ማውጫ ውስጥ ያለውን ውሂብ ወደ አንድ ፋይል ቀይረህ አስቀምጥ</translation>
+ <translation type="unfinished">በዚህ ማውጫ ውስጥ ያለውን ውሂብ ወደ ፋይል አዛውረው ያስቀምጡ</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_ar.ts b/src/qt/locale/bitcoin_ar.ts
new file mode 100644
index 0000000000..e58c221a86
--- /dev/null
+++ b/src/qt/locale/bitcoin_ar.ts
@@ -0,0 +1,4383 @@
+<TS version="2.1" language="ar">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished">انقر بالزر الايمن لتعديل العنوان</translation>
+ </message>
+ <message>
+ <source>Create a new address</source>
+ <translation type="unfinished">أنشئ عنوان جديد</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;جديد</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation type="unfinished">‫انسخ العنوان المحدد للحافظة‬</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="unfinished">&amp;نسخ</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation type="unfinished">ا&amp;غلاق</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation type="unfinished">احذف العنوان المحدد من القائمة</translation>
+ </message>
+ <message>
+ <source>Enter address or label to search</source>
+ <translation type="unfinished">أدخل عنوانا أو مذكرة للبحث</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">صدّر البيانات في التبويب الحالي الى ملف</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;تصدير</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;حذف</translation>
+ </message>
+ <message>
+ <source>Choose the address to send coins to</source>
+ <translation type="unfinished">اختر العنوان الذي ترغب بارسال بتكوين اليه</translation>
+ </message>
+ <message>
+ <source>Choose the address to receive coins with</source>
+ <translation type="unfinished">اختر العنوان الذي ترغب باستلام بتكوين اليه</translation>
+ </message>
+ <message>
+ <source>C&amp;hoose</source>
+ <translation type="unfinished">ا&amp;ختر</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
+ <translation type="unfinished">‫هذه عناوين البتكوين الخاصة بك لإرسال المدفوعات. تأكد دائما من القيم المدخلة ومن العنوان المستلم قبل الارسال.‬</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
+Signing is only possible with addresses of the type 'legacy'.</source>
+ <translation type="unfinished">هذه عناوين البتكوين الخاصة بك لاستلام المدفوعات. قم بالنقر على زر انشاء عنوان استلام جديد لإنشاء عناوين جديدة.
+التوقيع ممكن باستخدام العناوين القديمة "Legacy" فقط.</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Address</source>
+ <translation type="unfinished">&amp;نسخ العنوان</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Label</source>
+ <translation type="unfinished">نسخ &amp;المذكرة</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished">&amp;تحرير</translation>
+ </message>
+ <message>
+ <source>Export Address List</source>
+ <translation type="unfinished">تصدير قائمة العناوين</translation>
+ </message>
+ <message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">ملف القيم المفصولة بفاصلة</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the address list to %1. Please try again.</source>
+ <extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
+ <translation type="unfinished">حدث خطأ أثناء محاولة حفظ قائمة العناوين في %1. يرجى معاودة المحاولة. </translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">فشل التصدير</translation>
+ </message>
+</context>
+<context>
+ <name>AddressTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">المذكرة</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">العنوان</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">( لا وجود لمذكرة)</translation>
+ </message>
+</context>
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>Passphrase Dialog</source>
+ <translation type="unfinished">‫حوار عبارة المرور‬</translation>
+ </message>
+ <message>
+ <source>Enter passphrase</source>
+ <translation type="unfinished">‫ادخل عبارة المرور‬</translation>
+ </message>
+ <message>
+ <source>New passphrase</source>
+ <translation type="unfinished">‫أنشئ عبارة مرور‬</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation type="unfinished">‫أعد عبارة المرور‬</translation>
+ </message>
+ <message>
+ <source>Show passphrase</source>
+ <translation type="unfinished">‫عرض عبارة المرور‬</translation>
+ </message>
+ <message>
+ <source>Encrypt wallet</source>
+ <translation type="unfinished">تشفير المحفظة</translation>
+ </message>
+ <message>
+ <source>This operation needs your wallet passphrase to unlock the wallet.</source>
+ <translation type="unfinished">‫هذه العملية تتطلب عبارة المرور لفك تشفير المحفظة.‬</translation>
+ </message>
+ <message>
+ <source>Unlock wallet</source>
+ <translation type="unfinished">فتح قفل المحفظة</translation>
+ </message>
+ <message>
+ <source>Change passphrase</source>
+ <translation type="unfinished">‫تغيير عبارة المرور‬</translation>
+ </message>
+ <message>
+ <source>Confirm wallet encryption</source>
+ <translation type="unfinished">تأكيد تشفير المحفظة</translation>
+ </message>
+ <message>
+ <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
+ <translation type="unfinished">تحذير: إذا قمت بتشفير المحفظة وأضعت الكلمة السرية؛ &lt;b&gt;ستفقد كل البتكوين&lt;/b&gt;!</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to encrypt your wallet?</source>
+ <translation type="unfinished">هل أنت متأكد من رغبتك في تشفير المحفظة؟</translation>
+ </message>
+ <message>
+ <source>Wallet encrypted</source>
+ <translation type="unfinished">المحفظة مشفرة</translation>
+ </message>
+ <message>
+ <source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
+ <translation type="unfinished">أدخل عبارة المرور للمحفظة. &lt;br/&gt;الرجاء استخدام عبارة مرور تتكون من &lt;b&gt;عشر خانات عشوائية أو أكثر&lt;/b&gt;، أو &lt;b&gt;ثمان كلمات أو أكثر&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>Enter the old passphrase and new passphrase for the wallet.</source>
+ <translation type="unfinished">أدخل ‫عبارة المرور‬ السابقة و‫عبارة المرور‬ الجديدة للمحفظة</translation>
+ </message>
+ <message>
+ <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation type="unfinished">تذكر أن تشفير محفظتك قد لا يحميك بشكل كامل من البرمجيات الخبيثة التي تصيب جهازك.</translation>
+ </message>
+ <message>
+ <source>Wallet to be encrypted</source>
+ <translation type="unfinished">‫المحفظة سيتم تشفيرها‬</translation>
+ </message>
+ <message>
+ <source>Your wallet is about to be encrypted. </source>
+ <translation type="unfinished">سوف تشفر محفظتك.</translation>
+ </message>
+ <message>
+ <source>Your wallet is now encrypted. </source>
+ <translation type="unfinished">محفظتك الان مشفرة.</translation>
+ </message>
+ <message>
+ <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
+ <translation type="unfinished">مهم!!!: يجب استبدال أي نسخة احتياطية سابقة بملف المحفظة المشفر الجديد. لأسباب أمنية، لن تستطيع استخدام النسخ الاحتياطية السابقة الغير مشفرة عندما تبدأ في استخدام المحفظة المشفرة الجديدة.</translation>
+ </message>
+ <message>
+ <source>Wallet encryption failed</source>
+ <translation type="unfinished">فشل تشفير المحفظة</translation>
+ </message>
+ <message>
+ <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
+ <translation type="unfinished">فشل تشفير المحفظة بسبب خطأ داخلي. لم يتم تشفير محفظتك.</translation>
+ </message>
+ <message>
+ <source>The supplied passphrases do not match.</source>
+ <translation type="unfinished">عبارتي مرور غير متطابقتين.</translation>
+ </message>
+ <message>
+ <source>Wallet unlock failed</source>
+ <translation type="unfinished">فشل فتح المحفظة</translation>
+ </message>
+ <message>
+ <source>The passphrase entered for the wallet decryption was incorrect.</source>
+ <translation type="unfinished">‫عبارة المرور التي تم إدخالها لفك تشفير المحفظة غير صحيحة.‬</translation>
+ </message>
+ <message>
+ <source>Wallet passphrase was successfully changed.</source>
+ <translation type="unfinished">‫لقد تم تغيير عبارة المرور بنجاح.‬</translation>
+ </message>
+ <message>
+ <source>Warning: The Caps Lock key is on!</source>
+ <translation type="unfinished">‫تحذير: مفتاح الحروف الكبيرة مفعل!‬</translation>
+ </message>
+</context>
+<context>
+ <name>BanTableModel</name>
+ <message>
+ <source>IP/Netmask</source>
+ <translation type="unfinished">‫بروتوكول الانترنت/قناع الشبكة‬</translation>
+ </message>
+ <message>
+ <source>Banned Until</source>
+ <translation type="unfinished">محظور حتى</translation>
+ </message>
+</context>
+<context>
+ <name>BitcoinApplication</name>
+ <message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">ملف الاعدادات %1 قد يكون تالف او غير صالح</translation>
+ </message>
+ <message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">‫‫Runaway exception‬</translation>
+ </message>
+ <message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">حدث خطأ فادح. لم يعد بإمكان %1 المتابعة بأمان وسيتم الإنهاء.</translation>
+ </message>
+ <message>
+ <source>Internal error</source>
+ <translation type="unfinished">خطأ داخلي</translation>
+ </message>
+ <message>
+ <source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
+ <translation type="unfinished">حدث خطأ داخلي. سيحاول %1 المتابعة بأمان. هذا خطأ غير متوقع يمكن الإبلاغ عنه كما هو موضح أدناه.</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>Do you want to reset settings to default values, or to abort without making changes?</source>
+ <extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
+ <translation type="unfinished">‫هل تريد اعادة ضبط الاعدادات للقيم الافتراضية؟ أو الالغاء دون اجراء تغييرات؟‬</translation>
+ </message>
+ <message>
+ <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
+ <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
+ <translation type="unfinished">‫حدث خطأ فادح. تأكد أن أذونات ملف الاعدادات تسمح بالكتابة، جرب الاستمرار بتفعيل خيار -دون اعدادات.‬</translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">خطأ: %1</translation>
+ </message>
+ <message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">‫%1 لم يغلق بامان بعد…‬</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished">غير معروف</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">‫القيمة‬</translation>
+ </message>
+ <message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">ادخل عنوان محفطة البتكوين (مثال %1)</translation>
+ </message>
+ <message>
+ <source>Unroutable</source>
+ <translation type="unfinished">‫غير قابل للتوجيه‬</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
+ <translation type="unfinished">‫وارد‬</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">‫صادر‬</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">‫موصل كامل‬</translation>
+ </message>
+ <message>
+ <source>Block Relay</source>
+ <extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
+ <translation type="unfinished">‫موصل طابق‬</translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <extracomment>Peer connection type established manually through one of several methods.</extracomment>
+ <translation type="unfinished">يدوي</translation>
+ </message>
+ <message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">‫تفقدي‬</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">‫جلب العنوان‬</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation type="unfinished">%1 يوم</translation>
+ </message>
+ <message>
+ <source>%1 h</source>
+ <translation type="unfinished">%1 ساعة</translation>
+ </message>
+ <message>
+ <source>%1 m</source>
+ <translation type="unfinished">%1 دقيقة</translation>
+ </message>
+ <message>
+ <source>%1 s</source>
+ <translation type="unfinished">%1 ثانية</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">لا شيء</translation>
+ </message>
+ <message>
+ <source>N/A</source>
+ <translation type="unfinished">غير معروف</translation>
+ </message>
+ <message>
+ <source>%1 ms</source>
+ <translation type="unfinished">%1 جزء من الثانية</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n second(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n second(s)</numerusform>
+ <numerusform>%n second(s)</numerusform>
+ <numerusform>%n second(s)</numerusform>
+ <numerusform>%n second(s)</numerusform>
+ <numerusform>%n second(s)</numerusform>
+ <numerusform>%n‫‫ ثواني‬</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n minute(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n minute(s)</numerusform>
+ <numerusform>%n minute(s)</numerusform>
+ <numerusform>%n minute(s)</numerusform>
+ <numerusform>%n minute(s)</numerusform>
+ <numerusform>%n minute(s)</numerusform>
+ <numerusform>%n ‫دقائق‬</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n hour(s)</numerusform>
+ <numerusform>%n hour(s)</numerusform>
+ <numerusform>%n hour(s)</numerusform>
+ <numerusform>%n hour(s)</numerusform>
+ <numerusform>%n hour(s)</numerusform>
+ <numerusform>%n‫ساعات‬</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n day(s)</numerusform>
+ <numerusform>%n day(s)</numerusform>
+ <numerusform>%n day(s)</numerusform>
+ <numerusform>%n day(s)</numerusform>
+ <numerusform>%n day(s)</numerusform>
+ <numerusform>%n ‫أيام‬</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n week(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n ‫أسابيع‬</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>%1 and %2</source>
+ <translation type="unfinished">%1 و %2</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n ‫سنوات‬</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>%1 B</source>
+ <translation type="unfinished">%1 بايت</translation>
+ </message>
+ <message>
+ <source>%1 kB</source>
+ <translation type="unfinished">%1 كيلو بايت</translation>
+ </message>
+ <message>
+ <source>%1 MB</source>
+ <translation type="unfinished">%1 ‫ميجابايت‬</translation>
+ </message>
+ <message>
+ <source>%1 GB</source>
+ <translation type="unfinished">%1 ‫جيجابايت‬</translation>
+ </message>
+</context>
+<context>
+ <name>BitcoinGUI</name>
+ <message>
+ <source>&amp;Overview</source>
+ <translation type="unfinished">&amp;نظرة عامة</translation>
+ </message>
+ <message>
+ <source>Show general overview of wallet</source>
+ <translation type="unfinished">إظهار نظرة عامة على المحفظة</translation>
+ </message>
+ <message>
+ <source>&amp;Transactions</source>
+ <translation type="unfinished">&amp;المعاملات</translation>
+ </message>
+ <message>
+ <source>Browse transaction history</source>
+ <translation type="unfinished">تصفح تاريخ العمليات</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="unfinished">خروج</translation>
+ </message>
+ <message>
+ <source>Quit application</source>
+ <translation type="unfinished">إغلاق التطبيق</translation>
+ </message>
+ <message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">حوالي %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">أظهر المعلومات حولة %1</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation type="unfinished">عن &amp;Qt</translation>
+ </message>
+ <message>
+ <source>Show information about Qt</source>
+ <translation type="unfinished">اظهر المعلومات</translation>
+ </message>
+ <message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">تغيير خيارات الإعداد لأساس ل%1</translation>
+ </message>
+ <message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">إنشاء محفظة جديدة</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">المحفظة:</translation>
+ </message>
+ <message>
+ <source>Network activity disabled.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">تم إلغاء تفعيل الشبكه</translation>
+ </message>
+ <message>
+ <source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
+ <translation type="unfinished">%1 اتصال نشط بشبكة البيتكوين</translation>
+ </message>
+ <message>
+ <source>Send coins to a Bitcoin address</source>
+ <translation type="unfinished">ارسل عملات الى عنوان بيتكوين</translation>
+ </message>
+ <message>
+ <source>Backup wallet to another location</source>
+ <translation type="unfinished">احفظ نسخة احتياطية للمحفظة في مكان آخر</translation>
+ </message>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">تغيير كلمة المرور المستخدمة لتشفير المحفظة</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation type="unfinished">&amp;ارسل</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation type="unfinished">&amp;استقبل</translation>
+ </message>
+ <message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">&amp; خيارات</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">&amp; تشفير المحفظة</translation>
+ </message>
+ <message>
+ <source>Encrypt the private keys that belong to your wallet</source>
+ <translation type="unfinished">تشفير المفتاح الخاص بمحفظتك</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp; محفظة احتياطية</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">وتغيير العبارات...</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">علامة ورسالة...</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation type="unfinished">وقَع الرسائل بواسطة ال: Bitcoin الخاص بك لإثبات امتلاكك لهم</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">&amp; تحقق من الرسالة</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation type="unfinished">تحقق من الرسائل للتأكد من أنَها وُقعت برسائل Bitcoin محدَدة</translation>
+ </message>
+ <message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">وتحميل PSBT من ملف...</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">فتح ورابط...</translation>
+ </message>
+ <message>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">اغلاق المحفظة</translation>
+ </message>
+ <message>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">انشاء المحفظة</translation>
+ </message>
+ <message>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">اغلاق جميع المحافظ</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;ملف</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation type="unfinished">&amp;الاعدادات</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished">&amp;مساعدة</translation>
+ </message>
+ <message>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">شريط أدوات علامات التبويب</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">مزامنة مع الشبكة ...</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">كتل الفهرسة على القرص ...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">كتل المعالجة على القرص ...</translation>
+ </message>
+ <message>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">‫الاتصال بالأقران…‬</translation>
+ </message>
+ <message>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation type="unfinished">‫أطلب مدفوعات (أنشئ رموز استجابة (QR Codes) وعناوين بتكوين)‬</translation>
+ </message>
+ <message>
+ <source>Show the list of used sending addresses and labels</source>
+ <translation type="unfinished">‫عرض قائمة العناوين المرسِلة والمذكرات (المستخدمة سابقا)‬</translation>
+ </message>
+ <message>
+ <source>Show the list of used receiving addresses and labels</source>
+ <translation type="unfinished">‫عرض قائمة العناوين المستلمة والمذكرات (المستخدمة سابقا)‬</translation>
+ </message>
+ <message>
+ <source>&amp;Command-line options</source>
+ <translation type="unfinished">&amp;خيارات سطر الأوامر</translation>
+ </message>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation type="unfinished">
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
+ <numerusform>‫تمت معالجة %n طوابق من العمليات التاريخية.‬</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>%1 behind</source>
+ <translation type="unfinished">خلف %1</translation>
+ </message>
+ <message>
+ <source>Catching up…</source>
+ <translation type="unfinished">‫يجري التدارك…‬</translation>
+ </message>
+ <message>
+ <source>Last received block was generated %1 ago.</source>
+ <translation type="unfinished">تم توليد الكتلة المستقبلة الأخيرة منذ %1.</translation>
+ </message>
+ <message>
+ <source>Transactions after this will not yet be visible.</source>
+ <translation type="unfinished">المعاملات بعد ذلك لن تكون مريئة بعد.</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">خطأ</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation type="unfinished">تحذير</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation type="unfinished">المعلومات</translation>
+ </message>
+ <message>
+ <source>Up to date</source>
+ <translation type="unfinished">محدث</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction</source>
+ <translation type="unfinished">تحميل معاملة بتكوين الموقعة جزئيًا</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
+ <translation type="unfinished">تحميل معاملة بتكوين الموقعة جزئيًا من الحافظة</translation>
+ </message>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">نافذة Node </translation>
+ </message>
+ <message>
+ <source>Open node debugging and diagnostic console</source>
+ <translation type="unfinished">افتح وحدة التحكم في تصحيح أخطاء node والتشخيص</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses</source>
+ <translation type="unfinished">&amp;عناوين الإرسال</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses</source>
+ <translation type="unfinished">&amp;عناوين الإستقبال</translation>
+ </message>
+ <message>
+ <source>Open a bitcoin: URI</source>
+ <translation type="unfinished">افتح عملة بيتكوين: URI</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <translation type="unfinished">افتح المحفظة</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">افتح المحفظة</translation>
+ </message>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">اغلق المحفظة</translation>
+ </message>
+ <message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">‫استعادة محفظة…‬</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">‫استعادة محفظة من ملف النسخ الاحتياطي‬</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">إغلاق جميع المحافظ ...</translation>
+ </message>
+ <message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation type="unfinished">‫اعرض %1 رسالة المساعدة للحصول على قائمة من خيارات سطر أوامر البتكوين المحتملة‬</translation>
+ </message>
+ <message>
+ <source>&amp;Mask values</source>
+ <translation type="unfinished">&amp;إخفاء القيم</translation>
+ </message>
+ <message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">‫إخفاء القيم في علامة التبويب: نظرة عامة‬</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">‫محفظة افتراضية‬</translation>
+ </message>
+ <message>
+ <source>No wallets available</source>
+ <translation type="unfinished">‫لا يوجد محفظة متاحة‬</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">بيانات المحفظة</translation>
+ </message>
+ <message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">‫تحميل النسخة الاحتياطية لمحفظة‬</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">استعادة المحفظة</translation>
+ </message>
+ <message>
+ <source>Wallet Name</source>
+ <extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
+ <translation type="unfinished">إسم المحفظة</translation>
+ </message>
+ <message>
+ <source>&amp;Window</source>
+ <translation type="unfinished">‫&amp;نافذة‬</translation>
+ </message>
+ <message>
+ <source>Zoom</source>
+ <translation type="unfinished">تكبير</translation>
+ </message>
+ <message>
+ <source>Main Window</source>
+ <translation type="unfinished">النافذة الرئيسية</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation type="unfinished">‫العميل %1</translation>
+ </message>
+ <message>
+ <source>&amp;Hide</source>
+ <translation type="unfinished">‫&amp;اخفاء‬</translation>
+ </message>
+ <message>
+ <source>S&amp;how</source>
+ <translation type="unfinished">‫ع&amp;رض‬</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n active connection(s) to Bitcoin network.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n اتصال نشط بشبكة البتكوين.</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>Click for more actions.</source>
+ <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
+ <translation type="unfinished">انقر لمزيد من الإجراءات.</translation>
+ </message>
+ <message>
+ <source>Show Peers tab</source>
+ <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
+ <translation type="unfinished">‫إظهار تبويب الأقران‬</translation>
+ </message>
+ <message>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">تعطيل نشاط الشبكة</translation>
+ </message>
+ <message>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">تمكين نشاط الشبكة</translation>
+ </message>
+ <message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">ما قبل مزامنة الرؤوس (%1%)…</translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">خطأ: %1</translation>
+ </message>
+ <message>
+ <source>Warning: %1</source>
+ <translation type="unfinished">تحذير: %1</translation>
+ </message>
+ <message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">التاريخ %1
+</translation>
+ </message>
+ <message>
+ <source>Amount: %1
+</source>
+ <translation type="unfinished">القيمة %1
+</translation>
+ </message>
+ <message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">المحفظة: %1
+</translation>
+ </message>
+ <message>
+ <source>Type: %1
+</source>
+ <translation type="unfinished">النوع %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation type="unfinished">‫المذكرة‬: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation type="unfinished">العنوان %1
+</translation>
+ </message>
+ <message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">‫العمليات المرسلة‬</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation type="unfinished">‫العمليات الواردة‬</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
+ <translation type="unfinished">توليد المفاتيح الهرمية الحتمية HD &lt;b&gt;مفعل&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">توليد المفاتيح الهرمية الحتمية HD &lt;b&gt;معطل&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">المفتاح الخاص &lt;b&gt;معطل&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
+ <translation type="unfinished">المحفظة &lt;b&gt;مشفرة&lt;/b&gt; و &lt;b&gt;مفتوحة&lt;/b&gt; حاليا</translation>
+ </message>
+ <message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">المحفظة &lt;b&gt;مشفرة&lt;/b&gt; و &lt;b&gt;مقفلة&lt;/b&gt; حاليا</translation>
+ </message>
+ <message>
+ <source>Original message:</source>
+ <translation type="unfinished">الرسالة الأصلية:</translation>
+ </message>
+</context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation type="unfinished">‫وحدة عرض القيمة. انقر لتغيير وحدة العرض.‬</translation>
+ </message>
+</context>
+<context>
+ <name>CoinControlDialog</name>
+ <message>
+ <source>Coin Selection</source>
+ <translation type="unfinished">اختيار وحدات البتكوين</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">الكمية:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">بايت:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">القيمة:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">الرسوم:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">بعد الرسوم:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation type="unfinished">تعديل:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">‫الغاء تحديد الكل‬</translation>
+ </message>
+ <message>
+ <source>Tree mode</source>
+ <translation type="unfinished">صيغة الشجرة</translation>
+ </message>
+ <message>
+ <source>List mode</source>
+ <translation type="unfinished">صيغة القائمة</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">‫القيمة‬</translation>
+ </message>
+ <message>
+ <source>Received with label</source>
+ <translation type="unfinished">‫استُلم وله مذكرة‬</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation type="unfinished">‫مستلم مع عنوان‬</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">التاريخ</translation>
+ </message>
+ <message>
+ <source>Confirmations</source>
+ <translation type="unfinished">التأكيدات</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">‫نافذ‬</translation>
+ </message>
+ <message>
+ <source>Copy amount</source>
+ <translation type="unfinished">‫نسخ القيمة‬</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">‫&amp;انسخ العنوان‬</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">‫نسخ &amp;مذكرة‬</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">‫نسخ &amp;القيمة‬</translation>
+ </message>
+ <message>
+ <source>Copy transaction &amp;ID and output index</source>
+ <translation type="unfinished">‫نسخ &amp;معرف العملية وفهرس المخرجات‬</translation>
+ </message>
+ <message>
+ <source>L&amp;ock unspent</source>
+ <translation type="unfinished">قفل غير منفق</translation>
+ </message>
+ <message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">&amp; إفتح غير المنفق</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation type="unfinished">نسخ الكمية </translation>
+ </message>
+ <message>
+ <source>Copy fee</source>
+ <translation type="unfinished">نسخ الرسوم</translation>
+ </message>
+ <message>
+ <source>Copy after fee</source>
+ <translation type="unfinished">نسخ بعد الرسوم</translation>
+ </message>
+ <message>
+ <source>Copy bytes</source>
+ <translation type="unfinished">نسخ البايتات </translation>
+ </message>
+ <message>
+ <source>Copy change</source>
+ <translation type="unfinished">‫نسخ الفكة‬</translation>
+ </message>
+ <message>
+ <source>(%1 locked)</source>
+ <translation type="unfinished">(%1 تم قفله)</translation>
+ </message>
+ <message>
+ <source>Can vary +/- %1 satoshi(s) per input.</source>
+ <translation type="unfinished">‫يمكن يزيد أو ينقص %1 ساتوشي لكل مدخل.‬</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">( لا وجود لمذكرة)</translation>
+ </message>
+ <message>
+ <source>change from %1 (%2)</source>
+ <translation type="unfinished">تغيير من %1 (%2)</translation>
+ </message>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">‫(غيّر)‬</translation>
+ </message>
+</context>
+<context>
+ <name>CreateWalletActivity</name>
+ <message>
+ <source>Create Wallet</source>
+ <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
+ <translation type="unfinished">إنشاء محفظة</translation>
+ </message>
+ <message>
+ <source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</extracomment>
+ <translation type="unfinished">جار انشاء المحفظة &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>Create wallet failed</source>
+ <translation type="unfinished">‫تعذر إنشاء المحفظة‬</translation>
+ </message>
+ <message>
+ <source>Create wallet warning</source>
+ <translation type="unfinished">تحذير إنشاء محفظة</translation>
+ </message>
+ <message>
+ <source>Can't list signers</source>
+ <translation type="unfinished">لا يمكن سرد الموقعين</translation>
+ </message>
+ <message>
+ <source>Too many external signers found</source>
+ <translation type="unfinished">‫تم العثور على موقّعين خارجيين كُثر (Too Many)‬</translation>
+ </message>
+</context>
+<context>
+ <name>OpenWalletActivity</name>
+ <message>
+ <source>Open wallet failed</source>
+ <translation type="unfinished">فشل فتح محفظة</translation>
+ </message>
+ <message>
+ <source>Open wallet warning</source>
+ <translation type="unfinished">تحذير محفظة مفتوحة</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">‫محفظة افتراضية‬</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
+ <translation type="unfinished">افتح المحفظة</translation>
+ </message>
+ <message>
+ <source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
+ <translation type="unfinished">جاري فتح المحفظة&lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+</context>
+<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">استعادة المحفظة</translation>
+ </message>
+ <message>
+ <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
+ <translation type="unfinished">استعادة المحفظة &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>Restore wallet failed</source>
+ <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
+ <translation type="unfinished">‫تعذر استعادة المحفظة‬</translation>
+ </message>
+ <message>
+ <source>Restore wallet warning</source>
+ <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
+ <translation type="unfinished">‫تحذير استعادة المحفظة‬</translation>
+ </message>
+ <message>
+ <source>Restore wallet message</source>
+ <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
+ <translation type="unfinished">‫رسالة استعادة محفظة‬</translation>
+ </message>
+</context>
+<context>
+ <name>WalletController</name>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">اغلق المحفظة</translation>
+ </message>
+ <message>
+ <source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
+ <translation type="unfinished">اغلاق المحفظة لفترة طويلة قد يؤدي الى الاضطرار الى اعادة مزامنة السلسلة بأكملها اذا تم تمكين التلقيم.</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">إغلاق جميع المحافظ ...</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to close all wallets?</source>
+ <translation type="unfinished">هل أنت متأكد من رغبتك في اغلاق جميع المحافظ؟</translation>
+ </message>
+</context>
+<context>
+ <name>CreateWalletDialog</name>
+ <message>
+ <source>Create Wallet</source>
+ <translation type="unfinished">إنشاء محفظة</translation>
+ </message>
+ <message>
+ <source>Wallet Name</source>
+ <translation type="unfinished">إسم المحفظة</translation>
+ </message>
+ <message>
+ <source>Wallet</source>
+ <translation type="unfinished">محفظة</translation>
+ </message>
+ <message>
+ <source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
+ <translation type="unfinished">شفر المحفظة. المحفظة سيتم تشفيرها بإستخدام كلمة مرور من إختيارك.</translation>
+ </message>
+ <message>
+ <source>Encrypt Wallet</source>
+ <translation type="unfinished">تشفير محفظة</translation>
+ </message>
+ <message>
+ <source>Advanced Options</source>
+ <translation type="unfinished">خيارات متقدمة</translation>
+ </message>
+ <message>
+ <source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
+ <translation type="unfinished">تعطيل المفاتيح الخاصة لهذه المحفظة. لن تحتوي المحافظ ذات المفاتيح الخاصة المعطلة على مفاتيح خاصة ولا يمكن أن تحتوي على مفتاح HD أو مفاتيح خاصة مستوردة. هذا مثالي لمحافظ مشاهدة فقط فقط.</translation>
+ </message>
+ <message>
+ <source>Disable Private Keys</source>
+ <translation type="unfinished">إيقاف المفاتيح الخاصة</translation>
+ </message>
+ <message>
+ <source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
+ <translation type="unfinished">اصنع محفظة فارغة. لا تحتوي المحافظ الفارغة في البداية على مفاتيح خاصة أو نصوص. يمكن استيراد المفاتيح والعناوين الخاصة، أو يمكن تعيين مصدر HD في وقت لاحق.</translation>
+ </message>
+ <message>
+ <source>Make Blank Wallet</source>
+ <translation type="unfinished">أنشئ محفظة فارغة</translation>
+ </message>
+ <message>
+ <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
+ <translation type="unfinished">استخدم جهاز توقيع خارجي مثل محفظة الأجهزة. قم بتكوين البرنامج النصي للموقِّع الخارجي في تفضيلات المحفظة أولاً.</translation>
+ </message>
+ <message>
+ <source>External signer</source>
+ <translation type="unfinished">الموقّع الخارجي</translation>
+ </message>
+ <message>
+ <source>Create</source>
+ <translation type="unfinished">إنشاء</translation>
+ </message>
+ <message>
+ <source>Compiled without external signing support (required for external signing)</source>
+ <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">مجمعة بدون دعم توقيع خارجي (مطلوب للتوقيع الخارجي)</translation>
+ </message>
+</context>
+<context>
+ <name>EditAddressDialog</name>
+ <message>
+ <source>Edit Address</source>
+ <translation type="unfinished">تعديل العنوان</translation>
+ </message>
+ <message>
+ <source>&amp;Label</source>
+ <translation type="unfinished">&amp;وصف</translation>
+ </message>
+ <message>
+ <source>The label associated with this address list entry</source>
+ <translation type="unfinished">الملصق المرتبط بقائمة العناوين المدخلة</translation>
+ </message>
+ <message>
+ <source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
+ <translation type="unfinished">العنوان المرتبط بقائمة العناوين المدخلة. و التي يمكن تعديلها فقط بواسطة ارسال العناوين</translation>
+ </message>
+ <message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">&amp;العنوان</translation>
+ </message>
+ <message>
+ <source>New sending address</source>
+ <translation type="unfinished">عنوان إرسال جديد</translation>
+ </message>
+ <message>
+ <source>Edit receiving address</source>
+ <translation type="unfinished">تعديل عنوان الأستلام</translation>
+ </message>
+ <message>
+ <source>Edit sending address</source>
+ <translation type="unfinished">تعديل عنوان الارسال</translation>
+ </message>
+ <message>
+ <source>The entered address "%1" is not a valid Bitcoin address.</source>
+ <translation type="unfinished">العنوان المدخل "%1" ليس عنوان بيت كوين صحيح.</translation>
+ </message>
+ <message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">العنوان "%1" موجود بالفعل كعنوان إستقبال تحت مسمى "%2" ولذلك لا يمكن إضافته كعنوان إرسال.</translation>
+ </message>
+ <message>
+ <source>The entered address "%1" is already in the address book with label "%2".</source>
+ <translation type="unfinished">العنوان المدخل "%1" موجود بالفعل في سجل العناوين تحت مسمى " "%2".</translation>
+ </message>
+ <message>
+ <source>Could not unlock wallet.</source>
+ <translation type="unfinished"> يمكن فتح المحفظة.</translation>
+ </message>
+ <message>
+ <source>New key generation failed.</source>
+ <translation type="unfinished">فشل توليد مفتاح جديد.</translation>
+ </message>
+</context>
+<context>
+ <name>FreespaceChecker</name>
+ <message>
+ <source>A new data directory will be created.</source>
+ <translation type="unfinished">سيتم انشاء دليل بيانات جديد.</translation>
+ </message>
+ <message>
+ <source>name</source>
+ <translation type="unfinished">الإسم</translation>
+ </message>
+ <message>
+ <source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
+ <translation type="unfinished">الدليل موجوج بالفعل. أضف %1 اذا نويت إنشاء دليل جديد هنا.</translation>
+ </message>
+ <message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">المسار موجود بالفعل، وهو ليس دليلاً.</translation>
+ </message>
+ <message>
+ <source>Cannot create data directory here.</source>
+ <translation type="unfinished">لا يمكن انشاء دليل بيانات هنا .</translation>
+ </message>
+</context>
+<context>
+ <name>Intro</name>
+ <message>
+ <source>Bitcoin</source>
+ <translation type="unfinished">بتكوين</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n GB of space available</source>
+ <translation type="unfinished">
+ <numerusform>%n GB of space available</numerusform>
+ <numerusform>%n GB of space available</numerusform>
+ <numerusform>%n GB of space available</numerusform>
+ <numerusform>%n GB of space available</numerusform>
+ <numerusform>%n GB of space available</numerusform>
+ <numerusform>‫‫%n جيجابايت من المساحة متوفرة</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation type="unfinished">
+ <numerusform>(of %n GB needed)</numerusform>
+ <numerusform>(of %n GB needed)</numerusform>
+ <numerusform>(of %n GB needed)</numerusform>
+ <numerusform>(of %n GB needed)</numerusform>
+ <numerusform>(of %n GB needed)</numerusform>
+ <numerusform>‫(مطلوب %n جيجابايت)‬</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(%n GB needed for full chain)</source>
+ <translation type="unfinished">
+ <numerusform>(%n GB needed for full chain)</numerusform>
+ <numerusform>(%n GB needed for full chain)</numerusform>
+ <numerusform>(%n GB needed for full chain)</numerusform>
+ <numerusform>(%n GB needed for full chain)</numerusform>
+ <numerusform>(%n GB needed for full chain)</numerusform>
+ <numerusform>‫( مطلوب %n جيجابايت لكامل المتتالية)‬</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
+ <translation type="unfinished">سيتم تخزين %1 جيجابايت على الأقل من البيانات في هذا الدليل، وستنمو مع الوقت.</translation>
+ </message>
+ <message>
+ <source>Approximately %1 GB of data will be stored in this directory.</source>
+ <translation type="unfinished">سيتم تخزين %1 جيجابايت تقريباً من البيانات في هذا الدليل.</translation>
+ </message>
+ <message numerus="yes">
+ <source>(sufficient to restore backups %n day(s) old)</source>
+ <extracomment>Explanatory text on the capability of the current prune target.</extracomment>
+ <translation type="unfinished">
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>%1 will download and store a copy of the Bitcoin block chain.</source>
+ <translation type="unfinished">سيقوم %1 بتنزيل نسخة من سلسلة كتل بتكوين وتخزينها.</translation>
+ </message>
+ <message>
+ <source>The wallet will also be stored in this directory.</source>
+ <translation type="unfinished">سوف يتم تخزين المحفظة في هذا الدليل.</translation>
+ </message>
+ <message>
+ <source>Error: Specified data directory "%1" cannot be created.</source>
+ <translation type="unfinished">خطأ: لا يمكن تكوين دليل بيانات مخصص ل %1</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">خطأ</translation>
+ </message>
+ <message>
+ <source>Welcome</source>
+ <translation type="unfinished">أهلا</translation>
+ </message>
+ <message>
+ <source>Welcome to %1.</source>
+ <translation type="unfinished"> اهلا بكم في %1</translation>
+ </message>
+ <message>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation type="unfinished">بما انه هذه اول مرة لانطلاق هذا البرنامج, فيمكنك ان تختار اين سيخزن %1 بياناته</translation>
+ </message>
+ <message>
+ <source>Limit block chain storage to</source>
+ <translation type="unfinished">تقييد تخزين سلسلة الكتل إلى</translation>
+ </message>
+ <message>
+ <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
+ <translation type="unfinished">تتطلب العودة إلى هذا الإعداد إعادة تنزيل سلسلة الكتل بالكامل. من الأسرع تنزيل السلسلة الكاملة أولاً وتقليمها لاحقًا. تعطيل بعض الميزات المتقدمة.</translation>
+ </message>
+ <message>
+ <source> GB</source>
+ <translation type="unfinished">غيغابايت</translation>
+ </message>
+ <message>
+ <source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
+ <translation type="unfinished">تُعد هذه المزامنة الأولية أمرًا شاقًا للغاية، وقد تعرض جهاز الكمبيوتر الخاص بك للمشاكل الذي لم يلاحظها أحد سابقًا. في كل مرة تقوم فيها بتشغيل %1، سيتابع التحميل من حيث تم التوقف.</translation>
+ </message>
+ <message>
+ <source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
+ <translation type="unfinished">‫عندما تنقر موافق. %1 سنبدأ التحميل ومعالجة كامل %4 الطوابق المتتالية (%2 GB) بدأً من أوائل العمليات في %3 عندما %4 تم الاطلاق لأول مرة.‬</translation>
+ </message>
+ <message>
+ <source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
+ <translation type="unfinished">إذا كنت قد اخترت تقييد تخزين سلسلة الكتل (التجريد)، فيجب تحميل البيانات القديمة ومعالجتها، ولكن سيتم حذفها بعد ذلك للحفاظ على انخفاض استخدام القرص.</translation>
+ </message>
+ <message>
+ <source>Use the default data directory</source>
+ <translation type="unfinished">استخدام دليل البانات الافتراضي</translation>
+ </message>
+ <message>
+ <source>Use a custom data directory:</source>
+ <translation type="unfinished">استخدام دليل بيانات مخصص:</translation>
+ </message>
+</context>
+<context>
+ <name>HelpMessageDialog</name>
+ <message>
+ <source>version</source>
+ <translation type="unfinished">النسخة</translation>
+ </message>
+ <message>
+ <source>About %1</source>
+ <translation type="unfinished">حوالي %1</translation>
+ </message>
+ <message>
+ <source>Command-line options</source>
+ <translation type="unfinished">خيارات سطر الأوامر</translation>
+ </message>
+</context>
+<context>
+ <name>ShutdownWindow</name>
+ <message>
+ <source>%1 is shutting down…</source>
+ <translation type="unfinished">%1 يتم الإغلاق ...</translation>
+ </message>
+ <message>
+ <source>Do not shut down the computer until this window disappears.</source>
+ <translation type="unfinished">لا توقف عمل الكمبيوتر حتى تختفي هذه النافذة</translation>
+ </message>
+</context>
+<context>
+ <name>ModalOverlay</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">نمودج</translation>
+ </message>
+ <message>
+ <source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
+ <translation type="unfinished">قد لا تكون المعاملات الأخيرة مرئية بعد، وبالتالي قد يكون رصيد محفظتك غير صحيح. ستكون هذه المعلومات صحيحة بمجرد الانتهاء من محفظتك مع شبكة البيتكوين، كما هو مفصل أدناه.</translation>
+ </message>
+ <message>
+ <source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
+ <translation type="unfinished">لن تقبل الشبكة محاولة إنفاق البتكوين المتأثرة بالمعاملات التي لم يتم عرضها بعد.</translation>
+ </message>
+ <message>
+ <source>Number of blocks left</source>
+ <translation type="unfinished">عدد الكتل الفاضلة</translation>
+ </message>
+ <message>
+ <source>Unknown…</source>
+ <translation type="unfinished">غير معروف</translation>
+ </message>
+ <message>
+ <source>calculating…</source>
+ <translation type="unfinished">جاري الحساب</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">اخر وقت الكتلة</translation>
+ </message>
+ <message>
+ <source>Progress</source>
+ <translation type="unfinished">تقدم</translation>
+ </message>
+ <message>
+ <source>Progress increase per hour</source>
+ <translation type="unfinished">تقدم يزيد بلساعة</translation>
+ </message>
+ <message>
+ <source>Estimated time left until synced</source>
+ <translation type="unfinished">الوقت المتبقي للمزامنة</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">إخفاء</translation>
+ </message>
+ <message>
+ <source>Esc</source>
+ <translation type="unfinished">خروج</translation>
+ </message>
+ <message>
+ <source>Unknown. Syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">مجهول. مزامنة الرؤوس (%1،%2٪) ...</translation>
+ </message>
+ <message>
+ <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">‫غير معروف. ما قبل مزامنة الرؤوس (%1, %2%)…‬</translation>
+ </message>
+</context>
+<context>
+ <name>OpenURIDialog</name>
+ <message>
+ <source>Open bitcoin URI</source>
+ <translation type="unfinished">‫افتح رابط بتكوين (URI)‬</translation>
+ </message>
+ <message>
+ <source>URI:</source>
+ <translation type="unfinished">العنوان:</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">‫ألصق العنوان من الحافظة‬</translation>
+ </message>
+</context>
+<context>
+ <name>OptionsDialog</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished">خيارات</translation>
+ </message>
+ <message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">‫&amp;الرئيسية‬</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">‫تشغيل البرنامج تلقائيا %1 بعد تسجيل الدخول إلى النظام.‬</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation type="unfinished">تشغيل %1 عند الدخول إلى النظام</translation>
+ </message>
+ <message>
+ <source>Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain.</source>
+ <translation type="unfinished">‫يؤدي تمكين خيار اختصار النود إلى تقليل مساحة التخزين المطلوبة بشكل كبير. يتم المصادقة على جميع الطوابق رغم تفعيل هذا الخيار،. إلغاء هذا الاعداد يتطلب اعادة تحميل الطوابق المتتالية من جديد بشكل كامل.‬</translation>
+ </message>
+ <message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">‫حجم ذاكرة التخزين المؤقت ل&amp;قاعدة البيانات‬</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">عدد مؤشرات التحقق من البرنامج النصي</translation>
+ </message>
+ <message>
+ <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
+ <translation type="unfinished">‫عنوان IP للوكيل (مثل IPv4: 127.0.0.1 / IPv6: ::1)‬</translation>
+ </message>
+ <message>
+ <source>Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation type="unfinished">إظهار ما إذا كان وكيل SOCKS5 الافتراضي الموفر تم استخدامه للوصول إلى الأقران عبر نوع الشبكة هذا.</translation>
+ </message>
+ <message>
+ <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</source>
+ <translation type="unfinished">‫التصغير بدلاً من الخروج من التطبيق عند إغلاق النافذة. عند تفعيل هذا الخيار، سيتم إغلاق التطبيق فقط بعد النقر على خروج من القائمة المنسدلة.‬</translation>
+ </message>
+ <message>
+ <source>Options set in this dialog are overridden by the command line:</source>
+ <translation type="unfinished">‫التفضيلات المعينة عن طريق سطر الأوامر لها أولوية أكبر وتتجاوز التفضيلات المختارة هنا:‬</translation>
+ </message>
+ <message>
+ <source>Open the %1 configuration file from the working directory.</source>
+ <translation type="unfinished">‫فتح ملف %1 الإعداد من مجلد العمل.‬</translation>
+ </message>
+ <message>
+ <source>Open Configuration File</source>
+ <translation type="unfinished">‫فتح ملف الإعداد‬</translation>
+ </message>
+ <message>
+ <source>Reset all client options to default.</source>
+ <translation type="unfinished">إعادة تعيين كل إعدادات العميل للحالة الإفتراضية.</translation>
+ </message>
+ <message>
+ <source>&amp;Reset Options</source>
+ <translation type="unfinished">‫&amp;اعادة تهيئة الخيارات‬</translation>
+ </message>
+ <message>
+ <source>&amp;Network</source>
+ <translation type="unfinished">&amp;الشبكة</translation>
+ </message>
+ <message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">‫اختصار &amp;تخزين الطابق</translation>
+ </message>
+ <message>
+ <source>GB</source>
+ <translation type="unfinished">‫جيجابايت‬</translation>
+ </message>
+ <message>
+ <source>Reverting this setting requires re-downloading the entire blockchain.</source>
+ <translation type="unfinished">‫العودة الى هذا الاعداد تتطلب إعادة تنزيل الطوابق المتتالية بالكامل.‬</translation>
+ </message>
+ <message>
+ <source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
+ <extracomment>Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</extracomment>
+ <translation type="unfinished">‫الحد الأعلى لحجم قاعدة البيانات المؤقتة (الكاش). رفع حد الكاش يزيد من سرعة المزامنة. هذا الخيار مفيد أثناء المزامنة وقد لا يفيد بعد اكتمال المزامنة في معظم الحالات. تخفيض حجم الكاش يقلل من استهلاك الذاكرة. ذاكرة تجمع الذاكرة (mempool) الغير مستخدمة مضمنة في هذا الكاش.‬</translation>
+ </message>
+ <message>
+ <source>MiB</source>
+ <translation type="unfinished">‫ميجابايت‬</translation>
+ </message>
+ <message>
+ <source>(0 = auto, &lt;0 = leave that many cores free)</source>
+ <translation type="unfinished">‫(0 = تلقائي, &lt;0 = لترك أنوية حرة بقدر الرقم السالب)‬</translation>
+ </message>
+ <message>
+ <source>Enable R&amp;PC server</source>
+ <extracomment>An Options window setting to enable the RPC server.</extracomment>
+ <translation type="unfinished">‫تفعيل خادم نداء &amp;الاجراء البعيد (RPC)‬</translation>
+ </message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">‫م&amp;حفظة‬</translation>
+ </message>
+ <message>
+ <source>Whether to set subtract fee from amount as default or not.</source>
+ <extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
+ <translation type="unfinished">‫تعيين خيار خصم الرسوم من القيمة كخيار افتراضي أم لا.‬</translation>
+ </message>
+ <message>
+ <source>Subtract &amp;fee from amount by default</source>
+ <extracomment>An Options window setting to set subtracting the fee from a sending amount as default.</extracomment>
+ <translation type="unfinished">‫اخصم &amp;الرسوم من القيمة بشكل افتراضي‬</translation>
+ </message>
+ <message>
+ <source>Expert</source>
+ <translation type="unfinished">‫خبير‬</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">‫تفعيل ميزة &amp;التحكم بوحدات البتكوين‬</translation>
+ </message>
+ <message>
+ <source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
+ <translation type="unfinished">‫اذا قمت بتعطيل خيار الانفاق من الفكة الغير مؤكدة، لن يكون بمقدورك التحكم بتلك الفكة حتى تنْفُذ العملية وتحصل على تأكيد واحد على الأقل. هذا أيضا يؤثر على كيفية حساب رصيدك.‬</translation>
+ </message>
+ <message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">‫&amp;دفع الفكة غير المؤكدة‬</translation>
+ </message>
+ <message>
+ <source>Enable &amp;PSBT controls</source>
+ <extracomment>An options window setting to enable PSBT controls.</extracomment>
+ <translation type="unfinished">‫تفعيل التحكم ب &amp;المعاملات الموقعة جزئيا‬</translation>
+ </message>
+ <message>
+ <source>Whether to show PSBT controls.</source>
+ <extracomment>Tooltip text for options window setting that enables PSBT controls.</extracomment>
+ <translation type="unfinished">‫خيار عرض التحكم بالمعاملات الموقعة جزئيا.‬</translation>
+ </message>
+ <message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">‫جهاز التوقيع الخارجي (مثل المحفظة الخارجية)‬</translation>
+ </message>
+ <message>
+ <source>&amp;External signer script path</source>
+ <translation type="unfinished">&amp; مسار البرنامج النصي للموقّع الخارجي</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">‫فتح منفذ عميل البتكوين تلقائيا على الموجه. يعمل فقط عندما يكون الموجه الخاص بك يدعم UPnP ومفعل ايضا.‬</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">‫ربط المنفذ باستخدام &amp;UPnP‬</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">‫افتح منفذ عميل بتكوين تلقائيًا على جهاز التوجيه. يعمل هذا فقط عندما يدعم جهاز التوجيه الخاص بك NAT-PMP ويتم تمكينه. يمكن أن يكون المنفذ الخارجي عشوائيًا.‬</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">منفذ الخريطة باستخدام NAT-PMP</translation>
+ </message>
+ <message>
+ <source>Accept connections from outside.</source>
+ <translation type="unfinished">قبول الاتصالات من الخارج.</translation>
+ </message>
+ <message>
+ <source>Allow incomin&amp;g connections</source>
+ <translation type="unfinished">‫السماح بالاتصالات الوارد&amp;ة‬</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation type="unfinished">الاتصال بشبكة البتكوين عبر وكيل SOCKS5.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation type="unfinished">الاتصال من خلال وكيل SOCKS5 (الوكيل الافتراضي):</translation>
+ </message>
+ <message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">بروكسي &amp;اي بي:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">&amp;المنفذ:</translation>
+ </message>
+ <message>
+ <source>Port of the proxy (e.g. 9050)</source>
+ <translation type="unfinished">منفذ البروكسي (مثلا 9050)</translation>
+ </message>
+ <message>
+ <source>Used for reaching peers via:</source>
+ <translation type="unfinished">مستخدم للاتصال بالاقران من خلال:</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation type="unfinished">تور</translation>
+ </message>
+ <message>
+ <source>&amp;Window</source>
+ <translation type="unfinished">‫&amp;نافذة‬</translation>
+ </message>
+ <message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">عرض الأيقونة في زاوية الأيقونات.</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">‫&amp;اعرض الأيقونة في الزاوية‬</translation>
+ </message>
+ <message>
+ <source>Show only a tray icon after minimizing the window.</source>
+ <translation type="unfinished">‫عرض الأيقونة في زاوية الأيقونات فقط بعد تصغير النافذة.‬</translation>
+ </message>
+ <message>
+ <source>&amp;Minimize to the tray instead of the taskbar</source>
+ <translation type="unfinished">‫التصغير إلى زاوية الأيقونات بدلاً من شريط المهام‬</translation>
+ </message>
+ <message>
+ <source>M&amp;inimize on close</source>
+ <translation type="unfinished">‫ت&amp;صغير عند الإغلاق‬</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">&amp;عرض</translation>
+ </message>
+ <message>
+ <source>User Interface &amp;language:</source>
+ <translation type="unfinished">واجهة المستخدم &amp;اللغة:</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
+ <translation type="unfinished">‫يمكن ضبط الواجهة اللغوية للمستخدم من هنا. هذا الإعداد يتطلب إعادة تشغيل %1.‬</translation>
+ </message>
+ <message>
+ <source>&amp;Unit to show amounts in:</source>
+ <translation type="unfinished">‫وحدة لعرض القيم:‬</translation>
+ </message>
+ <message>
+ <source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
+ <translation type="unfinished">‫اختر وحدة التقسيم الفرعية الافتراضية للعرض في الواجهة وعند إرسال البتكوين.‬</translation>
+ </message>
+ <message>
+ <source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
+ <translation type="unfinished">‫عناوين أطراف أخرى (مثل: مستكشف الطوابق) تظهر في النافذة المبوبة للعمليات كخيار في القائمة المنبثقة. %s في الرابط تُستبدل بمعرف التجزئة. سيتم فصل العناوين بخط أفقي |.‬</translation>
+ </message>
+ <message>
+ <source>&amp;Third-party transaction URLs</source>
+ <translation type="unfinished">‫&amp;عناوين عمليات أطراف أخرى‬</translation>
+ </message>
+ <message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">‫ما اذا أردت إظهار ميزات التحكم في وحدات البتكوين أم لا.‬</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
+ <translation type="unfinished">اتصل بشبكة بتكوين من خلال وكيل SOCKS5 منفصل لخدمات Tor onion.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">استخدم بروكسي SOCKS5 منفصل للوصول إلى الأقران عبر خدمات Tor onion:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">&amp;تم</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">الغاء</translation>
+ </message>
+ <message>
+ <source>Compiled without external signing support (required for external signing)</source>
+ <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">مجمعة بدون دعم توقيع خارجي (مطلوب للتوقيع الخارجي)</translation>
+ </message>
+ <message>
+ <source>default</source>
+ <translation type="unfinished">الافتراضي</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation type="unfinished">لا شيء</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">تأكيد استعادة الخيارات</translation>
+ </message>
+ <message>
+ <source>Client restart required to activate changes.</source>
+ <extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
+ <translation type="unfinished">‫يجب إعادة تشغيل العميل لتفعيل التغييرات.‬</translation>
+ </message>
+ <message>
+ <source>Current settings will be backed up at "%1".</source>
+ <extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
+ <translation type="unfinished">‫سيتم النسخ الاحتياطي للاعدادات على “%1”.‬".</translation>
+ </message>
+ <message>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <extracomment>Text asking the user to confirm if they would like to proceed with a client shutdown.</extracomment>
+ <translation type="unfinished">‫سوف يتم إيقاف العميل تماماً. هل تريد الإستمرار؟‬</translation>
+ </message>
+ <message>
+ <source>Configuration options</source>
+ <extracomment>Window title text of pop-up box that allows opening up of configuration file.</extracomment>
+ <translation type="unfinished">‫خيارات الإعداد‬</translation>
+ </message>
+ <message>
+ <source>The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file.</source>
+ <extracomment>Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings.</extracomment>
+ <translation type="unfinished">‫يتم استخدام ملف الإعداد لتحديد خيارات المستخدم المتقدمة التي تتجاوز إعدادات واجهة المستخدم الرسومية. بالإضافة إلى ذلك ، ستتجاوز خيارات سطر الأوامر ملف الإعداد هذا.‬</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished">‫استمرار‬</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">إلغاء</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">خطأ</translation>
+ </message>
+ <message>
+ <source>The configuration file could not be opened.</source>
+ <translation type="unfinished">‫لم تتمكن من فتح ملف الإعداد.‬</translation>
+ </message>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">هذا التغيير يتطلب إعادة تشغيل العميل بشكل كامل.</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">‫عنوان الوكيل الذي تم ادخاله غير صالح.‬</translation>
+ </message>
+</context>
+<context>
+ <name>OptionsModel</name>
+ <message>
+ <source>Could not read setting "%1", %2.</source>
+ <translation type="unfinished">‫لا يمكن قراءة الاعدادات “%1”, %2.‬</translation>
+ </message>
+</context>
+<context>
+ <name>OverviewPage</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">نمودج</translation>
+ </message>
+ <message>
+ <source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source>
+ <translation type="unfinished">قد تكون المعلومات المعروضة قديمة. تتزامن محفظتك تلقائيًا مع شبكة البتكوين بعد إنشاء الاتصال، ولكن هذه العملية لم تكتمل بعد.</translation>
+ </message>
+ <message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">‫مراقبة فقط:‬</translation>
+ </message>
+ <message>
+ <source>Available:</source>
+ <translation type="unfinished">‫متاح:‬</translation>
+ </message>
+ <message>
+ <source>Your current spendable balance</source>
+ <translation type="unfinished">‫الرصيد المتاح للصرف‬</translation>
+ </message>
+ <message>
+ <source>Pending:</source>
+ <translation type="unfinished">معلق:</translation>
+ </message>
+ <message>
+ <source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
+ <translation type="unfinished">إجمالي المعاملات التي لم يتم تأكيدها بعد ولا تحتسب ضمن الرصيد القابل للانفاق</translation>
+ </message>
+ <message>
+ <source>Immature:</source>
+ <translation type="unfinished">‫غير ناضج:‬</translation>
+ </message>
+ <message>
+ <source>Mined balance that has not yet matured</source>
+ <translation type="unfinished">الرصيد المعدّن الذي لم ينضج بعد</translation>
+ </message>
+ <message>
+ <source>Balances</source>
+ <translation type="unfinished">الأرصدة</translation>
+ </message>
+ <message>
+ <source>Total:</source>
+ <translation type="unfinished">المجموع:</translation>
+ </message>
+ <message>
+ <source>Your current total balance</source>
+ <translation type="unfinished">رصيدك الكلي الحالي</translation>
+ </message>
+ <message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">‫رصيد عناوين المراقبة‬</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">قابل للصرف:</translation>
+ </message>
+ <message>
+ <source>Recent transactions</source>
+ <translation type="unfinished">العمليات الأخيرة</translation>
+ </message>
+ <message>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation type="unfinished">‫عمليات غير مؤكدة لعناوين المراقبة‬</translation>
+ </message>
+ <message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">‫الرصيد المعدّن في عناوين المراقبة الذي لم ينضج بعد‬</translation>
+ </message>
+ <message>
+ <source>Current total balance in watch-only addresses</source>
+ <translation type="unfinished">‫الرصيد الإجمالي الحالي في عناوين المراقبة‬</translation>
+ </message>
+ <message>
+ <source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
+ <translation type="unfinished">تم تنشيط وضع الخصوصية لعلامة التبويب "نظرة عامة". للكشف عن القيم ، قم بإلغاء تحديد الإعدادات-&gt; إخفاء القيم.</translation>
+ </message>
+</context>
+<context>
+ <name>PSBTOperationsDialog</name>
+ <message>
+ <source>Sign Tx</source>
+ <translation type="unfinished">‫توقيع العملية‬</translation>
+ </message>
+ <message>
+ <source>Broadcast Tx</source>
+ <translation type="unfinished">‫بث العملية‬</translation>
+ </message>
+ <message>
+ <source>Copy to Clipboard</source>
+ <translation type="unfinished">نسخ إلى الحافظة</translation>
+ </message>
+ <message>
+ <source>Save…</source>
+ <translation type="unfinished">‫حفظ…‬</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished">إغلاق</translation>
+ </message>
+ <message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">‫فشل تحميل العملية: %1‬</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">فشل توقيع المعاملة: %1</translation>
+ </message>
+ <message>
+ <source>Cannot sign inputs while wallet is locked.</source>
+ <translation type="unfinished">‫لا يمكن توقيع المدخلات والمحفظة مقفلة.‬</translation>
+ </message>
+ <message>
+ <source>Could not sign any more inputs.</source>
+ <translation type="unfinished">تعذر توقيع المزيد من المدخلات.</translation>
+ </message>
+ <message>
+ <source>Signed %1 inputs, but more signatures are still required.</source>
+ <translation type="unfinished">‫تم توقيع %1 مدخلات، مطلوب توقيعات اضافية.‬</translation>
+ </message>
+ <message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">‫تم توقيع المعاملة بنجاح. العملية جاهزة للبث.‬</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">‫خطأ غير معروف في معالجة العملية.‬</translation>
+ </message>
+ <message>
+ <source>Transaction broadcast successfully! Transaction ID: %1</source>
+ <translation type="unfinished">‫تم بث العملية بنجاح! معرّف العملية: %1‬</translation>
+ </message>
+ <message>
+ <source>Transaction broadcast failed: %1</source>
+ <translation type="unfinished">‫فشل بث العملية: %1‬</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">‫نسخ المعاملة الموقعة جزئيا إلى الحافظة.‬</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">حفظ بيانات العملية</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (Binary)</source>
+ <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
+ <translation type="unfinished">معاملة موقعة جزئيًا (ثنائي)</translation>
+ </message>
+ <message>
+ <source>PSBT saved to disk.</source>
+ <translation type="unfinished">‫تم حفظ المعاملة الموقعة جزئيا على وحدة التخزين.‬</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">عنوانه</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">‫غير قادر على حساب رسوم العملية أو إجمالي قيمة العملية.‬</translation>
+ </message>
+ <message>
+ <source>Pays transaction fee: </source>
+ <translation type="unfinished">‫دفع رسوم العملية: ‬</translation>
+ </message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">القيمة الإجمالية</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">أو</translation>
+ </message>
+ <message>
+ <source>Transaction has %1 unsigned inputs.</source>
+ <translation type="unfinished">‫المعاملة تحتوي على %1 من المدخلات غير موقعة.‬</translation>
+ </message>
+ <message>
+ <source>Transaction is missing some information about inputs.</source>
+ <translation type="unfinished">تفتقد المعاملة إلى بعض المعلومات حول المدخلات </translation>
+ </message>
+ <message>
+ <source>Transaction still needs signature(s).</source>
+ <translation type="unfinished">المعاملة ما زالت تحتاج التوقيع.</translation>
+ </message>
+ <message>
+ <source>(But no wallet is loaded.)</source>
+ <translation type="unfinished">‫(لكن لم يتم تحميل محفظة.)‬</translation>
+ </message>
+ <message>
+ <source>(But this wallet cannot sign transactions.)</source>
+ <translation type="unfinished">‫(لكن لا يمكن توقيع العمليات بهذه المحفظة.)‬</translation>
+ </message>
+ <message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">‫(لكن هذه المحفظة لا تحتوي على المفاتيح الصحيحة.)‬</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">‫المعاملة موقعة بالكامل وجاهزة للبث.‬</translation>
+ </message>
+ <message>
+ <source>Transaction status is unknown.</source>
+ <translation type="unfinished">‫حالة العملية غير معروفة.‬</translation>
+ </message>
+</context>
+<context>
+ <name>PaymentServer</name>
+ <message>
+ <source>Payment request error</source>
+ <translation type="unfinished">خطأ في طلب الدفع</translation>
+ </message>
+ <message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">لا يمكن تشغيل بتكوين: معالج النقر للدفع</translation>
+ </message>
+ <message>
+ <source>URI handling</source>
+ <translation type="unfinished">التعامل مع العنوان</translation>
+ </message>
+ <message>
+ <source>'bitcoin://' is not a valid URI. Use 'bitcoin:' instead.</source>
+ <translation type="unfinished">'bitcoin://' هو ليس عنوان URL صالح. استعمل 'bitcoin:' بدلا من ذلك.</translation>
+ </message>
+ <message>
+ <source>Cannot process payment request because BIP70 is not supported.
+Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
+If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
+ <translation type="unfinished">‫لا يمكن معالجة طلب الدفع لأن BIP70 غير مدعوم.
+‬‫‫‫نظرًا لوجود عيوب أمنية كبيرة في ‫BIP70 يوصى بشدة بتجاهل أي تعليمات من المستلمين لتبديل المحافظ.
+‬‫‫‫إذا كنت تتلقى هذا الخطأ ، يجب أن تطلب من المستلم تقديم عنوان URI متوافق مع BIP21.‬</translation>
+ </message>
+ <message>
+ <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
+ <translation type="unfinished">‫لا يمكن تحليل العنوان (URI)! يمكن أن يحدث هذا بسبب عنوان بتكوين غير صالح أو محددات عنوان غير صحيحة.‬</translation>
+ </message>
+ <message>
+ <source>Payment request file handling</source>
+ <translation type="unfinished">التعامل مع ملف طلب الدفع</translation>
+ </message>
+</context>
+<context>
+ <name>PeerTableModel</name>
+ <message>
+ <source>User Agent</source>
+ <extracomment>Title of Peers Table column which contains the peer's User Agent string.</extracomment>
+ <translation type="unfinished">وكيل المستخدم</translation>
+ </message>
+ <message>
+ <source>Ping</source>
+ <extracomment>Title of Peers Table column which indicates the current latency of the connection with the peer.</extracomment>
+ <translation type="unfinished">رنين</translation>
+ </message>
+ <message>
+ <source>Peer</source>
+ <extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
+ <translation type="unfinished">الأقران</translation>
+ </message>
+ <message>
+ <source>Age</source>
+ <extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
+ <translation type="unfinished">العمر</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <extracomment>Title of Peers Table column which indicates the direction the peer connection was initiated from.</extracomment>
+ <translation type="unfinished">جهة</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have sent to the peer.</extracomment>
+ <translation type="unfinished">تم الإرسال</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have received from the peer.</extracomment>
+ <translation type="unfinished">‫مستلم‬</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
+ <translation type="unfinished">العنوان</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <extracomment>Title of Peers Table column which describes the type of peer connection. The "type" describes why the connection exists.</extracomment>
+ <translation type="unfinished">النوع</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <extracomment>Title of Peers Table column which states the network the peer connected through.</extracomment>
+ <translation type="unfinished">الشبكة</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An Inbound Connection from a Peer.</extracomment>
+ <translation type="unfinished">‫وارد‬</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">‫صادر‬</translation>
+ </message>
+</context>
+<context>
+ <name>QRImageWidget</name>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;احفظ الصورة...</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">&amp;نسخ الصورة</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">‫العنوان الناتج طويل جدًا، حاول أن تقلص النص للمذكرة / الرسالة.‬</translation>
+ </message>
+ <message>
+ <source>Error encoding URI into QR Code.</source>
+ <translation type="unfinished">‫خطأ في ترميز العنوان إلى رمز الاستجابة السريع QR.‬</translation>
+ </message>
+ <message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">‫دعم رمز الاستجابة السريع QR غير متوفر.‬</translation>
+ </message>
+ <message>
+ <source>Save QR Code</source>
+ <translation type="unfinished">حفظ رمز الاستجابة السريع QR</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <extracomment>Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</extracomment>
+ <translation type="unfinished">صورة PNG</translation>
+ </message>
+</context>
+<context>
+ <name>RPCConsole</name>
+ <message>
+ <source>N/A</source>
+ <translation type="unfinished">غير معروف</translation>
+ </message>
+ <message>
+ <source>Client version</source>
+ <translation type="unfinished">‫اصدار العميل‬</translation>
+ </message>
+ <message>
+ <source>&amp;Information</source>
+ <translation type="unfinished">‫&amp;المعلومات‬</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation type="unfinished">عام</translation>
+ </message>
+ <message>
+ <source>Datadir</source>
+ <translation type="unfinished">‫مجلد البيانات‬</translation>
+ </message>
+ <message>
+ <source>To specify a non-default location of the data directory use the '%1' option.</source>
+ <translation type="unfinished">‫لتحديد مكان غير-إفتراضي لمجلد البيانات استخدم خيار الـ'%1'.‬</translation>
+ </message>
+ <message>
+ <source>Blocksdir</source>
+ <translation type="unfinished">‫مجلد الطوابق‬</translation>
+ </message>
+ <message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">‫لتحديد مكان غير-إفتراضي لمجلد البيانات استخدم خيار الـ'"%1'.‬</translation>
+ </message>
+ <message>
+ <source>Startup time</source>
+ <translation type="unfinished">وقت البدء</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">الشبكة</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">الاسم</translation>
+ </message>
+ <message>
+ <source>Number of connections</source>
+ <translation type="unfinished">عدد الاتصالات</translation>
+ </message>
+ <message>
+ <source>Block chain</source>
+ <translation type="unfinished">سلسلة الكتل</translation>
+ </message>
+ <message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">تجمع الذاكرة</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">عدد العمليات الحالي</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished">استخدام الذاكرة</translation>
+ </message>
+ <message>
+ <source>Wallet: </source>
+ <translation type="unfinished">محفظة:</translation>
+ </message>
+ <message>
+ <source>(none)</source>
+ <translation type="unfinished">‫(لا شيء)‬</translation>
+ </message>
+ <message>
+ <source>&amp;Reset</source>
+ <translation type="unfinished">‫&amp;إعادة تعيين‬</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <translation type="unfinished">‫مستلم‬</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation type="unfinished">تم الإرسال</translation>
+ </message>
+ <message>
+ <source>&amp;Peers</source>
+ <translation type="unfinished">‫&amp;أقران‬</translation>
+ </message>
+ <message>
+ <source>Banned peers</source>
+ <translation type="unfinished">‫الأقران المحظورون‬</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation type="unfinished">‫اختر قرينا لعرض معلومات مفصلة.‬</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation type="unfinished">الإصدار</translation>
+ </message>
+ <message>
+ <source>Starting Block</source>
+ <translation type="unfinished">‫طابق البداية‬</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation type="unfinished">‫رؤوس مزامنة‬</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">‫طوابق مزامنة‬</translation>
+ </message>
+ <message>
+ <source>Last Transaction</source>
+ <translation type="unfinished">‫آخر عملية‬</translation>
+ </message>
+ <message>
+ <source>The mapped Autonomous System used for diversifying peer selection.</source>
+ <translation type="unfinished">‫النظام التفصيلي المستقل المستخدم لتنويع اختيار الأقران.‬</translation>
+ </message>
+ <message>
+ <source>Mapped AS</source>
+ <translation type="unfinished">‫‫Mapped AS‬</translation>
+ </message>
+ <message>
+ <source>Whether we relay addresses to this peer.</source>
+ <extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
+ <translation type="unfinished">‫توصيل العناوين لهذا القرين أم لا.‬</translation>
+ </message>
+ <message>
+ <source>Address Relay</source>
+ <extracomment>Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
+ <translation type="unfinished">‫توصيل العنوان‬</translation>
+ </message>
+ <message>
+ <source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
+ <extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
+ <translation type="unfinished">‫مجموع العناوين المستلمة والمعالجة من هذا القرين (تستثنى العناوين المسقطة بسبب التقييد الحدي)‬</translation>
+ </message>
+ <message>
+ <source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
+ <extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
+ <translation type="unfinished">‫مجموع العناوين المستلمة والمسقطة من هذا القرين (غير معالجة) بسبب التقييد الحدي.‬</translation>
+ </message>
+ <message>
+ <source>Addresses Processed</source>
+ <extracomment>Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
+ <translation type="unfinished">‫العناوين المعالجة‬</translation>
+ </message>
+ <message>
+ <source>Addresses Rate-Limited</source>
+ <extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
+ <translation type="unfinished">‫عناوين مقيدة حديا‬</translation>
+ </message>
+ <message>
+ <source>User Agent</source>
+ <translation type="unfinished">وكيل المستخدم</translation>
+ </message>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">نافذة Node </translation>
+ </message>
+ <message>
+ <source>Current block height</source>
+ <translation type="unfinished">‫ارتفاع الطابق الحالي‬</translation>
+ </message>
+ <message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">‫افتح %1 ملف سجل المعالجة والتصحيح من مجلد البيانات الحالي. قد يستغرق عدة ثواني للسجلات الكبيرة.‬</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation type="unfinished">تصغير حجم الخط</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation type="unfinished">تكبير حجم الخط</translation>
+ </message>
+ <message>
+ <source>Permissions</source>
+ <translation type="unfinished">اذونات</translation>
+ </message>
+ <message>
+ <source>The direction and type of peer connection: %1</source>
+ <translation type="unfinished">اتجاه ونوع اتصال الأقران : %1</translation>
+ </message>
+ <message>
+ <source>Direction/Type</source>
+ <translation type="unfinished">الاتجاه / النوع</translation>
+ </message>
+ <message>
+ <source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
+ <translation type="unfinished">‫بروتوكول الشبكة الذي يتصل به هذا القرين من خلال: IPv4 أو IPv6 أو Onion أو I2P أو CJDNS.‬</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation type="unfinished">خدمات</translation>
+ </message>
+ <message>
+ <source>High Bandwidth</source>
+ <translation type="unfinished">‫نطاق بيانات عالي‬</translation>
+ </message>
+ <message>
+ <source>Connection Time</source>
+ <translation type="unfinished">مدة الاتصال</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">‫الوقت المنقضي منذ استلام طابق جديد مجتاز لاختبارات الصلاحية الأولية من هذا القرين.‬</translation>
+ </message>
+ <message>
+ <source>Last Block</source>
+ <translation type="unfinished">‫الطابق الأخير‬</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">‫الوقت المنقضي منذ استلام عملية مقبولة في تجمع الذاكرة من هذا النظير.‬</translation>
+ </message>
+ <message>
+ <source>Last Send</source>
+ <translation type="unfinished">‫آخر ارسال‬</translation>
+ </message>
+ <message>
+ <source>Last Receive</source>
+ <translation type="unfinished">‫آخر إستلام‬</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation type="unfinished">وقت الرنين</translation>
+ </message>
+ <message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation type="unfinished">مدة الرنين المعلقة حالياً.</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation type="unfinished">انتظار الرنين</translation>
+ </message>
+ <message>
+ <source>Min Ping</source>
+ <translation type="unfinished">أقل رنين</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">إزاحة الوقت</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">اخر وقت الكتلة</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation type="unfinished">‫&amp;فتح‬</translation>
+ </message>
+ <message>
+ <source>&amp;Console</source>
+ <translation type="unfinished">‫&amp;سطر الأوامر‬</translation>
+ </message>
+ <message>
+ <source>&amp;Network Traffic</source>
+ <translation type="unfinished">&amp;حركة الشبكة</translation>
+ </message>
+ <message>
+ <source>Totals</source>
+ <translation type="unfinished">المجاميع</translation>
+ </message>
+ <message>
+ <source>Debug log file</source>
+ <translation type="unfinished">‫ملف سجل تصحيح الأخطاء‬</translation>
+ </message>
+ <message>
+ <source>Clear console</source>
+ <translation type="unfinished">‫مسح الأوامر‬</translation>
+ </message>
+ <message>
+ <source>In:</source>
+ <translation type="unfinished">داخل:</translation>
+ </message>
+ <message>
+ <source>Out:</source>
+ <translation type="unfinished">خارج:</translation>
+ </message>
+ <message>
+ <source>Inbound: initiated by peer</source>
+ <extracomment>Explanatory text for an inbound peer connection.</extracomment>
+ <translation type="unfinished">‫الواردة: بدأها القرين‬</translation>
+ </message>
+ <message>
+ <source>Outbound Full Relay: default</source>
+ <extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
+ <translation type="unfinished">‫الموصل الكامل الصادر: افتراضي‬</translation>
+ </message>
+ <message>
+ <source>Outbound Block Relay: does not relay transactions or addresses</source>
+ <extracomment>Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</extracomment>
+ <translation type="unfinished">‫موصل الطابق الصادر: لا يقوم بتوصيل العمليات أو العناوين‬</translation>
+ </message>
+ <message>
+ <source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
+ <extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
+ <translation type="unfinished">‫دليل الصادر: مضاف باستخدام نداء الاجراء البعيد RPC %1 أو %2/%3 خيارات الاعداد‬</translation>
+ </message>
+ <message>
+ <source>Outbound Feeler: short-lived, for testing addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">‫أداة التفقد الصادر: قصير الأجل ، لاختبار العناوين‬</translation>
+ </message>
+ <message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">إحضار العنوان الصادر: قصير الأجل ، لطلب العناوين</translation>
+ </message>
+ <message>
+ <source>we selected the peer for high bandwidth relay</source>
+ <translation type="unfinished">‫اخترنا القرين لتوصيل نطاق البيانات العالي‬</translation>
+ </message>
+ <message>
+ <source>the peer selected us for high bandwidth relay</source>
+ <translation type="unfinished">‫القرين اختارنا لتوصيل بيانات ذات نطاق عالي‬</translation>
+ </message>
+ <message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">‫لم يتم تحديد موصل للبيانات عالية النطاق‬</translation>
+ </message>
+ <message>
+ <source>Ctrl++</source>
+ <extracomment>Main shortcut to increase the RPC console font size.</extracomment>
+ <translation type="unfinished">Ctrl ++</translation>
+ </message>
+ <message>
+ <source>Ctrl+-</source>
+ <extracomment>Main shortcut to decrease the RPC console font size.</extracomment>
+ <translation type="unfinished">Ctrl + -</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <extracomment>Context menu action to copy the address of a peer.</extracomment>
+ <translation type="unfinished">‫&amp;انسخ العنوان‬</translation>
+ </message>
+ <message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">&amp;قطع الاتصال</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation type="unfinished">1 &amp;ساعة</translation>
+ </message>
+ <message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">ي&amp;وم 1</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 &amp; اسبوع</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 &amp; سنة</translation>
+ </message>
+ <message>
+ <source>&amp;Unban</source>
+ <translation type="unfinished">&amp;رفع الحظر</translation>
+ </message>
+ <message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">تم تعطيل نشاط الشبكة</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">‫تنفيذ الأوامر بدون أي محفظة‬</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">‫تنفيذ الأوامر باستخدام "%1" من المحفظة‬</translation>
+ </message>
+ <message>
+ <source>Executing…</source>
+ <extracomment>A console message indicating an entered command is currently being executed.</extracomment>
+ <translation type="unfinished">جار التنفيذ...</translation>
+ </message>
+ <message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(قرين: %1)</translation>
+ </message>
+ <message>
+ <source>via %1</source>
+ <translation type="unfinished">خلال %1</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation type="unfinished">نعم</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation type="unfinished">لا</translation>
+ </message>
+ <message>
+ <source>To</source>
+ <translation type="unfinished">الى</translation>
+ </message>
+ <message>
+ <source>From</source>
+ <translation type="unfinished">من</translation>
+ </message>
+ <message>
+ <source>Ban for</source>
+ <translation type="unfinished">حظر ل</translation>
+ </message>
+ <message>
+ <source>Never</source>
+ <translation type="unfinished">مطلقا</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation type="unfinished">غير معروف</translation>
+ </message>
+</context>
+<context>
+ <name>ReceiveCoinsDialog</name>
+ <message>
+ <source>&amp;Amount:</source>
+ <translation type="unfinished">&amp;القيمة</translation>
+ </message>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">&amp;مذكرة :</translation>
+ </message>
+ <message>
+ <source>&amp;Message:</source>
+ <translation type="unfinished">&amp;رسالة:</translation>
+ </message>
+ <message>
+ <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
+ <translation type="unfinished">‫رسالة اختيارية لإرفاقها بطلب الدفع، والتي سيتم عرضها عند فتح الطلب. ملاحظة: لن يتم إرسال الرسالة مع العملية عبر شبكة البتكوين.‬</translation>
+ </message>
+ <message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">تسمية اختيارية لربطها بعنوان المستلم الجديد.</translation>
+ </message>
+ <message>
+ <source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
+ <translation type="unfinished">استخدم هذا النموذج لطلب الدفعات. جميع الحقول &lt;b&gt;اختيارية&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
+ <translation type="unfinished">مبلغ اختياري للطلب. اترك هذا فارغًا أو صفراً لعدم طلب مبلغ محدد.</translation>
+ </message>
+ <message>
+ <source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
+ <translation type="unfinished">‫مذكرة اختيارية للربط مع عنوان الاستلام (يستعمل من قبلك لتعريف فاتورة). هو أيضا مرفق بطلب الدفع.‬</translation>
+ </message>
+ <message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">رسالة اختيارية مرفقة بطلب الدفع ومن الممكن أن تعرض للمرسل.</translation>
+ </message>
+ <message>
+ <source>&amp;Create new receiving address</source>
+ <translation type="unfinished">&amp;إنشاء عناوين استلام جديدة</translation>
+ </message>
+ <message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">‫مسح كل الحقول من النموذج.‬</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished">مسح</translation>
+ </message>
+ <message>
+ <source>Requested payments history</source>
+ <translation type="unfinished">سجل طلبات الدفع</translation>
+ </message>
+ <message>
+ <source>Show the selected request (does the same as double clicking an entry)</source>
+ <translation type="unfinished">إظهار الطلب المحدد (يقوم بنفس نتيجة النقر المزدوج على أي إدخال)</translation>
+ </message>
+ <message>
+ <source>Show</source>
+ <translation type="unfinished">عرض</translation>
+ </message>
+ <message>
+ <source>Remove the selected entries from the list</source>
+ <translation type="unfinished">قم بإزالة الإدخالات المحددة من القائمة</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished">ازل</translation>
+ </message>
+ <message>
+ <source>Copy &amp;URI</source>
+ <translation type="unfinished">‫نسخ &amp;الرابط (URI)‬</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">‫&amp;انسخ العنوان‬</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">‫نسخ &amp;مذكرة‬</translation>
+ </message>
+ <message>
+ <source>Copy &amp;message</source>
+ <translation type="unfinished">‫نسخ &amp;رسالة‬</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">‫نسخ &amp;القيمة‬</translation>
+ </message>
+ <message>
+ <source>Could not unlock wallet.</source>
+ <translation type="unfinished"> يمكن فتح المحفظة.</translation>
+ </message>
+ <message>
+ <source>Could not generate new %1 address</source>
+ <translation type="unfinished">تعذر توليد عنوان %1 جديد.</translation>
+ </message>
+</context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ <message>
+ <source>Request payment to …</source>
+ <translation type="unfinished"> طلب الدفع لـ ...</translation>
+ </message>
+ <message>
+ <source>Address:</source>
+ <translation type="unfinished">العنوان:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">القيمة:</translation>
+ </message>
+ <message>
+ <source>Label:</source>
+ <translation type="unfinished">مذكرة:</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation type="unfinished">‫رسالة:‬</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">المحفظة:</translation>
+ </message>
+ <message>
+ <source>Copy &amp;URI</source>
+ <translation type="unfinished">‫نسخ &amp;الرابط (URI)‬</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Address</source>
+ <translation type="unfinished">نسخ &amp;العنوان</translation>
+ </message>
+ <message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">&amp;تحقق</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">تحقق من العنوان على شاشة المحفظة الخارجية</translation>
+ </message>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;احفظ الصورة...</translation>
+ </message>
+ <message>
+ <source>Payment information</source>
+ <translation type="unfinished">معلومات الدفع</translation>
+ </message>
+ <message>
+ <source>Request payment to %1</source>
+ <translation type="unfinished">طلب الدفعة إلى %1</translation>
+ </message>
+</context>
+<context>
+ <name>RecentRequestsTableModel</name>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">التاريخ</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">المذكرة</translation>
+ </message>
+ <message>
+ <source>Message</source>
+ <translation type="unfinished">رسالة </translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">( لا وجود لمذكرة)</translation>
+ </message>
+ <message>
+ <source>(no message)</source>
+ <translation type="unfinished">( لا رسائل )</translation>
+ </message>
+ <message>
+ <source>(no amount requested)</source>
+ <translation type="unfinished">(لا يوجد قيمة مطلوبة)</translation>
+ </message>
+ <message>
+ <source>Requested</source>
+ <translation type="unfinished">تم الطلب</translation>
+ </message>
+</context>
+<context>
+ <name>SendCoinsDialog</name>
+ <message>
+ <source>Send Coins</source>
+ <translation type="unfinished">‫إرسال وحدات البتكوين‬</translation>
+ </message>
+ <message>
+ <source>Coin Control Features</source>
+ <translation type="unfinished">‫ميزات التحكم بوحدات البتكوين‬</translation>
+ </message>
+ <message>
+ <source>automatically selected</source>
+ <translation type="unfinished">اختيار تلقائيا</translation>
+ </message>
+ <message>
+ <source>Insufficient funds!</source>
+ <translation type="unfinished">الرصيد غير كافي!</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">الكمية:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">بايت:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">القيمة:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">الرسوم:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">بعد الرسوم:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation type="unfinished">تعديل:</translation>
+ </message>
+ <message>
+ <source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
+ <translation type="unfinished">‫إذا تم تنشيط هذا، ولكن عنوان الفكة فارغ أو غير صالح، فسيتم إرسال الفكة إلى عنوان مولّد حديثًا.‬</translation>
+ </message>
+ <message>
+ <source>Custom change address</source>
+ <translation type="unfinished">تغيير عنوان الفكة</translation>
+ </message>
+ <message>
+ <source>Transaction Fee:</source>
+ <translation type="unfinished">رسوم المعاملة:</translation>
+ </message>
+ <message>
+ <source>Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
+ <translation type="unfinished">‫يمكن أن يؤدي استخدام الرسوم الاحتياطية إلى إرسال معاملة تستغرق عدة ساعات أو أيام (أو أبدًا) للتأكيد. ضع في اعتبارك اختيار الرسوم يدويًا أو انتظر حتى تتحقق من صحة المتتالية الكاملة.‬</translation>
+ </message>
+ <message>
+ <source>Warning: Fee estimation is currently not possible.</source>
+ <translation type="unfinished">تحذير: تقدير الرسوم غير ممكن في الوقت الحالي.</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">لكل كيلوبايت</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">إخفاء</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation type="unfinished">موصى به:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation type="unfinished">تخصيص:</translation>
+ </message>
+ <message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">إرسال إلى عدة مستلمين في وقت واحد</translation>
+ </message>
+ <message>
+ <source>Add &amp;Recipient</source>
+ <translation type="unfinished">أضافة &amp;مستلم</translation>
+ </message>
+ <message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">‫مسح كل الحقول من النموذج.‬</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">المدخلات...</translation>
+ </message>
+ <message>
+ <source>Choose…</source>
+ <translation type="unfinished">اختيار...</translation>
+ </message>
+ <message>
+ <source>Hide transaction fee settings</source>
+ <translation type="unfinished">اخفاء اعدادات رسوم المعاملة</translation>
+ </message>
+ <message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">‫حدد الرسوم المخصصة لكل كيلوبايت (١٠٠٠ بايت) من حجم العملية الافتراضي.
+
+ملاحظة: بما أن الرسوم تحتسب لكل بايت، معدل الرسوم ل “ ١٠٠ ساتوشي لكل كيلوبايت افتراضي” لعملية بحجم ٥٠٠ بايت افتراضي (نصف كيلوبايت افتراضي) ستكون ٥٠ ساتوشي فقط.‬</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">‫قد يفرض المعدنون والأنواد الموصلة حدا أدنى للرسوم عندما يكون عدد العمليات قليل نسبة لسعة الطوابق. يمكنك دفع الحد الأدنى ولكن كن على دراية بأن العملية قد لا تنفذ في حالة أن الطلب على عمليات البتكوين فاق قدرة الشبكة على المعالجة.‬</translation>
+ </message>
+ <message>
+ <source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
+ <translation type="unfinished">‫الرسوم القليلة جدا قد تؤدي الى عملية لا تتأكد أبدا (اقرأ التلميح).‬</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">‫(الرسوم الذكية غير مهيأة بعد. عادة يتطلب عدة طوابق…)‬</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">هدف وقت التأكيد:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">تفعيل الإستبدال بواسطة الرسوم</translation>
+ </message>
+ <message>
+ <source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
+ <translation type="unfinished">‫يمكنك زيادة رسوم المعاملة بعد إرسالها عند تفعيل الاستبدال بواسطة الرسوم (BIP-125). نوصي بوضع رسوم أعلى اذا لم يتم التفعيل لتفادي مخاطر تأخير العملية.‬</translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">مسح الكل</translation>
+ </message>
+ <message>
+ <source>Balance:</source>
+ <translation type="unfinished">الرصيد:</translation>
+ </message>
+ <message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">تأكيد الإرسال</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">‫ا&amp;رسال‬</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation type="unfinished">نسخ الكمية </translation>
+ </message>
+ <message>
+ <source>Copy amount</source>
+ <translation type="unfinished">‫نسخ القيمة‬</translation>
+ </message>
+ <message>
+ <source>Copy fee</source>
+ <translation type="unfinished">نسخ الرسوم</translation>
+ </message>
+ <message>
+ <source>Copy after fee</source>
+ <translation type="unfinished">نسخ بعد الرسوم</translation>
+ </message>
+ <message>
+ <source>Copy bytes</source>
+ <translation type="unfinished">نسخ البايتات </translation>
+ </message>
+ <message>
+ <source>Copy change</source>
+ <translation type="unfinished">‫نسخ الفكة‬</translation>
+ </message>
+ <message>
+ <source>%1 (%2 blocks)</source>
+ <translation type="unfinished">%1 (%2 طوابق)</translation>
+ </message>
+ <message>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">‫جهاز التوقيع‬</translation>
+ </message>
+ <message>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">‫قم بتوصيل المحفظة الخارجية أولا.‬</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">‫أعد المسار البرمجي للموقع الخارجي من خيارات -&gt; محفظة‬</translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">‫إن&amp;شاء من غير توقيع‬</translation>
+ </message>
+ <message>
+ <source>%1 to '%2'</source>
+ <translation type="unfinished">%1 الى "%2"</translation>
+ </message>
+ <message>
+ <source>%1 to %2</source>
+ <translation type="unfinished">%1 الى %2</translation>
+ </message>
+ <message>
+ <source>To review recipient list click "Show Details…"</source>
+ <translation type="unfinished">‫لمراجعة قائمة المستلمين انقر على “عرض التفاصيل…”‬</translation>
+ </message>
+ <message>
+ <source>Sign failed</source>
+ <translation type="unfinished">‫فشل التوقيع‬</translation>
+ </message>
+ <message>
+ <source>External signer not found</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">‫لم يتم العثور على موقّع خارجي‬</translation>
+ </message>
+ <message>
+ <source>External signer failure</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">‫فشل الموقّع الخارجي‬</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">حفظ بيانات العملية</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (Binary)</source>
+ <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
+ <translation type="unfinished">معاملة موقعة جزئيًا (ثنائي)</translation>
+ </message>
+ <message>
+ <source>PSBT saved</source>
+ <extracomment>Popup message when a PSBT has been saved to a file</extracomment>
+ <translation type="unfinished">تم حفظ PSBT</translation>
+ </message>
+ <message>
+ <source>External balance:</source>
+ <translation type="unfinished">رصيد خارجي </translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">أو</translation>
+ </message>
+ <message>
+ <source>You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
+ <translation type="unfinished">‫يمكنك زيادة الرسوم لاحقًا (الاستبدال بواسطة الرسوم، BIP-125 مفعل).‬</translation>
+ </message>
+ <message>
+ <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
+ <translation type="unfinished">‫رجاء، راجع معاملتك. هذا ينشئ معاملة بتكوين موقعة جزئيا (PSBT) ويمكنك حفظها أو نسخها و التوقيع مع محفظة %1 غير متصلة بالشبكة، أو محفظة خارجية متوافقة مع الـPSBT.‬</translation>
+ </message>
+ <message>
+ <source>Do you want to create this transaction?</source>
+ <extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
+ <translation type="unfinished">‫هل تريد انشاء هذه المعاملة؟‬</translation>
+ </message>
+ <message>
+ <source>Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</extracomment>
+ <translation type="unfinished">‫رجاء، راجع معاملتك.تستطيع انشاء وارسال هذه العملية أو انشاء معاملة بتكوين موقعة جزئيا (PSBT) ويمكنك حفظها أو نسخها و التوقيع مع محفظة %1 غير متصلة بالشبكة، أو محفظة خارجية متوافقة مع الـPSBT.‬</translation>
+ </message>
+ <message>
+ <source>Please, review your transaction.</source>
+ <extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
+ <translation type="unfinished">رجاء، راجع معاملتك.</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">رسوم العملية</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">‫الاستبدال بواسطة الرسوم، BIP-125 غير مفعلة.‬</translation>
+ </message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">القيمة الإجمالية</translation>
+ </message>
+ <message>
+ <source>Confirm send coins</source>
+ <translation type="unfinished">‫تأكيد ارسال وحدات البتكوين‬</translation>
+ </message>
+ <message>
+ <source>Watch-only balance:</source>
+ <translation type="unfinished">‫رصيد المراقبة:‬</translation>
+ </message>
+ <message>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation type="unfinished">‫عنوان المستلم غير صالح. يرجى مراجعة العنوان.‬</translation>
+ </message>
+ <message>
+ <source>The amount to pay must be larger than 0.</source>
+ <translation type="unfinished">‫القيمة المدفوعة يجب ان تكون اكبر من 0.‬</translation>
+ </message>
+ <message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">القيمة تتجاوز رصيدك.</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">المجموع يتجاوز رصيدك عندما يتم اضافة %1 رسوم العملية</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">‫تم العثور على عنوان مكرر: من الأفضل استخدام العناوين مرة واحدة فقط.‬</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">‫تعذر إنشاء المعاملة!‬</translation>
+ </message>
+ <message>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation type="unfinished">تعتبر الرسوم الأعلى من %1 رسوماً باهظة.</translation>
+ </message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>‫الوقت التقديري للنفاذ خلال %n طوابق.‬</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>Warning: Invalid Bitcoin address</source>
+ <translation type="unfinished">تحذير: عنوان بتكوين غير صالح</translation>
+ </message>
+ <message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">تحذير: عنوان الفكة غير معروف</translation>
+ </message>
+ <message>
+ <source>Confirm custom change address</source>
+ <translation type="unfinished">تأكيد تغيير العنوان الفكة</translation>
+ </message>
+ <message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">‫العنوان الذي قمت بتحديده للفكة ليس جزءا من هذه المحفظة. بعض أو جميع الأموال في محفظتك قد يتم إرسالها لهذا العنوان. هل أنت متأكد؟‬</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">( لا وجود لمذكرة)</translation>
+ </message>
+</context>
+<context>
+ <name>SendCoinsEntry</name>
+ <message>
+ <source>A&amp;mount:</source>
+ <translation type="unfinished">&amp;القيمة</translation>
+ </message>
+ <message>
+ <source>Pay &amp;To:</source>
+ <translation type="unfinished">ادفع &amp;الى :</translation>
+ </message>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">&amp;مذكرة :</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">‫اختر عنوانا تم استخدامه سابقا‬</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to send the payment to</source>
+ <translation type="unfinished">‫عنوان البتكوين لارسال الدفعة له‬</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">‫ألصق العنوان من الحافظة‬</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">‫ازل هذا المدخل‬</translation>
+ </message>
+ <message>
+ <source>The amount to send in the selected unit</source>
+ <translation type="unfinished">‫القيمة للإرسال في الوحدة المحددة‬</translation>
+ </message>
+ <message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">‫سيتم خصم الرسوم من المبلغ الذي يتم إرساله. لذا سوف يتلقى المستلم قيمة أقل من البتكوين المدخل في حقل القيمة. في حالة تحديد عدة مستلمين، يتم تقسيم الرسوم بالتساوي.‬</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation type="unfinished">‫ط&amp;رح الرسوم من القيمة‬</translation>
+ </message>
+ <message>
+ <source>Use available balance</source>
+ <translation type="unfinished">استخدام الرصيد المتاح</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation type="unfinished">‫رسالة:‬</translation>
+ </message>
+ <message>
+ <source>Enter a label for this address to add it to the list of used addresses</source>
+ <translation type="unfinished">‫أدخل مذكرة لهذا العنوان لإضافته إلى قائمة العناوين المستخدمة‬</translation>
+ </message>
+ <message>
+ <source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
+ <translation type="unfinished">‫الرسالة يتم إرفاقها مع البتكوين: الرابط سيتم تخزينه مع العملية لك للرجوع إليه. ملاحظة: لن يتم إرسال هذه الرسالة عبر شبكة البتكوين.‬</translation>
+ </message>
+</context>
+<context>
+ <name>SendConfirmationDialog</name>
+ <message>
+ <source>Send</source>
+ <translation type="unfinished">إرسال</translation>
+ </message>
+ <message>
+ <source>Create Unsigned</source>
+ <translation type="unfinished">إنشاء غير موقع</translation>
+ </message>
+</context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>Signatures - Sign / Verify a Message</source>
+ <translation type="unfinished">التواقيع - التوقيع / تحقق من الرسالة</translation>
+ </message>
+ <message>
+ <source>&amp;Sign Message</source>
+ <translation type="unfinished">&amp;توقيع الرسالة</translation>
+ </message>
+ <message>
+ <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">‫تستطيع توقيع رسائل/اتفاقيات من عناوينك لإثبات أنه بإمكانك استلام بتكوين مرسل لهذه العناوين. كن حذرا من توقيع أي شيء غامض أو عشوائي، هجمات التصيد قد تحاول خداعك وانتحال هويتك. وقع البيانات الواضحة بالكامل والتي توافق عليها فقط.‬</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">عنوان البتكوين لتوقيع الرسالة منه</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">‫اختر عنوانا تم استخدامه سابقا‬</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">‫ألصق العنوان من الحافظة‬</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">ادخل الرسالة التي تريد توقيعها هنا</translation>
+ </message>
+ <message>
+ <source>Signature</source>
+ <translation type="unfinished">التوقيع</translation>
+ </message>
+ <message>
+ <source>Copy the current signature to the system clipboard</source>
+ <translation type="unfinished">نسخ التوقيع الحالي إلى حافظة النظام</translation>
+ </message>
+ <message>
+ <source>Sign the message to prove you own this Bitcoin address</source>
+ <translation type="unfinished">‫وقع الرسالة لتثبت انك تملك عنوان البتكوين هذا‬</translation>
+ </message>
+ <message>
+ <source>Sign &amp;Message</source>
+ <translation type="unfinished">توقيع &amp;الرسالة</translation>
+ </message>
+ <message>
+ <source>Reset all sign message fields</source>
+ <translation type="unfinished">‫إعادة تعيين كافة حقول توقيع الرسالة‬</translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">مسح الكل</translation>
+ </message>
+ <message>
+ <source>&amp;Verify Message</source>
+ <translation type="unfinished">‫&amp;تحقق من الرسالة‬</translation>
+ </message>
+ <message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">أدخل عنوان المتلقي، راسل (تأكد من نسخ فواصل الأسطر، الفراغات، الخ.. تماما) والتوقيع أسفله لتأكيد الرسالة. كن حذرا من عدم قراءة داخل التوقيع أكثر مما هو موقع بالرسالة نفسها، لتجنب خداعك بهجوم man-in-the-middle. لاحظ أنه هذا لاثبات أن الجهة الموقعة تستقبل مع العنوان فقط، لا تستطيع اثبات الارسال لأي معاملة.</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address the message was signed with</source>
+ <translation type="unfinished">عنوان البتكوين الذي تم توقيع الرسالة منه</translation>
+ </message>
+ <message>
+ <source>The signed message to verify</source>
+ <translation type="unfinished">الرسالة الموقعة للتحقق.</translation>
+ </message>
+ <message>
+ <source>The signature given when the message was signed</source>
+ <translation type="unfinished">‫التوقيع المعطى عند توقيع الرسالة‬</translation>
+ </message>
+ <message>
+ <source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
+ <translation type="unfinished">‫تحقق من الرسالة للتأكد أنه تم توقيعها من عنوان البتكوين المحدد‬</translation>
+ </message>
+ <message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">تحقق من &amp;الرسالة</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">إعادة تعيين جميع حقول التحقق من الرسالة</translation>
+ </message>
+ <message>
+ <source>Click "Sign Message" to generate signature</source>
+ <translation type="unfinished">‫انقر "توقيع الرسالة" لانشاء التوقيع‬</translation>
+ </message>
+ <message>
+ <source>The entered address is invalid.</source>
+ <translation type="unfinished">العنوان المدخل غير صالح</translation>
+ </message>
+ <message>
+ <source>Please check the address and try again.</source>
+ <translation type="unfinished">الرجاء التأكد من العنوان والمحاولة مرة اخرى.</translation>
+ </message>
+ <message>
+ <source>The entered address does not refer to a key.</source>
+ <translation type="unfinished">العنوان المدخل لا يشير الى مفتاح.</translation>
+ </message>
+ <message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">تم الغاء عملية فتح المحفظة.</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation type="unfinished">لا يوجد خطأ</translation>
+ </message>
+ <message>
+ <source>Private key for the entered address is not available.</source>
+ <translation type="unfinished">‫المفتاح الخاص للعنوان المدخل غير متاح.‬</translation>
+ </message>
+ <message>
+ <source>Message signing failed.</source>
+ <translation type="unfinished">فشل توقيع الرسالة.</translation>
+ </message>
+ <message>
+ <source>Message signed.</source>
+ <translation type="unfinished">الرسالة موقعة.</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">لا يمكن فك تشفير التوقيع.</translation>
+ </message>
+ <message>
+ <source>Please check the signature and try again.</source>
+ <translation type="unfinished">فضلا تاكد من التوقيع وحاول مرة اخرى</translation>
+ </message>
+ <message>
+ <source>The signature did not match the message digest.</source>
+ <translation type="unfinished">لم يتطابق التوقيع مع ملخص الرسالة.</translation>
+ </message>
+ <message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">فشلت عملية التأكد من الرسالة.</translation>
+ </message>
+ <message>
+ <source>Message verified.</source>
+ <translation type="unfinished">تم تأكيد الرسالة.</translation>
+ </message>
+</context>
+<context>
+ <name>SplashScreen</name>
+ <message>
+ <source>(press q to shutdown and continue later)</source>
+ <translation type="unfinished">‫(انقر q للاغلاق والمواصلة لاحقا)‬</translation>
+ </message>
+ <message>
+ <source>press q to shutdown</source>
+ <translation type="unfinished">‫انقر q للاغلاق‬</translation>
+ </message>
+</context>
+<context>
+ <name>TrafficGraphWidget</name>
+ <message>
+ <source>kB/s</source>
+ <translation type="unfinished">كيلوبايت/ثانية</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionDesc</name>
+ <message>
+ <source>conflicted with a transaction with %1 confirmations</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
+ <translation type="unfinished">‫تعارضت مع عملية أخرى تم تأكيدها %1</translation>
+ </message>
+ <message>
+ <source>0/unconfirmed, in memory pool</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
+ <translation type="unfinished">‫0/غير مؤكدة، في تجمع الذاكرة‬</translation>
+ </message>
+ <message>
+ <source>0/unconfirmed, not in memory pool</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
+ <translation type="unfinished">‫0/غير مؤكدة، ليست في تجمع الذاكرة‬</translation>
+ </message>
+ <message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">مهجور</translation>
+ </message>
+ <message>
+ <source>%1/unconfirmed</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
+ <translation type="unfinished">غير مؤكدة/%1</translation>
+ </message>
+ <message>
+ <source>%1 confirmations</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in 6 or more blocks.</extracomment>
+ <translation type="unfinished">تأكيد %1</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation type="unfinished">الحالة.</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">التاريخ</translation>
+ </message>
+ <message>
+ <source>Source</source>
+ <translation type="unfinished">المصدر</translation>
+ </message>
+ <message>
+ <source>Generated</source>
+ <translation type="unfinished">‫مُصدر‬</translation>
+ </message>
+ <message>
+ <source>From</source>
+ <translation type="unfinished">من</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished">غير معروف</translation>
+ </message>
+ <message>
+ <source>To</source>
+ <translation type="unfinished">الى</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">عنوانه</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">‫مراقبة فقط‬</translation>
+ </message>
+ <message>
+ <source>label</source>
+ <translation type="unfinished">‫مذكرة‬</translation>
+ </message>
+ <message numerus="yes">
+ <source>matures in %n more block(s)</source>
+ <translation type="unfinished">
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>not accepted</source>
+ <translation type="unfinished">غير مقبولة</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">رسوم العملية</translation>
+ </message>
+ <message>
+ <source>Net amount</source>
+ <translation type="unfinished">‫صافي القيمة‬</translation>
+ </message>
+ <message>
+ <source>Message</source>
+ <translation type="unfinished">رسالة </translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">تعليق</translation>
+ </message>
+ <message>
+ <source>Transaction ID</source>
+ <translation type="unfinished">‫رقم العملية‬</translation>
+ </message>
+ <message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">الحجم الكلي ‫للعملية‬</translation>
+ </message>
+ <message>
+ <source>Transaction virtual size</source>
+ <translation type="unfinished">حجم المعاملة الافتراضي</translation>
+ </message>
+ <message>
+ <source>Output index</source>
+ <translation type="unfinished">مؤشر المخرجات</translation>
+ </message>
+ <message>
+ <source>Merchant</source>
+ <translation type="unfinished">تاجر</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">معلومات التصحيح</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">‫عملية‬</translation>
+ </message>
+ <message>
+ <source>Inputs</source>
+ <translation type="unfinished">المدخلات</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">‫القيمة‬</translation>
+ </message>
+ <message>
+ <source>true</source>
+ <translation type="unfinished">صحيح</translation>
+ </message>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">خاطئ</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionDescDialog</name>
+ <message>
+ <source>This pane shows a detailed description of the transaction</source>
+ <translation type="unfinished">يبين هذا الجزء وصفا مفصلا لهده المعاملة</translation>
+ </message>
+ <message>
+ <source>Details for %1</source>
+ <translation type="unfinished">تفاصيل عن %1</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionTableModel</name>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">التاريخ</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">النوع</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">المذكرة</translation>
+ </message>
+ <message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">غير مؤكد</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">مهجور</translation>
+ </message>
+ <message>
+ <source>Confirming (%1 of %2 recommended confirmations)</source>
+ <translation type="unfinished">قيد التأكيد (%1 من %2 تأكيد موصى به)</translation>
+ </message>
+ <message>
+ <source>Confirmed (%1 confirmations)</source>
+ <translation type="unfinished">‫نافذ (%1 تأكيدات)‬</translation>
+ </message>
+ <message>
+ <source>Conflicted</source>
+ <translation type="unfinished">يتعارض</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">غير ناضجة (تأكيدات %1 ، ستكون متوفرة بعد %2)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">ولّدت ولكن لم تقبل</translation>
+ </message>
+ <message>
+ <source>Received with</source>
+ <translation type="unfinished">‫استلم في‬</translation>
+ </message>
+ <message>
+ <source>Received from</source>
+ <translation type="unfinished">‫استلم من</translation>
+ </message>
+ <message>
+ <source>Sent to</source>
+ <translation type="unfinished">أرسل إلى</translation>
+ </message>
+ <message>
+ <source>Mined</source>
+ <translation type="unfinished">‫معدّن‬</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">‫مراقبة فقط‬</translation>
+ </message>
+ <message>
+ <source>(n/a)</source>
+ <translation type="unfinished">غير متوفر</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">( لا وجود لمذكرة)</translation>
+ </message>
+ <message>
+ <source>Transaction status. Hover over this field to show number of confirmations.</source>
+ <translation type="unfinished">حالة التحويل. مرر فوق هذا الحقل لعرض عدد التأكيدات.</translation>
+ </message>
+ <message>
+ <source>Date and time that the transaction was received.</source>
+ <translation type="unfinished">‫التاريخ والوقت الذي تم فيه استلام العملية.‬</translation>
+ </message>
+ <message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">‫نوع العملية.‬</translation>
+ </message>
+ <message>
+ <source>Whether or not a watch-only address is involved in this transaction.</source>
+ <translation type="unfinished">‫إذا كان عنوان المراقبة له علاقة بهذه العملية أم لا.‬</translation>
+ </message>
+ <message>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation type="unfinished">‫سبب تنفيذ العملية للمستخدم.‬</translation>
+ </message>
+ <message>
+ <source>Amount removed from or added to balance.</source>
+ <translation type="unfinished">‫القيمة المضافة أو المزالة من الرصيد.‬</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionView</name>
+ <message>
+ <source>All</source>
+ <translation type="unfinished">الكل</translation>
+ </message>
+ <message>
+ <source>Today</source>
+ <translation type="unfinished">اليوم</translation>
+ </message>
+ <message>
+ <source>This week</source>
+ <translation type="unfinished">هذا الاسبوع</translation>
+ </message>
+ <message>
+ <source>This month</source>
+ <translation type="unfinished">هذا الشهر</translation>
+ </message>
+ <message>
+ <source>Last month</source>
+ <translation type="unfinished">الشهر الماضي</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">هذا العام</translation>
+ </message>
+ <message>
+ <source>Received with</source>
+ <translation type="unfinished">‫استلم في‬</translation>
+ </message>
+ <message>
+ <source>Sent to</source>
+ <translation type="unfinished">أرسل إلى</translation>
+ </message>
+ <message>
+ <source>Mined</source>
+ <translation type="unfinished">‫معدّن‬</translation>
+ </message>
+ <message>
+ <source>Other</source>
+ <translation type="unfinished">أخرى</translation>
+ </message>
+ <message>
+ <source>Enter address, transaction id, or label to search</source>
+ <translation type="unfinished">‫أدخل العنوان أو معرف المعاملة أو المذكرة للبحث‬</translation>
+ </message>
+ <message>
+ <source>Min amount</source>
+ <translation type="unfinished">الحد الأدنى</translation>
+ </message>
+ <message>
+ <source>Range…</source>
+ <translation type="unfinished">نطاق...</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">‫&amp;انسخ العنوان‬</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">‫نسخ &amp;مذكرة‬</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">‫نسخ &amp;القيمة‬</translation>
+ </message>
+ <message>
+ <source>Copy transaction &amp;ID</source>
+ <translation type="unfinished">‫نسخ &amp;معرف العملية‬</translation>
+ </message>
+ <message>
+ <source>Copy &amp;raw transaction</source>
+ <translation type="unfinished">‫نسخ &amp;النص الأصلي للعملية‬</translation>
+ </message>
+ <message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">‫نسخ كامل &amp;تفاصيل العملية‬</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">‫&amp; اظهر تفاصيل العملية‬</translation>
+ </message>
+ <message>
+ <source>Increase transaction &amp;fee</source>
+ <translation type="unfinished">‫زيادة العملية و الرسوم‬</translation>
+ </message>
+ <message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">‫ال&amp;تخلي عن العملية</translation>
+ </message>
+ <message>
+ <source>&amp;Edit address label</source>
+ <translation type="unfinished">و تحرير تسمية العنوان </translation>
+ </message>
+ <message>
+ <source>Show in %1</source>
+ <extracomment>Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</extracomment>
+ <translation type="unfinished">‫عرض في %1</translation>
+ </message>
+ <message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">‫تصدير سجل العمليات التاريخي‬</translation>
+ </message>
+ <message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">ملف القيم المفصولة بفاصلة</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">‫نافذ‬</translation>
+ </message>
+ <message>
+ <source>Watch-only</source>
+ <translation type="unfinished">‫مراقبة فقط‬</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">التاريخ</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">النوع</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">المذكرة</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">العنوان</translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <translation type="unfinished">‫المعرف‬</translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">فشل التصدير</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the transaction history to %1.</source>
+ <translation type="unfinished">‫حدث خطأ أثناء محاولة حفظ سجل العملية التاريخي في %1.‬</translation>
+ </message>
+ <message>
+ <source>Exporting Successful</source>
+ <translation type="unfinished">نجح التصدير</translation>
+ </message>
+ <message>
+ <source>The transaction history was successfully saved to %1.</source>
+ <translation type="unfinished">‫تم حفظ سجل العملية التاريخي بنجاح في %1.‬</translation>
+ </message>
+ <message>
+ <source>Range:</source>
+ <translation type="unfinished">المدى:</translation>
+ </message>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">إلى</translation>
+ </message>
+</context>
+<context>
+ <name>WalletFrame</name>
+ <message>
+ <source>No wallet has been loaded.
+Go to File &gt; Open Wallet to load a wallet.
+- OR -</source>
+ <translation type="unfinished">لم يتم تحميل أي محافظ.
+اذهب الى ملف &gt; فتح محفظة لتحميل محفظة.
+- أو -</translation>
+ </message>
+ <message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">إنشاء محفظة جديدة</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">خطأ</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT from clipboard (invalid base64)</source>
+ <translation type="unfinished">‫تعذر قراءة وتحليل ترميز PSBT من الحافظة (base64 غير صالح)‬</translation>
+ </message>
+ <message>
+ <source>Load Transaction Data</source>
+ <translation type="unfinished">‫تحميل بيانات العملية‬</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (*.psbt)</source>
+ <translation type="unfinished">معاملة موقعة جزئيا (psbt.*)</translation>
+ </message>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">ملف PSBT يجب أن يكون أصغر من 100 ميجابايت</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">‫غير قادر على قراءة وتحليل ترميز PSBT‬</translation>
+ </message>
+</context>
+<context>
+ <name>WalletModel</name>
+ <message>
+ <source>Send Coins</source>
+ <translation type="unfinished">‫إرسال وحدات البتكوين‬</translation>
+ </message>
+ <message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">خطأ في زيادة الرسوم</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">فشل في زيادة رسوم العملية</translation>
+ </message>
+ <message>
+ <source>Do you want to increase the fee?</source>
+ <extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
+ <translation type="unfinished">هل تريد زيادة الرسوم؟</translation>
+ </message>
+ <message>
+ <source>Current fee:</source>
+ <translation type="unfinished">‫الرسوم الان:‬</translation>
+ </message>
+ <message>
+ <source>Increase:</source>
+ <translation type="unfinished">زيادة:</translation>
+ </message>
+ <message>
+ <source>New fee:</source>
+ <translation type="unfinished">‫رسم جديد:‬</translation>
+ </message>
+ <message>
+ <source>Confirm fee bump</source>
+ <translation type="unfinished">تأكيد زيادة الرسوم</translation>
+ </message>
+ <message>
+ <source>Can't draft transaction.</source>
+ <translation type="unfinished">لا يمكن صياغة المعاملة</translation>
+ </message>
+ <message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">تم نسخ PSBT</translation>
+ </message>
+ <message>
+ <source>Can't sign transaction.</source>
+ <translation type="unfinished">لا يمكن توقيع المعاملة.</translation>
+ </message>
+ <message>
+ <source>Could not commit transaction</source>
+ <translation type="unfinished">لا يمكن تنفيذ المعاملة</translation>
+ </message>
+ <message>
+ <source>Can't display address</source>
+ <translation type="unfinished">لا يمكن عرض العنوان </translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">‫محفظة افتراضية‬</translation>
+ </message>
+</context>
+<context>
+ <name>WalletView</name>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;تصدير</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">صدّر البيانات في التبويب الحالي الى ملف</translation>
+ </message>
+ <message>
+ <source>Backup Wallet</source>
+ <translation type="unfinished">‫انسخ المحفظة احتياطيا‬</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">بيانات المحفظة</translation>
+ </message>
+ <message>
+ <source>Backup Failed</source>
+ <translation type="unfinished">‫تعذر النسخ الاحتياطي‬</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the wallet data to %1.</source>
+ <translation type="unfinished">لقد حدث خطأ أثناء محاولة حفظ بيانات المحفظة الى %1.</translation>
+ </message>
+ <message>
+ <source>Backup Successful</source>
+ <translation type="unfinished">‫نجح النسخ الاحتياطي‬</translation>
+ </message>
+ <message>
+ <source>The wallet data was successfully saved to %1.</source>
+ <translation type="unfinished">تم حفظ بيانات المحفظة بنجاح إلى %1.</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">إلغاء</translation>
+ </message>
+</context>
+<context>
+ <name>bitcoin-core</name>
+ <message>
+ <source>The %s developers</source>
+ <translation type="unfinished">%s المبرمجون</translation>
+ </message>
+ <message>
+ <source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
+ <translation type="unfinished">‫‫%s مشكل. حاول استخدام أداة محفظة البتكوين للاصلاح أو استعادة نسخة احتياطية.‬</translation>
+ </message>
+ <message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%sفشل في التحقق من صحة حالة اللقطة -assumeutxo. يشير هذا إلى وجود مشكلة في الأجهزة، أو خطأ في البرنامج، أو تعديل سيء في البرنامج يسمح بتحميل لقطة غير صالحة. ونتيجة لذلك، سيتم إيقاف تشغيل العقدة والتوقف عن استخدام أي حالة تم إنشاؤها في اللقطة، مما يؤدي إلى إعادة ضبط ارتفاع السلسلة من%dإلى %d. في عملية إعادة التشغيل التالية، ستستأنف العقدة المزامنة من %dدون استخدام أي بيانات لقطة. الرجاء الإبلاغ عن هذه الحادثة إلى %s، بما في ذلك كيفية حصولك على اللقطة. سيتم ترك حالة سلسلة اللقطة غير الصالحة على القرص في حال كان ذلك مفيدًا في تشخيص المشكلة التي تسببت في هذا الخطأ.</translation>
+ </message>
+ <message>
+ <source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
+ <translation type="unfinished">‫لا يمكن استرجاع إصدار المحفظة من %i الى %i. لم يتغير إصدار المحفظة.‬</translation>
+ </message>
+ <message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">‫لا يمكن اقفال المجلد %s. من المحتمل أن %s يعمل بالفعل.‬</translation>
+ </message>
+ <message>
+ <source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
+ <translation type="unfinished">موزع بموجب ترخيص برامج MIT ، راجع الملف المصاحب %s أو %s</translation>
+ </message>
+ <message>
+ <source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
+ <translation type="unfinished">‫خطأ في قراءة %s بيانات العملية قد تكون مفقودة أو غير صحيحة. اعادة فحص المحفظة.‬</translation>
+ </message>
+ <message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">الملف %s موجود مسبقا , اذا كنت متأكدا من المتابعة يرجى ابعاده للاستمرار.</translation>
+ </message>
+ <message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">رجاء تأكد من أن التاريخ والوقت في حاسوبك صحيحان! اذا كانت ساعتك خاطئة، %s لن يعمل بصورة صحيحة.</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">يرجى المساهمة إذا وجدت %s مفيداً. تفضل بزيارة %s لمزيد من المعلومات حول البرنامج.</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">‫الاختصار أقل من الحد الأدنى %d ميجابايت. من فضلك ارفع الحد.‬</translation>
+ </message>
+ <message>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation type="unfinished">‫الاختصار: اخر مزامنة للمحفظة كانت قبل البيانات المختصرة. تحتاج الى - اعادة فهرسة (قم بتنزيل الطوابق المتتالية بأكملها مرة أخرى في حال تم اختصار النود)‬</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
+ <translation type="unfinished">SQLiteDatabase: اصدار مخطط لمحفظة sqlite غير معروف %d. فقط اصدار %d مدعوم.</translation>
+ </message>
+ <message>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation type="unfinished">‫قاعدة بيانات الطوابق تحتوي على طابق مستقبلي كما يبدو. قد يكون هذا بسبب أن التاريخ والوقت في جهازك لم يضبطا بشكل صحيح. قم بإعادة بناء قاعدة بيانات الطوابق في حال كنت متأكدا من أن التاريخ والوقت قد تم ضبطهما بشكل صحيح‬</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation type="unfinished">قيمة المعاملة صغيرة جدًا ولا يمكن إرسالها بعد خصم الرسوم</translation>
+ </message>
+ <message>
+ <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
+ <translation type="unfinished">‫هذه بناء برمجي تجريبي - استخدمه على مسؤوليتك الخاصة - لا تستخدمه للتعدين أو التجارة‬</translation>
+ </message>
+ <message>
+ <source>This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
+ <translation type="unfinished">‫هذا هو الحد الاعلى للرسوم التي تدفعها (بالاضافة للرسوم العادية) لتفادي الدفع الجزئي واعطاء أولوية لاختيار الوحدات.‬</translation>
+ </message>
+ <message>
+ <source>This is the transaction fee you may discard if change is smaller than dust at this level</source>
+ <translation type="unfinished">هذه رسوم المعاملة يمكنك التخلص منها إذا كان المبلغ أصغر من الغبار عند هذا المستوى</translation>
+ </message>
+ <message>
+ <source>This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation type="unfinished">هذه هي رسوم المعاملة التي قد تدفعها عندما تكون عملية حساب الرسوم غير متوفرة.</translation>
+ </message>
+ <message>
+ <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
+ <translation type="unfinished">‫صيغة ملف المحفظة غير معروفة “%s”. الرجاء تقديم اما “bdb” أو “sqlite”.‬</translation>
+ </message>
+ <message>
+ <source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
+ <translation type="unfinished">‫تم انشاء المحفظة بنجاح. سيتم الغاء العمل بنوعية المحافظ القديمة ولن يتم دعم انشاءها أو فتحها مستقبلا.‬</translation>
+ </message>
+ <message>
+ <source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
+ <translation type="unfinished">‫تحذير: تم اكتشاف مفاتيح خاصة في المحفظة {%s} رغم أن خيار التعامل مع المفاتيح الخاصة معطل‬} مع مفاتيح خاصة موقفة. </translation>
+ </message>
+ <message>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">‫تحذير: لا يبدو أننا نتفق تمامًا مع أقراننا! قد تحتاج إلى الترقية ، أو قد تحتاج الأنواد الأخرى إلى الترقية.‬</translation>
+ </message>
+ <message>
+ <source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
+ <translation type="unfinished">‫تحتاج إلى إعادة إنشاء قاعدة البيانات باستخدام -reindex للعودة إلى الوضعية النود الكامل. هذا سوف يعيد تحميل الطوابق المتتالية بأكملها‬</translation>
+ </message>
+ <message>
+ <source>%s is set very high!</source>
+ <translation type="unfinished">ضبط %s مرتفع جدا!‬</translation>
+ </message>
+ <message>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation type="unfinished">‫-الحد الأقصى لتجمع الذاكرة %d ميجابايت‬ على الأقل</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">‫حدث خطأ داخلي شديد، راجع ملف تصحيح الأخطاء للتفاصيل‬</translation>
+ </message>
+ <message>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation type="unfinished">لا يمكن الحل - %s العنوان: '%s'</translation>
+ </message>
+ <message>
+ <source>Cannot write to data directory '%s'; check permissions.</source>
+ <translation type="unfinished">‫لايمكن الكتابة في المجلد '%s'؛ تحقق من الصلاحيات.‬</translation>
+ </message>
+ <message>
+ <source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
+ <translation type="unfinished">‫فشل في إعادة تسمية ملف invalid peers.dat. يرجى نقله أو حذفه وحاول مرة أخرى.‬</translation>
+ </message>
+ <message>
+ <source>Config setting for %s only applied on %s network when in [%s] section.</source>
+ <translation type="unfinished">يتم تطبيق إعداد التكوين لـ%s فقط على شبكة %s في قسم [%s].</translation>
+ </message>
+ <message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">حقوق الطبع والنشر (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">‫تم الكشف عن قاعدة بيانات طوابق تالفة‬</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">تعذر العثور على ملف asmap %s</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">تعذر تحليل ملف asmap %s</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">‫تحذير: مساحة التخزين منخفضة!‬</translation>
+ </message>
+ <message>
+ <source>Do you want to rebuild the block database now?</source>
+ <translation type="unfinished">‫هل تريد إعادة بناء قاعدة بيانات الطوابق الآن؟‬</translation>
+ </message>
+ <message>
+ <source>Done loading</source>
+ <translation type="unfinished">إنتهاء التحميل</translation>
+ </message>
+ <message>
+ <source>Dump file %s does not exist.</source>
+ <translation type="unfinished">‫ملف الاسقاط %s غير موجود.‬</translation>
+ </message>
+ <message>
+ <source>Error creating %s</source>
+ <translation type="unfinished">خطأ في إنشاء %s</translation>
+ </message>
+ <message>
+ <source>Error loading %s</source>
+ <translation type="unfinished">خطأ في تحميل %s</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Private keys can only be disabled during creation</source>
+ <translation type="unfinished">‫خطأ في تحميل %s: يمكن تعطيل المفاتيح الخاصة أثناء الانشاء فقط‬</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation type="unfinished">خطأ في التحميل %s: المحفظة تالفة.</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation type="unfinished">‫خطأ في تحميل %s: المحفظة تتطلب الاصدار الجديد من %s‬</translation>
+ </message>
+ <message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">‫خطأ في تحميل قاعدة بيانات الطوابق‬</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">‫خطأ في فتح قاعدة بيانات الطوابق‬</translation>
+ </message>
+ <message>
+ <source>Error reading from database, shutting down.</source>
+ <translation type="unfinished">‫خطأ في القراءة من قاعدة البيانات ، يجري التوقف.‬</translation>
+ </message>
+ <message>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">خطأ قراءة السجل التالي من قاعدة بيانات المحفظة</translation>
+ </message>
+ <message>
+ <source>Error: Couldn't create cursor into database</source>
+ <translation type="unfinished">‫خطأ : لم نتمكن من انشاء علامة فارقة (cursor) في قاعدة البيانات‬</translation>
+ </message>
+ <message>
+ <source>Error: Disk space is low for %s</source>
+ <translation type="unfinished">‫خطأ : مساحة التخزين منخفضة ل %s</translation>
+ </message>
+ <message>
+ <source>Error: Failed to create new watchonly wallet</source>
+ <translation type="unfinished">‫خطأ: فشل انشاء محفظة المراقبة فقط الجديدة‬</translation>
+ </message>
+ <message>
+ <source>Error: Got key that was not hex: %s</source>
+ <translation type="unfinished">‫خطأ: المفتاح ليس في صيغة ست عشرية: %s</translation>
+ </message>
+ <message>
+ <source>Error: Got value that was not hex: %s</source>
+ <translation type="unfinished">‫خطأ: القيمة ليست في صيغة ست عشرية: %s</translation>
+ </message>
+ <message>
+ <source>Error: Missing checksum</source>
+ <translation type="unfinished">خطأ : مجموع اختباري مفقود </translation>
+ </message>
+ <message>
+ <source>Error: No %s addresses available.</source>
+ <translation type="unfinished">‫خطأ : لا يتوفر %s عناوين.‬</translation>
+ </message>
+ <message>
+ <source>Error: Unable to begin reading all records in the database</source>
+ <translation type="unfinished">‫خطأ: غير قادر على قراءة السجلات في قاعدة البيانات‬</translation>
+ </message>
+ <message>
+ <source>Error: Unable to make a backup of your wallet</source>
+ <translation type="unfinished">‫خطأ: غير قادر النسخ الاحتياطي للمحفظة‬</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read all records in the database</source>
+ <translation type="unfinished">‫خطأ: غير قادر على قراءة السجلات في قاعدة البيانات‬</translation>
+ </message>
+ <message>
+ <source>Error: Unable to remove watchonly address book data</source>
+ <translation type="unfinished">‫خطأ: غير قادر على ازالة عناوين المراقبة فقط من السجل‬</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write record to new wallet</source>
+ <translation type="unfinished">خطأ : لا يمكن كتابة السجل للمحفظة الجديدة</translation>
+ </message>
+ <message>
+ <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
+ <translation type="unfinished">فشل في الاستماع على أي منفذ. استخدام الاستماع = 0 إذا كنت تريد هذا.</translation>
+ </message>
+ <message>
+ <source>Failed to rescan the wallet during initialization</source>
+ <translation type="unfinished">‫فشلت عملية اعادة تفحص وتدقيق المحفظة أثناء التهيئة‬</translation>
+ </message>
+ <message>
+ <source>Failed to verify database</source>
+ <translation type="unfinished">فشل في التحقق من قاعدة البيانات</translation>
+ </message>
+ <message>
+ <source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
+ <translation type="unfinished">‫معدل الرسوم (%s) أقل من الحد الادنى لاعدادات معدل الرسوم (%s)‬</translation>
+ </message>
+ <message>
+ <source>Ignoring duplicate -wallet %s.</source>
+ <translation type="unfinished">‫تجاهل المحفظة المكررة %s.‬</translation>
+ </message>
+ <message>
+ <source>Importing…</source>
+ <translation type="unfinished">‫الاستيراد…‬</translation>
+ </message>
+ <message>
+ <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
+ <translation type="unfinished">‫لم يتم العثور على طابق الأساس أو المعلومات غير صحيحة. مجلد بيانات خاطئ للشبكة؟‬</translation>
+ </message>
+ <message>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <translation type="unfinished">‫فشل التحقق من اختبار التعقل. تم إيقاف %s.</translation>
+ </message>
+ <message>
+ <source>Input not found or already spent</source>
+ <translation type="unfinished">‫المدخلات غير موجودة أو تم صرفها‬</translation>
+ </message>
+ <message>
+ <source>Insufficient funds</source>
+ <translation type="unfinished">الرصيد غير كافي</translation>
+ </message>
+ <message>
+ <source>Invalid -onion address or hostname: '%s'</source>
+ <translation type="unfinished">عنوان اونيون غير صحيح : '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid P2P permission: '%s'</source>
+ <translation type="unfinished">‫إذن القرين للقرين غير صالح: ‘%s’‬</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">‫قيمة غير صحيحة‬ ل - %s=&lt;amount&gt;:"%s"</translation>
+ </message>
+ <message>
+ <source>Loading P2P addresses…</source>
+ <translation type="unfinished">تحميل عناوين P2P....</translation>
+ </message>
+ <message>
+ <source>Loading banlist…</source>
+ <translation type="unfinished">تحميل قائمة الحظر</translation>
+ </message>
+ <message>
+ <source>Loading block index…</source>
+ <translation type="unfinished">‫تحميل فهرس الطابق…‬</translation>
+ </message>
+ <message>
+ <source>Loading wallet…</source>
+ <translation type="unfinished">‫تحميل المحفظة…‬</translation>
+ </message>
+ <message>
+ <source>Missing amount</source>
+ <translation type="unfinished">‫يفتقد القيمة‬</translation>
+ </message>
+ <message>
+ <source>Not enough file descriptors available.</source>
+ <translation type="unfinished">لا تتوفر واصفات ملفات كافية.</translation>
+ </message>
+ <message>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation type="unfinished">‫لا يمكن ضبط الاختصار بقيمة سالبة.‬</translation>
+ </message>
+ <message>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation type="unfinished">‫وضع الاختصار غير متوافق مع -txindex.‬</translation>
+ </message>
+ <message>
+ <source>Replaying blocks…</source>
+ <translation type="unfinished">‫إستعادة الطوابق…‬</translation>
+ </message>
+ <message>
+ <source>Rescanning…</source>
+ <translation type="unfinished">‫إعادة التفحص والتدقيق…‬</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Failed to execute statement to verify database: %s</source>
+ <translation type="unfinished">‫‫SQLiteDatabase: فشل في تنفيذ الامر لتوثيق قاعدة البيانات: %s</translation>
+ </message>
+ <message>
+ <source>Section [%s] is not recognized.</source>
+ <translation type="unfinished">لم يتم التعرف على القسم [%s]</translation>
+ </message>
+ <message>
+ <source>Signing transaction failed</source>
+ <translation type="unfinished">فشل توقيع المعاملة</translation>
+ </message>
+ <message>
+ <source>Specified -walletdir "%s" does not exist</source>
+ <translation type="unfinished">‫مجلد المحفظة المحددة "%s" غير موجود</translation>
+ </message>
+ <message>
+ <source>Specified -walletdir "%s" is a relative path</source>
+ <translation type="unfinished">‫مسار مجلد المحفظة المحدد "%s" مختصر ومتغير‬</translation>
+ </message>
+ <message>
+ <source>The source code is available from %s.</source>
+ <translation type="unfinished">شفرة المصدر متاحة من %s.</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation type="unfinished">‫قيمة المعاملة صغيرة جدا ولا تكفي لدفع الرسوم‬</translation>
+ </message>
+ <message>
+ <source>The wallet will avoid paying less than the minimum relay fee.</source>
+ <translation type="unfinished">‫سوف تتجنب المحفظة دفع رسوم أقل من الحد الأدنى للتوصيل.‬</translation>
+ </message>
+ <message>
+ <source>This is experimental software.</source>
+ <translation type="unfinished">هذا برنامج تجريبي.</translation>
+ </message>
+ <message>
+ <source>This is the minimum transaction fee you pay on every transaction.</source>
+ <translation type="unfinished">هذه هي اقل قيمة من العمولة التي تدفعها عند كل عملية تحويل للأموال.</translation>
+ </message>
+ <message>
+ <source>This is the transaction fee you will pay if you send a transaction.</source>
+ <translation type="unfinished">‫هذه هي رسوم ارسال العملية التي ستدفعها إذا قمت بارسال العمليات.‬</translation>
+ </message>
+ <message>
+ <source>Transaction amount too small</source>
+ <translation type="unfinished">قيمة العملية صغيره جدا</translation>
+ </message>
+ <message>
+ <source>Transaction amounts must not be negative</source>
+ <translation type="unfinished">‫يجب ألا تكون قيمة العملية بالسالب‬</translation>
+ </message>
+ <message>
+ <source>Transaction must have at least one recipient</source>
+ <translation type="unfinished">يجب أن تحتوي المعاملة على مستلم واحد على الأقل</translation>
+ </message>
+ <message>
+ <source>Transaction needs a change address, but we can't generate it.</source>
+ <translation type="unfinished">‫العملية تتطلب عنوان فكة ولكن لم نتمكن من توليد العنوان.‬</translation>
+ </message>
+ <message>
+ <source>Transaction too large</source>
+ <translation type="unfinished">المعاملة كبيرة جدا</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer (bind returned error %s)</source>
+ <translation type="unfinished">يتعذر الربط مع %s على هذا الكمبيوتر (الربط انتج خطأ %s)</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation type="unfinished">تعذر الربط مع %s على هذا الكمبيوتر. %s على الأغلب يعمل مسبقا.</translation>
+ </message>
+ <message>
+ <source>Unable to generate initial keys</source>
+ <translation type="unfinished">غير قادر على توليد مفاتيح أولية</translation>
+ </message>
+ <message>
+ <source>Unable to generate keys</source>
+ <translation type="unfinished"> غير قادر على توليد مفاتيح</translation>
+ </message>
+ <message>
+ <source>Unable to open %s for writing</source>
+ <translation type="unfinished">غير قادر على فتح %s للكتابة </translation>
+ </message>
+ <message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation type="unfinished">غير قادر على بدء خادم ال HTTP. راجع سجل تصحيح الأخطاء للحصول على التفاصيل.</translation>
+ </message>
+ <message>
+ <source>Unknown -blockfilterindex value %s.</source>
+ <translation type="unfinished">‫قيمة -blockfilterindex  مجهولة %s.‬</translation>
+ </message>
+ <message>
+ <source>Unknown address type '%s'</source>
+ <translation type="unfinished">عنوان غير صحيح : '%s'</translation>
+ </message>
+ <message>
+ <source>Unknown network specified in -onlynet: '%s'</source>
+ <translation type="unfinished">شبكة مجهولة عرفت حددت في -onlynet: '%s'</translation>
+ </message>
+ <message>
+ <source>Verifying blocks…</source>
+ <translation type="unfinished">جار التحقق من الطوابق...</translation>
+ </message>
+ <message>
+ <source>Verifying wallet(s)…</source>
+ <translation type="unfinished"> التحقق من المحافظ ....</translation>
+ </message>
+ <message>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
+ <translation type="unfinished">يجب إعادة كتابة المحفظة: يلزم إعادة التشغيل %s لإكمال العملية</translation>
+ </message>
+ <message>
+ <source>Settings file could not be read</source>
+ <translation type="unfinished">‫ملف الاعدادات لا يمكن قراءته‬</translation>
+ </message>
+ <message>
+ <source>Settings file could not be written</source>
+ <translation type="unfinished">‫لم نتمكن من كتابة ملف الاعدادات‬</translation>
+ </message>
+</context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_az.ts b/src/qt/locale/bitcoin_az.ts
index 36fd19df49..3bba7a2b40 100644
--- a/src/qt/locale/bitcoin_az.ts
+++ b/src/qt/locale/bitcoin_az.ts
@@ -2,10 +2,6 @@
<context>
<name>AddressBookPage</name>
<message>
- <source>Right-click to edit address or label</source>
- <translation type="unfinished">Ünvana və ya etiketə düzəliş etmək üçün sağ düyməni klikləyin</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation type="unfinished">Yeni ünvan yaradın</translation>
</message>
diff --git a/src/qt/locale/bitcoin_bg.ts b/src/qt/locale/bitcoin_bg.ts
index be3c7a884f..7eefe113ce 100644
--- a/src/qt/locale/bitcoin_bg.ts
+++ b/src/qt/locale/bitcoin_bg.ts
@@ -93,6 +93,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Получи се грешка при запазването на листа с адреси към %1. Моля опитайте пак.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Изпращащ адрес - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Получаващ адрес - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Изнасянето се провали</translation>
</message>
@@ -687,6 +695,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Затвори всички портфейли</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Мигрирайте портфейла</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Мигрирайте портфейл</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Покажи %1 помощно съобщение за да получиш лист с възможни Биткойн команди</translation>
</message>
@@ -783,6 +799,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Разреши мрежова активност</translation>
</message>
<message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Предварителна синхронизация на Headers (%1%)…</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Грешка при създаването на портфейл</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Грешка: %1</translation>
</message>
@@ -1044,6 +1068,37 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Мигрирайте портфейла</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Сигурни ли сте, че желаете да мигрирате портфейла &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Мигрирайте портфейла</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Миграция на портфейла &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Портфейлът "%1" беше мигриран успешно.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Грешка при миграцията</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Миграцията е успешна</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1126,6 +1181,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Създайте портфейл</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Вие сте само на крачка от създаването на вашия нов портфейл!</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Име на портфейл</translation>
</message>
@@ -1677,10 +1736,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Дали да покаже възможностите за контрол на монетите или не.</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Моноширинен шрифт в раздела Общ преглед:</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">ОК</translation>
</message>
diff --git a/src/qt/locale/bitcoin_bn.ts b/src/qt/locale/bitcoin_bn.ts
index e8e98a510f..f4cdcd1a4b 100644
--- a/src/qt/locale/bitcoin_bn.ts
+++ b/src/qt/locale/bitcoin_bn.ts
@@ -59,7 +59,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">কমা দিয়ে আলাদা করা ফাইল</translation>
</message>
- </context>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">রপ্তানি ব্যর্থ হয়েছে৷</translation>
+ </message>
+</context>
<context>
<name>AddressTableModel</name>
<message>
@@ -70,7 +74,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Address</source>
<translation type="unfinished">ঠিকানা</translation>
</message>
- </context>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(কোন লেবেল নেই)</translation>
+ </message>
+</context>
<context>
<name>AskPassphraseDialog</name>
<message>
@@ -606,6 +614,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">আইডি</translation>
</message>
<message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">রপ্তানি ব্যর্থ হয়েছে৷</translation>
+ </message>
+ <message>
<source>Exporting Successful</source>
<translation type="unfinished">রপ্তানি সফল হয়েছে</translation>
</message>
diff --git a/src/qt/locale/bitcoin_bs.ts b/src/qt/locale/bitcoin_bs.ts
index a00c5c567b..2667d04cb7 100644
--- a/src/qt/locale/bitcoin_bs.ts
+++ b/src/qt/locale/bitcoin_bs.ts
@@ -1623,10 +1623,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Iznosi transakcija ne smiju biti negativni</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transakcija ima predugačak mempool lanac </translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transakcija mora imati najmanje jednog primaoca</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ca.ts b/src/qt/locale/bitcoin_ca.ts
index 4526bd5a3b..2ea1e0a2a2 100644
--- a/src/qt/locale/bitcoin_ca.ts
+++ b/src/qt/locale/bitcoin_ca.ts
@@ -51,7 +51,7 @@
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">Trieu l'adreça on rebre les monedes</translation>
+ <translation type="unfinished">Trieu l'adreça on rebre les monedes amb</translation>
</message>
<message>
<source>C&amp;hoose</source>
@@ -94,6 +94,14 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">S'ha produït un error en desar la llista d'adreces a %1. Torneu-ho a provar.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Adreces d'enviament - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Adreces de recepció - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">L'exportació ha fallat</translation>
</message>
@@ -216,6 +224,10 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">La contrasenya introduïda per a desxifrar el moneder és incorrecta.</translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">La contrasenya introduïda per a desxifrar la cartera és incorrecta. Conté un caràcter nul (és a dir, un byte zero). Si la contrasenya es va establir amb una versió d'aquest programari anterior a la 25.0, si us plau, torneu-ho a provar només amb els caràcters fins a — però sense incloure — el primer caràcter nul. En cas d'èxit, si us plau, establiu una nova contrasenya per evitar aquest problema en el futur.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">La contrasenya del moneder ha estat canviada correctament.</translation>
</message>
@@ -224,6 +236,10 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Ha fallat el canvi de frase de pas</translation>
</message>
<message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">La contrasenya antiga introduïda per a desxifrar la cartera és incorrecta. Conté un caràcter nul (és a dir, un byte zero). Si la contrasenya es va establir amb una versió d'aquest programari anterior a la 25.0, si us plau, intenta-ho de nou només amb els caràcters fins a — però sense incloure — el primer caràcter nul.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">Avís: Les lletres majúscules estan activades!</translation>
</message>
@@ -242,6 +258,10 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">El fitxer de configuració %1 pot estar corrupte o invàlid.</translation>
+ </message>
+ <message>
<source>Runaway exception</source>
<translation type="unfinished">Excepció fugitiva</translation>
</message>
@@ -646,10 +666,28 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Tanca la cartera</translation>
</message>
<message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Reestablir cartera...</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">Reestablir una cartera des d'un fitxer de còpia de seguretat</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">Tanqueu totes les carteres</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar cartera</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrar una cartera</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Mostra el missatge d'ajuda del %1 per obtenir una llista amb les possibles opcions de línia d'ordres de Bitcoin</translation>
</message>
@@ -675,6 +713,16 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Dades de la cartera</translation>
</message>
<message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">Carregar còpia de seguretat d'una cartera</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Restaurar cartera</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">Nom de la cartera</translation>
@@ -732,6 +780,18 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Habilita l'activitat de la xarxa</translation>
</message>
<message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Pre-sincronitzant capçaleres (%1%)...</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Error al crear la cartera</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">No s'ha pogut crear una nova cartera, el programari s'ha compilat sense suport per a SQLite (necessari per a les carteres de descriptors)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Avís: %1</translation>
</message>
@@ -894,6 +954,10 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Copia la &amp;quantitat</translation>
</message>
<message>
+ <source>Copy transaction &amp;ID and output index</source>
+ <translation type="unfinished">Copiar &amp;ID de transacció i índex de sortida</translation>
+ </message>
+ <message>
<source>L&amp;ock unspent</source>
<translation type="unfinished">Bl&amp;oqueja sense gastar</translation>
</message>
@@ -966,7 +1030,75 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<source>Can't list signers</source>
<translation type="unfinished">No es poden enumerar signants</translation>
</message>
- </context>
+ <message>
+ <source>Too many external signers found</source>
+ <translation type="unfinished">Massa signants externs trobats</translation>
+ </message>
+</context>
+<context>
+ <name>LoadWalletsActivity</name>
+ <message>
+ <source>Load Wallets</source>
+ <extracomment>Title of progress window which is displayed when wallets are being loaded.</extracomment>
+ <translation type="unfinished">Carregar carteres</translation>
+ </message>
+ <message>
+ <source>Loading wallets…</source>
+ <extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
+ <translation type="unfinished">Carregant carteres...</translation>
+ </message>
+</context>
+<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrar cartera</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Esteu segurs que voleu migrar la cartera &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Migrar la cartera convertirà aquesta cartera en una o més carteres de descriptors. Caldrà fer una nova còpia de seguretat de la cartera.
+Si aquesta cartera conté algun script només per a visualització, es crearà una nova cartera que contingui aquests scripts només per a visualització.
+Si aquesta cartera conté algun script resoluble però no visualitzat, es crearà una cartera diferent i nova que contingui aquests scripts.
+
+El procés de migració crearà una còpia de seguretat de la cartera abans de migrar-la. Aquest fitxer de còpia de seguretat tindrà el nom &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak i es podrà trobar al directori d'aquesta cartera. En cas d'una migració incorrecta, es podrà restaurar la còpia de seguretat mitjançant la funcionalitat "Restaurar cartera".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar cartera</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migrant cartera &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">La cartera '%1' s'ha migrat amb èxit.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Els scripts de només visualització s'han migrat a una nova cartera anomenada '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Els scripts resolubles però no vigilats s'han migrat a una nova cartera anomenada '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migració fallida</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migració exitosa</translation>
+ </message>
+</context>
<context>
<name>OpenWalletActivity</name>
<message>
@@ -993,6 +1125,19 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Restaurar cartera</translation>
+ </message>
+ <message>
+ <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
+ <translation type="unfinished">Restaurant cartera &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ </context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -1538,18 +1683,6 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">Utilitzeu el servidor intermediari SOCKS&amp;5 per a arribar als iguals mitjançant els serveis d'onion de Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Tipus de lletra monoespai a la pestanya Visió general:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">incrustat "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">coincidència més propera "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;D'acord</translation>
</message>
@@ -1751,10 +1884,6 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">PSBT guardada al disc.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">*Envia %1 a %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">adreça pròpia</translation>
</message>
@@ -2678,10 +2807,6 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<translation type="unfinished">Crea una transacció bitcoin parcialment signada (PSBT) per a utilitzar, per exemple, amb una cartera %1 fora de línia o amb una cartera compatible amb PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">de la cartera "%1"</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 a '%2'</translation>
</message>
@@ -3175,10 +3300,6 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<translation type="unfinished">Índex de resultats</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(El certificat no s'ha verificat)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Mercader</translation>
</message>
@@ -4085,10 +4206,6 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<translation type="unfinished">Els imports de la transacció no han de ser negatius</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transacció té massa temps d'una cadena de mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transacció ha de tenir com a mínim un destinatari</translation>
</message>
diff --git a/src/qt/locale/bitcoin_cmn.ts b/src/qt/locale/bitcoin_cmn.ts
index af5cc7059c..d65385fd59 100644
--- a/src/qt/locale/bitcoin_cmn.ts
+++ b/src/qt/locale/bitcoin_cmn.ts
@@ -290,15 +290,45 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">请输入一个比特币地址 (例如 %1)</translation>
+ </message>
+ <message>
+ <source>Unroutable</source>
+ <translation type="unfinished">不可路由</translation>
+ </message>
+ <message>
<source>Inbound</source>
<extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
<message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
+ </message>
+ <message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
<translation type="unfinished">区块转发</translation>
@@ -309,6 +339,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手册</translation>
</message>
<message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation type="unfinished">%1 天</translation>
+ </message>
+ <message>
<source>%1 h</source>
<translation type="unfinished">%1 小时</translation>
</message>
@@ -317,6 +361,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">%1 分</translation>
</message>
<message>
+ <source>%1 s</source>
+ <translation type="unfinished">%1 秒</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
<source>N/A</source>
<translation type="unfinished">未知</translation>
</message>
@@ -784,12 +836,24 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">警告: %1</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">日期: %1
+</translation>
+ </message>
+ <message>
<source>Amount: %1
</source>
<translation type="unfinished">金額: %1
</translation>
</message>
<message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">錢包: %1
+</translation>
+ </message>
+ <message>
<source>Type: %1
</source>
<translation type="unfinished">種類: %1
@@ -808,6 +872,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">送出交易</translation>
+ </message>
+ <message>
<source>Incoming transaction</source>
<translation type="unfinished">收款交易</translation>
</message>
@@ -828,6 +896,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;解鎖中&lt;/b&gt;</translation>
</message>
<message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
+ </message>
+ <message>
<source>Original message:</source>
<translation type="unfinished">原消息:</translation>
</message>
@@ -846,10 +918,34 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手动选币</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">总量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組數:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">全(不)选</translation>
+ </message>
+ <message>
<source>Tree mode</source>
<translation type="unfinished">树状模式</translation>
</message>
@@ -862,10 +958,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation type="unfinished">收款标签</translation>
+ </message>
+ <message>
<source>Received with address</source>
<translation type="unfinished">收款地址</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation type="unfinished">复制金额</translation>
</message>
@@ -890,6 +998,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">锁定未花费(&amp;O)</translation>
</message>
<message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">解锁未花费(&amp;U)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -925,7 +1037,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- </context>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(找零)</translation>
+ </message>
+</context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -990,12 +1106,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">仅观察脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> 可解但又未被监视的脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1068,7 +1184,11 @@ The migration process will create a backup of the wallet before migrating. This
<source>Close all wallets</source>
<translation type="unfinished">关闭所有钱包</translation>
</message>
- </context>
+ <message>
+ <source>Are you sure you wish to close all wallets?</source>
+ <translation type="unfinished">您确定想要关闭所有钱包吗?</translation>
+ </message>
+</context>
<context>
<name>CreateWalletDialog</name>
<message>
@@ -1115,6 +1235,10 @@ The migration process will create a backup of the wallet before migrating. This
<source>Make Blank Wallet</source>
<translation type="unfinished">製作空白錢包</translation>
</message>
+ <message>
+ <source>Create</source>
+ <translation type="unfinished">创建</translation>
+ </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -1135,6 +1259,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">跟這個地址清單關聯的地址。只有發送地址能被修改。</translation>
</message>
<message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">地址(&amp;A)</translation>
+ </message>
+ <message>
<source>New sending address</source>
<translation type="unfinished">新建付款地址</translation>
</message>
@@ -1147,6 +1275,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">编辑付款地址</translation>
</message>
<message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">地址“%1”已经存在,它是一个收款地址,标签为“%2”,所以它不能作为一个付款地址被添加进来。</translation>
+ </message>
+ <message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
<translation type="unfinished">输入的地址“%1”已经存在于地址簿中,标签为“%2”。</translation>
</message>
@@ -1166,10 +1298,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">就要產生新的資料目錄。</translation>
</message>
<message>
+ <source>name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
<translation type="unfinished">已經有這個目錄了。如果你要在裡面造出新的目錄的話,請加上 %1.</translation>
</message>
<message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">路径已存在,并且不是一个目录。</translation>
+ </message>
+ <message>
<source>Cannot create data directory here.</source>
<translation type="unfinished">无法在此创建数据目录。</translation>
</message>
@@ -1202,6 +1342,10 @@ The migration process will create a backup of the wallet before migrating. This
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
<translation type="unfinished">此目录中至少会保存 %1 GB 的数据,并且大小还会随着时间增长。</translation>
</message>
+ <message>
+ <source>Approximately %1 GB of data will be stored in this directory.</source>
+ <translation type="unfinished">会在此目录中存储约 %1 GB 的数据。</translation>
+ </message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
@@ -1230,10 +1374,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">欢迎</translation>
</message>
<message>
+ <source>Welcome to %1.</source>
+ <translation type="unfinished">欢迎使用 %1</translation>
+ </message>
+ <message>
<source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
<translation type="unfinished">由于这是第一次启动此程序,您可以选择%1存储数据的位置</translation>
</message>
<message>
+ <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
+ <translation type="unfinished">取消此设置需要重新下载整个区块链。先完整下载整条链再进行修剪会更快。这会禁用一些高级功能。</translation>
+ </message>
+ <message>
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
<translation type="unfinished">當你點擊「確認」,%1會開始下載,並從%3年最早的交易,處裡整個%4區塊鏈(大小:%2GB)</translation>
</message>
@@ -1253,6 +1405,10 @@ The migration process will create a backup of the wallet before migrating. This
<context>
<name>HelpMessageDialog</name>
<message>
+ <source>version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>About %1</source>
<translation type="unfinished">关于 %1</translation>
</message>
@@ -1267,7 +1423,11 @@ The migration process will create a backup of the wallet before migrating. This
<source>%1 is shutting down…</source>
<translation type="unfinished">%1正在关闭...</translation>
</message>
- </context>
+ <message>
+ <source>Do not shut down the computer until this window disappears.</source>
+ <translation type="unfinished">在此窗口消失前不要关闭计算机。</translation>
+ </message>
+</context>
<context>
<name>ModalOverlay</name>
<message>
@@ -1275,6 +1435,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗体</translation>
</message>
<message>
+ <source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
+ <translation type="unfinished">近期交易可能尚未显示,因此当前余额可能不准确。以上信息将在与比特币网络完全同步后更正。详情如下</translation>
+ </message>
+ <message>
+ <source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
+ <translation type="unfinished">尝试使用受未可见交易影响的余额将不被网络接受。</translation>
+ </message>
+ <message>
+ <source>Number of blocks left</source>
+ <translation type="unfinished">剩余区块数量</translation>
+ </message>
+ <message>
<source>Unknown…</source>
<translation type="unfinished">未知...</translation>
</message>
@@ -1283,6 +1455,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">计算中...</translation>
</message>
<message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
<source>Progress</source>
<translation type="unfinished">进度</translation>
</message>
@@ -1291,6 +1467,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">每小时进度增加</translation>
</message>
<message>
+ <source>Estimated time left until synced</source>
+ <translation type="unfinished">预计剩余同步时间</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">隐藏</translation>
</message>
@@ -1313,7 +1493,12 @@ The migration process will create a backup of the wallet before migrating. This
<source>Open bitcoin URI</source>
<translation type="unfinished">打开比特币URI</translation>
</message>
- </context>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+</context>
<context>
<name>OptionsDialog</name>
<message>
@@ -1321,6 +1506,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">選項</translation>
</message>
<message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">主要(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">在登入系统后自动启动 %1</translation>
+ </message>
+ <message>
<source>&amp;Start %1 on system login</source>
<translation type="unfinished">系统登入时启动 %1 (&amp;S)</translation>
</message>
@@ -1329,6 +1522,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">启用区块修剪会显著减小存储交易对磁盘空间的需求。所有的区块仍然会被完整校验。取消这个设置需要重新下载整条区块链。</translation>
</message>
<message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">数据库缓存大小(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">脚本验证线程数(&amp;V)</translation>
+ </message>
+ <message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
<translation type="unfinished">与%1兼容的脚本文件路径(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:恶意软件可以偷币!</translation>
</message>
@@ -1345,6 +1546,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
@@ -1369,6 +1574,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">网络(&amp;N)</translation>
</message>
<message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">将区块存储修剪至(&amp;B)</translation>
+ </message>
+ <message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
<translation type="unfinished">警告:还原此设置需要重新下载整个区块链。</translation>
</message>
@@ -1397,6 +1606,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">启用R&amp;PC服务器</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">钱包(&amp;A)</translation>
+ </message>
+ <message>
<source>Whether to set subtract fee from amount as default or not.</source>
<extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
<translation type="unfinished">是否要默认从金额中减去手续费。</translation>
@@ -1407,10 +1620,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">默认从金额中减去交易手续费(&amp;F)</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation type="unfinished">专家</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">启用手动选币功能(&amp;C)</translation>
+ </message>
+ <message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished">如果您禁止动用尚未确认的找零资金,则一笔交易的找零资金至少需要有1个确认后才能动用。这同时也会影响账户余额的计算。</translation>
</message>
<message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">动用尚未确认的找零资金(&amp;S)</translation>
+ </message>
+ <message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
<translation type="unfinished">启用&amp;PSBT控件</translation>
@@ -1421,10 +1646,26 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">是否要显示PSBT控件</translation>
</message>
<message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">外接簽證設備 (e.g. 硬體錢包)</translation>
+ </message>
+ <message>
<source>&amp;External signer script path</source>
<translation type="unfinished">外部签名器脚本路径(&amp;E)</translation>
</message>
<message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
<source>Accept connections from outside.</source>
<translation type="unfinished">接受外來連線</translation>
</message>
@@ -1441,6 +1682,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">通过 SO&amp;CKS5 代理连接(默认代理):</translation>
</message>
<message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">代理服务器 &amp;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">端口(&amp;P):</translation>
+ </message>
+ <message>
<source>Port of the proxy (e.g. 9050)</source>
<translation type="unfinished">代理伺服器的通訊埠(像是 9050)</translation>
</message>
@@ -1453,6 +1702,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗口(&amp;W)</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">視窗縮到最小後只在通知區顯示圖示。</translation>
</message>
@@ -1465,6 +1722,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">单击关闭按钮时最小化(&amp;I)</translation>
</message>
<message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">显示(&amp;D)</translation>
+ </message>
+ <message>
<source>User Interface &amp;language:</source>
<translation type="unfinished">使用界面語言(&amp;L):</translation>
</message>
@@ -1489,22 +1750,39 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">第三方交易网址(&amp;T)</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">是否显示手动选币功能。</translation>
+ </message>
+ <message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
<translation type="unfinished">连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
+ <source>&amp;OK</source>
+ <translation type="unfinished">确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">取消(&amp;C)</translation>
</message>
<message>
<source>default</source>
<translation type="unfinished">預設值</translation>
</message>
<message>
+ <source>none</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">确认恢复默认设置</translation>
+ </message>
+ <message>
<source>Client restart required to activate changes.</source>
<extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
<translation type="unfinished">需要重新開始客戶端軟體來讓改變生效。</translation>
@@ -1545,7 +1823,15 @@ The migration process will create a backup of the wallet before migrating. This
<source>The configuration file could not be opened.</source>
<translation type="unfinished">无法打开配置文件。</translation>
</message>
- </context>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">此更改需要重启客户端。</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">提供的代理服务器地址无效。</translation>
+ </message>
+</context>
<context>
<name>OptionsModel</name>
<message>
@@ -1564,6 +1850,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">顯示的資訊可能是過期的。跟 Bitcoin 網路的連線建立後,你的錢包會自動和網路同步,但是這個步驟還沒完成。</translation>
</message>
<message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
<source>Available:</source>
<translation type="unfinished">可用金額:</translation>
</message>
@@ -1592,10 +1882,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">餘額</translation>
</message>
<message>
+ <source>Total:</source>
+ <translation type="unfinished">总额:</translation>
+ </message>
+ <message>
<source>Your current total balance</source>
<translation type="unfinished">您当前的总余额</translation>
</message>
<message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">您当前在仅观察观察地址中的余额</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">可动用:</translation>
+ </message>
+ <message>
<source>Recent transactions</source>
<translation type="unfinished">最近的交易</translation>
</message>
@@ -1604,6 +1906,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">仅观察地址的未确认交易</translation>
</message>
<message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">仅观察地址中尚未成熟的挖矿收入余额:</translation>
+ </message>
+ <message>
<source>Current total balance in watch-only addresses</source>
<translation type="unfinished">仅观察地址中的当前总余额</translation>
</message>
@@ -1639,6 +1945,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">關閉</translation>
</message>
<message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">加载交易失败: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">签名交易失败: %1</translation>
+ </message>
+ <message>
<source>Cannot sign inputs while wallet is locked.</source>
<translation type="unfinished">钱包已锁定,无法签名交易输入项。</translation>
</message>
@@ -1651,6 +1965,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">已签名 %1 个交易输入项,但是仍然还有余下的项目需要签名。</translation>
</message>
<message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">成功签名交易。交易已经可以广播。</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">处理交易时遇到未知错误。</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">已复制PSBT到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -1660,6 +1990,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">PSBT已保存到硬盘</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">无法计算交易费用或总交易金额。</translation>
+ </message>
+ <message>
<source>Pays transaction fee: </source>
<translation type="unfinished">支付交易费用:</translation>
</message>
@@ -1688,6 +2030,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">(但这个钱包不能签名交易)</translation>
</message>
<message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(但这个钱包没有正确的密钥)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">交易已经完全签名,可以广播。</translation>
+ </message>
+ <message>
<source>Transaction status is unknown.</source>
<translation type="unfinished">交易状态未知。</translation>
</message>
@@ -1699,6 +2049,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">支付请求出错</translation>
</message>
<message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">无法启动 bitcoin: 协议的“一键支付”处理程序</translation>
+ </message>
+ <message>
<source>URI handling</source>
<translation type="unfinished">URI 處理</translation>
</message>
@@ -1775,7 +2129,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<extracomment>An Inbound Connection from a Peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
- </context>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
@@ -1783,10 +2142,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">复制图像(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">URI 太長,請縮短標籤或訊息文字。</translation>
+ </message>
+ <message>
<source>Error encoding URI into QR Code.</source>
<translation type="unfinished">把 URI 编码成二维码时发生错误。</translation>
</message>
<message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">不支持二维码。</translation>
+ </message>
+ <message>
<source>Save QR Code</source>
<translation type="unfinished">儲存 QR 碼</translation>
</message>
@@ -1811,6 +2182,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">資訊(&amp;I)</translation>
</message>
<message>
+ <source>General</source>
+ <translation type="unfinished">常规</translation>
+ </message>
+ <message>
<source>Datadir</source>
<translation type="unfinished">数据目录</translation>
</message>
@@ -1823,6 +2198,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">区块存储目录</translation>
</message>
<message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">如果要自訂區塊儲存目錄的位置,請使用 '%1' 這個選項來指定新的位置。</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation type="unfinished">啓動時間</translation>
</message>
@@ -1831,6 +2210,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络</translation>
</message>
<message>
+ <source>Name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Number of connections</source>
<translation type="unfinished">連線數</translation>
</message>
@@ -1839,10 +2222,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">區塊鏈</translation>
</message>
<message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">内存池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">当前交易数量</translation>
+ </message>
+ <message>
<source>Memory usage</source>
<translation type="unfinished">内存使用</translation>
</message>
<message>
+ <source>Wallet: </source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
<source>(none)</source>
<translation type="unfinished">(无)</translation>
</message>
@@ -1887,6 +2282,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">会话ID</translation>
</message>
<message>
+ <source>Version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">是否要将交易转发给这个节点。</translation>
</message>
@@ -1895,10 +2294,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">交易转发</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation type="unfinished">起步区块</translation>
+ </message>
+ <message>
<source>Synced Headers</source>
<translation type="unfinished">已同步前導資料</translation>
</message>
<message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">已同步区块</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">最近交易</translation>
</message>
@@ -1953,6 +2360,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">当前区块高度</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">打开当前数据目录中的 %1 调试日志文件。日志文件大的话可能要等上几秒钟。</translation>
+ </message>
+ <message>
<source>Decrease font size</source>
<translation type="unfinished">缩小字体大小</translation>
</message>
@@ -1989,10 +2400,23 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">高带宽</translation>
</message>
<message>
+ <source>Connection Time</source>
+ <translation type="unfinished">连接时间</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">來自這個節點上次成功驗證新區塊已經過的時間</translation>
+ </message>
+ <message>
<source>Last Block</source>
<translation type="unfinished">上一个区块</translation>
</message>
<message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">來自這個節點上次成功驗證新交易進入內存池已經過的時間</translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation type="unfinished">最近送出</translation>
</message>
@@ -2001,6 +2425,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">上次接收</translation>
</message>
<message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping 延时</translation>
+ </message>
+ <message>
<source>The duration of a currently outstanding ping.</source>
<translation type="unfinished">目前这一次 ping 已经过去的时间。</translation>
</message>
@@ -2009,6 +2437,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Ping 等待</translation>
</message>
<message>
+ <source>Min Ping</source>
+ <translation type="unfinished">最小 Ping 值</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">时间偏移</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
<source>&amp;Open</source>
<translation type="unfinished">打开(&amp;O)</translation>
</message>
@@ -2025,6 +2465,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">總計</translation>
</message>
<message>
+ <source>Debug log file</source>
+ <translation type="unfinished">调试日志文件</translation>
+ </message>
+ <message>
<source>Clear console</source>
<translation type="unfinished">清主控台</translation>
</message>
@@ -2062,6 +2506,11 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">出站触须: 短暂,用于测试地址</translation>
</message>
<message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">Outbound 地址取得: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
<source>detecting: peer could be v1 or v2</source>
<extracomment>Explanatory text for "detecting" transport type.</extracomment>
<translation type="unfinished">检测中: 节点可能是v1或是v2</translation>
@@ -2085,15 +2534,35 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">对端选择了我们用于高带宽转发</translation>
</message>
<message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">未選擇高頻寬轉發點</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">复制地址(&amp;C)</translation>
</message>
<message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">断开(&amp;D)</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
<translation type="unfinished">1 小时(&amp;H)</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 周(&amp;W)</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 年(&amp;Y)</translation>
+ </message>
+ <message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
<translation type="unfinished">复制IP/网络掩码(&amp;C)</translation>
@@ -2103,6 +2572,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">解封(&amp;U)</translation>
</message>
<message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">网络活动已禁用</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">不使用任何钱包执行命令</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">使用“%1”钱包执行命令</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2125,6 +2610,10 @@ For more information on using this console, type %6.
<translation type="unfinished">执行中……</translation>
</message>
<message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">經由 %1</translation>
</message>
@@ -2133,6 +2622,10 @@ For more information on using this console, type %6.
<translation type="unfinished">是</translation>
</message>
<message>
+ <source>No</source>
+ <translation type="unfinished">否</translation>
+ </message>
+ <message>
<source>To</source>
<translation type="unfinished">到</translation>
</message>
@@ -2160,6 +2653,10 @@ For more information on using this console, type %6.
<translation type="unfinished">金额(&amp;A):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
<source>&amp;Message:</source>
<translation type="unfinished">訊息(&amp;M):</translation>
</message>
@@ -2168,6 +2665,10 @@ For more information on using this console, type %6.
<translation type="unfinished">可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。</translation>
</message>
<message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">可为新建的收款地址添加一个标签。</translation>
+ </message>
+ <message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
<translation type="unfinished">使用此表单请求付款。所有字段都是&lt;b&gt;可选&lt;/b&gt;的。</translation>
</message>
@@ -2180,10 +2681,18 @@ For more information on using this console, type %6.
<translation type="unfinished">一个关联到新收款地址(被您用来识别发票)的可选标签。它也会被附加到付款请求中。</translation>
</message>
<message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">一条附加到付款请求中的可选消息,可以显示给付款方。</translation>
+ </message>
+ <message>
<source>&amp;Create new receiving address</source>
<translation type="unfinished">&amp;產生新的接收地址</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
<source>Clear</source>
<translation type="unfinished">清空</translation>
</message>
@@ -2204,6 +2713,10 @@ For more information on using this console, type %6.
<translation type="unfinished">从列表中移除选中的条目</translation>
</message>
<message>
+ <source>Remove</source>
+ <translation type="unfinished">移除</translation>
+ </message>
+ <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">複製 &amp;URI</translation>
</message>
@@ -2259,6 +2772,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请求支付至...</translation>
</message>
<message>
+ <source>Address:</source>
+ <translation type="unfinished">地址:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
<source>Label:</source>
<translation type="unfinished">标签:</translation>
</message>
@@ -2279,10 +2800,22 @@ For more information on using this console, type %6.
<translation type="unfinished">複製 &amp;地址</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
<source>&amp;Save Image…</source>
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>Payment information</source>
+ <translation type="unfinished">付款信息</translation>
+ </message>
+ <message>
<source>Request payment to %1</source>
<translation type="unfinished">付款給 %1 的要求</translation>
</message>
@@ -2290,14 +2823,26 @@ For more information on using this console, type %6.
<context>
<name>RecentRequestsTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
<message>
+ <source>(no message)</source>
+ <translation type="unfinished">(无消息)</translation>
+ </message>
+ <message>
<source>(no amount requested)</source>
<translation type="unfinished">(無要求金額)</translation>
</message>
@@ -2325,14 +2870,38 @@ For more information on using this console, type %6.
<translation type="unfinished">金额不足!</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">數量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
<translation type="unfinished">如果這項有打開,但是找零地址是空的或無效,那麼找零會送到一個產生出來的地址去。</translation>
</message>
<message>
+ <source>Custom change address</source>
+ <translation type="unfinished">自定义找零地址</translation>
+ </message>
+ <message>
<source>Transaction Fee:</source>
<translation type="unfinished">交易手续费:</translation>
</message>
@@ -2345,6 +2914,10 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 目前无法进行手续费估计。</translation>
</message>
<message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">每KB</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">隐藏</translation>
</message>
@@ -2357,10 +2930,22 @@ For more information on using this console, type %6.
<translation type="unfinished">自訂:</translation>
</message>
<message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">一次发送给多个收款人</translation>
+ </message>
+ <message>
<source>Add &amp;Recipient</source>
<translation type="unfinished">增加收款人(&amp;R)</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
+ </message>
+ <message>
<source>Choose…</source>
<translation type="unfinished">选择...</translation>
</message>
@@ -2369,18 +2954,54 @@ For more information on using this console, type %6.
<translation type="unfinished">隱藏交易手續費設定</translation>
</message>
<message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">當交易量小於可用區塊空間時,礦工和節點可能會執行最低手續費率限制。 以這個最低費率來支付手續費也是可以的,但請注意,一旦交易需求超出比特幣網路能處理的限度,你的交易可能永遠無法確認。</translation>
+ </message>
+ <message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
<translation type="unfinished">手續費太低的話可能會造成永遠無法確認的交易(請參考提示)</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">确认时间目标:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">启用手续费追加</translation>
+ </message>
+ <message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
<translation type="unfinished">手续费追加(Replace-By-Fee,BIP-125)可以让你在送出交易后继续追加手续费。不用这个功能的话,建议付比较高的手续费来降低交易延迟的风险。</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>Balance:</source>
<translation type="unfinished">餘額:</translation>
</message>
<message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">确认发送操作</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">发送(&amp;E)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -2409,12 +3030,26 @@ For more information on using this console, type %6.
<translation type="unfinished">%1 (%2个块)</translation>
</message>
<message>
- <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">在設備上簽證</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">從錢包 %1</translation>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">請先連接硬體錢包</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">在 選項 -&gt; 錢包 中設定外部簽名器腳本路徑 </translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">创建未签名交易(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2430,6 +3065,10 @@ For more information on using this console, type %6.
<translation type="unfinished">外部签名器失败</translation>
</message>
<message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -2443,6 +3082,10 @@ For more information on using this console, type %6.
<translation type="unfinished">你可以之後再提高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -2458,6 +3101,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请检查您的交易。</translation>
</message>
<message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">没有打上BIP-125手续费追加的标记。</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">總金額</translation>
</message>
@@ -2488,6 +3139,22 @@ For more information on using this console, type %6.
<translation type="unfinished">支付金额必须大于0。</translation>
</message>
<message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">金额超出您的余额。</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">计入 %1 手续费后,金额超出了您的余额。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">发现重复地址:每个地址应该只使用一次。</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">交易创建失败!</translation>
+ </message>
+ <message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">超过 %1 的手续费被视为高得离谱。</translation>
</message>
@@ -2498,10 +3165,18 @@ For more information on using this console, type %6.
</translation>
</message>
<message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">警告:未知的找零地址</translation>
+ </message>
+ <message>
<source>Confirm custom change address</source>
<translation type="unfinished">确认自定义找零地址</translation>
</message>
<message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">你选择的找零地址未被包含在本钱包中,你钱包中的部分或全部金额将被发送至该地址。你确定要这样做吗?</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
@@ -2517,14 +3192,34 @@ For more information on using this console, type %6.
<translation type="unfinished">付給(&amp;T):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
<source>The Bitcoin address to send the payment to</source>
<translation type="unfinished">將支付發送到的比特幣地址給</translation>
</message>
<message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">移除此项</translation>
+ </message>
+ <message>
<source>The amount to send in the selected unit</source>
<translation type="unfinished">用被选单位表示的待发送金额</translation>
</message>
<message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">交易费将从发送金额中扣除。接收人收到的比特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。</translation>
+ </message>
+ <message>
<source>S&amp;ubtract fee from amount</source>
<translation type="unfinished">從付款金額減去手續費(&amp;U)</translation>
</message>
@@ -2571,6 +3266,22 @@ For more information on using this console, type %6.
<translation type="unfinished">您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的比特幣。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。</translation>
</message>
<message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">用来对消息签名的地址</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">在这里输入您想要签名的消息</translation>
+ </message>
+ <message>
<source>Signature</source>
<translation type="unfinished">簽章</translation>
</message>
@@ -2591,10 +3302,18 @@ For more information on using this console, type %6.
<translation type="unfinished">清空所有签名消息栏</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>&amp;Verify Message</source>
<translation type="unfinished">消息验证(&amp;V)</translation>
</message>
<message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">请在下面输入接收者地址、消息(确保换行符、空格符、制表符等完全相同)和签名以验证消息。请仔细核对签名信息,以提防中间人攻击。请注意,这只是证明接收方可以用这个地址签名,它不能证明任何交易的发送人身份!</translation>
+ </message>
+ <message>
<source>The Bitcoin address the message was signed with</source>
<translation type="unfinished">用来签名消息的地址</translation>
</message>
@@ -2611,6 +3330,14 @@ For more information on using this console, type %6.
<translation type="unfinished">驗證這個訊息來確定是用指定的比特幣地址簽名的</translation>
</message>
<message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">验证消息签名(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">清空所有验证消息栏</translation>
+ </message>
+ <message>
<source>Click "Sign Message" to generate signature</source>
<translation type="unfinished">請按一下「簽署訊息」來產生簽章</translation>
</message>
@@ -2627,6 +3354,10 @@ For more information on using this console, type %6.
<translation type="unfinished">找不到与输入地址相关的密钥。</translation>
</message>
<message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">已取消解锁钱包。</translation>
+ </message>
+ <message>
<source>No error</source>
<translation type="unfinished">沒有錯誤</translation>
</message>
@@ -2639,6 +3370,14 @@ For more information on using this console, type %6.
<translation type="unfinished">消息签名失败。</translation>
</message>
<message>
+ <source>Message signed.</source>
+ <translation type="unfinished">消息已签名。</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">签名无法解码。</translation>
+ </message>
+ <message>
<source>Please check the signature and try again.</source>
<translation type="unfinished">请检查签名后重试。</translation>
</message>
@@ -2647,6 +3386,10 @@ For more information on using this console, type %6.
<translation type="unfinished">這個簽章跟訊息的數位摘要不符。</translation>
</message>
<message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">消息验证失败。</translation>
+ </message>
+ <message>
<source>Message verified.</source>
<translation type="unfinished">消息验证成功。</translation>
</message>
@@ -2680,6 +3423,11 @@ For more information on using this console, type %6.
<translation type="unfinished">0/未确认,不在内存池中</translation>
</message>
<message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>%1/unconfirmed</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
<translation type="unfinished">%1 次/未確認</translation>
@@ -2690,10 +3438,18 @@ For more information on using this console, type %6.
<translation type="unfinished">%1 个确认</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Source</source>
<translation type="unfinished">來源</translation>
</message>
<message>
+ <source>Generated</source>
+ <translation type="unfinished">挖矿生成</translation>
+ </message>
+ <message>
<source>From</source>
<translation type="unfinished">來源</translation>
</message>
@@ -2706,6 +3462,10 @@ For more information on using this console, type %6.
<translation type="unfinished">到</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
<source>watch-only</source>
<translation type="unfinished">只能看</translation>
</message>
@@ -2713,6 +3473,10 @@ For more information on using this console, type %6.
<source>label</source>
<translation type="unfinished">标签</translation>
</message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">收入</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -2720,18 +3484,46 @@ For more information on using this console, type %6.
</translation>
</message>
<message>
+ <source>not accepted</source>
+ <translation type="unfinished">未被接受</translation>
+ </message>
+ <message>
+ <source>Debit</source>
+ <translation type="unfinished">支出</translation>
+ </message>
+ <message>
<source>Total debit</source>
<translation type="unfinished">总支出</translation>
</message>
<message>
+ <source>Total credit</source>
+ <translation type="unfinished">总收入</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
<source>Net amount</source>
<translation type="unfinished">淨額</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">备注</translation>
+ </message>
+ <message>
<source>Transaction ID</source>
<translation type="unfinished">交易 ID</translation>
</message>
<message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">交易总大小</translation>
+ </message>
+ <message>
<source>Transaction virtual size</source>
<translation type="unfinished">交易擬真大小</translation>
</message>
@@ -2740,8 +3532,20 @@ For more information on using this console, type %6.
<translation type="unfinished">输出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(證書未驗證)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
+ </message>
+ <message>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">新挖出的比特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">调试信息</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">交易</translation>
</message>
<message>
<source>Inputs</source>
@@ -2755,7 +3559,11 @@ For more information on using this console, type %6.
<source>true</source>
<translation type="unfinished">是</translation>
</message>
- </context>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">否</translation>
+ </message>
+</context>
<context>
<name>TransactionDescDialog</name>
<message>
@@ -2770,6 +3578,10 @@ For more information on using this console, type %6.
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2778,6 +3590,14 @@ For more information on using this console, type %6.
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">未确认</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>Confirming (%1 of %2 recommended confirmations)</source>
<translation type="unfinished">确认中 (推荐 %2个确认,已经有 %1个确认)</translation>
</message>
@@ -2786,6 +3606,18 @@ For more information on using this console, type %6.
<translation type="unfinished">已確認(%1 次)</translation>
</message>
<message>
+ <source>Conflicted</source>
+ <translation type="unfinished">有冲突</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">未成熟 (%1 个确认,将在 %2 个后可用)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">已生成但未被接受</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2822,6 +3654,10 @@ For more information on using this console, type %6.
<translation type="unfinished">收到交易的日期和時間。</translation>
</message>
<message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">交易类型。</translation>
+ </message>
+ <message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
<translation type="unfinished">该交易中是否涉及仅观察地址。</translation>
</message>
@@ -2837,6 +3673,10 @@ For more information on using this console, type %6.
<translation type="unfinished">全部</translation>
</message>
<message>
+ <source>Today</source>
+ <translation type="unfinished">今天</translation>
+ </message>
+ <message>
<source>This week</source>
<translation type="unfinished">這星期</translation>
</message>
@@ -2845,6 +3685,14 @@ For more information on using this console, type %6.
<translation type="unfinished">這個月</translation>
</message>
<message>
+ <source>Last month</source>
+ <translation type="unfinished">上个月</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">今年</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2861,6 +3709,10 @@ For more information on using this console, type %6.
<translation type="unfinished">输入地址、交易ID或标签进行搜索</translation>
</message>
<message>
+ <source>Min amount</source>
+ <translation type="unfinished">最小金额</translation>
+ </message>
+ <message>
<source>Range…</source>
<translation type="unfinished">范围...</translation>
</message>
@@ -2885,10 +3737,22 @@ For more information on using this console, type %6.
<translation type="unfinished">复制原始交易(&amp;R)</translation>
</message>
<message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">複製完整交易明細</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">顯示交易明細</translation>
+ </message>
+ <message>
<source>Increase transaction &amp;fee</source>
<translation type="unfinished">增加矿工费(&amp;F)</translation>
</message>
<message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">放棄交易(&amp;b)</translation>
+ </message>
+ <message>
<source>&amp;Edit address label</source>
<translation type="unfinished">编辑地址标签(&amp;E)</translation>
</message>
@@ -2898,15 +3762,27 @@ For more information on using this console, type %6.
<translation type="unfinished">在 %1中显示</translation>
</message>
<message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">导出交易历史</translation>
+ </message>
+ <message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">逗號分隔文件</translation>
</message>
<message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Watch-only</source>
<translation type="unfinished">只能觀看的</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2942,7 +3818,11 @@ For more information on using this console, type %6.
<source>Range:</source>
<translation type="unfinished">範圍:</translation>
</message>
- </context>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">到</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -2973,7 +3853,15 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Partially Signed Transaction (*.psbt)</source>
<translation type="unfinished">部分签名交易 (*.psbt)</translation>
</message>
- </context>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">PSBT文件必须小于100MiB</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">无法解码PSBT</translation>
+ </message>
+</context>
<context>
<name>WalletModel</name>
<message>
@@ -2981,11 +3869,23 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">付款</translation>
</message>
<message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">追加手续费出错</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">追加交易手续费失败</translation>
+ </message>
+ <message>
<source>Do you want to increase the fee?</source>
<extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
<translation type="unfinished">想要提高手續費嗎?</translation>
</message>
<message>
+ <source>Increase:</source>
+ <translation type="unfinished">增加量:</translation>
+ </message>
+ <message>
<source>New fee:</source>
<translation type="unfinished">新的費用:</translation>
</message>
@@ -3002,6 +3902,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">無法草擬交易。</translation>
</message>
<message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">PSBT已複製</translation>
+ </message>
+ <message>
<source>Copied to clipboard</source>
<comment>Fee-bump PSBT saved</comment>
<translation type="unfinished">复制到剪贴板</translation>
@@ -3015,6 +3919,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">沒辦法提交交易</translation>
</message>
<message>
+ <source>Can't display address</source>
+ <translation type="unfinished">無法顯示地址</translation>
+ </message>
+ <message>
<source>default wallet</source>
<translation type="unfinished">默认钱包</translation>
</message>
@@ -3078,6 +3986,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">无法把钱包版本从%i降级到%i。钱包版本未改变。</translation>
</message>
<message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">无法锁定数据目录 %s。%s 可能已经在运行。</translation>
+ </message>
+ <message>
<source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
<translation type="unfinished">无法在不支持“拆分前的密钥池”(pre split keypool)的情况下把“非拆分HD钱包”(non HD split wallet)从版本%i升级到%i。请使用版本号%i,或者压根不要指定版本号。</translation>
</message>
@@ -3102,6 +4014,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误: 转储文件格式不正确。得到是"%s",而预期本应得到的是 "format"。</translation>
</message>
<message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ </message>
+ <message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
<translation type="unfinished">错误: 转储文件版本不被支持。这个版本的 bitcoin-wallet 只支持版本为 1 的转储文件。得到的转储文件版本却是%s</translation>
</message>
@@ -3114,18 +4030,42 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误: 无法为该旧式钱包生成描述符。如果钱包已被加密,请确保提供的钱包加密密码正确。</translation>
</message>
<message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">檔案%s已經存在。 如果你確定這就是你想做的,先把這份檔案移開。</translation>
+ </message>
+ <message>
<source>Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start.</source>
<translation type="unfinished">无效或损坏的peers.dat (%s)。如果你确信这是一个bug,请反馈到%s。作为变通办法,你可以把现有文件 (%s) 移开(重命名、移动或删除),这样就可以在下次启动时创建一个新文件了。</translation>
</message>
<message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">提供多數TOR路由綁定位址。 對自動建立的Tor服務用%s</translation>
+ </message>
+ <message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
<translation type="unfinished">没有提供转储文件。要使用 createfromdump ,必须提供 -dumpfile=&lt;filename&gt;。</translation>
</message>
<message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 dump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
<translation type="unfinished">没有提供钱包格式。要使用 createfromdump ,必须提供 -format=&lt;format&gt;</translation>
</message>
<message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">请检查电脑的日期时间设置是否正确!时间错误可能会导致 %s 运行异常。</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">如果你认为%s对你比较有用的话,请对我们进行一些自愿贡献。请访问%s网站来获取有关这个软件的更多信息。</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">修剪被设置得太小,已经低于最小值%d MiB,请使用更大的数值。</translation>
+ </message>
+ <message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<translation type="unfinished">修剪模式与 -reindex-chainstate 不兼容。请进行一次完整的 -reindex 。</translation>
</message>
@@ -3150,6 +4090,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">扣除手續費後的交易金額太少而不能傳送</translation>
</message>
<message>
+ <source>This error could occur if this wallet was not shutdown cleanly and was last loaded using a build with a newer version of Berkeley DB. If so, please use the software that last loaded this wallet</source>
+ <translation type="unfinished">如果这个钱包之前没有正确关闭,而且上一次是被新版的Berkeley DB加载过,就会发生这个错误。如果是这样,请使用上次加载过这个钱包的那个软件。</translation>
+ </message>
+ <message>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
<translation type="unfinished">這是個還沒發表的測試版本 - 使用請自負風險 - 請不要用來開採或做商業應用</translation>
</message>
@@ -3202,6 +4146,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">警告:在已经禁用私钥的钱包 {%s} 中仍然检测到私钥</translation>
</message>
<message>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">警告:我们和其他节点似乎没达成共识!您可能需要升级,或者就是其他节点可能需要升级。</translation>
+ </message>
+ <message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
<translation type="unfinished">需要验证高度在%d之后的区块见证数据。请使用 -reindex 重新启动。</translation>
</message>
@@ -3218,6 +4166,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">參數 -maxmempool 至少要給 %d 百萬位元組(MB)</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">发生了致命的内部错误,请在debug.log中查看详情</translation>
+ </message>
+ <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">沒辦法解析 -%s 參數指定的地址: '%s'</translation>
</message>
@@ -3360,6 +4312,26 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">对 %s 的配置设置只对 %s 网络生效,如果它位于配置的 [%s] 章节的话</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">版权所有 (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">检测到区块数据库损坏</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">找不到asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">無法解析asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">磁盘空间太低!</translation>
+ </message>
+ <message>
<source>Do you want to rebuild the block database now?</source>
<translation type="unfinished">你想现在就重建区块数据库吗?</translation>
</message>
@@ -3372,6 +4344,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">转储文件 %s 不存在</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">创建%s时出错</translation>
</message>
@@ -3380,6 +4356,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">初始化区块数据库时出错</translation>
</message>
<message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">初始化钱包数据库环境错误 %s!</translation>
+ </message>
+ <message>
<source>Error loading %s</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤</translation>
</message>
@@ -3396,6 +4376,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤: 這個錢包需要新版的 %s</translation>
</message>
<message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">加载区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">打开区块数据库时出错</translation>
+ </message>
+ <message>
<source>Error reading configuration file: %s</source>
<translation type="unfinished">读取配置文件失败: %s</translation>
</message>
@@ -3404,16 +4392,16 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">读取数据库出错,关闭中。</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">從錢包資料庫讀取下一筆記錄時出錯</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -3432,10 +4420,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">錯誤:keypool已用完,請先重新呼叫keypoolrefill</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已经在使用SQLite</translation>
</message>
@@ -3460,6 +4444,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
@@ -3468,6 +4456,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法写入记录到新钱包</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法启动索引,关闭中...</translation>
</message>
@@ -3476,6 +4480,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数据库失败</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手续费率 (%s) 低于最大手续费率设置 (%s)</translation>
</message>
@@ -3644,6 +4652,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">这是你每次交易付款时最少要付的手续费。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amounts must not be negative</source>
<translation type="unfinished">交易金额不不可为负数</translation>
</message>
@@ -3712,6 +4724,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">%s链上acceptstalefeeestimates 不受支持。</translation>
</message>
@@ -3720,6 +4736,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的日志分类 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">用户代理备注(%s)包含不安全的字符。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_cs.ts b/src/qt/locale/bitcoin_cs.ts
index dcebd69839..5f2ffc5bd0 100644
--- a/src/qt/locale/bitcoin_cs.ts
+++ b/src/qt/locale/bitcoin_cs.ts
@@ -1734,18 +1734,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Použít samostatnou SOCKS&amp;5 proxy ke spojení s protějšky přes skryté služby v Toru:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Písmo s pevnou šířkou v panelu Přehled:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">zahrnuto "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">nejbližší shoda "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Budiž</translation>
</message>
@@ -1987,10 +1975,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT uložena na disk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Odešle %1 na %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">vlastní adresa</translation>
</message>
@@ -2998,10 +2982,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Vytvořit částečně podepsanou Bitcoin transakci (Partially Signed Bitcoin Transaction - PSBT) k použtí kupříkladu s offline %1 peněženkou nebo s jinou kompatibilní PSBT hardware peněženkou.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">z peněženky '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 do '%2'</translation>
</message>
@@ -3521,10 +3501,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Pořadí výstupu</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certifikát nebyl ověřen)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Obchodník</translation>
</message>
@@ -4362,14 +4338,6 @@ Nelze obnovit zálohu peněženky.</translation>
<translation type="unfinished">Chyba: Nelze extrahovat cíl z generovaného scriptpubkey</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Chyba: Nelze přidat pouze-sledovací tx do peněženky pro čtení</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Chyba: Nelze odstranit transakce které jsou pouze pro čtení</translation>
- </message>
- <message>
<source>Error: Couldn't create cursor into database</source>
<translation type="unfinished">Chyba: nebylo možno vytvořit kurzor do databáze</translation>
</message>
@@ -4406,10 +4374,6 @@ Nelze obnovit zálohu peněženky.</translation>
<translation type="unfinished">Chyba: Žádné %s adresy nejsou dostupné.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Chyba: Ne všechny pouze-sledovací tx bylo možné smazat</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Chyba: Tato peněženka již používá SQLite</translation>
</message>
@@ -4686,10 +4650,6 @@ Nelze obnovit zálohu peněženky.</translation>
<translation type="unfinished">Výstupní index změny transakce mimo rozsah</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transakce má v transakčním zásobníku příliš dlouhý řetězec</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transakce musí mít alespoň jednoho příjemce</translation>
</message>
diff --git a/src/qt/locale/bitcoin_da.ts b/src/qt/locale/bitcoin_da.ts
index ff71527841..53a4f6a223 100644
--- a/src/qt/locale/bitcoin_da.ts
+++ b/src/qt/locale/bitcoin_da.ts
@@ -1618,18 +1618,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Brug separate SOCKS&amp;5 proxy, for at nå fælle via Tor-onion-tjenester:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Monospaced skrifttype på fanen Oversigt:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">indlejret "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">tættest matchende "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Ok</translation>
</message>
@@ -1851,10 +1839,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT gemt på disk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Sender %1 til %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">egen adresse</translation>
</message>
@@ -2810,10 +2794,6 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<translation type="unfinished">L&amp;av usigneret</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">fra tegnebog '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 til '%2'</translation>
</message>
@@ -3303,10 +3283,6 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<translation type="unfinished">Outputindeks</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(certifikat er ikke verificeret)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Forretningsdrivende</translation>
</message>
@@ -4252,10 +4228,6 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<translation type="unfinished">Transaktions byttepenge outputindeks uden for intervallet</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transaktionen har en for lang hukommelsespuljekæde</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transaktionen skal have mindst én modtager</translation>
</message>
diff --git a/src/qt/locale/bitcoin_de.ts b/src/qt/locale/bitcoin_de.ts
index c231200bb0..e7a3710dfb 100644
--- a/src/qt/locale/bitcoin_de.ts
+++ b/src/qt/locale/bitcoin_de.ts
@@ -263,7 +263,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
<message>
<source>Runaway exception</source>
- <translation type="unfinished">Ausreisser Ausnahme</translation>
+ <translation type="unfinished">Nicht abgefangene Ausnahme</translation>
</message>
<message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
@@ -299,6 +299,18 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">unbekannt</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Eingebettet "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Standard Systemschriftart "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Benutzerdefiniert...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Betrag</translation>
</message>
@@ -1114,12 +1126,12 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">Die Wallet '%1' wurde erfolgreich migriert.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> Watchonly-Skripte wurden in eine neue Wallet mit dem Namen '%1' migriert.</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Nur-beobachten Scripts wurden in eine neue Wallet namens '%1' überführt.</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> Lösbare, aber nicht beobachtete Skripte wurden in eine neue Wallet mit dem Namen '%1' migriert.</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Lösbare aber nicht beobachtete Scripts wurde in eine neue Wallet namens '%1' überführt.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1421,11 +1433,11 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
</message>
<message>
<source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
- <translation type="unfinished">Um diese Einstellung wiederherzustellen, muss die gesamte Blockchain neu heruntergeladen werden. Es ist schneller, die gesamte Chain zuerst herunterzuladen und später zu stutzen. Deaktiviert einige erweiterte Funktionen.</translation>
+ <translation type="unfinished">Um diese Einstellung wiederherzustellen, muss die gesamte Blockchain neu heruntergeladen werden. Es ist schneller, die gesamte Chain zuerst herunterzuladen und später zu kürzen. Deaktiviert einige erweiterte Funktionen.</translation>
</message>
<message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
- <translation type="unfinished">Diese initiale Synchronisation führt zu hoher Last und kann Hardwareprobleme, die bisher nicht aufgetreten sind, bei ihrem Computer verursachen. Jedes Mal, wenn Sie %1 ausführen, wird der Download zum letzten Synchronisationspunkt fortgesetzt.</translation>
+ <translation type="unfinished">Diese initiale Synchronisation führt zu hoher Last und kann Hardwareprobleme, die bisher nicht aufgetreten sind, mit dem Computer verursachen. Jedes Mal, beim %1 ausführen, wird der Download zum letzten Synchronisationspunkt fortgesetzt.</translation>
</message>
<message>
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
@@ -1433,7 +1445,7 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
</message>
<message>
<source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
- <translation type="unfinished">Wenn Sie bewusst den Blockchain-Speicher begrenzen (pruning), müssen die historischen Daten dennoch heruntergeladen und verarbeitet werden. Diese Daten werden aber zu einem späteren Zeitpunkt gelöscht, um die Festplattennutzung niedrig zu halten.</translation>
+ <translation type="unfinished">Wenn man den Blockchain-Speicher begrenzt (pruning), müssen die historischen Daten dennoch heruntergeladen und verarbeitet werden. Diese Daten werden aber zu einem späteren Zeitpunkt gelöscht, um die Festplattennutzung niedrig zu halten.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -1588,6 +1600,10 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">Minimiert die Anwendung anstatt sie zu beenden wenn das Fenster geschlossen wird. Wenn dies aktiviert ist, müssen Sie die Anwendung über "Beenden" im Menü schließen.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Schriftart im Überblicks-Reiter:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Einstellungen in diesem Dialog werden von der Kommandozeile überschrieben:</translation>
</message>
@@ -1736,6 +1752,10 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">Benutzt um Gegenstellen zu erreichen über:</translation>
</message>
<message>
+ <source>&amp;Window</source>
+ <translation type="unfinished">&amp;Programmfenster</translation>
+ </message>
+ <message>
<source>Show the icon in the system tray.</source>
<translation type="unfinished">Zeigt das Symbol in der Leiste an.</translation>
</message>
@@ -1796,18 +1816,6 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">Nutze separaten SOCKS&amp;5-Proxy um Gegenstellen über Tor-Onion-Dienste zu erreichen:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Monospace Font im Übersichtsreiter:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">eingebettet "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">nächstliegende Übereinstimmung "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Abbrechen</translation>
</message>
@@ -2045,8 +2053,8 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">PSBT auf Platte gespeichert.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Sende %1 an %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Schickt %1 an %2</translation>
</message>
<message>
<source>own address</source>
@@ -2655,6 +2663,10 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Strg+P</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Node-Fenster - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Befehl wird mit Wallet "%1" ausgeführt</translation>
</message>
@@ -3115,10 +3127,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Erzeugt eine teilsignierte Bitcoin Transaktion (PSBT) zur Benutzung mit z.B. einem Offline %1 Wallet, oder einem kompatiblen Hardware Wallet.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">von der Wallet '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 an '%2'</translation>
</message>
@@ -3176,6 +3184,10 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Überprüfen Sie bitte Ihr Transaktionsvorhaben. Dadurch wird eine Partiell Signierte Bitcoin-Transaktion (PSBT) erstellt, die Sie speichern oder kopieren und dann z. B. mit einer Offline-Wallet %1 oder einer PSBT-kompatible Hardware-Wallet nutzen können.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 von Wallet '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Möchtest du diese Transaktion erstellen?</translation>
@@ -3632,8 +3644,8 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Ausgabeindex</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Zertifikat wurde nicht verifiziert)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Zertifikat wurde nicht verifiziert)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4054,6 +4066,11 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<translation type="unfinished">Wallet sichern</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Wallet-Daten</translation>
+ </message>
+ <message>
<source>Backup Failed</source>
<translation type="unfinished">Sicherung fehlgeschlagen</translation>
</message>
@@ -4448,6 +4465,10 @@ Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
<translation type="unfinished">Speicherauszugsdatei %sexistiert nicht.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Fehler beim Bestätigen der Datenbanktransaktion für die Entfernung der Wallet-Transaktionen.</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error beim Erstellen von %s</translation>
</message>
@@ -4496,16 +4517,12 @@ Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
<translation type="unfinished">Fehler beim Lesen des nächsten Eintrags aus der Wallet Datenbank</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Fehler: Das Ziel kann nicht aus dem generierten scriptpubkey extrahiert werden</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Fehler: watchonly tx konnte nicht zu watchonly Wallet hinzugefügt werden</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Fehler beim Starten der Datenbanktransaktion für die Entfernung der Wallet-Transaktionen.</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Fehler: Watchonly-Transaktionen konnten nicht gelöscht werden</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Fehler: Das Ziel kann nicht aus dem generierten scriptpubkey extrahiert werden</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4545,10 +4562,6 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Keine %s Adressen verfügbar.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Fehler: Nicht alle nur-beobachten txs konnten gelöscht werden</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Fehler: Diese Wallet verwendet bereits SQLite</translation>
</message>
@@ -4573,6 +4586,10 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Nicht alle Datensätze in der Datenbank können gelesen werden</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Wallet Eintrag für Ort des besten Blocks nicht lesen.</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Fehler: Watchonly-Adressbuchdaten können nicht entfernt werden</translation>
</message>
@@ -4581,6 +4598,22 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Kann neuen Eintrag nicht in Wallet schreiben</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Wallet Eintrag für Ort des besten Blocks nicht schreiben.</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Nur-beobachten-Wallet Eintrag für Ort des besten Blocks nicht schreiben.</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Fehler: Adressbuchkopie für Wallet %s fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Fehler: Datenbank-Transaktion kann für Wallet %s nicht ausgeführt werden.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Fehler: Konnte auf keinem Port hören. Wenn dies so gewünscht wird -listen=0 verwenden.</translation>
</message>
@@ -4597,6 +4630,10 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Verifizierung der Datenbank fehlgeschlagen</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Fehler beim Entfernen der Transaktion: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Der Gebührensatz (%s) ist niedriger als die Mindestgebührensatz (%s) Einstellung.</translation>
</message>
@@ -4818,6 +4855,10 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Dies ist die Gebühr, die beim Senden einer Transaktion fällig wird.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">Transaktion %s gehört nicht zu dieser Wallet</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Transaktionsbetrag zu niedrig</translation>
</message>
@@ -4830,10 +4871,6 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Ausgangsindex des Wechselgelds außerhalb des Bereichs</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Die Speicherpoolkette der Transaktion ist zu lang.</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Die Transaktion muss mindestens einen Empfänger enthalten.</translation>
</message>
@@ -4914,6 +4951,10 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Nicht unterstützte globale Protokollierungsebene %s=%s. Gültige Werte: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Wallet Datei konnte nicht angelegt werden: %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates wird auf der %s Chain nicht unterstützt.</translation>
</message>
@@ -4922,6 +4963,14 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Nicht unterstützte Protokollkategorie %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Fehler: Konnte Nur-beobachten TX %s der Nur-beobachten-Wallet nicht hinzufügen.</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Fehler: Watchonly-Transaktionen konnten nicht gelöscht werden.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Der User Agent Kommentar (%s) enthält unsichere Zeichen.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_de_AT.ts b/src/qt/locale/bitcoin_de_AT.ts
index 8da452d128..72ec23d469 100644
--- a/src/qt/locale/bitcoin_de_AT.ts
+++ b/src/qt/locale/bitcoin_de_AT.ts
@@ -303,6 +303,18 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">unbekannt</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Eingebettet "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Standard Systemschriftart "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Benutzerdefiniert...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Betrag</translation>
</message>
@@ -921,12 +933,12 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">Die Wallet '%1' wurde erfolgreich migriert.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> Watchonly-Skripte wurden in eine neue Wallet mit dem Namen '%1' migriert.</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Nur-beobachten Scripts wurden in eine neue Wallet namens '%1' überführt.</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> Lösbare, aber nicht beobachtete Skripte wurden in eine neue Wallet mit dem Namen '%1' migriert.</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Lösbare aber nicht beobachtete Scripts wurde in eine neue Wallet namens '%1' überführt.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1394,6 +1406,10 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">Minimiert die Anwendung anstatt sie zu beenden wenn das Fenster geschlossen wird. Wenn dies aktiviert ist, müssen Sie die Anwendung über "Beenden" im Menü schließen.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Schriftart im Überblicks-Tab:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Einstellungen in diesem Dialog werden von der Kommandozeile überschrieben:</translation>
</message>
@@ -1606,18 +1622,6 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">Nutze separaten SOCKS&amp;5-Proxy um Gegenstellen über Tor-Onion-Dienste zu erreichen:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Monospace Font im Übersichtsreiter:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">eingebettet "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">nächstliegende Übereinstimmung "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Abbrechen</translation>
</message>
@@ -1855,8 +1859,8 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">PSBT auf Platte gespeichert.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Sende %1 an %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Schickt %1 an %2</translation>
</message>
<message>
<source>own address</source>
@@ -2461,6 +2465,10 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Strg+P</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Node-Fenster - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Befehl wird mit Wallet "%1" ausgeführt</translation>
</message>
@@ -2917,10 +2925,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Erzeugt eine teilsignierte Bitcoin Transaktion (PSBT) zur Benutzung mit z.B. einem Offline %1 Wallet, oder einem kompatiblen Hardware Wallet.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">von der Wallet '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 an '%2'</translation>
</message>
@@ -2978,6 +2982,10 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Überprüfen Sie bitte Ihr Transaktionsvorhaben. Dadurch wird eine Partiell Signierte Bitcoin-Transaktion (PSBT) erstellt, die Sie speichern oder kopieren und dann z. B. mit einer Offline-Wallet %1 oder einer PSBT-kompatible Hardware-Wallet nutzen können.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 von Wallet '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Möchtest du diese Transaktion erstellen?</translation>
@@ -3434,8 +3442,8 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Ausgabeindex</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Zertifikat wurde nicht verifiziert)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Zertifikat wurde nicht verifiziert)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4255,6 +4263,10 @@ Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
<translation type="unfinished">Speicherauszugsdatei %sexistiert nicht.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Fehler beim Bestätigen der Datenbanktransaktion für die Entfernung der Wallet-transaktionen.</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error beim Erstellen von %s</translation>
</message>
@@ -4303,16 +4315,12 @@ Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
<translation type="unfinished">Fehler beim Lesen des nächsten Eintrags aus der Wallet Datenbank</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Fehler: Das Ziel kann nicht aus dem generierten scriptpubkey extrahiert werden</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Fehler: watchonly tx konnte nicht zu watchonly Wallet hinzugefügt werden</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Fehler beim Starten der Datenbanktransaktion für die Entfernung der Wallet-Transaktionen.</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Fehler: Watchonly-Transaktionen konnten nicht gelöscht werden</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Fehler: Das Ziel kann nicht aus dem generierten scriptpubkey extrahiert werden</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4352,10 +4360,6 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Keine %s Adressen verfügbar..</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Fehler: Nicht alle watchonly txs konnten gelöscht werden</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Fehler: Diese Wallet verwendet bereits SQLite</translation>
</message>
@@ -4380,6 +4384,10 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Alle Datensätze in der Datenbank können nicht gelesen werden</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Wallet Eintrag für Ort des besten Blocks nicht lesen.</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Fehler: Watchonly-Adressbuchdaten können nicht entfernt werden</translation>
</message>
@@ -4388,6 +4396,22 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Kann neuen Eintrag nicht in Wallet schreiben</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Wallet Eintrag für Ort des besten Blocks nicht schreiben.</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Nur-beobachten-Wallet Eintrag für Ort des besten Blocks nicht schreiben.</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Fehler: Adressbuchkopie für Wallet %s fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Fehler: Datenbank-Transaktion kann für Wallet %s nicht ausgeführt werden.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Fehler: Es konnte kein Port abgehört werden. Wenn dies so gewünscht wird -listen=0 verwenden.</translation>
</message>
@@ -4404,6 +4428,10 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Verifizierung der Datenbank fehlgeschlagen</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Fehler beim Entfernen der Transaktion: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Der Gebührensatz (%s) ist niedriger als die Mindestgebührensatz (%s) Einstellung.</translation>
</message>
@@ -4625,6 +4653,10 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Dies ist die Gebühr, die beim Senden einer Transaktion fällig wird.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">Transaktion %s gehört nicht zu dieser Brieftasche</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Transaktionsbetrag zu niedrig</translation>
</message>
@@ -4637,10 +4669,6 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Ausgangsindex der Transaktionsänderung außerhalb des Bereichs</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Die Speicherpoolkette der Transaktion ist zu lang.</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Die Transaktion muss mindestens einen Empfänger enthalten.</translation>
</message>
@@ -4721,6 +4749,10 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Nicht unterstützte globale Protokollierungsebene %s=%s. Gültige Werte: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Wallet Datei konnte nicht angelegt werden: %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates wird auf der %s Chain nicht unterstützt.</translation>
</message>
@@ -4729,6 +4761,14 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Nicht unterstützte Protokollkategorie %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Fehler: Konnte Nur-beobachten TX %s der Nur-beobachten-Wallet nicht hinzufügen.</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Fehler: Watchonly-Transaktionen konnten nicht gelöscht werden.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Der User Agent Kommentar (%s) enthält unsichere Zeichen.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_de_CH.ts b/src/qt/locale/bitcoin_de_CH.ts
index de133888c5..2792a1bc98 100644
--- a/src/qt/locale/bitcoin_de_CH.ts
+++ b/src/qt/locale/bitcoin_de_CH.ts
@@ -303,6 +303,18 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">unbekannt</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Eingebettet "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Standard Systemschriftart "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Benutzerdefiniert...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Betrag</translation>
</message>
@@ -921,12 +933,12 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">Die Wallet '%1' wurde erfolgreich migriert.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> Watchonly-Skripte wurden in eine neue Wallet mit dem Namen '%1' migriert.</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Nur-beobachten Scripts wurden in eine neue Wallet namens '%1' überführt.</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> Lösbare, aber nicht beobachtete Skripte wurden in eine neue Wallet mit dem Namen '%1' migriert.</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Lösbare aber nicht beobachtete Scripts wurde in eine neue Wallet namens '%1' überführt.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1394,6 +1406,10 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">Minimiert die Anwendung anstatt sie zu beenden wenn das Fenster geschlossen wird. Wenn dies aktiviert ist, müssen Sie die Anwendung über "Beenden" im Menü schließen.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Schriftart im Überblicks-Tab:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Einstellungen in diesem Dialog werden von der Kommandozeile überschrieben:</translation>
</message>
@@ -1606,18 +1622,6 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">Nutze separaten SOCKS&amp;5-Proxy um Gegenstellen über Tor-Onion-Dienste zu erreichen:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Monospace Font im Übersichtsreiter:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">eingebettet "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">nächstliegende Übereinstimmung "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Abbrechen</translation>
</message>
@@ -1855,8 +1859,8 @@ Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet er
<translation type="unfinished">PSBT auf Platte gespeichert.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Sende %1 an %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Schickt %1 an %2</translation>
</message>
<message>
<source>own address</source>
@@ -2461,6 +2465,10 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Strg+P</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Node-Fenster - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Befehl wird mit Wallet "%1" ausgeführt</translation>
</message>
@@ -2917,10 +2925,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Erzeugt eine teilsignierte Bitcoin Transaktion (PSBT) zur Benutzung mit z.B. einem Offline %1 Wallet, oder einem kompatiblen Hardware Wallet.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">von der Wallet '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 an '%2'</translation>
</message>
@@ -2978,6 +2982,10 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Überprüfen Sie bitte Ihr Transaktionsvorhaben. Dadurch wird eine Partiell Signierte Bitcoin-Transaktion (PSBT) erstellt, die Sie speichern oder kopieren und dann z. B. mit einer Offline-Wallet %1 oder einer PSBT-kompatible Hardware-Wallet nutzen können.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 von Wallet '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Möchtest du diese Transaktion erstellen?</translation>
@@ -3434,8 +3442,8 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Ausgabeindex</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Zertifikat wurde nicht verifiziert)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Zertifikat wurde nicht verifiziert)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4258,6 +4266,10 @@ Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
<translation type="unfinished">Speicherauszugsdatei %sexistiert nicht.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Fehler beim Bestätigen der Datenbanktransaktion für die Entfernung der Wallet-transaktionen.</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error beim Erstellen von %s</translation>
</message>
@@ -4306,16 +4318,12 @@ Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
<translation type="unfinished">Fehler beim Lesen des nächsten Eintrags aus der Wallet Datenbank</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Fehler: Das Ziel kann nicht aus dem generierten scriptpubkey extrahiert werden</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Fehler: watchonly tx konnte nicht zu watchonly Wallet hinzugefügt werden</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Fehler beim Starten der Datenbanktransaktion für die Entfernung der Wallet-Transaktionen.</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Fehler: Watchonly-Transaktionen konnten nicht gelöscht werden</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Fehler: Das Ziel kann nicht aus dem generierten scriptpubkey extrahiert werden</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4355,10 +4363,6 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Keine %s Adressen verfügbar.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Fehler: Nicht alle nur-beobachten txs konnten gelöscht werden</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Fehler: Diese Wallet verwendet bereits SQLite</translation>
</message>
@@ -4383,6 +4387,10 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Nicht alle Datensätze in der Datenbank können gelesen werden</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Wallet Eintrag für Ort des besten Blocks nicht lesen.</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Fehler: Watchonly-Adressbuchdaten konnten nicht entfernt werden</translation>
</message>
@@ -4391,6 +4399,22 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Kann neuen Eintrag nicht in Wallet schreiben</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Wallet Eintrag für Ort des besten Blocks nicht schreiben.</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Nur-beobachten-Wallet Eintrag für Ort des besten Blocks nicht schreiben.</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Fehler: Adressbuchkopie für Wallet %s fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Fehler: Datenbank-Transaktion kann für Wallet %s nicht ausgeführt werden.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Fehler: Konnte auf keinem Port hören. Wenn dies so gewünscht wird -listen=0 verwenden.</translation>
</message>
@@ -4407,6 +4431,10 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Verifizierung der Datenbank fehlgeschlagen</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Fehler beim Entfernen der Transaktion: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Der Gebührensatz (%s) ist niedriger als die Mindestgebührensatz (%s) Einstellung.</translation>
</message>
@@ -4628,6 +4656,10 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Dies ist die Gebühr, die beim Senden einer Transaktion fällig wird.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">Transaktion %s gehört nicht zu dieser Brieftasche</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Transaktionsbetrag zu niedrig</translation>
</message>
@@ -4640,10 +4672,6 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Ausgangsindex des Wechselgelds außerhalb des Bereichs</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Die Speicherpoolkette der Transaktion ist zu lang.</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Die Transaktion muss mindestens einen Empfänger enthalten.</translation>
</message>
@@ -4724,6 +4752,10 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Nicht unterstützte globale Protokollierungsebene %s=%s. Gültige Werte: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Wallet Datei konnte nicht angelegt werden: %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates wird auf der %s Chain nicht unterstützt.</translation>
</message>
@@ -4732,6 +4764,14 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Nicht unterstützte Protokollkategorie %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Fehler: Konnte Nur-beobachten TX %s der Nur-beobachten-Wallet nicht hinzufügen.</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Fehler: Watchonly-Transaktionen konnten nicht gelöscht werden.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Der User Agent Kommentar (%s) enthält unsichere Zeichen.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_el.ts b/src/qt/locale/bitcoin_el.ts
index 6f07f01f71..61d6807947 100644
--- a/src/qt/locale/bitcoin_el.ts
+++ b/src/qt/locale/bitcoin_el.ts
@@ -221,7 +221,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
- <translation type="unfinished">Ο παλιός κωδικός που εισήχθη για την αποκρυπτογράφηση του πορτοφολιού είναι εσφαλμένος. Περιέχει έναν χαρακτήρα null (δηλαδή, ένα μηδενικό byte). Εάν ο κωδικός ορίστηκε πριν από την έκδοση 25.0 του λογισμικού, δοκιμάστε πάλι μόνο με τους χαρακτήρες έως τον πρώτο χαρακτήρα null — αλλά χωρίς αυτόν.</translation>
+ <translation type="unfinished">Ο παλιός κωδικός που εισήχθη για την αποκρυπτογράφηση του πορτοφολιού είναι εσφαλμένος. Περιέχει έναν χαρακτήρα null (δηλαδή, ένα μηδενικό byte). Εάν ο κωδικός ορίστηκε πριν από την έκδοση 25.0 του λογισμικού, δοκιμάστε ξανά εισαγάγοντας μόνο τους χαρακτήρες έως τον πρώτο χαρακτήρα null — αλλά όχι αυτόν.</translation>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
@@ -242,6 +242,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Το αρχείο Ρυθμίσεων %1 ενδέχεται να είναι κατεστραμμένο ή μη έγκυρο.</translation>
</message>
<message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">Αδυναμία αποθήκευσης παλιών δεδομένων πορτοφολιού</translation>
+ </message>
+ <message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
<translation type="unfinished">Συνέβη ενα μοιραίο σφάλμα. %1 δε μπορεί να συνεχιστεί με ασφάλεια και θα σταματήσει</translation>
</message>
@@ -291,6 +295,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Αδρομολόγητο</translation>
</message>
<message>
+ <source>Onion</source>
+ <comment>network name</comment>
+ <extracomment>Name of Tor network in peer info</extracomment>
+ <translation type="unfinished">Onion (κρυφές υπηρεσίες)</translation>
+ </message>
+ <message>
<source>Inbound</source>
<extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
<translation type="unfinished">Εισερχόμενα</translation>
@@ -316,6 +326,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Χειροκίνητα</translation>
</message>
<message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">Feeler (εξερχόμενη σύνδεση βραχείας διάρκειας)</translation>
+ </message>
+ <message>
<source>Address Fetch</source>
<extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
<translation type="unfinished">Λήψη Διεύθυνσης</translation>
@@ -668,6 +683,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Κλείσιμο όλων των πορτοφολιών</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Μεταφορά Πορτοφολιού</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Μεταφορά ενός πορτοφολιού</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Εμφάνισε το %1 βοηθητικό μήνυμα για λήψη μιας λίστας με διαθέσιμες επιλογές για Bitcoin εντολές </translation>
</message>
@@ -760,6 +783,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ενεργοποίηση δραστηριότητας δικτύου</translation>
</message>
<message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Προ-συγχρονισμός Επικεφαλίδων (%1%)...</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Σφάλμα δημιουργίας πορτοφολιού</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Δεν είναι δυνατή η δημιουργία νέου πορτοφολιού, το λογισμικό μεταγλωττίστηκε χωρίς SQLite υποστήριξη (απαιτείται για κρυπτογραφημένα πορτοφόλια)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Σφάλμα: %1</translation>
</message>
@@ -998,7 +1033,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Can't list signers</source>
<translation type="unfinished">Αδυναμία απαρίθμησης εγγεγραμμένων </translation>
</message>
- </context>
+ <message>
+ <source>Too many external signers found</source>
+ <translation type="unfinished">Βρέθηκαν πάρα πολλοί εξωτερικοί υπογράφοντες</translation>
+ </message>
+</context>
<context>
<name>LoadWalletsActivity</name>
<message>
@@ -1013,6 +1052,57 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Μετεγκατάσταση πορτοφολιού</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Είστε σίγουρος/η ότι θέλετε να μετεγκαταστήσετε το πορτοφόλι σας; &lt;i&gt;%1&lt;/i&gt;;</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Η μετεγκατάσταση του πορτοφολιού θα μετατρέψει αυτό το πορτοφόλι σε ένα ή περισσότερα περιγραφικά πορτοφόλια. Θα χρειαστεί να δημιουργηθεί ένα νέο αντίγραφο ασφαλείας πορτοφολιού.
+Εάν αυτό το πορτοφόλι περιέχει σενάρια μόνο για παρακολούθηση, θα δημιουργηθεί ένα νέο πορτοφόλι το οποίο περιέχει αυτά τα σενάρια παρακολούθησης.
+Εάν αυτό το πορτοφόλι περιέχει επιλύσιμα αλλά όχι για παρακολούθηση σενάρια, θα δημιουργηθεί ένα διαφορετικό και νέο πορτοφόλι που περιέχει αυτά τα σενάρια.
+
+Η διαδικασία μετεγκατάστασης θα δημιουργήσει ένα αντίγραφο ασφαλείας του πορτοφολιού πριν από τη μετεγκατάσταση. Αυτό το αρχείο αντιγράφου ασφαλείας θα ονομάζεται &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak και μπορεί να βρεθεί στον κατάλογο αυτού του πορτοφολιού. Σε περίπτωση εσφαλμένης μετεγκατάστασης, το αντίγραφο ασφαλείας μπορεί να αποκατασταθεί με τη λειτουργία "Επαναφορά Πορτοφολιού".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Μετεγκατάσταση Πορτοφολιού</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Μετεγκατάσταση Πορτοφολιού &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Το πορτοφόλι '%1' μετεγκαταστάθηκε επιτυχώς.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Τα σενάρια παρακολούθησης μόνο μετεγκαταστάθηκαν σε νέο πορτοφόλι ονόματι '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Τα επιλύσιμα αλλά όχι για παρακολούθηση σενάρια μετεγκαταστάθηκαν σε νέο πορτοφόλι ονόματι '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Αποτυχία μετεγκατάστασης</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Επιτυχής Μετεγκατάσταση</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1095,6 +1185,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Δημιουργία Πορτοφολιού</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Απέχετε ένα βήμα από τη δημιουργία του νέου σας πορτοφολιού!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Παρακαλώ εισαγάγετε ένα όνομα και, εάν θέλετε, ενεργοποιήστε τυχόν προηγμένες επιλογές</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Όνομα Πορτοφολιού</translation>
</message>
@@ -1502,14 +1600,29 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Η επαναφορά αυτής της ρύθμισης απαιτεί εκ νέου λήψη ολόκληρου του μπλοκ αλυσίδας.</translation>
</message>
<message>
+ <source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
+ <extracomment>Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</extracomment>
+ <translation type="unfinished">Μέγιστο μέγεθος βάσης δεδομένων προσωρινής μνήμης. Μια μεγαλύτερη προσωρινή μνήμη μπορεί να συμβάλει στον ταχύτερο συγχρονισμό, μετά τον οποίο το όφελος είναι λιγότερο έντονο για τις περισσότερες περιπτώσεις χρήσης. Η μείωση του μεγέθους της προσωρινής μνήμης θα μειώσει τη χρήση της μνήμης. Η αχρησιμοποίητη μνήμη mempool είναι κοινόχρηστη για αυτήν την προσωρινή μνήμη.</translation>
+ </message>
+ <message>
<source>MiB</source>
<translation type="unfinished">MebiBytes</translation>
</message>
<message>
+ <source>Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
+ <extracomment>Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</extracomment>
+ <translation type="unfinished">Ορίστε τον αριθμό των νημάτων επαλήθευσης σεναρίου. Οι αρνητικές τιμές αντιστοιχούν στον αριθμό των πυρήνων που θέλετε να αφήσετε ελεύθερους στο σύστημα.</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation type="unfinished">(0 = αυτόματο, &lt;0 = ελεύθεροι πυρήνες)</translation>
</message>
<message>
+ <source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
+ <extracomment>Tooltip text for Options window setting that enables the RPC server.</extracomment>
+ <translation type="unfinished">Αυτό επιτρέπει σε εσάς ή ένα εργαλείο τρίτων να επικοινωνεί με τον κόμβο μέσω κώδικα γραμμής εντολών και JSON-RPC.</translation>
+ </message>
+ <message>
<source>Enable R&amp;PC server</source>
<extracomment>An Options window setting to enable the RPC server.</extracomment>
<translation type="unfinished">Ενεργοποίηση R&amp;PC σέρβερ</translation>
@@ -1524,6 +1637,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Να τεθεί ο φόρος αφαίρεσης από το ποσό στην προκαθορισμένη τιμή ή οχι. </translation>
</message>
<message>
+ <source>Subtract &amp;fee from amount by default</source>
+ <extracomment>An Options window setting to set subtracting the fee from a sending amount as default.</extracomment>
+ <translation type="unfinished">Αφαιρέστε &amp;τέλος από το ποσό προεπιλογής</translation>
+ </message>
+ <message>
<source>Expert</source>
<translation type="unfinished">Έμπειρος</translation>
</message>
@@ -1545,10 +1663,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ενεργοποίηση ελέγχων &amp;PSBT</translation>
</message>
<message>
+ <source>Whether to show PSBT controls.</source>
+ <extracomment>Tooltip text for options window setting that enables PSBT controls.</extracomment>
+ <translation type="unfinished">Αν θα εμφανιστούν στοιχεία ελέγχου PSBT.</translation>
+ </message>
+ <message>
<source>External Signer (e.g. hardware wallet)</source>
<translation type="unfinished">Εξωτερική συσκευή υπογραφής (π.χ. πορτοφόλι υλικού)</translation>
</message>
<message>
+ <source>&amp;External signer script path</source>
+ <translation type="unfinished">&amp;Διαδρομή σεναρίου εξωτερικού υπογράφοντος</translation>
+ </message>
+ <message>
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
<translation type="unfinished">Αυτόματο άνοιγμα των θυρών Bitcoin στον δρομολογητή. Λειτουργεί μόνο αν ο δρομολογητής σας υποστηρίζει τη λειτουργία UPnP.</translation>
</message>
@@ -1641,6 +1768,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Διαλέξτε την προεπιλεγμένη υποδιαίρεση που θα εμφανίζεται όταν στέλνετε νομίσματα.</translation>
</message>
<message>
+ <source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
+ <translation type="unfinished">Διευθύνσεις URL τρίτων (π.χ. μπλοκ explorer) που εμφανίζονται στην καρτέλα συναλλαγών ως συμφραζόμενα στοιχεία μενού. %sστο URL αντικαθίσταται από κατακερματισμό συναλλαγής. Πολλαπλές διευθύνσεις URL διαχωρίζονται με κάθετη γραμμή |.</translation>
+ </message>
+ <message>
+ <source>&amp;Third-party transaction URLs</source>
+ <translation type="unfinished">&amp;Διευθύνσεις URL συναλλαγών τρίτων</translation>
+ </message>
+ <message>
<source>Whether to show coin control features or not.</source>
<translation type="unfinished">Επιλογή κατά πόσο να αναδείχνονται οι δυνατότητες ελέγχου κερμάτων.</translation>
</message>
@@ -1653,14 +1788,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Χρησιμοποιήστε ξεχωριστό διακομιστή μεσολάβησης SOCKS&amp;5 για σύνδεση με αποδέκτες μέσω των υπηρεσιών onion του Tor:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">ενσωματωμένο "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">πλησιέστερη αντιστοίχιση "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;ΟΚ</translation>
</message>
@@ -1692,6 +1819,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Χρειάζεται επανεκκίνηση του προγράμματος για να ενεργοποιηθούν οι αλλαγές.</translation>
</message>
<message>
+ <source>Current settings will be backed up at "%1".</source>
+ <extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
+ <translation type="unfinished">Θα δημιουργηθούν αντίγραφα ασφαλείας για τις τρέχουσες ρυθμίσεις στο "%1".</translation>
+ </message>
+ <message>
<source>Client will be shut down. Do you want to proceed?</source>
<extracomment>Text asking the user to confirm if they would like to proceed with a client shutdown.</extracomment>
<translation type="unfinished">Ο πελάτης θα τερματιστεί. Θέλετε να συνεχίσετε?</translation>
@@ -1821,6 +1953,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>PSBTOperationsDialog</name>
<message>
+ <source>PSBT Operations</source>
+ <translation type="unfinished">Λειτουργίες PSBT</translation>
+ </message>
+ <message>
<source>Sign Tx</source>
<translation type="unfinished">Υπόγραψε Tx</translation>
</message>
@@ -1895,8 +2031,8 @@ ID Συναλλαγής: %1</translation>
<translation type="unfinished">PSBT αποθηκεύτηκε στο δίσκο.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Στέλνει %1 προς %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Αποστέλλει %1 στο %2</translation>
</message>
<message>
<source>own address</source>
@@ -1970,6 +2106,14 @@ ID Συναλλαγής: %1</translation>
<translation type="unfinished">Το 'bitcoin://' δεν είναι έγκυρο URI. Αντ' αυτού χρησιμοποιήστε το 'bitcoin:'.</translation>
</message>
<message>
+ <source>Cannot process payment request because BIP70 is not supported.
+Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
+If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
+ <translation type="unfinished">Αδυναμία επεξεργασίας αιτήματος πληρωμής επειδή το BIP70 δεν υποστηρίζεται.
+Λόγω των εκτεταμένων ελαττωμάτων ασφαλείας στο BIP70, συνιστάται να αγνοούνται τυχόν οδηγίες του εμπόρου για αλλαγή πορτοφολιού.
+Εάν λαμβάνετε αυτό το σφάλμα, θα πρέπει να ζητήσετε από τον έμπορο να παρέχει ένα URI συμβατό με το BIP21.</translation>
+ </message>
+ <message>
<source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
<translation type="unfinished">Δεν είναι δυνατή η ανάλυση του URI! Αυτό μπορεί να προκληθεί από μη έγκυρη διεύθυνση Bitcoin ή παραμορφωμένες παραμέτρους URI.</translation>
</message>
@@ -2163,6 +2307,18 @@ ID Συναλλαγής: %1</translation>
<translation type="unfinished">Επιλέξτε έναν χρήστη για να δείτε αναλυτικές πληροφορίες.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Πρωτόκολλο μεταφοράς: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Μεταφορά</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">Η συμβολοσειρά αναγνωριστικού περιόδου σύνδεσης BIP324 σε δεκαεξαδική μορφή, εάν υπάρχει.</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Έκδοση</translation>
</message>
@@ -2774,10 +2930,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Δη&amp;μιουργία Ανυπόγραφου</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">από πορτοφόλι '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 προς το '%2'</translation>
</message>
@@ -3258,10 +3410,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Δείκτης εξόδου</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Το πιστοποιητικό δεν επαληθεύτηκε)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Έμπορος</translation>
</message>
@@ -4082,10 +4230,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Τα ποσά των συναλλαγών δεν πρέπει να είναι αρνητικά</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Η συναλλαγή έχει πολύ μακρά αλυσίδα mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Η συναλλαγή πρέπει να έχει τουλάχιστον έναν παραλήπτη</translation>
</message>
diff --git a/src/qt/locale/bitcoin_en.ts b/src/qt/locale/bitcoin_en.ts
index 7f0e43a1bd..01b428d46e 100644
--- a/src/qt/locale/bitcoin_en.ts
+++ b/src/qt/locale/bitcoin_en.ts
@@ -427,7 +427,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+415"/>
+ <location line="+417"/>
<source>Network activity disabled.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished"></translation>
@@ -438,7 +438,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-1197"/>
+ <location line="-1199"/>
<source>Send coins to a Bitcoin address</source>
<translation>Send coins to a Bitcoin address</translation>
</message>
@@ -553,7 +553,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation>Tabs toolbar</translation>
</message>
<message>
- <location line="+479"/>
+ <location line="+481"/>
<source>Syncing Headers (%1%)…</source>
<translation type="unfinished"></translation>
</message>
@@ -578,7 +578,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-855"/>
+ <location line="-857"/>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation type="unfinished"></translation>
</message>
@@ -598,7 +598,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location line="+767"/>
+ <location line="+769"/>
<source>Processed %n block(s) of transaction history.</source>
<translation>
<numerusform>Processed %n block of transaction history.</numerusform>
@@ -646,7 +646,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation>Up to date</translation>
</message>
<message>
- <location line="-840"/>
+ <location line="-842"/>
<source>Ctrl+Q</source>
<translation type="unfinished"></translation>
</message>
@@ -802,7 +802,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+277"/>
+ <location line="+279"/>
<source>%1 client</source>
<translation type="unfinished"></translation>
</message>
@@ -1416,7 +1416,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished">Bitcoin</translation>
</message>
<message numerus="yes">
- <location line="+162"/>
+ <location line="+164"/>
<source>%n GB of space available</source>
<translation type="unfinished">
<numerusform>%n GB of space available</numerusform>
@@ -1747,7 +1747,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+227"/>
+ <location line="+107"/>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+45"/>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished"></translation>
</message>
@@ -1772,7 +1777,7 @@ The migration process will create a backup of the wallet before migrating. This
<translation>&amp;Reset Options</translation>
</message>
<message>
- <location line="-645"/>
+ <location line="-570"/>
<source>&amp;Network</source>
<translation>&amp;Network</translation>
</message>
@@ -2044,22 +2049,7 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+236"/>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>embedded &quot;%1&quot;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+49"/>
- <source>closest matching &quot;%1&quot;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+206"/>
+ <location line="+424"/>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
@@ -2069,7 +2059,7 @@ The migration process will create a backup of the wallet before migrating. This
<translation>&amp;Cancel</translation>
</message>
<message>
- <location filename="../optionsdialog.cpp" line="+96"/>
+ <location filename="../optionsdialog.cpp" line="+152"/>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>&quot;External signing&quot; means using devices such as hardware wallets.</extracomment>
<translation type="unfinished"></translation>
@@ -2080,25 +2070,25 @@ The migration process will create a backup of the wallet before migrating. This
<translation>default</translation>
</message>
<message>
- <location line="+86"/>
+ <location line="+74"/>
<source>none</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+107"/>
+ <location line="+109"/>
<source>Confirm options reset</source>
<extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
<translation>Confirm options reset</translation>
</message>
<message>
<location line="-9"/>
- <location line="+79"/>
+ <location line="+81"/>
<source>Client restart required to activate changes.</source>
<extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-75"/>
+ <location line="-77"/>
<source>Current settings will be backed up at &quot;%1&quot;.</source>
<extracomment>Text explaining to the user that the client&apos;s current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location&apos;s path.</extracomment>
<translation type="unfinished"></translation>
@@ -2142,7 +2132,7 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+42"/>
<source>This change would require a client restart.</source>
<translation type="unfinished"></translation>
</message>
@@ -2155,7 +2145,7 @@ The migration process will create a backup of the wallet before migrating. This
<context>
<name>OptionsModel</name>
<message>
- <location filename="../optionsmodel.cpp" line="+199"/>
+ <location filename="../optionsmodel.cpp" line="+230"/>
<source>Could not read setting &quot;%1&quot;, %2.</source>
<translation type="unfinished"></translation>
</message>
@@ -2747,7 +2737,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<location line="+2"/>
- <location filename="../rpcconsole.cpp" line="+1004"/>
+ <location filename="../rpcconsole.cpp" line="+1006"/>
<source>%1 kB</source>
<translation type="unfinished"></translation>
</message>
@@ -2789,6 +2779,21 @@ If you are receiving this error you should request the merchant provide a BIP21
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../optionsdialog.cpp" line="-389"/>
+ <source>Embedded &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Default system font &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Custom…</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QRImageWidget</name>
@@ -3293,7 +3298,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../rpcconsole.cpp" line="-473"/>
+ <location filename="../rpcconsole.cpp" line="-475"/>
<source>Inbound: initiated by peer</source>
<extracomment>Explanatory text for an inbound peer connection.</extracomment>
<translation type="unfinished"></translation>
@@ -3386,7 +3391,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+151"/>
+ <location line="+153"/>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished"></translation>
@@ -3458,7 +3463,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-330"/>
+ <location line="+18"/>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-348"/>
<source>Executing command using &quot;%1&quot; wallet</source>
<translation type="unfinished"></translation>
</message>
@@ -4363,7 +4373,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
<context>
<name>ShutdownWindow</name>
<message>
- <location filename="../utilitydialog.cpp" line="+85"/>
+ <location filename="../utilitydialog.cpp" line="+86"/>
<source>%1 is shutting down…</source>
<translation type="unfinished"></translation>
</message>
@@ -5241,7 +5251,7 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Send Coins</translation>
</message>
<message>
- <location line="+247"/>
+ <location line="+254"/>
<location line="+55"/>
<location line="+15"/>
<location line="+5"/>
@@ -5833,6 +5843,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Error creating %s</source>
<translation type="unfinished"></translation>
</message>
@@ -5893,16 +5908,16 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <source>Error starting db txn for wallet transactions removal</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
- <source>Error: Could not delete watchonly transactions</source>
+ <location line="+1"/>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+3"/>
<source>Error: Couldn&apos;t create cursor into database</source>
<translation type="unfinished"></translation>
</message>
@@ -5948,11 +5963,6 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished"></translation>
</message>
@@ -6008,6 +6018,16 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished"></translation>
</message>
@@ -6028,6 +6048,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished"></translation>
</message>
@@ -6303,6 +6328,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Transaction amount too small</source>
<translation type="unfinished"></translation>
</message>
@@ -6432,12 +6462,17 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-107"/>
+ <location line="-110"/>
<source>Error: Could not add watchonly tx %s to watchonly wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+108"/>
+ <location line="+1"/>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+110"/>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished"></translation>
</message>
@@ -6457,7 +6492,7 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-44"/>
+ <location line="-45"/>
<source>Settings file could not be read</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src/qt/locale/bitcoin_en.xlf b/src/qt/locale/bitcoin_en.xlf
index 0375b6bdbe..2bab80e3dd 100644
--- a/src/qt/locale/bitcoin_en.xlf
+++ b/src/qt/locale/bitcoin_en.xlf
@@ -381,12 +381,12 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</trans-unit>
<trans-unit id="_msg84">
<source xml:space="preserve">Network activity disabled.</source>
- <context-group purpose="location"><context context-type="linenumber">1004</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1006</context></context-group>
<note annotates="source" from="developer">A substring of the tooltip.</note>
</trans-unit>
<trans-unit id="_msg85">
<source xml:space="preserve">Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
- <context-group purpose="location"><context context-type="linenumber">1455</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1457</context></context-group>
</trans-unit>
<trans-unit id="_msg86">
<source xml:space="preserve">Send coins to a Bitcoin address</source>
@@ -482,23 +482,23 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</trans-unit>
<trans-unit id="_msg109">
<source xml:space="preserve">Syncing Headers (%1%)…</source>
- <context-group purpose="location"><context context-type="linenumber">1048</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1050</context></context-group>
</trans-unit>
<trans-unit id="_msg110">
<source xml:space="preserve">Synchronizing with network…</source>
- <context-group purpose="location"><context context-type="linenumber">1106</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1108</context></context-group>
</trans-unit>
<trans-unit id="_msg111">
<source xml:space="preserve">Indexing blocks on disk…</source>
- <context-group purpose="location"><context context-type="linenumber">1111</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1113</context></context-group>
</trans-unit>
<trans-unit id="_msg112">
<source xml:space="preserve">Processing blocks on disk…</source>
- <context-group purpose="location"><context context-type="linenumber">1113</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1115</context></context-group>
</trans-unit>
<trans-unit id="_msg113">
<source xml:space="preserve">Connecting to peers…</source>
- <context-group purpose="location"><context context-type="linenumber">1120</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1122</context></context-group>
</trans-unit>
<trans-unit id="_msg114">
<source xml:space="preserve">Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -517,7 +517,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<context-group purpose="location"><context context-type="linenumber">362</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">1129</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1131</context></context-group>
<trans-unit id="_msg118[0]">
<source xml:space="preserve">Processed %n block(s) of transaction history.</source>
</trans-unit>
@@ -527,35 +527,35 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</group>
<trans-unit id="_msg119">
<source xml:space="preserve">%1 behind</source>
- <context-group purpose="location"><context context-type="linenumber">1152</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1154</context></context-group>
</trans-unit>
<trans-unit id="_msg120">
<source xml:space="preserve">Catching up…</source>
- <context-group purpose="location"><context context-type="linenumber">1157</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1159</context></context-group>
</trans-unit>
<trans-unit id="_msg121">
<source xml:space="preserve">Last received block was generated %1 ago.</source>
- <context-group purpose="location"><context context-type="linenumber">1176</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1178</context></context-group>
</trans-unit>
<trans-unit id="_msg122">
<source xml:space="preserve">Transactions after this will not yet be visible.</source>
- <context-group purpose="location"><context context-type="linenumber">1178</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1180</context></context-group>
</trans-unit>
<trans-unit id="_msg123">
<source xml:space="preserve">Error</source>
- <context-group purpose="location"><context context-type="linenumber">1218</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1220</context></context-group>
</trans-unit>
<trans-unit id="_msg124">
<source xml:space="preserve">Warning</source>
- <context-group purpose="location"><context context-type="linenumber">1222</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1224</context></context-group>
</trans-unit>
<trans-unit id="_msg125">
<source xml:space="preserve">Information</source>
- <context-group purpose="location"><context context-type="linenumber">1226</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1228</context></context-group>
</trans-unit>
<trans-unit id="_msg126">
<source xml:space="preserve">Up to date</source>
- <context-group purpose="location"><context context-type="linenumber">1133</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1135</context></context-group>
</trans-unit>
<trans-unit id="_msg127">
<source xml:space="preserve">Ctrl+Q</source>
@@ -685,18 +685,18 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</trans-unit>
<trans-unit id="_msg157">
<source xml:space="preserve">%1 client</source>
- <context-group purpose="location"><context context-type="linenumber">815</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">817</context></context-group>
</trans-unit>
<trans-unit id="_msg158">
<source xml:space="preserve">&amp;Hide</source>
- <context-group purpose="location"><context context-type="linenumber">883</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">885</context></context-group>
</trans-unit>
<trans-unit id="_msg159">
<source xml:space="preserve">S&amp;how</source>
- <context-group purpose="location"><context context-type="linenumber">884</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">886</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">1001</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1003</context></context-group>
<note annotates="source" from="developer">A substring of the tooltip.</note>
<trans-unit id="_msg160[0]">
<source xml:space="preserve">%n active connection(s) to Bitcoin network.</source>
@@ -707,111 +707,111 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</group>
<trans-unit id="_msg161">
<source xml:space="preserve">Click for more actions.</source>
- <context-group purpose="location"><context context-type="linenumber">1011</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1013</context></context-group>
<note annotates="source" from="developer">A substring of the tooltip. &quot;More actions&quot; are available via the context menu.</note>
</trans-unit>
<trans-unit id="_msg162">
<source xml:space="preserve">Show Peers tab</source>
- <context-group purpose="location"><context context-type="linenumber">1028</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1030</context></context-group>
<note annotates="source" from="developer">A context menu item. The &quot;Peers tab&quot; is an element of the &quot;Node window&quot;.</note>
</trans-unit>
<trans-unit id="_msg163">
<source xml:space="preserve">Disable network activity</source>
- <context-group purpose="location"><context context-type="linenumber">1036</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1038</context></context-group>
<note annotates="source" from="developer">A context menu item.</note>
</trans-unit>
<trans-unit id="_msg164">
<source xml:space="preserve">Enable network activity</source>
- <context-group purpose="location"><context context-type="linenumber">1038</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1040</context></context-group>
<note annotates="source" from="developer">A context menu item. The network activity was disabled previously.</note>
</trans-unit>
<trans-unit id="_msg165">
<source xml:space="preserve">Pre-syncing Headers (%1%)…</source>
- <context-group purpose="location"><context context-type="linenumber">1055</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1057</context></context-group>
</trans-unit>
<trans-unit id="_msg166">
<source xml:space="preserve">Error creating wallet</source>
- <context-group purpose="location"><context context-type="linenumber">1194</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1196</context></context-group>
</trans-unit>
<trans-unit id="_msg167">
<source xml:space="preserve">Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
- <context-group purpose="location"><context context-type="linenumber">1194</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1196</context></context-group>
</trans-unit>
<trans-unit id="_msg168">
<source xml:space="preserve">Error: %1</source>
- <context-group purpose="location"><context context-type="linenumber">1219</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1221</context></context-group>
</trans-unit>
<trans-unit id="_msg169">
<source xml:space="preserve">Warning: %1</source>
- <context-group purpose="location"><context context-type="linenumber">1223</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1225</context></context-group>
</trans-unit>
<trans-unit id="_msg170">
<source xml:space="preserve">Date: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1331</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1333</context></context-group>
</trans-unit>
<trans-unit id="_msg171">
<source xml:space="preserve">Amount: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1332</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1334</context></context-group>
</trans-unit>
<trans-unit id="_msg172">
<source xml:space="preserve">Wallet: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1334</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1336</context></context-group>
</trans-unit>
<trans-unit id="_msg173">
<source xml:space="preserve">Type: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1336</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1338</context></context-group>
</trans-unit>
<trans-unit id="_msg174">
<source xml:space="preserve">Label: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1338</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1340</context></context-group>
</trans-unit>
<trans-unit id="_msg175">
<source xml:space="preserve">Address: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1340</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1342</context></context-group>
</trans-unit>
<trans-unit id="_msg176">
<source xml:space="preserve">Sent transaction</source>
- <context-group purpose="location"><context context-type="linenumber">1341</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1343</context></context-group>
</trans-unit>
<trans-unit id="_msg177">
<source xml:space="preserve">Incoming transaction</source>
- <context-group purpose="location"><context context-type="linenumber">1341</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1343</context></context-group>
</trans-unit>
<trans-unit id="_msg178">
<source xml:space="preserve">HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <context-group purpose="location"><context context-type="linenumber">1393</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1395</context></context-group>
</trans-unit>
<trans-unit id="_msg179">
<source xml:space="preserve">HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
- <context-group purpose="location"><context context-type="linenumber">1393</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1395</context></context-group>
</trans-unit>
<trans-unit id="_msg180">
<source xml:space="preserve">Private key &lt;b&gt;disabled&lt;/b&gt;</source>
- <context-group purpose="location"><context context-type="linenumber">1393</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1395</context></context-group>
</trans-unit>
<trans-unit id="_msg181">
<source xml:space="preserve">Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <context-group purpose="location"><context context-type="linenumber">1416</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1418</context></context-group>
</trans-unit>
<trans-unit id="_msg182">
<source xml:space="preserve">Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
- <context-group purpose="location"><context context-type="linenumber">1424</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1426</context></context-group>
</trans-unit>
<trans-unit id="_msg183">
<source xml:space="preserve">Original message:</source>
- <context-group purpose="location"><context context-type="linenumber">1543</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1545</context></context-group>
</trans-unit>
</group>
<group restype="x-trolltech-linguist-context" resname="UnitDisplayStatusBarControl">
<trans-unit id="_msg184">
<source xml:space="preserve">Unit to show amounts in. Click to select another unit.</source>
- <context-group purpose="location"><context context-type="linenumber">1582</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1584</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -1279,7 +1279,7 @@ The migration process will create a backup of the wallet before migrating. This
<context-group purpose="location"><context context-type="linenumber">139</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">301</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">303</context></context-group>
<trans-unit id="_msg286[0]">
<source xml:space="preserve">%n GB of space available</source>
</trans-unit>
@@ -1288,7 +1288,7 @@ The migration process will create a backup of the wallet before migrating. This
</trans-unit>
</group>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">303</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">305</context></context-group>
<trans-unit id="_msg287[0]">
<source xml:space="preserve">(of %n GB needed)</source>
</trans-unit>
@@ -1297,7 +1297,7 @@ The migration process will create a backup of the wallet before migrating. This
</trans-unit>
</group>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">306</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">308</context></context-group>
<trans-unit id="_msg288[0]">
<source xml:space="preserve">(%n GB needed for full chain)</source>
</trans-unit>
@@ -1307,18 +1307,18 @@ The migration process will create a backup of the wallet before migrating. This
</group>
<trans-unit id="_msg289">
<source xml:space="preserve">Choose data directory</source>
- <context-group purpose="location"><context context-type="linenumber">323</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">325</context></context-group>
</trans-unit>
<trans-unit id="_msg290">
<source xml:space="preserve">At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <context-group purpose="location"><context context-type="linenumber">378</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">380</context></context-group>
</trans-unit>
<trans-unit id="_msg291">
<source xml:space="preserve">Approximately %1 GB of data will be stored in this directory.</source>
- <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">383</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">390</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">392</context></context-group>
<note annotates="source" from="developer">Explanatory text on the capability of the current prune target.</note>
<trans-unit id="_msg292[0]">
<source xml:space="preserve">(sufficient to restore backups %n day(s) old)</source>
@@ -1329,19 +1329,19 @@ The migration process will create a backup of the wallet before migrating. This
</group>
<trans-unit id="_msg293">
<source xml:space="preserve">%1 will download and store a copy of the Bitcoin block chain.</source>
- <context-group purpose="location"><context context-type="linenumber">392</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">394</context></context-group>
</trans-unit>
<trans-unit id="_msg294">
<source xml:space="preserve">The wallet will also be stored in this directory.</source>
- <context-group purpose="location"><context context-type="linenumber">394</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">396</context></context-group>
</trans-unit>
<trans-unit id="_msg295">
<source xml:space="preserve">Error: Specified data directory &quot;%1&quot; cannot be created.</source>
- <context-group purpose="location"><context context-type="linenumber">250</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">252</context></context-group>
</trans-unit>
<trans-unit id="_msg296">
<source xml:space="preserve">Error</source>
- <context-group purpose="location"><context context-type="linenumber">280</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">282</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -1363,11 +1363,11 @@ The migration process will create a backup of the wallet before migrating. This
<group restype="x-trolltech-linguist-context" resname="ShutdownWindow">
<trans-unit id="_msg300">
<source xml:space="preserve">%1 is shutting down…</source>
- <context-group purpose="location"><context context-type="linenumber">145</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
<trans-unit id="_msg301">
<source xml:space="preserve">Do not shut down the computer until this window disappears.</source>
- <context-group purpose="location"><context context-type="linenumber">146</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">147</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -1563,419 +1563,425 @@ The migration process will create a backup of the wallet before migrating. This
<context-group purpose="location"><context context-type="linenumber">672</context></context-group>
</trans-unit>
<trans-unit id="_msg343">
- <source xml:space="preserve">Options set in this dialog are overridden by the command line:</source>
- <context-group purpose="location"><context context-type="linenumber">899</context></context-group>
+ <source xml:space="preserve">Font in the Overview tab: </source>
+ <context-group purpose="location"><context context-type="linenumber">779</context></context-group>
</trans-unit>
<trans-unit id="_msg344">
- <source xml:space="preserve">Open the %1 configuration file from the working directory.</source>
- <context-group purpose="location"><context context-type="linenumber">944</context></context-group>
+ <source xml:space="preserve">Options set in this dialog are overridden by the command line:</source>
+ <context-group purpose="location"><context context-type="linenumber">824</context></context-group>
</trans-unit>
<trans-unit id="_msg345">
- <source xml:space="preserve">Open Configuration File</source>
- <context-group purpose="location"><context context-type="linenumber">947</context></context-group>
+ <source xml:space="preserve">Open the %1 configuration file from the working directory.</source>
+ <context-group purpose="location"><context context-type="linenumber">869</context></context-group>
</trans-unit>
<trans-unit id="_msg346">
- <source xml:space="preserve">Reset all client options to default.</source>
- <context-group purpose="location"><context context-type="linenumber">957</context></context-group>
+ <source xml:space="preserve">Open Configuration File</source>
+ <context-group purpose="location"><context context-type="linenumber">872</context></context-group>
</trans-unit>
<trans-unit id="_msg347">
- <source xml:space="preserve">&amp;Reset Options</source>
- <context-group purpose="location"><context context-type="linenumber">960</context></context-group>
+ <source xml:space="preserve">Reset all client options to default.</source>
+ <context-group purpose="location"><context context-type="linenumber">882</context></context-group>
</trans-unit>
<trans-unit id="_msg348">
+ <source xml:space="preserve">&amp;Reset Options</source>
+ <context-group purpose="location"><context context-type="linenumber">885</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg349">
<source xml:space="preserve">&amp;Network</source>
<context-group purpose="location"><context context-type="linenumber">315</context></context-group>
</trans-unit>
- <trans-unit id="_msg349">
+ <trans-unit id="_msg350">
<source xml:space="preserve">Prune &amp;block storage to</source>
<context-group purpose="location"><context context-type="linenumber">61</context></context-group>
</trans-unit>
- <trans-unit id="_msg350">
+ <trans-unit id="_msg351">
<source xml:space="preserve">GB</source>
<context-group purpose="location"><context context-type="linenumber">71</context></context-group>
</trans-unit>
- <trans-unit id="_msg351">
+ <trans-unit id="_msg352">
<source xml:space="preserve">Reverting this setting requires re-downloading the entire blockchain.</source>
<context-group purpose="location"><context context-type="linenumber">96</context></context-group>
</trans-unit>
- <trans-unit id="_msg352">
+ <trans-unit id="_msg353">
<source xml:space="preserve">Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
<context-group purpose="location"><context context-type="linenumber">108</context></context-group>
<note annotates="source" from="developer">Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</note>
</trans-unit>
- <trans-unit id="_msg353">
+ <trans-unit id="_msg354">
<source xml:space="preserve">MiB</source>
<context-group purpose="location"><context context-type="linenumber">127</context></context-group>
</trans-unit>
- <trans-unit id="_msg354">
+ <trans-unit id="_msg355">
<source xml:space="preserve">Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
<context-group purpose="location"><context context-type="linenumber">154</context></context-group>
<note annotates="source" from="developer">Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</note>
</trans-unit>
- <trans-unit id="_msg355">
+ <trans-unit id="_msg356">
<source xml:space="preserve">(0 = auto, &lt;0 = leave that many cores free)</source>
<context-group purpose="location"><context context-type="linenumber">170</context></context-group>
</trans-unit>
- <trans-unit id="_msg356">
+ <trans-unit id="_msg357">
<source xml:space="preserve">This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
<context-group purpose="location"><context context-type="linenumber">192</context></context-group>
<note annotates="source" from="developer">Tooltip text for Options window setting that enables the RPC server.</note>
</trans-unit>
- <trans-unit id="_msg357">
+ <trans-unit id="_msg358">
<source xml:space="preserve">Enable R&amp;PC server</source>
<context-group purpose="location"><context context-type="linenumber">195</context></context-group>
<note annotates="source" from="developer">An Options window setting to enable the RPC server.</note>
</trans-unit>
- <trans-unit id="_msg358">
+ <trans-unit id="_msg359">
<source xml:space="preserve">W&amp;allet</source>
<context-group purpose="location"><context context-type="linenumber">216</context></context-group>
</trans-unit>
- <trans-unit id="_msg359">
+ <trans-unit id="_msg360">
<source xml:space="preserve">Whether to set subtract fee from amount as default or not.</source>
<context-group purpose="location"><context context-type="linenumber">222</context></context-group>
<note annotates="source" from="developer">Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</note>
</trans-unit>
- <trans-unit id="_msg360">
+ <trans-unit id="_msg361">
<source xml:space="preserve">Subtract &amp;fee from amount by default</source>
<context-group purpose="location"><context context-type="linenumber">225</context></context-group>
<note annotates="source" from="developer">An Options window setting to set subtracting the fee from a sending amount as default.</note>
</trans-unit>
- <trans-unit id="_msg361">
+ <trans-unit id="_msg362">
<source xml:space="preserve">Expert</source>
<context-group purpose="location"><context context-type="linenumber">232</context></context-group>
</trans-unit>
- <trans-unit id="_msg362">
+ <trans-unit id="_msg363">
<source xml:space="preserve">Enable coin &amp;control features</source>
<context-group purpose="location"><context context-type="linenumber">241</context></context-group>
</trans-unit>
- <trans-unit id="_msg363">
+ <trans-unit id="_msg364">
<source xml:space="preserve">If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<context-group purpose="location"><context context-type="linenumber">248</context></context-group>
</trans-unit>
- <trans-unit id="_msg364">
+ <trans-unit id="_msg365">
<source xml:space="preserve">&amp;Spend unconfirmed change</source>
<context-group purpose="location"><context context-type="linenumber">251</context></context-group>
</trans-unit>
- <trans-unit id="_msg365">
+ <trans-unit id="_msg366">
<source xml:space="preserve">Enable &amp;PSBT controls</source>
<context-group purpose="location"><context context-type="linenumber">258</context></context-group>
<note annotates="source" from="developer">An options window setting to enable PSBT controls.</note>
</trans-unit>
- <trans-unit id="_msg366">
+ <trans-unit id="_msg367">
<source xml:space="preserve">Whether to show PSBT controls.</source>
<context-group purpose="location"><context context-type="linenumber">261</context></context-group>
<note annotates="source" from="developer">Tooltip text for options window setting that enables PSBT controls.</note>
</trans-unit>
- <trans-unit id="_msg367">
+ <trans-unit id="_msg368">
<source xml:space="preserve">External Signer (e.g. hardware wallet)</source>
<context-group purpose="location"><context context-type="linenumber">271</context></context-group>
</trans-unit>
- <trans-unit id="_msg368">
+ <trans-unit id="_msg369">
<source xml:space="preserve">&amp;External signer script path</source>
<context-group purpose="location"><context context-type="linenumber">279</context></context-group>
</trans-unit>
- <trans-unit id="_msg369">
+ <trans-unit id="_msg370">
<source xml:space="preserve">Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
<context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
- <trans-unit id="_msg370">
+ <trans-unit id="_msg371">
<source xml:space="preserve">Map port using &amp;UPnP</source>
<context-group purpose="location"><context context-type="linenumber">324</context></context-group>
</trans-unit>
- <trans-unit id="_msg371">
+ <trans-unit id="_msg372">
<source xml:space="preserve">Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
<context-group purpose="location"><context context-type="linenumber">331</context></context-group>
</trans-unit>
- <trans-unit id="_msg372">
+ <trans-unit id="_msg373">
<source xml:space="preserve">Map port using NA&amp;T-PMP</source>
<context-group purpose="location"><context context-type="linenumber">334</context></context-group>
</trans-unit>
- <trans-unit id="_msg373">
+ <trans-unit id="_msg374">
<source xml:space="preserve">Accept connections from outside.</source>
<context-group purpose="location"><context context-type="linenumber">341</context></context-group>
</trans-unit>
- <trans-unit id="_msg374">
+ <trans-unit id="_msg375">
<source xml:space="preserve">Allow incomin&amp;g connections</source>
<context-group purpose="location"><context context-type="linenumber">344</context></context-group>
</trans-unit>
- <trans-unit id="_msg375">
+ <trans-unit id="_msg376">
<source xml:space="preserve">Connect to the Bitcoin network through a SOCKS5 proxy.</source>
<context-group purpose="location"><context context-type="linenumber">351</context></context-group>
</trans-unit>
- <trans-unit id="_msg376">
+ <trans-unit id="_msg377">
<source xml:space="preserve">&amp;Connect through SOCKS5 proxy (default proxy):</source>
<context-group purpose="location"><context context-type="linenumber">354</context></context-group>
</trans-unit>
- <trans-unit id="_msg377">
+ <trans-unit id="_msg378">
<source xml:space="preserve">Proxy &amp;IP:</source>
<context-group purpose="location"><context context-type="linenumber">363</context></context-group>
<context-group purpose="location"><context context-type="linenumber">550</context></context-group>
</trans-unit>
- <trans-unit id="_msg378">
+ <trans-unit id="_msg379">
<source xml:space="preserve">&amp;Port:</source>
<context-group purpose="location"><context context-type="linenumber">395</context></context-group>
<context-group purpose="location"><context context-type="linenumber">582</context></context-group>
</trans-unit>
- <trans-unit id="_msg379">
+ <trans-unit id="_msg380">
<source xml:space="preserve">Port of the proxy (e.g. 9050)</source>
<context-group purpose="location"><context context-type="linenumber">420</context></context-group>
<context-group purpose="location"><context context-type="linenumber">607</context></context-group>
</trans-unit>
- <trans-unit id="_msg380">
+ <trans-unit id="_msg381">
<source xml:space="preserve">Used for reaching peers via:</source>
<context-group purpose="location"><context context-type="linenumber">444</context></context-group>
</trans-unit>
- <trans-unit id="_msg381">
+ <trans-unit id="_msg382">
<source xml:space="preserve">IPv4</source>
<context-group purpose="location"><context context-type="linenumber">467</context></context-group>
</trans-unit>
- <trans-unit id="_msg382">
+ <trans-unit id="_msg383">
<source xml:space="preserve">IPv6</source>
<context-group purpose="location"><context context-type="linenumber">490</context></context-group>
</trans-unit>
- <trans-unit id="_msg383">
+ <trans-unit id="_msg384">
<source xml:space="preserve">Tor</source>
<context-group purpose="location"><context context-type="linenumber">513</context></context-group>
</trans-unit>
- <trans-unit id="_msg384">
+ <trans-unit id="_msg385">
<source xml:space="preserve">&amp;Window</source>
<context-group purpose="location"><context context-type="linenumber">643</context></context-group>
</trans-unit>
- <trans-unit id="_msg385">
+ <trans-unit id="_msg386">
<source xml:space="preserve">Show the icon in the system tray.</source>
<context-group purpose="location"><context context-type="linenumber">649</context></context-group>
</trans-unit>
- <trans-unit id="_msg386">
+ <trans-unit id="_msg387">
<source xml:space="preserve">&amp;Show tray icon</source>
<context-group purpose="location"><context context-type="linenumber">652</context></context-group>
</trans-unit>
- <trans-unit id="_msg387">
+ <trans-unit id="_msg388">
<source xml:space="preserve">Show only a tray icon after minimizing the window.</source>
<context-group purpose="location"><context context-type="linenumber">662</context></context-group>
</trans-unit>
- <trans-unit id="_msg388">
+ <trans-unit id="_msg389">
<source xml:space="preserve">&amp;Minimize to the tray instead of the taskbar</source>
<context-group purpose="location"><context context-type="linenumber">665</context></context-group>
</trans-unit>
- <trans-unit id="_msg389">
+ <trans-unit id="_msg390">
<source xml:space="preserve">M&amp;inimize on close</source>
<context-group purpose="location"><context context-type="linenumber">675</context></context-group>
</trans-unit>
- <trans-unit id="_msg390">
+ <trans-unit id="_msg391">
<source xml:space="preserve">&amp;Display</source>
<context-group purpose="location"><context context-type="linenumber">696</context></context-group>
</trans-unit>
- <trans-unit id="_msg391">
+ <trans-unit id="_msg392">
<source xml:space="preserve">User Interface &amp;language:</source>
<context-group purpose="location"><context context-type="linenumber">704</context></context-group>
</trans-unit>
- <trans-unit id="_msg392">
+ <trans-unit id="_msg393">
<source xml:space="preserve">The user interface language can be set here. This setting will take effect after restarting %1.</source>
<context-group purpose="location"><context context-type="linenumber">717</context></context-group>
</trans-unit>
- <trans-unit id="_msg393">
+ <trans-unit id="_msg394">
<source xml:space="preserve">&amp;Unit to show amounts in:</source>
<context-group purpose="location"><context context-type="linenumber">728</context></context-group>
</trans-unit>
- <trans-unit id="_msg394">
+ <trans-unit id="_msg395">
<source xml:space="preserve">Choose the default subdivision unit to show in the interface and when sending coins.</source>
<context-group purpose="location"><context context-type="linenumber">741</context></context-group>
</trans-unit>
- <trans-unit id="_msg395">
+ <trans-unit id="_msg396">
<source xml:space="preserve">Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
<context-group purpose="location"><context context-type="linenumber">752</context></context-group>
<context-group purpose="location"><context context-type="linenumber">765</context></context-group>
</trans-unit>
- <trans-unit id="_msg396">
+ <trans-unit id="_msg397">
<source xml:space="preserve">&amp;Third-party transaction URLs</source>
<context-group purpose="location"><context context-type="linenumber">755</context></context-group>
</trans-unit>
- <trans-unit id="_msg397">
+ <trans-unit id="_msg398">
<source xml:space="preserve">Whether to show coin control features or not.</source>
<context-group purpose="location"><context context-type="linenumber">238</context></context-group>
</trans-unit>
- <trans-unit id="_msg398">
+ <trans-unit id="_msg399">
<source xml:space="preserve">Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
<context-group purpose="location"><context context-type="linenumber">538</context></context-group>
</trans-unit>
- <trans-unit id="_msg399">
+ <trans-unit id="_msg400">
<source xml:space="preserve">Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
<context-group purpose="location"><context context-type="linenumber">541</context></context-group>
</trans-unit>
- <trans-unit id="_msg400">
- <source xml:space="preserve">Monospaced font in the Overview tab:</source>
- <context-group purpose="location"><context context-type="linenumber">777</context></context-group>
- </trans-unit>
<trans-unit id="_msg401">
- <source xml:space="preserve">embedded &quot;%1&quot;</source>
- <context-group purpose="location"><context context-type="linenumber">785</context></context-group>
- </trans-unit>
- <trans-unit id="_msg402">
- <source xml:space="preserve">closest matching &quot;%1&quot;</source>
- <context-group purpose="location"><context context-type="linenumber">834</context></context-group>
- </trans-unit>
- <trans-unit id="_msg403">
<source xml:space="preserve">&amp;OK</source>
- <context-group purpose="location"><context context-type="linenumber">1040</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">965</context></context-group>
</trans-unit>
- <trans-unit id="_msg404">
+ <trans-unit id="_msg402">
<source xml:space="preserve">&amp;Cancel</source>
- <context-group purpose="location"><context context-type="linenumber">1053</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">978</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../optionsdialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="OptionsDialog">
- <trans-unit id="_msg405">
+ <trans-unit id="_msg403">
<source xml:space="preserve">Compiled without external signing support (required for external signing)</source>
- <context-group purpose="location"><context context-type="linenumber">96</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">152</context></context-group>
<note annotates="source" from="developer">&quot;External signing&quot; means using devices such as hardware wallets.</note>
</trans-unit>
- <trans-unit id="_msg406">
+ <trans-unit id="_msg404">
<source xml:space="preserve">default</source>
- <context-group purpose="location"><context context-type="linenumber">108</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">164</context></context-group>
</trans-unit>
- <trans-unit id="_msg407">
+ <trans-unit id="_msg405">
<source xml:space="preserve">none</source>
- <context-group purpose="location"><context context-type="linenumber">194</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">238</context></context-group>
</trans-unit>
- <trans-unit id="_msg408">
+ <trans-unit id="_msg406">
<source xml:space="preserve">Confirm options reset</source>
- <context-group purpose="location"><context context-type="linenumber">301</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">347</context></context-group>
<note annotates="source" from="developer">Window title text of pop-up window shown when the user has chosen to reset options.</note>
</trans-unit>
- <trans-unit id="_msg409">
+ <trans-unit id="_msg407">
<source xml:space="preserve">Client restart required to activate changes.</source>
- <context-group purpose="location"><context context-type="linenumber">292</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">371</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">338</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">419</context></context-group>
<note annotates="source" from="developer">Text explaining that the settings changed will not come into effect until the client is restarted.</note>
</trans-unit>
- <trans-unit id="_msg410">
+ <trans-unit id="_msg408">
<source xml:space="preserve">Current settings will be backed up at &quot;%1&quot;.</source>
- <context-group purpose="location"><context context-type="linenumber">296</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">342</context></context-group>
<note annotates="source" from="developer">Text explaining to the user that the client&apos;s current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location&apos;s path.</note>
</trans-unit>
- <trans-unit id="_msg411">
+ <trans-unit id="_msg409">
<source xml:space="preserve">Client will be shut down. Do you want to proceed?</source>
- <context-group purpose="location"><context context-type="linenumber">299</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">345</context></context-group>
<note annotates="source" from="developer">Text asking the user to confirm if they would like to proceed with a client shutdown.</note>
</trans-unit>
- <trans-unit id="_msg412">
+ <trans-unit id="_msg410">
<source xml:space="preserve">Configuration options</source>
- <context-group purpose="location"><context context-type="linenumber">319</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">365</context></context-group>
<note annotates="source" from="developer">Window title text of pop-up box that allows opening up of configuration file.</note>
</trans-unit>
- <trans-unit id="_msg413">
+ <trans-unit id="_msg411">
<source xml:space="preserve">The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file.</source>
- <context-group purpose="location"><context context-type="linenumber">322</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">368</context></context-group>
<note annotates="source" from="developer">Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings.</note>
</trans-unit>
- <trans-unit id="_msg414">
+ <trans-unit id="_msg412">
<source xml:space="preserve">Continue</source>
- <context-group purpose="location"><context context-type="linenumber">325</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">371</context></context-group>
</trans-unit>
- <trans-unit id="_msg415">
+ <trans-unit id="_msg413">
<source xml:space="preserve">Cancel</source>
- <context-group purpose="location"><context context-type="linenumber">326</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">372</context></context-group>
</trans-unit>
- <trans-unit id="_msg416">
+ <trans-unit id="_msg414">
<source xml:space="preserve">Error</source>
- <context-group purpose="location"><context context-type="linenumber">335</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
- <trans-unit id="_msg417">
+ <trans-unit id="_msg415">
<source xml:space="preserve">The configuration file could not be opened.</source>
- <context-group purpose="location"><context context-type="linenumber">335</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
- <trans-unit id="_msg418">
+ <trans-unit id="_msg416">
<source xml:space="preserve">This change would require a client restart.</source>
- <context-group purpose="location"><context context-type="linenumber">375</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">423</context></context-group>
</trans-unit>
- <trans-unit id="_msg419">
+ <trans-unit id="_msg417">
<source xml:space="preserve">The supplied proxy address is invalid.</source>
- <context-group purpose="location"><context context-type="linenumber">403</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">451</context></context-group>
+ </trans-unit>
+ </group>
+ <group restype="x-trolltech-linguist-context" resname="QObject">
+ <trans-unit id="_msg418">
+ <source xml:space="preserve">Embedded &quot;%1&quot;</source>
+ <context-group purpose="location"><context context-type="linenumber">62</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg419">
+ <source xml:space="preserve">Default system font &quot;%1&quot;</source>
+ <context-group purpose="location"><context context-type="linenumber">63</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg420">
+ <source xml:space="preserve">Custom…</source>
+ <context-group purpose="location"><context context-type="linenumber">64</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../optionsmodel.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="OptionsModel">
- <trans-unit id="_msg420">
+ <trans-unit id="_msg421">
<source xml:space="preserve">Could not read setting &quot;%1&quot;, %2.</source>
- <context-group purpose="location"><context context-type="linenumber">199</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">230</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../forms/overviewpage.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="OverviewPage">
- <trans-unit id="_msg421">
+ <trans-unit id="_msg422">
<source xml:space="preserve">Form</source>
<context-group purpose="location"><context context-type="linenumber">14</context></context-group>
</trans-unit>
- <trans-unit id="_msg422">
+ <trans-unit id="_msg423">
<source xml:space="preserve">The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source>
<context-group purpose="location"><context context-type="linenumber">76</context></context-group>
<context-group purpose="location"><context context-type="linenumber">411</context></context-group>
</trans-unit>
- <trans-unit id="_msg423">
+ <trans-unit id="_msg424">
<source xml:space="preserve">Watch-only:</source>
<context-group purpose="location"><context context-type="linenumber">284</context></context-group>
</trans-unit>
- <trans-unit id="_msg424">
+ <trans-unit id="_msg425">
<source xml:space="preserve">Available:</source>
<context-group purpose="location"><context context-type="linenumber">294</context></context-group>
</trans-unit>
- <trans-unit id="_msg425">
+ <trans-unit id="_msg426">
<source xml:space="preserve">Your current spendable balance</source>
<context-group purpose="location"><context context-type="linenumber">304</context></context-group>
</trans-unit>
- <trans-unit id="_msg426">
+ <trans-unit id="_msg427">
<source xml:space="preserve">Pending:</source>
<context-group purpose="location"><context context-type="linenumber">339</context></context-group>
</trans-unit>
- <trans-unit id="_msg427">
+ <trans-unit id="_msg428">
<source xml:space="preserve">Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
<context-group purpose="location"><context context-type="linenumber">139</context></context-group>
</trans-unit>
- <trans-unit id="_msg428">
+ <trans-unit id="_msg429">
<source xml:space="preserve">Immature:</source>
<context-group purpose="location"><context context-type="linenumber">239</context></context-group>
</trans-unit>
- <trans-unit id="_msg429">
+ <trans-unit id="_msg430">
<source xml:space="preserve">Mined balance that has not yet matured</source>
<context-group purpose="location"><context context-type="linenumber">210</context></context-group>
</trans-unit>
- <trans-unit id="_msg430">
+ <trans-unit id="_msg431">
<source xml:space="preserve">Balances</source>
<context-group purpose="location"><context context-type="linenumber">60</context></context-group>
</trans-unit>
- <trans-unit id="_msg431">
+ <trans-unit id="_msg432">
<source xml:space="preserve">Total:</source>
<context-group purpose="location"><context context-type="linenumber">200</context></context-group>
</trans-unit>
- <trans-unit id="_msg432">
+ <trans-unit id="_msg433">
<source xml:space="preserve">Your current total balance</source>
<context-group purpose="location"><context context-type="linenumber">249</context></context-group>
</trans-unit>
- <trans-unit id="_msg433">
+ <trans-unit id="_msg434">
<source xml:space="preserve">Your current balance in watch-only addresses</source>
<context-group purpose="location"><context context-type="linenumber">323</context></context-group>
</trans-unit>
- <trans-unit id="_msg434">
+ <trans-unit id="_msg435">
<source xml:space="preserve">Spendable:</source>
<context-group purpose="location"><context context-type="linenumber">346</context></context-group>
</trans-unit>
- <trans-unit id="_msg435">
+ <trans-unit id="_msg436">
<source xml:space="preserve">Recent transactions</source>
<context-group purpose="location"><context context-type="linenumber">395</context></context-group>
</trans-unit>
- <trans-unit id="_msg436">
+ <trans-unit id="_msg437">
<source xml:space="preserve">Unconfirmed transactions to watch-only addresses</source>
<context-group purpose="location"><context context-type="linenumber">120</context></context-group>
</trans-unit>
- <trans-unit id="_msg437">
+ <trans-unit id="_msg438">
<source xml:space="preserve">Mined balance in watch-only addresses that has not yet matured</source>
<context-group purpose="location"><context context-type="linenumber">158</context></context-group>
</trans-unit>
- <trans-unit id="_msg438">
+ <trans-unit id="_msg439">
<source xml:space="preserve">Current total balance in watch-only addresses</source>
<context-group purpose="location"><context context-type="linenumber">268</context></context-group>
</trans-unit>
@@ -1983,7 +1989,7 @@ The migration process will create a backup of the wallet before migrating. This
</body></file>
<file original="../overviewpage.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="OverviewPage">
- <trans-unit id="_msg439">
+ <trans-unit id="_msg440">
<source xml:space="preserve">Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
<context-group purpose="location"><context context-type="linenumber">184</context></context-group>
</trans-unit>
@@ -1991,27 +1997,27 @@ The migration process will create a backup of the wallet before migrating. This
</body></file>
<file original="../forms/psbtoperationsdialog.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="PSBTOperationsDialog">
- <trans-unit id="_msg440">
+ <trans-unit id="_msg441">
<source xml:space="preserve">PSBT Operations</source>
<context-group purpose="location"><context context-type="linenumber">14</context></context-group>
</trans-unit>
- <trans-unit id="_msg441">
+ <trans-unit id="_msg442">
<source xml:space="preserve">Sign Tx</source>
<context-group purpose="location"><context context-type="linenumber">86</context></context-group>
</trans-unit>
- <trans-unit id="_msg442">
+ <trans-unit id="_msg443">
<source xml:space="preserve">Broadcast Tx</source>
<context-group purpose="location"><context context-type="linenumber">102</context></context-group>
</trans-unit>
- <trans-unit id="_msg443">
+ <trans-unit id="_msg444">
<source xml:space="preserve">Copy to Clipboard</source>
<context-group purpose="location"><context context-type="linenumber">122</context></context-group>
</trans-unit>
- <trans-unit id="_msg444">
+ <trans-unit id="_msg445">
<source xml:space="preserve">Save…</source>
<context-group purpose="location"><context context-type="linenumber">129</context></context-group>
</trans-unit>
- <trans-unit id="_msg445">
+ <trans-unit id="_msg446">
<source xml:space="preserve">Close</source>
<context-group purpose="location"><context context-type="linenumber">136</context></context-group>
</trans-unit>
@@ -2019,112 +2025,112 @@ The migration process will create a backup of the wallet before migrating. This
</body></file>
<file original="../psbtoperationsdialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="PSBTOperationsDialog">
- <trans-unit id="_msg446">
+ <trans-unit id="_msg447">
<source xml:space="preserve">Failed to load transaction: %1</source>
<context-group purpose="location"><context context-type="linenumber">60</context></context-group>
</trans-unit>
- <trans-unit id="_msg447">
+ <trans-unit id="_msg448">
<source xml:space="preserve">Failed to sign transaction: %1</source>
<context-group purpose="location"><context context-type="linenumber">85</context></context-group>
</trans-unit>
- <trans-unit id="_msg448">
+ <trans-unit id="_msg449">
<source xml:space="preserve">Cannot sign inputs while wallet is locked.</source>
<context-group purpose="location"><context context-type="linenumber">93</context></context-group>
</trans-unit>
- <trans-unit id="_msg449">
+ <trans-unit id="_msg450">
<source xml:space="preserve">Could not sign any more inputs.</source>
<context-group purpose="location"><context context-type="linenumber">95</context></context-group>
</trans-unit>
- <trans-unit id="_msg450">
+ <trans-unit id="_msg451">
<source xml:space="preserve">Signed %1 inputs, but more signatures are still required.</source>
<context-group purpose="location"><context context-type="linenumber">97</context></context-group>
</trans-unit>
- <trans-unit id="_msg451">
+ <trans-unit id="_msg452">
<source xml:space="preserve">Signed transaction successfully. Transaction is ready to broadcast.</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
- <trans-unit id="_msg452">
+ <trans-unit id="_msg453">
<source xml:space="preserve">Unknown error processing transaction.</source>
<context-group purpose="location"><context context-type="linenumber">112</context></context-group>
</trans-unit>
- <trans-unit id="_msg453">
+ <trans-unit id="_msg454">
<source xml:space="preserve">Transaction broadcast successfully! Transaction ID: %1</source>
<context-group purpose="location"><context context-type="linenumber">122</context></context-group>
</trans-unit>
- <trans-unit id="_msg454">
+ <trans-unit id="_msg455">
<source xml:space="preserve">Transaction broadcast failed: %1</source>
<context-group purpose="location"><context context-type="linenumber">125</context></context-group>
</trans-unit>
- <trans-unit id="_msg455">
+ <trans-unit id="_msg456">
<source xml:space="preserve">PSBT copied to clipboard.</source>
<context-group purpose="location"><context context-type="linenumber">134</context></context-group>
</trans-unit>
- <trans-unit id="_msg456">
+ <trans-unit id="_msg457">
<source xml:space="preserve">Save Transaction Data</source>
<context-group purpose="location"><context context-type="linenumber">157</context></context-group>
</trans-unit>
- <trans-unit id="_msg457">
+ <trans-unit id="_msg458">
<source xml:space="preserve">Partially Signed Transaction (Binary)</source>
<context-group purpose="location"><context context-type="linenumber">159</context></context-group>
<note annotates="source" from="developer">Expanded name of the binary PSBT file format. See: BIP 174.</note>
</trans-unit>
- <trans-unit id="_msg458">
+ <trans-unit id="_msg459">
<source xml:space="preserve">PSBT saved to disk.</source>
<context-group purpose="location"><context context-type="linenumber">166</context></context-group>
</trans-unit>
- <trans-unit id="_msg459">
+ <trans-unit id="_msg460">
<source xml:space="preserve">Sends %1 to %2</source>
<context-group purpose="location"><context context-type="linenumber">183</context></context-group>
</trans-unit>
- <trans-unit id="_msg460">
+ <trans-unit id="_msg461">
<source xml:space="preserve">own address</source>
<context-group purpose="location"><context context-type="linenumber">187</context></context-group>
</trans-unit>
- <trans-unit id="_msg461">
+ <trans-unit id="_msg462">
<source xml:space="preserve">Unable to calculate transaction fee or total transaction amount.</source>
<context-group purpose="location"><context context-type="linenumber">195</context></context-group>
</trans-unit>
- <trans-unit id="_msg462">
+ <trans-unit id="_msg463">
<source xml:space="preserve">Pays transaction fee: </source>
<context-group purpose="location"><context context-type="linenumber">197</context></context-group>
</trans-unit>
- <trans-unit id="_msg463">
+ <trans-unit id="_msg464">
<source xml:space="preserve">Total Amount</source>
<context-group purpose="location"><context context-type="linenumber">209</context></context-group>
</trans-unit>
- <trans-unit id="_msg464">
+ <trans-unit id="_msg465">
<source xml:space="preserve">or</source>
<context-group purpose="location"><context context-type="linenumber">212</context></context-group>
</trans-unit>
- <trans-unit id="_msg465">
+ <trans-unit id="_msg466">
<source xml:space="preserve">Transaction has %1 unsigned inputs.</source>
<context-group purpose="location"><context context-type="linenumber">218</context></context-group>
</trans-unit>
- <trans-unit id="_msg466">
+ <trans-unit id="_msg467">
<source xml:space="preserve">Transaction is missing some information about inputs.</source>
<context-group purpose="location"><context context-type="linenumber">264</context></context-group>
</trans-unit>
- <trans-unit id="_msg467">
+ <trans-unit id="_msg468">
<source xml:space="preserve">Transaction still needs signature(s).</source>
<context-group purpose="location"><context context-type="linenumber">268</context></context-group>
</trans-unit>
- <trans-unit id="_msg468">
+ <trans-unit id="_msg469">
<source xml:space="preserve">(But no wallet is loaded.)</source>
<context-group purpose="location"><context context-type="linenumber">271</context></context-group>
</trans-unit>
- <trans-unit id="_msg469">
+ <trans-unit id="_msg470">
<source xml:space="preserve">(But this wallet cannot sign transactions.)</source>
<context-group purpose="location"><context context-type="linenumber">274</context></context-group>
</trans-unit>
- <trans-unit id="_msg470">
+ <trans-unit id="_msg471">
<source xml:space="preserve">(But this wallet does not have the right keys.)</source>
<context-group purpose="location"><context context-type="linenumber">277</context></context-group>
</trans-unit>
- <trans-unit id="_msg471">
+ <trans-unit id="_msg472">
<source xml:space="preserve">Transaction is fully signed and ready for broadcast.</source>
<context-group purpose="location"><context context-type="linenumber">285</context></context-group>
</trans-unit>
- <trans-unit id="_msg472">
+ <trans-unit id="_msg473">
<source xml:space="preserve">Transaction status is unknown.</source>
<context-group purpose="location"><context context-type="linenumber">289</context></context-group>
</trans-unit>
@@ -2132,37 +2138,37 @@ The migration process will create a backup of the wallet before migrating. This
</body></file>
<file original="../paymentserver.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="PaymentServer">
- <trans-unit id="_msg473">
+ <trans-unit id="_msg474">
<source xml:space="preserve">Payment request error</source>
<context-group purpose="location"><context context-type="linenumber">149</context></context-group>
</trans-unit>
- <trans-unit id="_msg474">
+ <trans-unit id="_msg475">
<source xml:space="preserve">Cannot start bitcoin: click-to-pay handler</source>
<context-group purpose="location"><context context-type="linenumber">150</context></context-group>
</trans-unit>
- <trans-unit id="_msg475">
+ <trans-unit id="_msg476">
<source xml:space="preserve">URI handling</source>
<context-group purpose="location"><context context-type="linenumber">198</context></context-group>
<context-group purpose="location"><context context-type="linenumber">214</context></context-group>
<context-group purpose="location"><context context-type="linenumber">220</context></context-group>
<context-group purpose="location"><context context-type="linenumber">227</context></context-group>
</trans-unit>
- <trans-unit id="_msg476">
+ <trans-unit id="_msg477">
<source xml:space="preserve">&apos;bitcoin://&apos; is not a valid URI. Use &apos;bitcoin:&apos; instead.</source>
<context-group purpose="location"><context context-type="linenumber">198</context></context-group>
</trans-unit>
- <trans-unit id="_msg477">
+ <trans-unit id="_msg478">
<source xml:space="preserve">Cannot process payment request because BIP70 is not supported.
Due to widespread security flaws in BIP70 it&apos;s strongly recommended that any merchant instructions to switch wallets be ignored.
If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
<context-group purpose="location"><context context-type="linenumber">215</context></context-group>
<context-group purpose="location"><context context-type="linenumber">238</context></context-group>
</trans-unit>
- <trans-unit id="_msg478">
+ <trans-unit id="_msg479">
<source xml:space="preserve">URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
<context-group purpose="location"><context context-type="linenumber">228</context></context-group>
</trans-unit>
- <trans-unit id="_msg479">
+ <trans-unit id="_msg480">
<source xml:space="preserve">Payment request file handling</source>
<context-group purpose="location"><context context-type="linenumber">237</context></context-group>
</trans-unit>
@@ -2170,52 +2176,52 @@ If you are receiving this error you should request the merchant provide a BIP21
</body></file>
<file original="../peertablemodel.h" datatype="c" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="PeerTableModel">
- <trans-unit id="_msg480">
+ <trans-unit id="_msg481">
<source xml:space="preserve">User Agent</source>
<context-group purpose="location"><context context-type="linenumber">112</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which contains the peer&apos;s User Agent string.</note>
</trans-unit>
- <trans-unit id="_msg481">
+ <trans-unit id="_msg482">
<source xml:space="preserve">Ping</source>
<context-group purpose="location"><context context-type="linenumber">103</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which indicates the current latency of the connection with the peer.</note>
</trans-unit>
- <trans-unit id="_msg482">
+ <trans-unit id="_msg483">
<source xml:space="preserve">Peer</source>
<context-group purpose="location"><context context-type="linenumber">85</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which contains a unique number used to identify a connection.</note>
</trans-unit>
- <trans-unit id="_msg483">
+ <trans-unit id="_msg484">
<source xml:space="preserve">Age</source>
<context-group purpose="location"><context context-type="linenumber">88</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</note>
</trans-unit>
- <trans-unit id="_msg484">
+ <trans-unit id="_msg485">
<source xml:space="preserve">Direction</source>
<context-group purpose="location"><context context-type="linenumber">94</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which indicates the direction the peer connection was initiated from.</note>
</trans-unit>
- <trans-unit id="_msg485">
+ <trans-unit id="_msg486">
<source xml:space="preserve">Sent</source>
<context-group purpose="location"><context context-type="linenumber">106</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which indicates the total amount of network information we have sent to the peer.</note>
</trans-unit>
- <trans-unit id="_msg486">
+ <trans-unit id="_msg487">
<source xml:space="preserve">Received</source>
<context-group purpose="location"><context context-type="linenumber">109</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which indicates the total amount of network information we have received from the peer.</note>
</trans-unit>
- <trans-unit id="_msg487">
+ <trans-unit id="_msg488">
<source xml:space="preserve">Address</source>
<context-group purpose="location"><context context-type="linenumber">91</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</note>
</trans-unit>
- <trans-unit id="_msg488">
+ <trans-unit id="_msg489">
<source xml:space="preserve">Type</source>
<context-group purpose="location"><context context-type="linenumber">97</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which describes the type of peer connection. The &quot;type&quot; describes why the connection exists.</note>
</trans-unit>
- <trans-unit id="_msg489">
+ <trans-unit id="_msg490">
<source xml:space="preserve">Network</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which states the network the peer connected through.</note>
@@ -2224,12 +2230,12 @@ If you are receiving this error you should request the merchant provide a BIP21
</body></file>
<file original="../peertablemodel.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="PeerTableModel">
- <trans-unit id="_msg490">
+ <trans-unit id="_msg491">
<source xml:space="preserve">Inbound</source>
<context-group purpose="location"><context context-type="linenumber">77</context></context-group>
<note annotates="source" from="developer">An Inbound Connection from a Peer.</note>
</trans-unit>
- <trans-unit id="_msg491">
+ <trans-unit id="_msg492">
<source xml:space="preserve">Outbound</source>
<context-group purpose="location"><context context-type="linenumber">79</context></context-group>
<note annotates="source" from="developer">An Outbound Connection to a Peer.</note>
@@ -2238,7 +2244,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</body></file>
<file original="../bitcoinunits.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="QObject">
- <trans-unit id="_msg492">
+ <trans-unit id="_msg493">
<source xml:space="preserve">Amount</source>
<context-group purpose="location"><context context-type="linenumber">197</context></context-group>
</trans-unit>
@@ -2246,190 +2252,190 @@ If you are receiving this error you should request the merchant provide a BIP21
</body></file>
<file original="../guiutil.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="QObject">
- <trans-unit id="_msg493">
+ <trans-unit id="_msg494">
<source xml:space="preserve">Enter a Bitcoin address (e.g. %1)</source>
<context-group purpose="location"><context context-type="linenumber">133</context></context-group>
</trans-unit>
- <trans-unit id="_msg494">
+ <trans-unit id="_msg495">
<source xml:space="preserve">Ctrl+W</source>
<context-group purpose="location"><context context-type="linenumber">421</context></context-group>
</trans-unit>
- <trans-unit id="_msg495">
+ <trans-unit id="_msg496">
<source xml:space="preserve">Unroutable</source>
<context-group purpose="location"><context context-type="linenumber">678</context></context-group>
</trans-unit>
- <trans-unit id="_msg496">
+ <trans-unit id="_msg497">
<source xml:space="preserve">IPv4</source>
<context-group purpose="location"><context context-type="linenumber">680</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">network name</context></context-group>
<note annotates="source" from="developer">Name of IPv4 network in peer info</note>
</trans-unit>
- <trans-unit id="_msg497">
+ <trans-unit id="_msg498">
<source xml:space="preserve">IPv6</source>
<context-group purpose="location"><context context-type="linenumber">682</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">network name</context></context-group>
<note annotates="source" from="developer">Name of IPv6 network in peer info</note>
</trans-unit>
- <trans-unit id="_msg498">
+ <trans-unit id="_msg499">
<source xml:space="preserve">Onion</source>
<context-group purpose="location"><context context-type="linenumber">684</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">network name</context></context-group>
<note annotates="source" from="developer">Name of Tor network in peer info</note>
</trans-unit>
- <trans-unit id="_msg499">
+ <trans-unit id="_msg500">
<source xml:space="preserve">I2P</source>
<context-group purpose="location"><context context-type="linenumber">686</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">network name</context></context-group>
<note annotates="source" from="developer">Name of I2P network in peer info</note>
</trans-unit>
- <trans-unit id="_msg500">
+ <trans-unit id="_msg501">
<source xml:space="preserve">CJDNS</source>
<context-group purpose="location"><context context-type="linenumber">688</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">network name</context></context-group>
<note annotates="source" from="developer">Name of CJDNS network in peer info</note>
</trans-unit>
- <trans-unit id="_msg501">
+ <trans-unit id="_msg502">
<source xml:space="preserve">Inbound</source>
<context-group purpose="location"><context context-type="linenumber">702</context></context-group>
<note annotates="source" from="developer">An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</note>
</trans-unit>
- <trans-unit id="_msg502">
+ <trans-unit id="_msg503">
<source xml:space="preserve">Outbound</source>
<context-group purpose="location"><context context-type="linenumber">705</context></context-group>
<note annotates="source" from="developer">An outbound connection to a peer. An outbound connection is a connection initiated by us.</note>
</trans-unit>
- <trans-unit id="_msg503">
+ <trans-unit id="_msg504">
<source xml:space="preserve">Full Relay</source>
<context-group purpose="location"><context context-type="linenumber">710</context></context-group>
<note annotates="source" from="developer">Peer connection type that relays all network information.</note>
</trans-unit>
- <trans-unit id="_msg504">
+ <trans-unit id="_msg505">
<source xml:space="preserve">Block Relay</source>
<context-group purpose="location"><context context-type="linenumber">713</context></context-group>
<note annotates="source" from="developer">Peer connection type that relays network information about blocks and not transactions or addresses.</note>
</trans-unit>
- <trans-unit id="_msg505">
+ <trans-unit id="_msg506">
<source xml:space="preserve">Manual</source>
<context-group purpose="location"><context context-type="linenumber">715</context></context-group>
<note annotates="source" from="developer">Peer connection type established manually through one of several methods.</note>
</trans-unit>
- <trans-unit id="_msg506">
+ <trans-unit id="_msg507">
<source xml:space="preserve">Feeler</source>
<context-group purpose="location"><context context-type="linenumber">717</context></context-group>
<note annotates="source" from="developer">Short-lived peer connection type that tests the aliveness of known addresses.</note>
</trans-unit>
- <trans-unit id="_msg507">
+ <trans-unit id="_msg508">
<source xml:space="preserve">Address Fetch</source>
<context-group purpose="location"><context context-type="linenumber">719</context></context-group>
<note annotates="source" from="developer">Short-lived peer connection type that solicits known addresses from a peer.</note>
</trans-unit>
- <trans-unit id="_msg508">
+ <trans-unit id="_msg509">
<source xml:space="preserve">%1 d</source>
<context-group purpose="location"><context context-type="linenumber">731</context></context-group>
<context-group purpose="location"><context context-type="linenumber">743</context></context-group>
</trans-unit>
- <trans-unit id="_msg509">
+ <trans-unit id="_msg510">
<source xml:space="preserve">%1 h</source>
<context-group purpose="location"><context context-type="linenumber">732</context></context-group>
<context-group purpose="location"><context context-type="linenumber">744</context></context-group>
</trans-unit>
- <trans-unit id="_msg510">
+ <trans-unit id="_msg511">
<source xml:space="preserve">%1 m</source>
<context-group purpose="location"><context context-type="linenumber">733</context></context-group>
<context-group purpose="location"><context context-type="linenumber">745</context></context-group>
</trans-unit>
- <trans-unit id="_msg511">
+ <trans-unit id="_msg512">
<source xml:space="preserve">%1 s</source>
<context-group purpose="location"><context context-type="linenumber">735</context></context-group>
<context-group purpose="location"><context context-type="linenumber">746</context></context-group>
<context-group purpose="location"><context context-type="linenumber">772</context></context-group>
</trans-unit>
- <trans-unit id="_msg512">
+ <trans-unit id="_msg513">
<source xml:space="preserve">None</source>
<context-group purpose="location"><context context-type="linenumber">760</context></context-group>
</trans-unit>
- <trans-unit id="_msg513">
+ <trans-unit id="_msg514">
<source xml:space="preserve">N/A</source>
<context-group purpose="location"><context context-type="linenumber">766</context></context-group>
</trans-unit>
- <trans-unit id="_msg514">
+ <trans-unit id="_msg515">
<source xml:space="preserve">%1 ms</source>
<context-group purpose="location"><context context-type="linenumber">767</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
<context-group purpose="location"><context context-type="linenumber">785</context></context-group>
- <trans-unit id="_msg515[0]">
+ <trans-unit id="_msg516[0]">
<source xml:space="preserve">%n second(s)</source>
</trans-unit>
- <trans-unit id="_msg515[1]">
+ <trans-unit id="_msg516[1]">
<source xml:space="preserve">%n second(s)</source>
</trans-unit>
</group>
<group restype="x-gettext-plurals">
<context-group purpose="location"><context context-type="linenumber">789</context></context-group>
- <trans-unit id="_msg516[0]">
+ <trans-unit id="_msg517[0]">
<source xml:space="preserve">%n minute(s)</source>
</trans-unit>
- <trans-unit id="_msg516[1]">
+ <trans-unit id="_msg517[1]">
<source xml:space="preserve">%n minute(s)</source>
</trans-unit>
</group>
<group restype="x-gettext-plurals">
<context-group purpose="location"><context context-type="linenumber">793</context></context-group>
- <trans-unit id="_msg517[0]">
+ <trans-unit id="_msg518[0]">
<source xml:space="preserve">%n hour(s)</source>
</trans-unit>
- <trans-unit id="_msg517[1]">
+ <trans-unit id="_msg518[1]">
<source xml:space="preserve">%n hour(s)</source>
</trans-unit>
</group>
<group restype="x-gettext-plurals">
<context-group purpose="location"><context context-type="linenumber">797</context></context-group>
- <trans-unit id="_msg518[0]">
+ <trans-unit id="_msg519[0]">
<source xml:space="preserve">%n day(s)</source>
</trans-unit>
- <trans-unit id="_msg518[1]">
+ <trans-unit id="_msg519[1]">
<source xml:space="preserve">%n day(s)</source>
</trans-unit>
</group>
<group restype="x-gettext-plurals">
<context-group purpose="location"><context context-type="linenumber">801</context></context-group>
<context-group purpose="location"><context context-type="linenumber">807</context></context-group>
- <trans-unit id="_msg519[0]">
+ <trans-unit id="_msg520[0]">
<source xml:space="preserve">%n week(s)</source>
</trans-unit>
- <trans-unit id="_msg519[1]">
+ <trans-unit id="_msg520[1]">
<source xml:space="preserve">%n week(s)</source>
</trans-unit>
</group>
- <trans-unit id="_msg520">
+ <trans-unit id="_msg521">
<source xml:space="preserve">%1 and %2</source>
<context-group purpose="location"><context context-type="linenumber">807</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
<context-group purpose="location"><context context-type="linenumber">807</context></context-group>
- <trans-unit id="_msg521[0]">
+ <trans-unit id="_msg522[0]">
<source xml:space="preserve">%n year(s)</source>
</trans-unit>
- <trans-unit id="_msg521[1]">
+ <trans-unit id="_msg522[1]">
<source xml:space="preserve">%n year(s)</source>
</trans-unit>
</group>
- <trans-unit id="_msg522">
+ <trans-unit id="_msg523">
<source xml:space="preserve">%1 B</source>
<context-group purpose="location"><context context-type="linenumber">815</context></context-group>
</trans-unit>
- <trans-unit id="_msg523">
+ <trans-unit id="_msg524">
<source xml:space="preserve">%1 kB</source>
<context-group purpose="location"><context context-type="linenumber">817</context></context-group>
- <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1004</context></context-group>
+ <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1006</context></context-group>
</trans-unit>
- <trans-unit id="_msg524">
+ <trans-unit id="_msg525">
<source xml:space="preserve">%1 MB</source>
<context-group purpose="location"><context context-type="linenumber">819</context></context-group>
- <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1006</context></context-group>
+ <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1008</context></context-group>
</trans-unit>
- <trans-unit id="_msg525">
+ <trans-unit id="_msg526">
<source xml:space="preserve">%1 GB</source>
<context-group purpose="location"><context context-type="linenumber">821</context></context-group>
</trans-unit>
@@ -2437,31 +2443,31 @@ If you are receiving this error you should request the merchant provide a BIP21
</body></file>
<file original="../qrimagewidget.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="QRImageWidget">
- <trans-unit id="_msg526">
+ <trans-unit id="_msg527">
<source xml:space="preserve">&amp;Save Image…</source>
<context-group purpose="location"><context context-type="linenumber">30</context></context-group>
</trans-unit>
- <trans-unit id="_msg527">
+ <trans-unit id="_msg528">
<source xml:space="preserve">&amp;Copy Image</source>
<context-group purpose="location"><context context-type="linenumber">31</context></context-group>
</trans-unit>
- <trans-unit id="_msg528">
+ <trans-unit id="_msg529">
<source xml:space="preserve">Resulting URI too long, try to reduce the text for label / message.</source>
<context-group purpose="location"><context context-type="linenumber">42</context></context-group>
</trans-unit>
- <trans-unit id="_msg529">
+ <trans-unit id="_msg530">
<source xml:space="preserve">Error encoding URI into QR Code.</source>
<context-group purpose="location"><context context-type="linenumber">49</context></context-group>
</trans-unit>
- <trans-unit id="_msg530">
+ <trans-unit id="_msg531">
<source xml:space="preserve">QR code support not available.</source>
<context-group purpose="location"><context context-type="linenumber">90</context></context-group>
</trans-unit>
- <trans-unit id="_msg531">
+ <trans-unit id="_msg532">
<source xml:space="preserve">Save QR Code</source>
<context-group purpose="location"><context context-type="linenumber">120</context></context-group>
</trans-unit>
- <trans-unit id="_msg532">
+ <trans-unit id="_msg533">
<source xml:space="preserve">PNG Image</source>
<context-group purpose="location"><context context-type="linenumber">123</context></context-group>
<note annotates="source" from="developer">Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</note>
@@ -2470,7 +2476,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</body></file>
<file original="../forms/debugwindow.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="RPCConsole">
- <trans-unit id="_msg533">
+ <trans-unit id="_msg534">
<source xml:space="preserve">N/A</source>
<context-group purpose="location"><context context-type="linenumber">75</context></context-group>
<context-group purpose="location"><context context-type="linenumber">101</context></context-group>
@@ -2513,307 +2519,307 @@ If you are receiving this error you should request the merchant provide a BIP21
<context-group purpose="location"><context context-type="linenumber">1714</context></context-group>
<context-group purpose="location"><context context-type="sourcefile">../rpcconsole.h</context><context context-type="linenumber">147</context></context-group>
</trans-unit>
- <trans-unit id="_msg534">
+ <trans-unit id="_msg535">
<source xml:space="preserve">Client version</source>
<context-group purpose="location"><context context-type="linenumber">65</context></context-group>
</trans-unit>
- <trans-unit id="_msg535">
+ <trans-unit id="_msg536">
<source xml:space="preserve">&amp;Information</source>
<context-group purpose="location"><context context-type="linenumber">43</context></context-group>
</trans-unit>
- <trans-unit id="_msg536">
+ <trans-unit id="_msg537">
<source xml:space="preserve">General</source>
<context-group purpose="location"><context context-type="linenumber">58</context></context-group>
</trans-unit>
- <trans-unit id="_msg537">
+ <trans-unit id="_msg538">
<source xml:space="preserve">Datadir</source>
<context-group purpose="location"><context context-type="linenumber">114</context></context-group>
</trans-unit>
- <trans-unit id="_msg538">
+ <trans-unit id="_msg539">
<source xml:space="preserve">To specify a non-default location of the data directory use the &apos;%1&apos; option.</source>
<context-group purpose="location"><context context-type="linenumber">124</context></context-group>
</trans-unit>
- <trans-unit id="_msg539">
+ <trans-unit id="_msg540">
<source xml:space="preserve">Blocksdir</source>
<context-group purpose="location"><context context-type="linenumber">143</context></context-group>
</trans-unit>
- <trans-unit id="_msg540">
+ <trans-unit id="_msg541">
<source xml:space="preserve">To specify a non-default location of the blocks directory use the &apos;%1&apos; option.</source>
<context-group purpose="location"><context context-type="linenumber">153</context></context-group>
</trans-unit>
- <trans-unit id="_msg541">
+ <trans-unit id="_msg542">
<source xml:space="preserve">Startup time</source>
<context-group purpose="location"><context context-type="linenumber">172</context></context-group>
</trans-unit>
- <trans-unit id="_msg542">
+ <trans-unit id="_msg543">
<source xml:space="preserve">Network</source>
<context-group purpose="location"><context context-type="linenumber">201</context></context-group>
<context-group purpose="location"><context context-type="linenumber">1145</context></context-group>
</trans-unit>
- <trans-unit id="_msg543">
+ <trans-unit id="_msg544">
<source xml:space="preserve">Name</source>
<context-group purpose="location"><context context-type="linenumber">208</context></context-group>
</trans-unit>
- <trans-unit id="_msg544">
+ <trans-unit id="_msg545">
<source xml:space="preserve">Number of connections</source>
<context-group purpose="location"><context context-type="linenumber">231</context></context-group>
</trans-unit>
- <trans-unit id="_msg545">
+ <trans-unit id="_msg546">
<source xml:space="preserve">Block chain</source>
<context-group purpose="location"><context context-type="linenumber">260</context></context-group>
</trans-unit>
- <trans-unit id="_msg546">
+ <trans-unit id="_msg547">
<source xml:space="preserve">Memory Pool</source>
<context-group purpose="location"><context context-type="linenumber">319</context></context-group>
</trans-unit>
- <trans-unit id="_msg547">
+ <trans-unit id="_msg548">
<source xml:space="preserve">Current number of transactions</source>
<context-group purpose="location"><context context-type="linenumber">326</context></context-group>
</trans-unit>
- <trans-unit id="_msg548">
+ <trans-unit id="_msg549">
<source xml:space="preserve">Memory usage</source>
<context-group purpose="location"><context context-type="linenumber">349</context></context-group>
</trans-unit>
- <trans-unit id="_msg549">
+ <trans-unit id="_msg550">
<source xml:space="preserve">Wallet: </source>
<context-group purpose="location"><context context-type="linenumber">443</context></context-group>
</trans-unit>
- <trans-unit id="_msg550">
+ <trans-unit id="_msg551">
<source xml:space="preserve">(none)</source>
<context-group purpose="location"><context context-type="linenumber">454</context></context-group>
</trans-unit>
- <trans-unit id="_msg551">
+ <trans-unit id="_msg552">
<source xml:space="preserve">&amp;Reset</source>
<context-group purpose="location"><context context-type="linenumber">665</context></context-group>
</trans-unit>
- <trans-unit id="_msg552">
+ <trans-unit id="_msg553">
<source xml:space="preserve">Received</source>
<context-group purpose="location"><context context-type="linenumber">745</context></context-group>
<context-group purpose="location"><context context-type="linenumber">1505</context></context-group>
</trans-unit>
- <trans-unit id="_msg553">
+ <trans-unit id="_msg554">
<source xml:space="preserve">Sent</source>
<context-group purpose="location"><context context-type="linenumber">825</context></context-group>
<context-group purpose="location"><context context-type="linenumber">1482</context></context-group>
</trans-unit>
- <trans-unit id="_msg554">
+ <trans-unit id="_msg555">
<source xml:space="preserve">&amp;Peers</source>
<context-group purpose="location"><context context-type="linenumber">866</context></context-group>
</trans-unit>
- <trans-unit id="_msg555">
+ <trans-unit id="_msg556">
<source xml:space="preserve">Banned peers</source>
<context-group purpose="location"><context context-type="linenumber">942</context></context-group>
</trans-unit>
- <trans-unit id="_msg556">
+ <trans-unit id="_msg557">
<source xml:space="preserve">Select a peer to view detailed information.</source>
<context-group purpose="location"><context context-type="linenumber">1010</context></context-group>
- <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1171</context></context-group>
+ <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1173</context></context-group>
</trans-unit>
- <trans-unit id="_msg557">
+ <trans-unit id="_msg558">
<source xml:space="preserve">The transport layer version: %1</source>
<context-group purpose="location"><context context-type="linenumber">1090</context></context-group>
</trans-unit>
- <trans-unit id="_msg558">
+ <trans-unit id="_msg559">
<source xml:space="preserve">Transport</source>
<context-group purpose="location"><context context-type="linenumber">1093</context></context-group>
</trans-unit>
- <trans-unit id="_msg559">
+ <trans-unit id="_msg560">
<source xml:space="preserve">The BIP324 session ID string in hex, if any.</source>
<context-group purpose="location"><context context-type="linenumber">1116</context></context-group>
</trans-unit>
- <trans-unit id="_msg560">
+ <trans-unit id="_msg561">
<source xml:space="preserve">Session ID</source>
<context-group purpose="location"><context context-type="linenumber">1119</context></context-group>
</trans-unit>
- <trans-unit id="_msg561">
+ <trans-unit id="_msg562">
<source xml:space="preserve">Version</source>
<context-group purpose="location"><context context-type="linenumber">1168</context></context-group>
</trans-unit>
- <trans-unit id="_msg562">
+ <trans-unit id="_msg563">
<source xml:space="preserve">Whether we relay transactions to this peer.</source>
<context-group purpose="location"><context context-type="linenumber">1240</context></context-group>
</trans-unit>
- <trans-unit id="_msg563">
+ <trans-unit id="_msg564">
<source xml:space="preserve">Transaction Relay</source>
<context-group purpose="location"><context context-type="linenumber">1243</context></context-group>
</trans-unit>
- <trans-unit id="_msg564">
+ <trans-unit id="_msg565">
<source xml:space="preserve">Starting Block</source>
<context-group purpose="location"><context context-type="linenumber">1292</context></context-group>
</trans-unit>
- <trans-unit id="_msg565">
+ <trans-unit id="_msg566">
<source xml:space="preserve">Synced Headers</source>
<context-group purpose="location"><context context-type="linenumber">1315</context></context-group>
</trans-unit>
- <trans-unit id="_msg566">
+ <trans-unit id="_msg567">
<source xml:space="preserve">Synced Blocks</source>
<context-group purpose="location"><context context-type="linenumber">1338</context></context-group>
</trans-unit>
- <trans-unit id="_msg567">
+ <trans-unit id="_msg568">
<source xml:space="preserve">Last Transaction</source>
<context-group purpose="location"><context context-type="linenumber">1413</context></context-group>
</trans-unit>
- <trans-unit id="_msg568">
+ <trans-unit id="_msg569">
<source xml:space="preserve">The mapped Autonomous System used for diversifying peer selection.</source>
<context-group purpose="location"><context context-type="linenumber">1623</context></context-group>
</trans-unit>
- <trans-unit id="_msg569">
+ <trans-unit id="_msg570">
<source xml:space="preserve">Mapped AS</source>
<context-group purpose="location"><context context-type="linenumber">1626</context></context-group>
</trans-unit>
- <trans-unit id="_msg570">
+ <trans-unit id="_msg571">
<source xml:space="preserve">Whether we relay addresses to this peer.</source>
<context-group purpose="location"><context context-type="linenumber">1649</context></context-group>
<note annotates="source" from="developer">Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</note>
</trans-unit>
- <trans-unit id="_msg571">
+ <trans-unit id="_msg572">
<source xml:space="preserve">Address Relay</source>
<context-group purpose="location"><context context-type="linenumber">1652</context></context-group>
<note annotates="source" from="developer">Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</note>
</trans-unit>
- <trans-unit id="_msg572">
+ <trans-unit id="_msg573">
<source xml:space="preserve">The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
<context-group purpose="location"><context context-type="linenumber">1675</context></context-group>
<note annotates="source" from="developer">Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</note>
</trans-unit>
- <trans-unit id="_msg573">
+ <trans-unit id="_msg574">
<source xml:space="preserve">The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
<context-group purpose="location"><context context-type="linenumber">1701</context></context-group>
<note annotates="source" from="developer">Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</note>
</trans-unit>
- <trans-unit id="_msg574">
+ <trans-unit id="_msg575">
<source xml:space="preserve">Addresses Processed</source>
<context-group purpose="location"><context context-type="linenumber">1678</context></context-group>
<note annotates="source" from="developer">Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</note>
</trans-unit>
- <trans-unit id="_msg575">
+ <trans-unit id="_msg576">
<source xml:space="preserve">Addresses Rate-Limited</source>
<context-group purpose="location"><context context-type="linenumber">1704</context></context-group>
<note annotates="source" from="developer">Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</note>
</trans-unit>
- <trans-unit id="_msg576">
+ <trans-unit id="_msg577">
<source xml:space="preserve">User Agent</source>
<context-group purpose="location"><context context-type="linenumber">88</context></context-group>
<context-group purpose="location"><context context-type="linenumber">1191</context></context-group>
</trans-unit>
- <trans-unit id="_msg577">
+ <trans-unit id="_msg578">
<source xml:space="preserve">Node window</source>
<context-group purpose="location"><context context-type="linenumber">14</context></context-group>
</trans-unit>
- <trans-unit id="_msg578">
+ <trans-unit id="_msg579">
<source xml:space="preserve">Current block height</source>
<context-group purpose="location"><context context-type="linenumber">267</context></context-group>
</trans-unit>
- <trans-unit id="_msg579">
+ <trans-unit id="_msg580">
<source xml:space="preserve">Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
<context-group purpose="location"><context context-type="linenumber">397</context></context-group>
</trans-unit>
- <trans-unit id="_msg580">
+ <trans-unit id="_msg581">
<source xml:space="preserve">Decrease font size</source>
<context-group purpose="location"><context context-type="linenumber">475</context></context-group>
</trans-unit>
- <trans-unit id="_msg581">
+ <trans-unit id="_msg582">
<source xml:space="preserve">Increase font size</source>
<context-group purpose="location"><context context-type="linenumber">495</context></context-group>
</trans-unit>
- <trans-unit id="_msg582">
+ <trans-unit id="_msg583">
<source xml:space="preserve">Permissions</source>
<context-group purpose="location"><context context-type="linenumber">1041</context></context-group>
</trans-unit>
- <trans-unit id="_msg583">
+ <trans-unit id="_msg584">
<source xml:space="preserve">The direction and type of peer connection: %1</source>
<context-group purpose="location"><context context-type="linenumber">1064</context></context-group>
</trans-unit>
- <trans-unit id="_msg584">
+ <trans-unit id="_msg585">
<source xml:space="preserve">Direction/Type</source>
<context-group purpose="location"><context context-type="linenumber">1067</context></context-group>
</trans-unit>
- <trans-unit id="_msg585">
+ <trans-unit id="_msg586">
<source xml:space="preserve">The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<context-group purpose="location"><context context-type="linenumber">1142</context></context-group>
</trans-unit>
- <trans-unit id="_msg586">
+ <trans-unit id="_msg587">
<source xml:space="preserve">Services</source>
<context-group purpose="location"><context context-type="linenumber">1214</context></context-group>
</trans-unit>
- <trans-unit id="_msg587">
+ <trans-unit id="_msg588">
<source xml:space="preserve">High bandwidth BIP152 compact block relay: %1</source>
<context-group purpose="location"><context context-type="linenumber">1266</context></context-group>
</trans-unit>
- <trans-unit id="_msg588">
+ <trans-unit id="_msg589">
<source xml:space="preserve">High Bandwidth</source>
<context-group purpose="location"><context context-type="linenumber">1269</context></context-group>
</trans-unit>
- <trans-unit id="_msg589">
+ <trans-unit id="_msg590">
<source xml:space="preserve">Connection Time</source>
<context-group purpose="location"><context context-type="linenumber">1361</context></context-group>
</trans-unit>
- <trans-unit id="_msg590">
+ <trans-unit id="_msg591">
<source xml:space="preserve">Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
<context-group purpose="location"><context context-type="linenumber">1384</context></context-group>
</trans-unit>
- <trans-unit id="_msg591">
+ <trans-unit id="_msg592">
<source xml:space="preserve">Last Block</source>
<context-group purpose="location"><context context-type="linenumber">1387</context></context-group>
</trans-unit>
- <trans-unit id="_msg592">
+ <trans-unit id="_msg593">
<source xml:space="preserve">Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
<context-group purpose="location"><context context-type="linenumber">1410</context></context-group>
<note annotates="source" from="developer">Tooltip text for the Last Transaction field in the peer details area.</note>
</trans-unit>
- <trans-unit id="_msg593">
+ <trans-unit id="_msg594">
<source xml:space="preserve">Last Send</source>
<context-group purpose="location"><context context-type="linenumber">1436</context></context-group>
</trans-unit>
- <trans-unit id="_msg594">
+ <trans-unit id="_msg595">
<source xml:space="preserve">Last Receive</source>
<context-group purpose="location"><context context-type="linenumber">1459</context></context-group>
</trans-unit>
- <trans-unit id="_msg595">
+ <trans-unit id="_msg596">
<source xml:space="preserve">Ping Time</source>
<context-group purpose="location"><context context-type="linenumber">1528</context></context-group>
</trans-unit>
- <trans-unit id="_msg596">
+ <trans-unit id="_msg597">
<source xml:space="preserve">The duration of a currently outstanding ping.</source>
<context-group purpose="location"><context context-type="linenumber">1551</context></context-group>
</trans-unit>
- <trans-unit id="_msg597">
+ <trans-unit id="_msg598">
<source xml:space="preserve">Ping Wait</source>
<context-group purpose="location"><context context-type="linenumber">1554</context></context-group>
</trans-unit>
- <trans-unit id="_msg598">
+ <trans-unit id="_msg599">
<source xml:space="preserve">Min Ping</source>
<context-group purpose="location"><context context-type="linenumber">1577</context></context-group>
</trans-unit>
- <trans-unit id="_msg599">
+ <trans-unit id="_msg600">
<source xml:space="preserve">Time Offset</source>
<context-group purpose="location"><context context-type="linenumber">1600</context></context-group>
</trans-unit>
- <trans-unit id="_msg600">
+ <trans-unit id="_msg601">
<source xml:space="preserve">Last block time</source>
<context-group purpose="location"><context context-type="linenumber">290</context></context-group>
</trans-unit>
- <trans-unit id="_msg601">
+ <trans-unit id="_msg602">
<source xml:space="preserve">&amp;Open</source>
<context-group purpose="location"><context context-type="linenumber">400</context></context-group>
</trans-unit>
- <trans-unit id="_msg602">
+ <trans-unit id="_msg603">
<source xml:space="preserve">&amp;Console</source>
<context-group purpose="location"><context context-type="linenumber">426</context></context-group>
</trans-unit>
- <trans-unit id="_msg603">
+ <trans-unit id="_msg604">
<source xml:space="preserve">&amp;Network Traffic</source>
<context-group purpose="location"><context context-type="linenumber">613</context></context-group>
</trans-unit>
- <trans-unit id="_msg604">
+ <trans-unit id="_msg605">
<source xml:space="preserve">Totals</source>
<context-group purpose="location"><context context-type="linenumber">681</context></context-group>
</trans-unit>
- <trans-unit id="_msg605">
+ <trans-unit id="_msg606">
<source xml:space="preserve">Debug log file</source>
<context-group purpose="location"><context context-type="linenumber">390</context></context-group>
</trans-unit>
- <trans-unit id="_msg606">
+ <trans-unit id="_msg607">
<source xml:space="preserve">Clear console</source>
<context-group purpose="location"><context context-type="linenumber">515</context></context-group>
</trans-unit>
@@ -2821,154 +2827,158 @@ If you are receiving this error you should request the merchant provide a BIP21
</body></file>
<file original="../rpcconsole.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="RPCConsole">
- <trans-unit id="_msg607">
+ <trans-unit id="_msg608">
<source xml:space="preserve">In:</source>
- <context-group purpose="location"><context context-type="linenumber">968</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">970</context></context-group>
</trans-unit>
- <trans-unit id="_msg608">
+ <trans-unit id="_msg609">
<source xml:space="preserve">Out:</source>
- <context-group purpose="location"><context context-type="linenumber">969</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">971</context></context-group>
</trans-unit>
- <trans-unit id="_msg609">
+ <trans-unit id="_msg610">
<source xml:space="preserve">Inbound: initiated by peer</source>
<context-group purpose="location"><context context-type="linenumber">496</context></context-group>
<note annotates="source" from="developer">Explanatory text for an inbound peer connection.</note>
</trans-unit>
- <trans-unit id="_msg610">
+ <trans-unit id="_msg611">
<source xml:space="preserve">Outbound Full Relay: default</source>
<context-group purpose="location"><context context-type="linenumber">500</context></context-group>
<note annotates="source" from="developer">Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</note>
</trans-unit>
- <trans-unit id="_msg611">
+ <trans-unit id="_msg612">
<source xml:space="preserve">Outbound Block Relay: does not relay transactions or addresses</source>
<context-group purpose="location"><context context-type="linenumber">503</context></context-group>
<note annotates="source" from="developer">Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</note>
</trans-unit>
- <trans-unit id="_msg612">
+ <trans-unit id="_msg613">
<source xml:space="preserve">Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
<context-group purpose="location"><context context-type="linenumber">508</context></context-group>
<note annotates="source" from="developer">Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</note>
</trans-unit>
- <trans-unit id="_msg613">
+ <trans-unit id="_msg614">
<source xml:space="preserve">Outbound Feeler: short-lived, for testing addresses</source>
<context-group purpose="location"><context context-type="linenumber">514</context></context-group>
<note annotates="source" from="developer">Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</note>
</trans-unit>
- <trans-unit id="_msg614">
+ <trans-unit id="_msg615">
<source xml:space="preserve">Outbound Address Fetch: short-lived, for soliciting addresses</source>
<context-group purpose="location"><context context-type="linenumber">517</context></context-group>
<note annotates="source" from="developer">Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</note>
</trans-unit>
- <trans-unit id="_msg615">
+ <trans-unit id="_msg616">
<source xml:space="preserve">detecting: peer could be v1 or v2</source>
<context-group purpose="location"><context context-type="linenumber">522</context></context-group>
<note annotates="source" from="developer">Explanatory text for &quot;detecting&quot; transport type.</note>
</trans-unit>
- <trans-unit id="_msg616">
+ <trans-unit id="_msg617">
<source xml:space="preserve">v1: unencrypted, plaintext transport protocol</source>
<context-group purpose="location"><context context-type="linenumber">524</context></context-group>
<note annotates="source" from="developer">Explanatory text for v1 transport type.</note>
</trans-unit>
- <trans-unit id="_msg617">
+ <trans-unit id="_msg618">
<source xml:space="preserve">v2: BIP324 encrypted transport protocol</source>
<context-group purpose="location"><context context-type="linenumber">526</context></context-group>
<note annotates="source" from="developer">Explanatory text for v2 transport type.</note>
</trans-unit>
- <trans-unit id="_msg618">
+ <trans-unit id="_msg619">
<source xml:space="preserve">we selected the peer for high bandwidth relay</source>
<context-group purpose="location"><context context-type="linenumber">530</context></context-group>
</trans-unit>
- <trans-unit id="_msg619">
+ <trans-unit id="_msg620">
<source xml:space="preserve">the peer selected us for high bandwidth relay</source>
<context-group purpose="location"><context context-type="linenumber">531</context></context-group>
</trans-unit>
- <trans-unit id="_msg620">
+ <trans-unit id="_msg621">
<source xml:space="preserve">no high bandwidth relay selected</source>
<context-group purpose="location"><context context-type="linenumber">532</context></context-group>
</trans-unit>
- <trans-unit id="_msg621">
+ <trans-unit id="_msg622">
<source xml:space="preserve">Ctrl++</source>
<context-group purpose="location"><context context-type="linenumber">545</context></context-group>
<note annotates="source" from="developer">Main shortcut to increase the RPC console font size.</note>
</trans-unit>
- <trans-unit id="_msg622">
+ <trans-unit id="_msg623">
<source xml:space="preserve">Ctrl+=</source>
<context-group purpose="location"><context context-type="linenumber">547</context></context-group>
<note annotates="source" from="developer">Secondary shortcut to increase the RPC console font size.</note>
</trans-unit>
- <trans-unit id="_msg623">
+ <trans-unit id="_msg624">
<source xml:space="preserve">Ctrl+-</source>
<context-group purpose="location"><context context-type="linenumber">551</context></context-group>
<note annotates="source" from="developer">Main shortcut to decrease the RPC console font size.</note>
</trans-unit>
- <trans-unit id="_msg624">
+ <trans-unit id="_msg625">
<source xml:space="preserve">Ctrl+_</source>
<context-group purpose="location"><context context-type="linenumber">553</context></context-group>
<note annotates="source" from="developer">Secondary shortcut to decrease the RPC console font size.</note>
</trans-unit>
- <trans-unit id="_msg625">
+ <trans-unit id="_msg626">
<source xml:space="preserve">&amp;Copy address</source>
- <context-group purpose="location"><context context-type="linenumber">704</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">706</context></context-group>
<note annotates="source" from="developer">Context menu action to copy the address of a peer.</note>
</trans-unit>
- <trans-unit id="_msg626">
+ <trans-unit id="_msg627">
<source xml:space="preserve">&amp;Disconnect</source>
- <context-group purpose="location"><context context-type="linenumber">708</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">710</context></context-group>
</trans-unit>
- <trans-unit id="_msg627">
+ <trans-unit id="_msg628">
<source xml:space="preserve">1 &amp;hour</source>
- <context-group purpose="location"><context context-type="linenumber">709</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">711</context></context-group>
</trans-unit>
- <trans-unit id="_msg628">
+ <trans-unit id="_msg629">
<source xml:space="preserve">1 d&amp;ay</source>
- <context-group purpose="location"><context context-type="linenumber">710</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">712</context></context-group>
</trans-unit>
- <trans-unit id="_msg629">
+ <trans-unit id="_msg630">
<source xml:space="preserve">1 &amp;week</source>
- <context-group purpose="location"><context context-type="linenumber">711</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">713</context></context-group>
</trans-unit>
- <trans-unit id="_msg630">
+ <trans-unit id="_msg631">
<source xml:space="preserve">1 &amp;year</source>
- <context-group purpose="location"><context context-type="linenumber">712</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">714</context></context-group>
</trans-unit>
- <trans-unit id="_msg631">
+ <trans-unit id="_msg632">
<source xml:space="preserve">&amp;Copy IP/Netmask</source>
- <context-group purpose="location"><context context-type="linenumber">738</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">740</context></context-group>
<note annotates="source" from="developer">Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer&apos;s IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</note>
</trans-unit>
- <trans-unit id="_msg632">
+ <trans-unit id="_msg633">
<source xml:space="preserve">&amp;Unban</source>
- <context-group purpose="location"><context context-type="linenumber">742</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">744</context></context-group>
</trans-unit>
- <trans-unit id="_msg633">
+ <trans-unit id="_msg634">
<source xml:space="preserve">Network activity disabled</source>
- <context-group purpose="location"><context context-type="linenumber">972</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">974</context></context-group>
</trans-unit>
- <trans-unit id="_msg634">
+ <trans-unit id="_msg635">
<source xml:space="preserve">Executing command without any wallet</source>
- <context-group purpose="location"><context context-type="linenumber">1051</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1053</context></context-group>
</trans-unit>
- <trans-unit id="_msg635">
+ <trans-unit id="_msg636">
<source xml:space="preserve">Ctrl+I</source>
- <context-group purpose="location"><context context-type="linenumber">1376</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1378</context></context-group>
</trans-unit>
- <trans-unit id="_msg636">
+ <trans-unit id="_msg637">
<source xml:space="preserve">Ctrl+T</source>
- <context-group purpose="location"><context context-type="linenumber">1377</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1379</context></context-group>
</trans-unit>
- <trans-unit id="_msg637">
+ <trans-unit id="_msg638">
<source xml:space="preserve">Ctrl+N</source>
- <context-group purpose="location"><context context-type="linenumber">1378</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1380</context></context-group>
</trans-unit>
- <trans-unit id="_msg638">
+ <trans-unit id="_msg639">
<source xml:space="preserve">Ctrl+P</source>
- <context-group purpose="location"><context context-type="linenumber">1379</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1381</context></context-group>
</trans-unit>
- <trans-unit id="_msg639">
+ <trans-unit id="_msg640">
+ <source xml:space="preserve">Node window - [%1]</source>
+ <context-group purpose="location"><context context-type="linenumber">1399</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg641">
<source xml:space="preserve">Executing command using &quot;%1&quot; wallet</source>
- <context-group purpose="location"><context context-type="linenumber">1049</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1051</context></context-group>
</trans-unit>
- <trans-unit id="_msg640">
+ <trans-unit id="_msg642">
<source xml:space="preserve">Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2976,51 +2986,51 @@ Type %5 for an overview of available commands.
For more information on using this console, type %6.
%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
- <context-group purpose="location"><context context-type="linenumber">902</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">904</context></context-group>
<note annotates="source" from="developer">RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</note>
</trans-unit>
- <trans-unit id="_msg641">
+ <trans-unit id="_msg643">
<source xml:space="preserve">Executing…</source>
- <context-group purpose="location"><context context-type="linenumber">1059</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1061</context></context-group>
<note annotates="source" from="developer">A console message indicating an entered command is currently being executed.</note>
</trans-unit>
- <trans-unit id="_msg642">
+ <trans-unit id="_msg644">
<source xml:space="preserve">(peer: %1)</source>
- <context-group purpose="location"><context context-type="linenumber">1177</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1179</context></context-group>
</trans-unit>
- <trans-unit id="_msg643">
+ <trans-unit id="_msg645">
<source xml:space="preserve">via %1</source>
- <context-group purpose="location"><context context-type="linenumber">1179</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1181</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../rpcconsole.h" datatype="c" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="RPCConsole">
- <trans-unit id="_msg644">
+ <trans-unit id="_msg646">
<source xml:space="preserve">Yes</source>
<context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
- <trans-unit id="_msg645">
+ <trans-unit id="_msg647">
<source xml:space="preserve">No</source>
<context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
- <trans-unit id="_msg646">
+ <trans-unit id="_msg648">
<source xml:space="preserve">To</source>
<context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
- <trans-unit id="_msg647">
+ <trans-unit id="_msg649">
<source xml:space="preserve">From</source>
<context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
- <trans-unit id="_msg648">
+ <trans-unit id="_msg650">
<source xml:space="preserve">Ban for</source>
<context-group purpose="location"><context context-type="linenumber">147</context></context-group>
</trans-unit>
- <trans-unit id="_msg649">
+ <trans-unit id="_msg651">
<source xml:space="preserve">Never</source>
<context-group purpose="location"><context context-type="linenumber">189</context></context-group>
</trans-unit>
- <trans-unit id="_msg650">
+ <trans-unit id="_msg652">
<source xml:space="preserve">Unknown</source>
<context-group purpose="location"><context context-type="linenumber">147</context></context-group>
</trans-unit>
@@ -3028,72 +3038,72 @@ For more information on using this console, type %6.
</body></file>
<file original="../forms/receivecoinsdialog.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="ReceiveCoinsDialog">
- <trans-unit id="_msg651">
+ <trans-unit id="_msg653">
<source xml:space="preserve">&amp;Amount:</source>
<context-group purpose="location"><context context-type="linenumber">37</context></context-group>
</trans-unit>
- <trans-unit id="_msg652">
+ <trans-unit id="_msg654">
<source xml:space="preserve">&amp;Label:</source>
<context-group purpose="location"><context context-type="linenumber">83</context></context-group>
</trans-unit>
- <trans-unit id="_msg653">
+ <trans-unit id="_msg655">
<source xml:space="preserve">&amp;Message:</source>
<context-group purpose="location"><context context-type="linenumber">53</context></context-group>
</trans-unit>
- <trans-unit id="_msg654">
+ <trans-unit id="_msg656">
<source xml:space="preserve">An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
<context-group purpose="location"><context context-type="linenumber">50</context></context-group>
</trans-unit>
- <trans-unit id="_msg655">
+ <trans-unit id="_msg657">
<source xml:space="preserve">An optional label to associate with the new receiving address.</source>
<context-group purpose="location"><context context-type="linenumber">80</context></context-group>
</trans-unit>
- <trans-unit id="_msg656">
+ <trans-unit id="_msg658">
<source xml:space="preserve">Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
<context-group purpose="location"><context context-type="linenumber">73</context></context-group>
</trans-unit>
- <trans-unit id="_msg657">
+ <trans-unit id="_msg659">
<source xml:space="preserve">An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
<context-group purpose="location"><context context-type="linenumber">34</context></context-group>
<context-group purpose="location"><context context-type="linenumber">193</context></context-group>
</trans-unit>
- <trans-unit id="_msg658">
+ <trans-unit id="_msg660">
<source xml:space="preserve">An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
<context-group purpose="location"><context context-type="linenumber">66</context></context-group>
</trans-unit>
- <trans-unit id="_msg659">
+ <trans-unit id="_msg661">
<source xml:space="preserve">An optional message that is attached to the payment request and may be displayed to the sender.</source>
<context-group purpose="location"><context context-type="linenumber">96</context></context-group>
</trans-unit>
- <trans-unit id="_msg660">
+ <trans-unit id="_msg662">
<source xml:space="preserve">&amp;Create new receiving address</source>
<context-group purpose="location"><context context-type="linenumber">111</context></context-group>
</trans-unit>
- <trans-unit id="_msg661">
+ <trans-unit id="_msg663">
<source xml:space="preserve">Clear all fields of the form.</source>
<context-group purpose="location"><context context-type="linenumber">134</context></context-group>
</trans-unit>
- <trans-unit id="_msg662">
+ <trans-unit id="_msg664">
<source xml:space="preserve">Clear</source>
<context-group purpose="location"><context context-type="linenumber">137</context></context-group>
</trans-unit>
- <trans-unit id="_msg663">
+ <trans-unit id="_msg665">
<source xml:space="preserve">Requested payments history</source>
<context-group purpose="location"><context context-type="linenumber">273</context></context-group>
</trans-unit>
- <trans-unit id="_msg664">
+ <trans-unit id="_msg666">
<source xml:space="preserve">Show the selected request (does the same as double clicking an entry)</source>
<context-group purpose="location"><context context-type="linenumber">298</context></context-group>
</trans-unit>
- <trans-unit id="_msg665">
+ <trans-unit id="_msg667">
<source xml:space="preserve">Show</source>
<context-group purpose="location"><context context-type="linenumber">301</context></context-group>
</trans-unit>
- <trans-unit id="_msg666">
+ <trans-unit id="_msg668">
<source xml:space="preserve">Remove the selected entries from the list</source>
<context-group purpose="location"><context context-type="linenumber">318</context></context-group>
</trans-unit>
- <trans-unit id="_msg667">
+ <trans-unit id="_msg669">
<source xml:space="preserve">Remove</source>
<context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
@@ -3101,63 +3111,63 @@ For more information on using this console, type %6.
</body></file>
<file original="../receivecoinsdialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="ReceiveCoinsDialog">
- <trans-unit id="_msg668">
+ <trans-unit id="_msg670">
<source xml:space="preserve">Copy &amp;URI</source>
<context-group purpose="location"><context context-type="linenumber">46</context></context-group>
</trans-unit>
- <trans-unit id="_msg669">
+ <trans-unit id="_msg671">
<source xml:space="preserve">&amp;Copy address</source>
<context-group purpose="location"><context context-type="linenumber">47</context></context-group>
</trans-unit>
- <trans-unit id="_msg670">
+ <trans-unit id="_msg672">
<source xml:space="preserve">Copy &amp;label</source>
<context-group purpose="location"><context context-type="linenumber">48</context></context-group>
</trans-unit>
- <trans-unit id="_msg671">
+ <trans-unit id="_msg673">
<source xml:space="preserve">Copy &amp;message</source>
<context-group purpose="location"><context context-type="linenumber">49</context></context-group>
</trans-unit>
- <trans-unit id="_msg672">
+ <trans-unit id="_msg674">
<source xml:space="preserve">Copy &amp;amount</source>
<context-group purpose="location"><context context-type="linenumber">50</context></context-group>
</trans-unit>
- <trans-unit id="_msg673">
+ <trans-unit id="_msg675">
<source xml:space="preserve">Base58 (Legacy)</source>
<context-group purpose="location"><context context-type="linenumber">96</context></context-group>
</trans-unit>
- <trans-unit id="_msg674">
+ <trans-unit id="_msg676">
<source xml:space="preserve">Not recommended due to higher fees and less protection against typos.</source>
<context-group purpose="location"><context context-type="linenumber">96</context></context-group>
</trans-unit>
- <trans-unit id="_msg675">
+ <trans-unit id="_msg677">
<source xml:space="preserve">Base58 (P2SH-SegWit)</source>
<context-group purpose="location"><context context-type="linenumber">97</context></context-group>
</trans-unit>
- <trans-unit id="_msg676">
+ <trans-unit id="_msg678">
<source xml:space="preserve">Generates an address compatible with older wallets.</source>
<context-group purpose="location"><context context-type="linenumber">97</context></context-group>
</trans-unit>
- <trans-unit id="_msg677">
+ <trans-unit id="_msg679">
<source xml:space="preserve">Bech32 (SegWit)</source>
<context-group purpose="location"><context context-type="linenumber">98</context></context-group>
</trans-unit>
- <trans-unit id="_msg678">
+ <trans-unit id="_msg680">
<source xml:space="preserve">Generates a native segwit address (BIP-173). Some old wallets don&apos;t support it.</source>
<context-group purpose="location"><context context-type="linenumber">98</context></context-group>
</trans-unit>
- <trans-unit id="_msg679">
+ <trans-unit id="_msg681">
<source xml:space="preserve">Bech32m (Taproot)</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
- <trans-unit id="_msg680">
+ <trans-unit id="_msg682">
<source xml:space="preserve">Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
- <trans-unit id="_msg681">
+ <trans-unit id="_msg683">
<source xml:space="preserve">Could not unlock wallet.</source>
<context-group purpose="location"><context context-type="linenumber">175</context></context-group>
</trans-unit>
- <trans-unit id="_msg682">
+ <trans-unit id="_msg684">
<source xml:space="preserve">Could not generate new %1 address</source>
<context-group purpose="location"><context context-type="linenumber">180</context></context-group>
</trans-unit>
@@ -3165,51 +3175,51 @@ For more information on using this console, type %6.
</body></file>
<file original="../forms/receiverequestdialog.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="ReceiveRequestDialog">
- <trans-unit id="_msg683">
+ <trans-unit id="_msg685">
<source xml:space="preserve">Request payment to …</source>
<context-group purpose="location"><context context-type="linenumber">14</context></context-group>
</trans-unit>
- <trans-unit id="_msg684">
+ <trans-unit id="_msg686">
<source xml:space="preserve">Address:</source>
<context-group purpose="location"><context context-type="linenumber">90</context></context-group>
</trans-unit>
- <trans-unit id="_msg685">
+ <trans-unit id="_msg687">
<source xml:space="preserve">Amount:</source>
<context-group purpose="location"><context context-type="linenumber">119</context></context-group>
</trans-unit>
- <trans-unit id="_msg686">
+ <trans-unit id="_msg688">
<source xml:space="preserve">Label:</source>
<context-group purpose="location"><context context-type="linenumber">148</context></context-group>
</trans-unit>
- <trans-unit id="_msg687">
+ <trans-unit id="_msg689">
<source xml:space="preserve">Message:</source>
<context-group purpose="location"><context context-type="linenumber">180</context></context-group>
</trans-unit>
- <trans-unit id="_msg688">
+ <trans-unit id="_msg690">
<source xml:space="preserve">Wallet:</source>
<context-group purpose="location"><context context-type="linenumber">212</context></context-group>
</trans-unit>
- <trans-unit id="_msg689">
+ <trans-unit id="_msg691">
<source xml:space="preserve">Copy &amp;URI</source>
<context-group purpose="location"><context context-type="linenumber">240</context></context-group>
</trans-unit>
- <trans-unit id="_msg690">
+ <trans-unit id="_msg692">
<source xml:space="preserve">Copy &amp;Address</source>
<context-group purpose="location"><context context-type="linenumber">250</context></context-group>
</trans-unit>
- <trans-unit id="_msg691">
+ <trans-unit id="_msg693">
<source xml:space="preserve">&amp;Verify</source>
<context-group purpose="location"><context context-type="linenumber">260</context></context-group>
</trans-unit>
- <trans-unit id="_msg692">
+ <trans-unit id="_msg694">
<source xml:space="preserve">Verify this address on e.g. a hardware wallet screen</source>
<context-group purpose="location"><context context-type="linenumber">263</context></context-group>
</trans-unit>
- <trans-unit id="_msg693">
+ <trans-unit id="_msg695">
<source xml:space="preserve">&amp;Save Image…</source>
<context-group purpose="location"><context context-type="linenumber">273</context></context-group>
</trans-unit>
- <trans-unit id="_msg694">
+ <trans-unit id="_msg696">
<source xml:space="preserve">Payment information</source>
<context-group purpose="location"><context context-type="linenumber">39</context></context-group>
</trans-unit>
@@ -3217,7 +3227,7 @@ For more information on using this console, type %6.
</body></file>
<file original="../receiverequestdialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="ReceiveRequestDialog">
- <trans-unit id="_msg695">
+ <trans-unit id="_msg697">
<source xml:space="preserve">Request payment to %1</source>
<context-group purpose="location"><context context-type="linenumber">48</context></context-group>
</trans-unit>
@@ -3225,31 +3235,31 @@ For more information on using this console, type %6.
</body></file>
<file original="../recentrequeststablemodel.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="RecentRequestsTableModel">
- <trans-unit id="_msg696">
+ <trans-unit id="_msg698">
<source xml:space="preserve">Date</source>
<context-group purpose="location"><context context-type="linenumber">32</context></context-group>
</trans-unit>
- <trans-unit id="_msg697">
+ <trans-unit id="_msg699">
<source xml:space="preserve">Label</source>
<context-group purpose="location"><context context-type="linenumber">32</context></context-group>
</trans-unit>
- <trans-unit id="_msg698">
+ <trans-unit id="_msg700">
<source xml:space="preserve">Message</source>
<context-group purpose="location"><context context-type="linenumber">32</context></context-group>
</trans-unit>
- <trans-unit id="_msg699">
+ <trans-unit id="_msg701">
<source xml:space="preserve">(no label)</source>
<context-group purpose="location"><context context-type="linenumber">70</context></context-group>
</trans-unit>
- <trans-unit id="_msg700">
+ <trans-unit id="_msg702">
<source xml:space="preserve">(no message)</source>
<context-group purpose="location"><context context-type="linenumber">79</context></context-group>
</trans-unit>
- <trans-unit id="_msg701">
+ <trans-unit id="_msg703">
<source xml:space="preserve">(no amount requested)</source>
<context-group purpose="location"><context context-type="linenumber">87</context></context-group>
</trans-unit>
- <trans-unit id="_msg702">
+ <trans-unit id="_msg704">
<source xml:space="preserve">Requested</source>
<context-group purpose="location"><context context-type="linenumber">130</context></context-group>
</trans-unit>
@@ -3257,150 +3267,150 @@ For more information on using this console, type %6.
</body></file>
<file original="../forms/sendcoinsdialog.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SendCoinsDialog">
- <trans-unit id="_msg703">
+ <trans-unit id="_msg705">
<source xml:space="preserve">Send Coins</source>
<context-group purpose="location"><context context-type="linenumber">14</context></context-group>
<context-group purpose="location"><context context-type="sourcefile">../sendcoinsdialog.cpp</context><context context-type="linenumber">762</context></context-group>
</trans-unit>
- <trans-unit id="_msg704">
+ <trans-unit id="_msg706">
<source xml:space="preserve">Coin Control Features</source>
<context-group purpose="location"><context context-type="linenumber">90</context></context-group>
</trans-unit>
- <trans-unit id="_msg705">
+ <trans-unit id="_msg707">
<source xml:space="preserve">automatically selected</source>
<context-group purpose="location"><context context-type="linenumber">120</context></context-group>
</trans-unit>
- <trans-unit id="_msg706">
+ <trans-unit id="_msg708">
<source xml:space="preserve">Insufficient funds!</source>
<context-group purpose="location"><context context-type="linenumber">139</context></context-group>
</trans-unit>
- <trans-unit id="_msg707">
+ <trans-unit id="_msg709">
<source xml:space="preserve">Quantity:</source>
<context-group purpose="location"><context context-type="linenumber">231</context></context-group>
</trans-unit>
- <trans-unit id="_msg708">
+ <trans-unit id="_msg710">
<source xml:space="preserve">Bytes:</source>
<context-group purpose="location"><context context-type="linenumber">266</context></context-group>
</trans-unit>
- <trans-unit id="_msg709">
+ <trans-unit id="_msg711">
<source xml:space="preserve">Amount:</source>
<context-group purpose="location"><context context-type="linenumber">314</context></context-group>
</trans-unit>
- <trans-unit id="_msg710">
+ <trans-unit id="_msg712">
<source xml:space="preserve">Fee:</source>
<context-group purpose="location"><context context-type="linenumber">365</context></context-group>
</trans-unit>
- <trans-unit id="_msg711">
+ <trans-unit id="_msg713">
<source xml:space="preserve">After Fee:</source>
<context-group purpose="location"><context context-type="linenumber">419</context></context-group>
</trans-unit>
- <trans-unit id="_msg712">
+ <trans-unit id="_msg714">
<source xml:space="preserve">Change:</source>
<context-group purpose="location"><context context-type="linenumber">451</context></context-group>
</trans-unit>
- <trans-unit id="_msg713">
+ <trans-unit id="_msg715">
<source xml:space="preserve">If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
<context-group purpose="location"><context context-type="linenumber">495</context></context-group>
</trans-unit>
- <trans-unit id="_msg714">
+ <trans-unit id="_msg716">
<source xml:space="preserve">Custom change address</source>
<context-group purpose="location"><context context-type="linenumber">498</context></context-group>
</trans-unit>
- <trans-unit id="_msg715">
+ <trans-unit id="_msg717">
<source xml:space="preserve">Transaction Fee:</source>
<context-group purpose="location"><context context-type="linenumber">704</context></context-group>
</trans-unit>
- <trans-unit id="_msg716">
+ <trans-unit id="_msg718">
<source xml:space="preserve">Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
<context-group purpose="location"><context context-type="linenumber">742</context></context-group>
</trans-unit>
- <trans-unit id="_msg717">
+ <trans-unit id="_msg719">
<source xml:space="preserve">Warning: Fee estimation is currently not possible.</source>
<context-group purpose="location"><context context-type="linenumber">751</context></context-group>
</trans-unit>
- <trans-unit id="_msg718">
+ <trans-unit id="_msg720">
<source xml:space="preserve">per kilobyte</source>
<context-group purpose="location"><context context-type="linenumber">833</context></context-group>
</trans-unit>
- <trans-unit id="_msg719">
+ <trans-unit id="_msg721">
<source xml:space="preserve">Hide</source>
<context-group purpose="location"><context context-type="linenumber">780</context></context-group>
</trans-unit>
- <trans-unit id="_msg720">
+ <trans-unit id="_msg722">
<source xml:space="preserve">Recommended:</source>
<context-group purpose="location"><context context-type="linenumber">892</context></context-group>
</trans-unit>
- <trans-unit id="_msg721">
+ <trans-unit id="_msg723">
<source xml:space="preserve">Custom:</source>
<context-group purpose="location"><context context-type="linenumber">922</context></context-group>
</trans-unit>
- <trans-unit id="_msg722">
+ <trans-unit id="_msg724">
<source xml:space="preserve">Send to multiple recipients at once</source>
<context-group purpose="location"><context context-type="linenumber">1137</context></context-group>
</trans-unit>
- <trans-unit id="_msg723">
+ <trans-unit id="_msg725">
<source xml:space="preserve">Add &amp;Recipient</source>
<context-group purpose="location"><context context-type="linenumber">1140</context></context-group>
</trans-unit>
- <trans-unit id="_msg724">
+ <trans-unit id="_msg726">
<source xml:space="preserve">Clear all fields of the form.</source>
<context-group purpose="location"><context context-type="linenumber">1120</context></context-group>
</trans-unit>
- <trans-unit id="_msg725">
+ <trans-unit id="_msg727">
<source xml:space="preserve">Inputs…</source>
<context-group purpose="location"><context context-type="linenumber">110</context></context-group>
</trans-unit>
- <trans-unit id="_msg726">
+ <trans-unit id="_msg728">
<source xml:space="preserve">Choose…</source>
<context-group purpose="location"><context context-type="linenumber">718</context></context-group>
</trans-unit>
- <trans-unit id="_msg727">
+ <trans-unit id="_msg729">
<source xml:space="preserve">Hide transaction fee settings</source>
<context-group purpose="location"><context context-type="linenumber">777</context></context-group>
</trans-unit>
- <trans-unit id="_msg728">
+ <trans-unit id="_msg730">
<source xml:space="preserve">Specify a custom fee per kB (1,000 bytes) of the transaction&apos;s virtual size.
Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100 satoshis per kvB&quot; for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
<context-group purpose="location"><context context-type="linenumber">828</context></context-group>
</trans-unit>
- <trans-unit id="_msg729">
+ <trans-unit id="_msg731">
<source xml:space="preserve">When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
<context-group purpose="location"><context context-type="linenumber">863</context></context-group>
</trans-unit>
- <trans-unit id="_msg730">
+ <trans-unit id="_msg732">
<source xml:space="preserve">A too low fee might result in a never confirming transaction (read the tooltip)</source>
<context-group purpose="location"><context context-type="linenumber">866</context></context-group>
</trans-unit>
- <trans-unit id="_msg731">
+ <trans-unit id="_msg733">
<source xml:space="preserve">(Smart fee not initialized yet. This usually takes a few blocks…)</source>
<context-group purpose="location"><context context-type="linenumber">971</context></context-group>
</trans-unit>
- <trans-unit id="_msg732">
+ <trans-unit id="_msg734">
<source xml:space="preserve">Confirmation time target:</source>
<context-group purpose="location"><context context-type="linenumber">997</context></context-group>
</trans-unit>
- <trans-unit id="_msg733">
+ <trans-unit id="_msg735">
<source xml:space="preserve">Enable Replace-By-Fee</source>
<context-group purpose="location"><context context-type="linenumber">1055</context></context-group>
</trans-unit>
- <trans-unit id="_msg734">
+ <trans-unit id="_msg736">
<source xml:space="preserve">With Replace-By-Fee (BIP-125) you can increase a transaction&apos;s fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
<context-group purpose="location"><context context-type="linenumber">1058</context></context-group>
</trans-unit>
- <trans-unit id="_msg735">
+ <trans-unit id="_msg737">
<source xml:space="preserve">Clear &amp;All</source>
<context-group purpose="location"><context context-type="linenumber">1123</context></context-group>
</trans-unit>
- <trans-unit id="_msg736">
+ <trans-unit id="_msg738">
<source xml:space="preserve">Balance:</source>
<context-group purpose="location"><context context-type="linenumber">1178</context></context-group>
</trans-unit>
- <trans-unit id="_msg737">
+ <trans-unit id="_msg739">
<source xml:space="preserve">Confirm the send action</source>
<context-group purpose="location"><context context-type="linenumber">1094</context></context-group>
</trans-unit>
- <trans-unit id="_msg738">
+ <trans-unit id="_msg740">
<source xml:space="preserve">S&amp;end</source>
<context-group purpose="location"><context context-type="linenumber">1097</context></context-group>
</trans-unit>
@@ -3408,231 +3418,231 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../sendcoinsdialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SendCoinsDialog">
- <trans-unit id="_msg739">
+ <trans-unit id="_msg741">
<source xml:space="preserve">Copy quantity</source>
<context-group purpose="location"><context context-type="linenumber">95</context></context-group>
</trans-unit>
- <trans-unit id="_msg740">
+ <trans-unit id="_msg742">
<source xml:space="preserve">Copy amount</source>
<context-group purpose="location"><context context-type="linenumber">96</context></context-group>
</trans-unit>
- <trans-unit id="_msg741">
+ <trans-unit id="_msg743">
<source xml:space="preserve">Copy fee</source>
<context-group purpose="location"><context context-type="linenumber">97</context></context-group>
</trans-unit>
- <trans-unit id="_msg742">
+ <trans-unit id="_msg744">
<source xml:space="preserve">Copy after fee</source>
<context-group purpose="location"><context context-type="linenumber">98</context></context-group>
</trans-unit>
- <trans-unit id="_msg743">
+ <trans-unit id="_msg745">
<source xml:space="preserve">Copy bytes</source>
<context-group purpose="location"><context context-type="linenumber">99</context></context-group>
</trans-unit>
- <trans-unit id="_msg744">
+ <trans-unit id="_msg746">
<source xml:space="preserve">Copy change</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
- <trans-unit id="_msg745">
+ <trans-unit id="_msg747">
<source xml:space="preserve">%1 (%2 blocks)</source>
<context-group purpose="location"><context context-type="linenumber">172</context></context-group>
</trans-unit>
- <trans-unit id="_msg746">
+ <trans-unit id="_msg748">
<source xml:space="preserve">Sign on device</source>
<context-group purpose="location"><context context-type="linenumber">202</context></context-group>
<note annotates="source" from="developer">&quot;device&quot; usually means a hardware wallet.</note>
</trans-unit>
- <trans-unit id="_msg747">
+ <trans-unit id="_msg749">
<source xml:space="preserve">Connect your hardware wallet first.</source>
<context-group purpose="location"><context context-type="linenumber">205</context></context-group>
</trans-unit>
- <trans-unit id="_msg748">
+ <trans-unit id="_msg750">
<source xml:space="preserve">Set external signer script path in Options -&gt; Wallet</source>
<context-group purpose="location"><context context-type="linenumber">209</context></context-group>
<note annotates="source" from="developer">&quot;External signer&quot; means using devices such as hardware wallets.</note>
</trans-unit>
- <trans-unit id="_msg749">
+ <trans-unit id="_msg751">
<source xml:space="preserve">Cr&amp;eate Unsigned</source>
<context-group purpose="location"><context context-type="linenumber">212</context></context-group>
</trans-unit>
- <trans-unit id="_msg750">
+ <trans-unit id="_msg752">
<source xml:space="preserve">Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<context-group purpose="location"><context context-type="linenumber">213</context></context-group>
</trans-unit>
- <trans-unit id="_msg751">
+ <trans-unit id="_msg753">
<source xml:space="preserve">%1 to &apos;%2&apos;</source>
<context-group purpose="location"><context context-type="linenumber">316</context></context-group>
</trans-unit>
- <trans-unit id="_msg752">
+ <trans-unit id="_msg754">
<source xml:space="preserve">%1 to %2</source>
<context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
- <trans-unit id="_msg753">
+ <trans-unit id="_msg755">
<source xml:space="preserve">To review recipient list click &quot;Show Details…&quot;</source>
<context-group purpose="location"><context context-type="linenumber">388</context></context-group>
</trans-unit>
- <trans-unit id="_msg754">
+ <trans-unit id="_msg756">
<source xml:space="preserve">Sign failed</source>
<context-group purpose="location"><context context-type="linenumber">450</context></context-group>
</trans-unit>
- <trans-unit id="_msg755">
+ <trans-unit id="_msg757">
<source xml:space="preserve">External signer not found</source>
<context-group purpose="location"><context context-type="linenumber">455</context></context-group>
<note annotates="source" from="developer">&quot;External signer&quot; means using devices such as hardware wallets.</note>
</trans-unit>
- <trans-unit id="_msg756">
+ <trans-unit id="_msg758">
<source xml:space="preserve">External signer failure</source>
<context-group purpose="location"><context context-type="linenumber">461</context></context-group>
<note annotates="source" from="developer">&quot;External signer&quot; means using devices such as hardware wallets.</note>
</trans-unit>
- <trans-unit id="_msg757">
+ <trans-unit id="_msg759">
<source xml:space="preserve">Save Transaction Data</source>
<context-group purpose="location"><context context-type="linenumber">425</context></context-group>
</trans-unit>
- <trans-unit id="_msg758">
+ <trans-unit id="_msg760">
<source xml:space="preserve">Partially Signed Transaction (Binary)</source>
<context-group purpose="location"><context context-type="linenumber">427</context></context-group>
<note annotates="source" from="developer">Expanded name of the binary PSBT file format. See: BIP 174.</note>
</trans-unit>
- <trans-unit id="_msg759">
+ <trans-unit id="_msg761">
<source xml:space="preserve">PSBT saved</source>
<context-group purpose="location"><context context-type="linenumber">435</context></context-group>
<note annotates="source" from="developer">Popup message when a PSBT has been saved to a file</note>
</trans-unit>
- <trans-unit id="_msg760">
+ <trans-unit id="_msg762">
<source xml:space="preserve">External balance:</source>
<context-group purpose="location"><context context-type="linenumber">708</context></context-group>
</trans-unit>
- <trans-unit id="_msg761">
+ <trans-unit id="_msg763">
<source xml:space="preserve">or</source>
<context-group purpose="location"><context context-type="linenumber">384</context></context-group>
</trans-unit>
- <trans-unit id="_msg762">
+ <trans-unit id="_msg764">
<source xml:space="preserve">You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
<context-group purpose="location"><context context-type="linenumber">366</context></context-group>
</trans-unit>
- <trans-unit id="_msg763">
+ <trans-unit id="_msg765">
<source xml:space="preserve">Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<context-group purpose="location"><context context-type="linenumber">335</context></context-group>
<note annotates="source" from="developer">Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</note>
</trans-unit>
- <trans-unit id="_msg764">
+ <trans-unit id="_msg766">
<source xml:space="preserve">%1 from wallet &apos;%2&apos;</source>
<context-group purpose="location"><context context-type="linenumber">305</context></context-group>
</trans-unit>
- <trans-unit id="_msg765">
+ <trans-unit id="_msg767">
<source xml:space="preserve">Do you want to create this transaction?</source>
<context-group purpose="location"><context context-type="linenumber">329</context></context-group>
<note annotates="source" from="developer">Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</note>
</trans-unit>
- <trans-unit id="_msg766">
+ <trans-unit id="_msg768">
<source xml:space="preserve">Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<context-group purpose="location"><context context-type="linenumber">340</context></context-group>
<note annotates="source" from="developer">Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</note>
</trans-unit>
- <trans-unit id="_msg767">
+ <trans-unit id="_msg769">
<source xml:space="preserve">Please, review your transaction.</source>
<context-group purpose="location"><context context-type="linenumber">343</context></context-group>
<note annotates="source" from="developer">Text to prompt a user to review the details of the transaction they are attempting to send.</note>
</trans-unit>
- <trans-unit id="_msg768">
+ <trans-unit id="_msg770">
<source xml:space="preserve">Transaction fee</source>
<context-group purpose="location"><context context-type="linenumber">351</context></context-group>
</trans-unit>
- <trans-unit id="_msg769">
+ <trans-unit id="_msg771">
<source xml:space="preserve">%1 kvB</source>
<context-group purpose="location"><context context-type="linenumber">356</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">PSBT transaction creation</context></context-group>
<note annotates="source" from="developer">When reviewing a newly created PSBT (via Send flow), the transaction fee is shown, with &quot;virtual size&quot; of the transaction displayed for context</note>
</trans-unit>
- <trans-unit id="_msg770">
+ <trans-unit id="_msg772">
<source xml:space="preserve">Not signalling Replace-By-Fee, BIP-125.</source>
<context-group purpose="location"><context context-type="linenumber">368</context></context-group>
</trans-unit>
- <trans-unit id="_msg771">
+ <trans-unit id="_msg773">
<source xml:space="preserve">Total Amount</source>
<context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
- <trans-unit id="_msg772">
+ <trans-unit id="_msg774">
<source xml:space="preserve">Unsigned Transaction</source>
<context-group purpose="location"><context context-type="linenumber">405</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">PSBT copied</context></context-group>
<note annotates="source" from="developer">Caption of &quot;PSBT has been copied&quot; messagebox</note>
</trans-unit>
- <trans-unit id="_msg773">
+ <trans-unit id="_msg775">
<source xml:space="preserve">The PSBT has been copied to the clipboard. You can also save it.</source>
<context-group purpose="location"><context context-type="linenumber">406</context></context-group>
</trans-unit>
- <trans-unit id="_msg774">
+ <trans-unit id="_msg776">
<source xml:space="preserve">PSBT saved to disk</source>
<context-group purpose="location"><context context-type="linenumber">435</context></context-group>
</trans-unit>
- <trans-unit id="_msg775">
+ <trans-unit id="_msg777">
<source xml:space="preserve">Confirm send coins</source>
<context-group purpose="location"><context context-type="linenumber">484</context></context-group>
</trans-unit>
- <trans-unit id="_msg776">
+ <trans-unit id="_msg778">
<source xml:space="preserve">Watch-only balance:</source>
<context-group purpose="location"><context context-type="linenumber">711</context></context-group>
</trans-unit>
- <trans-unit id="_msg777">
+ <trans-unit id="_msg779">
<source xml:space="preserve">The recipient address is not valid. Please recheck.</source>
<context-group purpose="location"><context context-type="linenumber">735</context></context-group>
</trans-unit>
- <trans-unit id="_msg778">
+ <trans-unit id="_msg780">
<source xml:space="preserve">The amount to pay must be larger than 0.</source>
<context-group purpose="location"><context context-type="linenumber">738</context></context-group>
</trans-unit>
- <trans-unit id="_msg779">
+ <trans-unit id="_msg781">
<source xml:space="preserve">The amount exceeds your balance.</source>
<context-group purpose="location"><context context-type="linenumber">741</context></context-group>
</trans-unit>
- <trans-unit id="_msg780">
+ <trans-unit id="_msg782">
<source xml:space="preserve">The total exceeds your balance when the %1 transaction fee is included.</source>
<context-group purpose="location"><context context-type="linenumber">744</context></context-group>
</trans-unit>
- <trans-unit id="_msg781">
+ <trans-unit id="_msg783">
<source xml:space="preserve">Duplicate address found: addresses should only be used once each.</source>
<context-group purpose="location"><context context-type="linenumber">747</context></context-group>
</trans-unit>
- <trans-unit id="_msg782">
+ <trans-unit id="_msg784">
<source xml:space="preserve">Transaction creation failed!</source>
<context-group purpose="location"><context context-type="linenumber">750</context></context-group>
</trans-unit>
- <trans-unit id="_msg783">
+ <trans-unit id="_msg785">
<source xml:space="preserve">A fee higher than %1 is considered an absurdly high fee.</source>
<context-group purpose="location"><context context-type="linenumber">754</context></context-group>
</trans-unit>
- <trans-unit id="_msg784">
+ <trans-unit id="_msg786">
<source xml:space="preserve">%1/kvB</source>
<context-group purpose="location"><context context-type="linenumber">833</context></context-group>
<context-group purpose="location"><context context-type="linenumber">868</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
<context-group purpose="location"><context context-type="linenumber">882</context></context-group>
- <trans-unit id="_msg785[0]">
+ <trans-unit id="_msg787[0]">
<source xml:space="preserve">Estimated to begin confirmation within %n block(s).</source>
</trans-unit>
- <trans-unit id="_msg785[1]">
+ <trans-unit id="_msg787[1]">
<source xml:space="preserve">Estimated to begin confirmation within %n block(s).</source>
</trans-unit>
</group>
- <trans-unit id="_msg786">
+ <trans-unit id="_msg788">
<source xml:space="preserve">Warning: Invalid Bitcoin address</source>
<context-group purpose="location"><context context-type="linenumber">977</context></context-group>
</trans-unit>
- <trans-unit id="_msg787">
+ <trans-unit id="_msg789">
<source xml:space="preserve">Warning: Unknown change address</source>
<context-group purpose="location"><context context-type="linenumber">982</context></context-group>
</trans-unit>
- <trans-unit id="_msg788">
+ <trans-unit id="_msg790">
<source xml:space="preserve">Confirm custom change address</source>
<context-group purpose="location"><context context-type="linenumber">985</context></context-group>
</trans-unit>
- <trans-unit id="_msg789">
+ <trans-unit id="_msg791">
<source xml:space="preserve">The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
<context-group purpose="location"><context context-type="linenumber">985</context></context-group>
</trans-unit>
- <trans-unit id="_msg790">
+ <trans-unit id="_msg792">
<source xml:space="preserve">(no label)</source>
<context-group purpose="location"><context context-type="linenumber">1006</context></context-group>
</trans-unit>
@@ -3640,68 +3650,68 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../forms/sendcoinsentry.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SendCoinsEntry">
- <trans-unit id="_msg791">
+ <trans-unit id="_msg793">
<source xml:space="preserve">A&amp;mount:</source>
<context-group purpose="location"><context context-type="linenumber">151</context></context-group>
</trans-unit>
- <trans-unit id="_msg792">
+ <trans-unit id="_msg794">
<source xml:space="preserve">Pay &amp;To:</source>
<context-group purpose="location"><context context-type="linenumber">35</context></context-group>
</trans-unit>
- <trans-unit id="_msg793">
+ <trans-unit id="_msg795">
<source xml:space="preserve">&amp;Label:</source>
<context-group purpose="location"><context context-type="linenumber">128</context></context-group>
</trans-unit>
- <trans-unit id="_msg794">
+ <trans-unit id="_msg796">
<source xml:space="preserve">Choose previously used address</source>
<context-group purpose="location"><context context-type="linenumber">60</context></context-group>
</trans-unit>
- <trans-unit id="_msg795">
+ <trans-unit id="_msg797">
<source xml:space="preserve">The Bitcoin address to send the payment to</source>
<context-group purpose="location"><context context-type="linenumber">53</context></context-group>
</trans-unit>
- <trans-unit id="_msg796">
+ <trans-unit id="_msg798">
<source xml:space="preserve">Alt+A</source>
<context-group purpose="location"><context context-type="linenumber">76</context></context-group>
</trans-unit>
- <trans-unit id="_msg797">
+ <trans-unit id="_msg799">
<source xml:space="preserve">Paste address from clipboard</source>
<context-group purpose="location"><context context-type="linenumber">83</context></context-group>
</trans-unit>
- <trans-unit id="_msg798">
+ <trans-unit id="_msg800">
<source xml:space="preserve">Alt+P</source>
<context-group purpose="location"><context context-type="linenumber">99</context></context-group>
</trans-unit>
- <trans-unit id="_msg799">
+ <trans-unit id="_msg801">
<source xml:space="preserve">Remove this entry</source>
<context-group purpose="location"><context context-type="linenumber">106</context></context-group>
</trans-unit>
- <trans-unit id="_msg800">
+ <trans-unit id="_msg802">
<source xml:space="preserve">The amount to send in the selected unit</source>
<context-group purpose="location"><context context-type="linenumber">166</context></context-group>
</trans-unit>
- <trans-unit id="_msg801">
+ <trans-unit id="_msg803">
<source xml:space="preserve">The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
<context-group purpose="location"><context context-type="linenumber">173</context></context-group>
</trans-unit>
- <trans-unit id="_msg802">
+ <trans-unit id="_msg804">
<source xml:space="preserve">S&amp;ubtract fee from amount</source>
<context-group purpose="location"><context context-type="linenumber">176</context></context-group>
</trans-unit>
- <trans-unit id="_msg803">
+ <trans-unit id="_msg805">
<source xml:space="preserve">Use available balance</source>
<context-group purpose="location"><context context-type="linenumber">183</context></context-group>
</trans-unit>
- <trans-unit id="_msg804">
+ <trans-unit id="_msg806">
<source xml:space="preserve">Message:</source>
<context-group purpose="location"><context context-type="linenumber">192</context></context-group>
</trans-unit>
- <trans-unit id="_msg805">
+ <trans-unit id="_msg807">
<source xml:space="preserve">Enter a label for this address to add it to the list of used addresses</source>
<context-group purpose="location"><context context-type="linenumber">141</context></context-group>
<context-group purpose="location"><context context-type="linenumber">144</context></context-group>
</trans-unit>
- <trans-unit id="_msg806">
+ <trans-unit id="_msg808">
<source xml:space="preserve">A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
<context-group purpose="location"><context context-type="linenumber">202</context></context-group>
</trans-unit>
@@ -3709,11 +3719,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../sendcoinsdialog.h" datatype="c" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SendConfirmationDialog">
- <trans-unit id="_msg807">
+ <trans-unit id="_msg809">
<source xml:space="preserve">Send</source>
<context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
- <trans-unit id="_msg808">
+ <trans-unit id="_msg810">
<source xml:space="preserve">Create Unsigned</source>
<context-group purpose="location"><context context-type="linenumber">148</context></context-group>
</trans-unit>
@@ -3721,105 +3731,105 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../forms/signverifymessagedialog.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SignVerifyMessageDialog">
- <trans-unit id="_msg809">
+ <trans-unit id="_msg811">
<source xml:space="preserve">Signatures - Sign / Verify a Message</source>
<context-group purpose="location"><context context-type="linenumber">14</context></context-group>
</trans-unit>
- <trans-unit id="_msg810">
+ <trans-unit id="_msg812">
<source xml:space="preserve">&amp;Sign Message</source>
<context-group purpose="location"><context context-type="linenumber">27</context></context-group>
</trans-unit>
- <trans-unit id="_msg811">
+ <trans-unit id="_msg813">
<source xml:space="preserve">You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
<context-group purpose="location"><context context-type="linenumber">33</context></context-group>
</trans-unit>
- <trans-unit id="_msg812">
+ <trans-unit id="_msg814">
<source xml:space="preserve">The Bitcoin address to sign the message with</source>
<context-group purpose="location"><context context-type="linenumber">51</context></context-group>
</trans-unit>
- <trans-unit id="_msg813">
+ <trans-unit id="_msg815">
<source xml:space="preserve">Choose previously used address</source>
<context-group purpose="location"><context context-type="linenumber">58</context></context-group>
<context-group purpose="location"><context context-type="linenumber">274</context></context-group>
</trans-unit>
- <trans-unit id="_msg814">
+ <trans-unit id="_msg816">
<source xml:space="preserve">Alt+A</source>
<context-group purpose="location"><context context-type="linenumber">68</context></context-group>
<context-group purpose="location"><context context-type="linenumber">284</context></context-group>
</trans-unit>
- <trans-unit id="_msg815">
+ <trans-unit id="_msg817">
<source xml:space="preserve">Paste address from clipboard</source>
<context-group purpose="location"><context context-type="linenumber">78</context></context-group>
</trans-unit>
- <trans-unit id="_msg816">
+ <trans-unit id="_msg818">
<source xml:space="preserve">Alt+P</source>
<context-group purpose="location"><context context-type="linenumber">88</context></context-group>
</trans-unit>
- <trans-unit id="_msg817">
+ <trans-unit id="_msg819">
<source xml:space="preserve">Enter the message you want to sign here</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
<context-group purpose="location"><context context-type="linenumber">103</context></context-group>
</trans-unit>
- <trans-unit id="_msg818">
+ <trans-unit id="_msg820">
<source xml:space="preserve">Signature</source>
<context-group purpose="location"><context context-type="linenumber">110</context></context-group>
</trans-unit>
- <trans-unit id="_msg819">
+ <trans-unit id="_msg821">
<source xml:space="preserve">Copy the current signature to the system clipboard</source>
<context-group purpose="location"><context context-type="linenumber">140</context></context-group>
</trans-unit>
- <trans-unit id="_msg820">
+ <trans-unit id="_msg822">
<source xml:space="preserve">Sign the message to prove you own this Bitcoin address</source>
<context-group purpose="location"><context context-type="linenumber">161</context></context-group>
</trans-unit>
- <trans-unit id="_msg821">
+ <trans-unit id="_msg823">
<source xml:space="preserve">Sign &amp;Message</source>
<context-group purpose="location"><context context-type="linenumber">164</context></context-group>
</trans-unit>
- <trans-unit id="_msg822">
+ <trans-unit id="_msg824">
<source xml:space="preserve">Reset all sign message fields</source>
<context-group purpose="location"><context context-type="linenumber">178</context></context-group>
</trans-unit>
- <trans-unit id="_msg823">
+ <trans-unit id="_msg825">
<source xml:space="preserve">Clear &amp;All</source>
<context-group purpose="location"><context context-type="linenumber">181</context></context-group>
<context-group purpose="location"><context context-type="linenumber">338</context></context-group>
</trans-unit>
- <trans-unit id="_msg824">
+ <trans-unit id="_msg826">
<source xml:space="preserve">&amp;Verify Message</source>
<context-group purpose="location"><context context-type="linenumber">240</context></context-group>
</trans-unit>
- <trans-unit id="_msg825">
+ <trans-unit id="_msg827">
<source xml:space="preserve">Enter the receiver&apos;s address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
<context-group purpose="location"><context context-type="linenumber">246</context></context-group>
</trans-unit>
- <trans-unit id="_msg826">
+ <trans-unit id="_msg828">
<source xml:space="preserve">The Bitcoin address the message was signed with</source>
<context-group purpose="location"><context context-type="linenumber">267</context></context-group>
</trans-unit>
- <trans-unit id="_msg827">
+ <trans-unit id="_msg829">
<source xml:space="preserve">The signed message to verify</source>
<context-group purpose="location"><context context-type="linenumber">296</context></context-group>
<context-group purpose="location"><context context-type="linenumber">299</context></context-group>
</trans-unit>
- <trans-unit id="_msg828">
+ <trans-unit id="_msg830">
<source xml:space="preserve">The signature given when the message was signed</source>
<context-group purpose="location"><context context-type="linenumber">306</context></context-group>
<context-group purpose="location"><context context-type="linenumber">309</context></context-group>
</trans-unit>
- <trans-unit id="_msg829">
+ <trans-unit id="_msg831">
<source xml:space="preserve">Verify the message to ensure it was signed with the specified Bitcoin address</source>
<context-group purpose="location"><context context-type="linenumber">318</context></context-group>
</trans-unit>
- <trans-unit id="_msg830">
+ <trans-unit id="_msg832">
<source xml:space="preserve">Verify &amp;Message</source>
<context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
- <trans-unit id="_msg831">
+ <trans-unit id="_msg833">
<source xml:space="preserve">Reset all verify message fields</source>
<context-group purpose="location"><context context-type="linenumber">335</context></context-group>
</trans-unit>
- <trans-unit id="_msg832">
+ <trans-unit id="_msg834">
<source xml:space="preserve">Click &quot;Sign Message&quot; to generate signature</source>
<context-group purpose="location"><context context-type="linenumber">125</context></context-group>
</trans-unit>
@@ -3827,61 +3837,61 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../signverifymessagedialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SignVerifyMessageDialog">
- <trans-unit id="_msg833">
+ <trans-unit id="_msg835">
<source xml:space="preserve">The entered address is invalid.</source>
<context-group purpose="location"><context context-type="linenumber">119</context></context-group>
<context-group purpose="location"><context context-type="linenumber">218</context></context-group>
</trans-unit>
- <trans-unit id="_msg834">
+ <trans-unit id="_msg836">
<source xml:space="preserve">Please check the address and try again.</source>
<context-group purpose="location"><context context-type="linenumber">119</context></context-group>
<context-group purpose="location"><context context-type="linenumber">126</context></context-group>
<context-group purpose="location"><context context-type="linenumber">219</context></context-group>
<context-group purpose="location"><context context-type="linenumber">226</context></context-group>
</trans-unit>
- <trans-unit id="_msg835">
+ <trans-unit id="_msg837">
<source xml:space="preserve">The entered address does not refer to a key.</source>
<context-group purpose="location"><context context-type="linenumber">126</context></context-group>
<context-group purpose="location"><context context-type="linenumber">225</context></context-group>
</trans-unit>
- <trans-unit id="_msg836">
+ <trans-unit id="_msg838">
<source xml:space="preserve">Wallet unlock was cancelled.</source>
<context-group purpose="location"><context context-type="linenumber">134</context></context-group>
</trans-unit>
- <trans-unit id="_msg837">
+ <trans-unit id="_msg839">
<source xml:space="preserve">No error</source>
<context-group purpose="location"><context context-type="linenumber">145</context></context-group>
</trans-unit>
- <trans-unit id="_msg838">
+ <trans-unit id="_msg840">
<source xml:space="preserve">Private key for the entered address is not available.</source>
<context-group purpose="location"><context context-type="linenumber">148</context></context-group>
</trans-unit>
- <trans-unit id="_msg839">
+ <trans-unit id="_msg841">
<source xml:space="preserve">Message signing failed.</source>
<context-group purpose="location"><context context-type="linenumber">151</context></context-group>
</trans-unit>
- <trans-unit id="_msg840">
+ <trans-unit id="_msg842">
<source xml:space="preserve">Message signed.</source>
<context-group purpose="location"><context context-type="linenumber">163</context></context-group>
</trans-unit>
- <trans-unit id="_msg841">
+ <trans-unit id="_msg843">
<source xml:space="preserve">The signature could not be decoded.</source>
<context-group purpose="location"><context context-type="linenumber">232</context></context-group>
</trans-unit>
- <trans-unit id="_msg842">
+ <trans-unit id="_msg844">
<source xml:space="preserve">Please check the signature and try again.</source>
<context-group purpose="location"><context context-type="linenumber">233</context></context-group>
<context-group purpose="location"><context context-type="linenumber">240</context></context-group>
</trans-unit>
- <trans-unit id="_msg843">
+ <trans-unit id="_msg845">
<source xml:space="preserve">The signature did not match the message digest.</source>
<context-group purpose="location"><context context-type="linenumber">239</context></context-group>
</trans-unit>
- <trans-unit id="_msg844">
+ <trans-unit id="_msg846">
<source xml:space="preserve">Message verification failed.</source>
<context-group purpose="location"><context context-type="linenumber">245</context></context-group>
</trans-unit>
- <trans-unit id="_msg845">
+ <trans-unit id="_msg847">
<source xml:space="preserve">Message verified.</source>
<context-group purpose="location"><context context-type="linenumber">213</context></context-group>
</trans-unit>
@@ -3889,11 +3899,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../splashscreen.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SplashScreen">
- <trans-unit id="_msg846">
+ <trans-unit id="_msg848">
<source xml:space="preserve">(press q to shutdown and continue later)</source>
<context-group purpose="location"><context context-type="linenumber">177</context></context-group>
</trans-unit>
- <trans-unit id="_msg847">
+ <trans-unit id="_msg849">
<source xml:space="preserve">press q to shutdown</source>
<context-group purpose="location"><context context-type="linenumber">178</context></context-group>
</trans-unit>
@@ -3901,7 +3911,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../trafficgraphwidget.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="TrafficGraphWidget">
- <trans-unit id="_msg848">
+ <trans-unit id="_msg850">
<source xml:space="preserve">kB/s</source>
<context-group purpose="location"><context context-type="linenumber">74</context></context-group>
</trans-unit>
@@ -3909,84 +3919,84 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../transactiondesc.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="TransactionDesc">
- <trans-unit id="_msg849">
+ <trans-unit id="_msg851">
<source xml:space="preserve">conflicted with a transaction with %1 confirmations</source>
<context-group purpose="location"><context context-type="linenumber">44</context></context-group>
<note annotates="source" from="developer">Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</note>
</trans-unit>
- <trans-unit id="_msg850">
+ <trans-unit id="_msg852">
<source xml:space="preserve">0/unconfirmed, in memory pool</source>
<context-group purpose="location"><context context-type="linenumber">51</context></context-group>
<note annotates="source" from="developer">Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</note>
</trans-unit>
- <trans-unit id="_msg851">
+ <trans-unit id="_msg853">
<source xml:space="preserve">0/unconfirmed, not in memory pool</source>
<context-group purpose="location"><context context-type="linenumber">56</context></context-group>
<note annotates="source" from="developer">Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</note>
</trans-unit>
- <trans-unit id="_msg852">
+ <trans-unit id="_msg854">
<source xml:space="preserve">abandoned</source>
<context-group purpose="location"><context context-type="linenumber">62</context></context-group>
<note annotates="source" from="developer">Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</note>
</trans-unit>
- <trans-unit id="_msg853">
+ <trans-unit id="_msg855">
<source xml:space="preserve">%1/unconfirmed</source>
<context-group purpose="location"><context context-type="linenumber">70</context></context-group>
<note annotates="source" from="developer">Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</note>
</trans-unit>
- <trans-unit id="_msg854">
+ <trans-unit id="_msg856">
<source xml:space="preserve">%1 confirmations</source>
<context-group purpose="location"><context context-type="linenumber">75</context></context-group>
<note annotates="source" from="developer">Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in 6 or more blocks.</note>
</trans-unit>
- <trans-unit id="_msg855">
+ <trans-unit id="_msg857">
<source xml:space="preserve">Status</source>
<context-group purpose="location"><context context-type="linenumber">125</context></context-group>
</trans-unit>
- <trans-unit id="_msg856">
+ <trans-unit id="_msg858">
<source xml:space="preserve">Date</source>
<context-group purpose="location"><context context-type="linenumber">128</context></context-group>
</trans-unit>
- <trans-unit id="_msg857">
+ <trans-unit id="_msg859">
<source xml:space="preserve">Source</source>
<context-group purpose="location"><context context-type="linenumber">135</context></context-group>
</trans-unit>
- <trans-unit id="_msg858">
+ <trans-unit id="_msg860">
<source xml:space="preserve">Generated</source>
<context-group purpose="location"><context context-type="linenumber">135</context></context-group>
</trans-unit>
- <trans-unit id="_msg859">
+ <trans-unit id="_msg861">
<source xml:space="preserve">From</source>
<context-group purpose="location"><context context-type="linenumber">140</context></context-group>
<context-group purpose="location"><context context-type="linenumber">154</context></context-group>
<context-group purpose="location"><context context-type="linenumber">226</context></context-group>
</trans-unit>
- <trans-unit id="_msg860">
+ <trans-unit id="_msg862">
<source xml:space="preserve">unknown</source>
<context-group purpose="location"><context context-type="linenumber">154</context></context-group>
</trans-unit>
- <trans-unit id="_msg861">
+ <trans-unit id="_msg863">
<source xml:space="preserve">To</source>
<context-group purpose="location"><context context-type="linenumber">155</context></context-group>
<context-group purpose="location"><context context-type="linenumber">175</context></context-group>
<context-group purpose="location"><context context-type="linenumber">245</context></context-group>
</trans-unit>
- <trans-unit id="_msg862">
+ <trans-unit id="_msg864">
<source xml:space="preserve">own address</source>
<context-group purpose="location"><context context-type="linenumber">157</context></context-group>
<context-group purpose="location"><context context-type="linenumber">252</context></context-group>
</trans-unit>
- <trans-unit id="_msg863">
+ <trans-unit id="_msg865">
<source xml:space="preserve">watch-only</source>
<context-group purpose="location"><context context-type="linenumber">157</context></context-group>
<context-group purpose="location"><context context-type="linenumber">226</context></context-group>
<context-group purpose="location"><context context-type="linenumber">254</context></context-group>
</trans-unit>
- <trans-unit id="_msg864">
+ <trans-unit id="_msg866">
<source xml:space="preserve">label</source>
<context-group purpose="location"><context context-type="linenumber">159</context></context-group>
</trans-unit>
- <trans-unit id="_msg865">
+ <trans-unit id="_msg867">
<source xml:space="preserve">Credit</source>
<context-group purpose="location"><context context-type="linenumber">195</context></context-group>
<context-group purpose="location"><context context-type="linenumber">207</context></context-group>
@@ -3996,98 +4006,98 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</trans-unit>
<group restype="x-gettext-plurals">
<context-group purpose="location"><context context-type="linenumber">197</context></context-group>
- <trans-unit id="_msg866[0]">
+ <trans-unit id="_msg868[0]">
<source xml:space="preserve">matures in %n more block(s)</source>
</trans-unit>
- <trans-unit id="_msg866[1]">
+ <trans-unit id="_msg868[1]">
<source xml:space="preserve">matures in %n more block(s)</source>
</trans-unit>
</group>
- <trans-unit id="_msg867">
+ <trans-unit id="_msg869">
<source xml:space="preserve">not accepted</source>
<context-group purpose="location"><context context-type="linenumber">199</context></context-group>
</trans-unit>
- <trans-unit id="_msg868">
+ <trans-unit id="_msg870">
<source xml:space="preserve">Debit</source>
<context-group purpose="location"><context context-type="linenumber">259</context></context-group>
<context-group purpose="location"><context context-type="linenumber">285</context></context-group>
<context-group purpose="location"><context context-type="linenumber">348</context></context-group>
</trans-unit>
- <trans-unit id="_msg869">
+ <trans-unit id="_msg871">
<source xml:space="preserve">Total debit</source>
<context-group purpose="location"><context context-type="linenumber">269</context></context-group>
</trans-unit>
- <trans-unit id="_msg870">
+ <trans-unit id="_msg872">
<source xml:space="preserve">Total credit</source>
<context-group purpose="location"><context context-type="linenumber">270</context></context-group>
</trans-unit>
- <trans-unit id="_msg871">
+ <trans-unit id="_msg873">
<source xml:space="preserve">Transaction fee</source>
<context-group purpose="location"><context context-type="linenumber">275</context></context-group>
</trans-unit>
- <trans-unit id="_msg872">
+ <trans-unit id="_msg874">
<source xml:space="preserve">Net amount</source>
<context-group purpose="location"><context context-type="linenumber">297</context></context-group>
</trans-unit>
- <trans-unit id="_msg873">
+ <trans-unit id="_msg875">
<source xml:space="preserve">Message</source>
<context-group purpose="location"><context context-type="linenumber">303</context></context-group>
<context-group purpose="location"><context context-type="linenumber">315</context></context-group>
</trans-unit>
- <trans-unit id="_msg874">
+ <trans-unit id="_msg876">
<source xml:space="preserve">Comment</source>
<context-group purpose="location"><context context-type="linenumber">305</context></context-group>
</trans-unit>
- <trans-unit id="_msg875">
+ <trans-unit id="_msg877">
<source xml:space="preserve">Transaction ID</source>
<context-group purpose="location"><context context-type="linenumber">307</context></context-group>
</trans-unit>
- <trans-unit id="_msg876">
+ <trans-unit id="_msg878">
<source xml:space="preserve">Transaction total size</source>
<context-group purpose="location"><context context-type="linenumber">308</context></context-group>
</trans-unit>
- <trans-unit id="_msg877">
+ <trans-unit id="_msg879">
<source xml:space="preserve">Transaction virtual size</source>
<context-group purpose="location"><context context-type="linenumber">309</context></context-group>
</trans-unit>
- <trans-unit id="_msg878">
+ <trans-unit id="_msg880">
<source xml:space="preserve">Output index</source>
<context-group purpose="location"><context context-type="linenumber">310</context></context-group>
</trans-unit>
- <trans-unit id="_msg879">
+ <trans-unit id="_msg881">
<source xml:space="preserve">%1 (Certificate was not verified)</source>
<context-group purpose="location"><context context-type="linenumber">326</context></context-group>
</trans-unit>
- <trans-unit id="_msg880">
+ <trans-unit id="_msg882">
<source xml:space="preserve">Merchant</source>
<context-group purpose="location"><context context-type="linenumber">329</context></context-group>
</trans-unit>
- <trans-unit id="_msg881">
+ <trans-unit id="_msg883">
<source xml:space="preserve">Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to &quot;not accepted&quot; and it won&apos;t be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
<context-group purpose="location"><context context-type="linenumber">337</context></context-group>
</trans-unit>
- <trans-unit id="_msg882">
+ <trans-unit id="_msg884">
<source xml:space="preserve">Debug information</source>
<context-group purpose="location"><context context-type="linenumber">345</context></context-group>
</trans-unit>
- <trans-unit id="_msg883">
+ <trans-unit id="_msg885">
<source xml:space="preserve">Transaction</source>
<context-group purpose="location"><context context-type="linenumber">353</context></context-group>
</trans-unit>
- <trans-unit id="_msg884">
+ <trans-unit id="_msg886">
<source xml:space="preserve">Inputs</source>
<context-group purpose="location"><context context-type="linenumber">356</context></context-group>
</trans-unit>
- <trans-unit id="_msg885">
+ <trans-unit id="_msg887">
<source xml:space="preserve">Amount</source>
<context-group purpose="location"><context context-type="linenumber">375</context></context-group>
</trans-unit>
- <trans-unit id="_msg886">
+ <trans-unit id="_msg888">
<source xml:space="preserve">true</source>
<context-group purpose="location"><context context-type="linenumber">376</context></context-group>
<context-group purpose="location"><context context-type="linenumber">377</context></context-group>
</trans-unit>
- <trans-unit id="_msg887">
+ <trans-unit id="_msg889">
<source xml:space="preserve">false</source>
<context-group purpose="location"><context context-type="linenumber">376</context></context-group>
<context-group purpose="location"><context context-type="linenumber">377</context></context-group>
@@ -4096,7 +4106,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../forms/transactiondescdialog.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="TransactionDescDialog">
- <trans-unit id="_msg888">
+ <trans-unit id="_msg890">
<source xml:space="preserve">This pane shows a detailed description of the transaction</source>
<context-group purpose="location"><context context-type="linenumber">20</context></context-group>
</trans-unit>
@@ -4104,7 +4114,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../transactiondescdialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="TransactionDescDialog">
- <trans-unit id="_msg889">
+ <trans-unit id="_msg891">
<source xml:space="preserve">Details for %1</source>
<context-group purpose="location"><context context-type="linenumber">18</context></context-group>
</trans-unit>
@@ -4112,95 +4122,95 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../transactiontablemodel.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="TransactionTableModel">
- <trans-unit id="_msg890">
+ <trans-unit id="_msg892">
<source xml:space="preserve">Date</source>
<context-group purpose="location"><context context-type="linenumber">258</context></context-group>
</trans-unit>
- <trans-unit id="_msg891">
+ <trans-unit id="_msg893">
<source xml:space="preserve">Type</source>
<context-group purpose="location"><context context-type="linenumber">258</context></context-group>
</trans-unit>
- <trans-unit id="_msg892">
+ <trans-unit id="_msg894">
<source xml:space="preserve">Label</source>
<context-group purpose="location"><context context-type="linenumber">258</context></context-group>
</trans-unit>
- <trans-unit id="_msg893">
+ <trans-unit id="_msg895">
<source xml:space="preserve">Unconfirmed</source>
<context-group purpose="location"><context context-type="linenumber">318</context></context-group>
</trans-unit>
- <trans-unit id="_msg894">
+ <trans-unit id="_msg896">
<source xml:space="preserve">Abandoned</source>
<context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
- <trans-unit id="_msg895">
+ <trans-unit id="_msg897">
<source xml:space="preserve">Confirming (%1 of %2 recommended confirmations)</source>
<context-group purpose="location"><context context-type="linenumber">324</context></context-group>
</trans-unit>
- <trans-unit id="_msg896">
+ <trans-unit id="_msg898">
<source xml:space="preserve">Confirmed (%1 confirmations)</source>
<context-group purpose="location"><context context-type="linenumber">327</context></context-group>
</trans-unit>
- <trans-unit id="_msg897">
+ <trans-unit id="_msg899">
<source xml:space="preserve">Conflicted</source>
<context-group purpose="location"><context context-type="linenumber">330</context></context-group>
</trans-unit>
- <trans-unit id="_msg898">
+ <trans-unit id="_msg900">
<source xml:space="preserve">Immature (%1 confirmations, will be available after %2)</source>
<context-group purpose="location"><context context-type="linenumber">333</context></context-group>
</trans-unit>
- <trans-unit id="_msg899">
+ <trans-unit id="_msg901">
<source xml:space="preserve">Generated but not accepted</source>
<context-group purpose="location"><context context-type="linenumber">336</context></context-group>
</trans-unit>
- <trans-unit id="_msg900">
+ <trans-unit id="_msg902">
<source xml:space="preserve">Received with</source>
<context-group purpose="location"><context context-type="linenumber">375</context></context-group>
</trans-unit>
- <trans-unit id="_msg901">
+ <trans-unit id="_msg903">
<source xml:space="preserve">Received from</source>
<context-group purpose="location"><context context-type="linenumber">377</context></context-group>
</trans-unit>
- <trans-unit id="_msg902">
+ <trans-unit id="_msg904">
<source xml:space="preserve">Sent to</source>
<context-group purpose="location"><context context-type="linenumber">380</context></context-group>
</trans-unit>
- <trans-unit id="_msg903">
+ <trans-unit id="_msg905">
<source xml:space="preserve">Mined</source>
<context-group purpose="location"><context context-type="linenumber">382</context></context-group>
</trans-unit>
- <trans-unit id="_msg904">
+ <trans-unit id="_msg906">
<source xml:space="preserve">watch-only</source>
<context-group purpose="location"><context context-type="linenumber">410</context></context-group>
</trans-unit>
- <trans-unit id="_msg905">
+ <trans-unit id="_msg907">
<source xml:space="preserve">(n/a)</source>
<context-group purpose="location"><context context-type="linenumber">424</context></context-group>
</trans-unit>
- <trans-unit id="_msg906">
+ <trans-unit id="_msg908">
<source xml:space="preserve">(no label)</source>
<context-group purpose="location"><context context-type="linenumber">629</context></context-group>
</trans-unit>
- <trans-unit id="_msg907">
+ <trans-unit id="_msg909">
<source xml:space="preserve">Transaction status. Hover over this field to show number of confirmations.</source>
<context-group purpose="location"><context context-type="linenumber">668</context></context-group>
</trans-unit>
- <trans-unit id="_msg908">
+ <trans-unit id="_msg910">
<source xml:space="preserve">Date and time that the transaction was received.</source>
<context-group purpose="location"><context context-type="linenumber">670</context></context-group>
</trans-unit>
- <trans-unit id="_msg909">
+ <trans-unit id="_msg911">
<source xml:space="preserve">Type of transaction.</source>
<context-group purpose="location"><context context-type="linenumber">672</context></context-group>
</trans-unit>
- <trans-unit id="_msg910">
+ <trans-unit id="_msg912">
<source xml:space="preserve">Whether or not a watch-only address is involved in this transaction.</source>
<context-group purpose="location"><context context-type="linenumber">674</context></context-group>
</trans-unit>
- <trans-unit id="_msg911">
+ <trans-unit id="_msg913">
<source xml:space="preserve">User-defined intent/purpose of the transaction.</source>
<context-group purpose="location"><context context-type="linenumber">676</context></context-group>
</trans-unit>
- <trans-unit id="_msg912">
+ <trans-unit id="_msg914">
<source xml:space="preserve">Amount removed from or added to balance.</source>
<context-group purpose="location"><context context-type="linenumber">678</context></context-group>
</trans-unit>
@@ -4208,162 +4218,162 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../transactionview.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="TransactionView">
- <trans-unit id="_msg913">
+ <trans-unit id="_msg915">
<source xml:space="preserve">All</source>
<context-group purpose="location"><context context-type="linenumber">73</context></context-group>
<context-group purpose="location"><context context-type="linenumber">89</context></context-group>
</trans-unit>
- <trans-unit id="_msg914">
+ <trans-unit id="_msg916">
<source xml:space="preserve">Today</source>
<context-group purpose="location"><context context-type="linenumber">74</context></context-group>
</trans-unit>
- <trans-unit id="_msg915">
+ <trans-unit id="_msg917">
<source xml:space="preserve">This week</source>
<context-group purpose="location"><context context-type="linenumber">75</context></context-group>
</trans-unit>
- <trans-unit id="_msg916">
+ <trans-unit id="_msg918">
<source xml:space="preserve">This month</source>
<context-group purpose="location"><context context-type="linenumber">76</context></context-group>
</trans-unit>
- <trans-unit id="_msg917">
+ <trans-unit id="_msg919">
<source xml:space="preserve">Last month</source>
<context-group purpose="location"><context context-type="linenumber">77</context></context-group>
</trans-unit>
- <trans-unit id="_msg918">
+ <trans-unit id="_msg920">
<source xml:space="preserve">This year</source>
<context-group purpose="location"><context context-type="linenumber">78</context></context-group>
</trans-unit>
- <trans-unit id="_msg919">
+ <trans-unit id="_msg921">
<source xml:space="preserve">Received with</source>
<context-group purpose="location"><context context-type="linenumber">90</context></context-group>
</trans-unit>
- <trans-unit id="_msg920">
+ <trans-unit id="_msg922">
<source xml:space="preserve">Sent to</source>
<context-group purpose="location"><context context-type="linenumber">92</context></context-group>
</trans-unit>
- <trans-unit id="_msg921">
+ <trans-unit id="_msg923">
<source xml:space="preserve">Mined</source>
<context-group purpose="location"><context context-type="linenumber">94</context></context-group>
</trans-unit>
- <trans-unit id="_msg922">
+ <trans-unit id="_msg924">
<source xml:space="preserve">Other</source>
<context-group purpose="location"><context context-type="linenumber">95</context></context-group>
</trans-unit>
- <trans-unit id="_msg923">
+ <trans-unit id="_msg925">
<source xml:space="preserve">Enter address, transaction id, or label to search</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
- <trans-unit id="_msg924">
+ <trans-unit id="_msg926">
<source xml:space="preserve">Min amount</source>
<context-group purpose="location"><context context-type="linenumber">104</context></context-group>
</trans-unit>
- <trans-unit id="_msg925">
+ <trans-unit id="_msg927">
<source xml:space="preserve">Range…</source>
<context-group purpose="location"><context context-type="linenumber">79</context></context-group>
</trans-unit>
- <trans-unit id="_msg926">
+ <trans-unit id="_msg928">
<source xml:space="preserve">&amp;Copy address</source>
<context-group purpose="location"><context context-type="linenumber">168</context></context-group>
</trans-unit>
- <trans-unit id="_msg927">
+ <trans-unit id="_msg929">
<source xml:space="preserve">Copy &amp;label</source>
<context-group purpose="location"><context context-type="linenumber">169</context></context-group>
</trans-unit>
- <trans-unit id="_msg928">
+ <trans-unit id="_msg930">
<source xml:space="preserve">Copy &amp;amount</source>
<context-group purpose="location"><context context-type="linenumber">170</context></context-group>
</trans-unit>
- <trans-unit id="_msg929">
+ <trans-unit id="_msg931">
<source xml:space="preserve">Copy transaction &amp;ID</source>
<context-group purpose="location"><context context-type="linenumber">171</context></context-group>
</trans-unit>
- <trans-unit id="_msg930">
+ <trans-unit id="_msg932">
<source xml:space="preserve">Copy &amp;raw transaction</source>
<context-group purpose="location"><context context-type="linenumber">172</context></context-group>
</trans-unit>
- <trans-unit id="_msg931">
+ <trans-unit id="_msg933">
<source xml:space="preserve">Copy full transaction &amp;details</source>
<context-group purpose="location"><context context-type="linenumber">173</context></context-group>
</trans-unit>
- <trans-unit id="_msg932">
+ <trans-unit id="_msg934">
<source xml:space="preserve">&amp;Show transaction details</source>
<context-group purpose="location"><context context-type="linenumber">174</context></context-group>
</trans-unit>
- <trans-unit id="_msg933">
+ <trans-unit id="_msg935">
<source xml:space="preserve">Increase transaction &amp;fee</source>
<context-group purpose="location"><context context-type="linenumber">176</context></context-group>
</trans-unit>
- <trans-unit id="_msg934">
+ <trans-unit id="_msg936">
<source xml:space="preserve">A&amp;bandon transaction</source>
<context-group purpose="location"><context context-type="linenumber">179</context></context-group>
</trans-unit>
- <trans-unit id="_msg935">
+ <trans-unit id="_msg937">
<source xml:space="preserve">&amp;Edit address label</source>
<context-group purpose="location"><context context-type="linenumber">180</context></context-group>
</trans-unit>
- <trans-unit id="_msg936">
+ <trans-unit id="_msg938">
<source xml:space="preserve">Show in %1</source>
<context-group purpose="location"><context context-type="linenumber">239</context></context-group>
<note annotates="source" from="developer">Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</note>
</trans-unit>
- <trans-unit id="_msg937">
+ <trans-unit id="_msg939">
<source xml:space="preserve">Export Transaction History</source>
<context-group purpose="location"><context context-type="linenumber">358</context></context-group>
</trans-unit>
- <trans-unit id="_msg938">
+ <trans-unit id="_msg940">
<source xml:space="preserve">Comma separated file</source>
<context-group purpose="location"><context context-type="linenumber">361</context></context-group>
<note annotates="source" from="developer">Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</note>
</trans-unit>
- <trans-unit id="_msg939">
+ <trans-unit id="_msg941">
<source xml:space="preserve">Confirmed</source>
<context-group purpose="location"><context context-type="linenumber">370</context></context-group>
</trans-unit>
- <trans-unit id="_msg940">
+ <trans-unit id="_msg942">
<source xml:space="preserve">Watch-only</source>
<context-group purpose="location"><context context-type="linenumber">372</context></context-group>
</trans-unit>
- <trans-unit id="_msg941">
+ <trans-unit id="_msg943">
<source xml:space="preserve">Date</source>
<context-group purpose="location"><context context-type="linenumber">373</context></context-group>
</trans-unit>
- <trans-unit id="_msg942">
+ <trans-unit id="_msg944">
<source xml:space="preserve">Type</source>
<context-group purpose="location"><context context-type="linenumber">374</context></context-group>
</trans-unit>
- <trans-unit id="_msg943">
+ <trans-unit id="_msg945">
<source xml:space="preserve">Label</source>
<context-group purpose="location"><context context-type="linenumber">375</context></context-group>
</trans-unit>
- <trans-unit id="_msg944">
+ <trans-unit id="_msg946">
<source xml:space="preserve">Address</source>
<context-group purpose="location"><context context-type="linenumber">376</context></context-group>
</trans-unit>
- <trans-unit id="_msg945">
+ <trans-unit id="_msg947">
<source xml:space="preserve">ID</source>
<context-group purpose="location"><context context-type="linenumber">378</context></context-group>
</trans-unit>
- <trans-unit id="_msg946">
+ <trans-unit id="_msg948">
<source xml:space="preserve">Exporting Failed</source>
<context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
- <trans-unit id="_msg947">
+ <trans-unit id="_msg949">
<source xml:space="preserve">There was an error trying to save the transaction history to %1.</source>
<context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
- <trans-unit id="_msg948">
+ <trans-unit id="_msg950">
<source xml:space="preserve">Exporting Successful</source>
<context-group purpose="location"><context context-type="linenumber">385</context></context-group>
</trans-unit>
- <trans-unit id="_msg949">
+ <trans-unit id="_msg951">
<source xml:space="preserve">The transaction history was successfully saved to %1.</source>
<context-group purpose="location"><context context-type="linenumber">385</context></context-group>
</trans-unit>
- <trans-unit id="_msg950">
+ <trans-unit id="_msg952">
<source xml:space="preserve">Range:</source>
<context-group purpose="location"><context context-type="linenumber">558</context></context-group>
</trans-unit>
- <trans-unit id="_msg951">
+ <trans-unit id="_msg953">
<source xml:space="preserve">to</source>
<context-group purpose="location"><context context-type="linenumber">566</context></context-group>
</trans-unit>
@@ -4371,39 +4381,39 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../walletframe.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="WalletFrame">
- <trans-unit id="_msg952">
+ <trans-unit id="_msg954">
<source xml:space="preserve">No wallet has been loaded.
Go to File &gt; Open Wallet to load a wallet.
- OR -</source>
<context-group purpose="location"><context context-type="linenumber">45</context></context-group>
</trans-unit>
- <trans-unit id="_msg953">
+ <trans-unit id="_msg955">
<source xml:space="preserve">Create a new wallet</source>
<context-group purpose="location"><context context-type="linenumber">50</context></context-group>
</trans-unit>
- <trans-unit id="_msg954">
+ <trans-unit id="_msg956">
<source xml:space="preserve">Error</source>
<context-group purpose="location"><context context-type="linenumber">201</context></context-group>
<context-group purpose="location"><context context-type="linenumber">211</context></context-group>
<context-group purpose="location"><context context-type="linenumber">229</context></context-group>
</trans-unit>
- <trans-unit id="_msg955">
+ <trans-unit id="_msg957">
<source xml:space="preserve">Unable to decode PSBT from clipboard (invalid base64)</source>
<context-group purpose="location"><context context-type="linenumber">201</context></context-group>
</trans-unit>
- <trans-unit id="_msg956">
+ <trans-unit id="_msg958">
<source xml:space="preserve">Load Transaction Data</source>
<context-group purpose="location"><context context-type="linenumber">207</context></context-group>
</trans-unit>
- <trans-unit id="_msg957">
+ <trans-unit id="_msg959">
<source xml:space="preserve">Partially Signed Transaction (*.psbt)</source>
<context-group purpose="location"><context context-type="linenumber">208</context></context-group>
</trans-unit>
- <trans-unit id="_msg958">
+ <trans-unit id="_msg960">
<source xml:space="preserve">PSBT file must be smaller than 100 MiB</source>
<context-group purpose="location"><context context-type="linenumber">211</context></context-group>
</trans-unit>
- <trans-unit id="_msg959">
+ <trans-unit id="_msg961">
<source xml:space="preserve">Unable to decode PSBT</source>
<context-group purpose="location"><context context-type="linenumber">229</context></context-group>
</trans-unit>
@@ -4411,114 +4421,114 @@ Go to File &gt; Open Wallet to load a wallet.
</body></file>
<file original="../walletmodel.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="WalletModel">
- <trans-unit id="_msg960">
+ <trans-unit id="_msg962">
<source xml:space="preserve">Send Coins</source>
<context-group purpose="location"><context context-type="linenumber">227</context></context-group>
<context-group purpose="location"><context context-type="linenumber">240</context></context-group>
</trans-unit>
- <trans-unit id="_msg961">
+ <trans-unit id="_msg963">
<source xml:space="preserve">Fee bump error</source>
- <context-group purpose="location"><context context-type="linenumber">487</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">542</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">557</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">562</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">494</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">549</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">564</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">569</context></context-group>
</trans-unit>
- <trans-unit id="_msg962">
+ <trans-unit id="_msg964">
<source xml:space="preserve">Increasing transaction fee failed</source>
- <context-group purpose="location"><context context-type="linenumber">487</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">494</context></context-group>
</trans-unit>
- <trans-unit id="_msg963">
+ <trans-unit id="_msg965">
<source xml:space="preserve">Do you want to increase the fee?</source>
- <context-group purpose="location"><context context-type="linenumber">494</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">501</context></context-group>
<note annotates="source" from="developer">Asks a user if they would like to manually increase the fee of a transaction that has already been created.</note>
</trans-unit>
- <trans-unit id="_msg964">
+ <trans-unit id="_msg966">
<source xml:space="preserve">Current fee:</source>
- <context-group purpose="location"><context context-type="linenumber">498</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">505</context></context-group>
</trans-unit>
- <trans-unit id="_msg965">
+ <trans-unit id="_msg967">
<source xml:space="preserve">Increase:</source>
- <context-group purpose="location"><context context-type="linenumber">502</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">509</context></context-group>
</trans-unit>
- <trans-unit id="_msg966">
+ <trans-unit id="_msg968">
<source xml:space="preserve">New fee:</source>
- <context-group purpose="location"><context context-type="linenumber">506</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">513</context></context-group>
</trans-unit>
- <trans-unit id="_msg967">
+ <trans-unit id="_msg969">
<source xml:space="preserve">Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy.</source>
- <context-group purpose="location"><context context-type="linenumber">514</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">521</context></context-group>
</trans-unit>
- <trans-unit id="_msg968">
+ <trans-unit id="_msg970">
<source xml:space="preserve">Confirm fee bump</source>
- <context-group purpose="location"><context context-type="linenumber">519</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">526</context></context-group>
</trans-unit>
- <trans-unit id="_msg969">
+ <trans-unit id="_msg971">
<source xml:space="preserve">Can&apos;t draft transaction.</source>
- <context-group purpose="location"><context context-type="linenumber">542</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">549</context></context-group>
</trans-unit>
- <trans-unit id="_msg970">
+ <trans-unit id="_msg972">
<source xml:space="preserve">PSBT copied</source>
- <context-group purpose="location"><context context-type="linenumber">549</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">556</context></context-group>
</trans-unit>
- <trans-unit id="_msg971">
+ <trans-unit id="_msg973">
<source xml:space="preserve">Copied to clipboard</source>
- <context-group purpose="location"><context context-type="linenumber">549</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">556</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">Fee-bump PSBT saved</context></context-group>
</trans-unit>
- <trans-unit id="_msg972">
+ <trans-unit id="_msg974">
<source xml:space="preserve">Can&apos;t sign transaction.</source>
- <context-group purpose="location"><context context-type="linenumber">557</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">564</context></context-group>
</trans-unit>
- <trans-unit id="_msg973">
+ <trans-unit id="_msg975">
<source xml:space="preserve">Could not commit transaction</source>
- <context-group purpose="location"><context context-type="linenumber">562</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">569</context></context-group>
</trans-unit>
- <trans-unit id="_msg974">
+ <trans-unit id="_msg976">
<source xml:space="preserve">Can&apos;t display address</source>
- <context-group purpose="location"><context context-type="linenumber">576</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">583</context></context-group>
</trans-unit>
- <trans-unit id="_msg975">
+ <trans-unit id="_msg977">
<source xml:space="preserve">default wallet</source>
- <context-group purpose="location"><context context-type="linenumber">594</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">601</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../walletview.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="WalletView">
- <trans-unit id="_msg976">
+ <trans-unit id="_msg978">
<source xml:space="preserve">&amp;Export</source>
<context-group purpose="location"><context context-type="linenumber">50</context></context-group>
</trans-unit>
- <trans-unit id="_msg977">
+ <trans-unit id="_msg979">
<source xml:space="preserve">Export the data in the current tab to a file</source>
<context-group purpose="location"><context context-type="linenumber">51</context></context-group>
</trans-unit>
- <trans-unit id="_msg978">
+ <trans-unit id="_msg980">
<source xml:space="preserve">Backup Wallet</source>
<context-group purpose="location"><context context-type="linenumber">214</context></context-group>
</trans-unit>
- <trans-unit id="_msg979">
+ <trans-unit id="_msg981">
<source xml:space="preserve">Wallet Data</source>
<context-group purpose="location"><context context-type="linenumber">216</context></context-group>
<note annotates="source" from="developer">Name of the wallet data file format.</note>
</trans-unit>
- <trans-unit id="_msg980">
+ <trans-unit id="_msg982">
<source xml:space="preserve">Backup Failed</source>
<context-group purpose="location"><context context-type="linenumber">222</context></context-group>
</trans-unit>
- <trans-unit id="_msg981">
+ <trans-unit id="_msg983">
<source xml:space="preserve">There was an error trying to save the wallet data to %1.</source>
<context-group purpose="location"><context context-type="linenumber">222</context></context-group>
</trans-unit>
- <trans-unit id="_msg982">
+ <trans-unit id="_msg984">
<source xml:space="preserve">Backup Successful</source>
<context-group purpose="location"><context context-type="linenumber">226</context></context-group>
</trans-unit>
- <trans-unit id="_msg983">
+ <trans-unit id="_msg985">
<source xml:space="preserve">The wallet data was successfully saved to %1.</source>
<context-group purpose="location"><context context-type="linenumber">226</context></context-group>
</trans-unit>
- <trans-unit id="_msg984">
+ <trans-unit id="_msg986">
<source xml:space="preserve">Cancel</source>
<context-group purpose="location"><context context-type="linenumber">263</context></context-group>
</trans-unit>
@@ -4526,318 +4536,318 @@ Go to File &gt; Open Wallet to load a wallet.
</body></file>
<file original="../bitcoinstrings.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="bitcoin-core">
- <trans-unit id="_msg985">
+ <trans-unit id="_msg987">
<source xml:space="preserve">The %s developers</source>
<context-group purpose="location"><context context-type="linenumber">12</context></context-group>
</trans-unit>
- <trans-unit id="_msg986">
+ <trans-unit id="_msg988">
<source xml:space="preserve">%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
<context-group purpose="location"><context context-type="linenumber">13</context></context-group>
</trans-unit>
- <trans-unit id="_msg987">
+ <trans-unit id="_msg989">
<source xml:space="preserve">%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
<context-group purpose="location"><context context-type="linenumber">16</context></context-group>
</trans-unit>
- <trans-unit id="_msg988">
+ <trans-unit id="_msg990">
<source xml:space="preserve">%s request to listen on port %u. This port is considered &quot;bad&quot; and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<context-group purpose="location"><context context-type="linenumber">28</context></context-group>
</trans-unit>
- <trans-unit id="_msg989">
+ <trans-unit id="_msg991">
<source xml:space="preserve">Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
<context-group purpose="location"><context context-type="linenumber">32</context></context-group>
</trans-unit>
- <trans-unit id="_msg990">
+ <trans-unit id="_msg992">
<source xml:space="preserve">Cannot obtain a lock on data directory %s. %s is probably already running.</source>
<context-group purpose="location"><context context-type="linenumber">35</context></context-group>
</trans-unit>
- <trans-unit id="_msg991">
+ <trans-unit id="_msg993">
<source xml:space="preserve">Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
<context-group purpose="location"><context context-type="linenumber">40</context></context-group>
</trans-unit>
- <trans-unit id="_msg992">
+ <trans-unit id="_msg994">
<source xml:space="preserve">Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
<context-group purpose="location"><context context-type="linenumber">44</context></context-group>
</trans-unit>
- <trans-unit id="_msg993">
+ <trans-unit id="_msg995">
<source xml:space="preserve">Distributed under the MIT software license, see the accompanying file %s or %s</source>
<context-group purpose="location"><context context-type="linenumber">47</context></context-group>
</trans-unit>
- <trans-unit id="_msg994">
+ <trans-unit id="_msg996">
<source xml:space="preserve">Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
<context-group purpose="location"><context context-type="linenumber">53</context></context-group>
</trans-unit>
- <trans-unit id="_msg995">
+ <trans-unit id="_msg997">
<source xml:space="preserve">Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<context-group purpose="location"><context context-type="linenumber">61</context></context-group>
</trans-unit>
- <trans-unit id="_msg996">
+ <trans-unit id="_msg998">
<source xml:space="preserve">Error: Dumpfile format record is incorrect. Got &quot;%s&quot;, expected &quot;format&quot;.</source>
<context-group purpose="location"><context context-type="linenumber">67</context></context-group>
</trans-unit>
- <trans-unit id="_msg997">
+ <trans-unit id="_msg999">
<source xml:space="preserve">Error: Dumpfile identifier record is incorrect. Got &quot;%s&quot;, expected &quot;%s&quot;.</source>
<context-group purpose="location"><context context-type="linenumber">69</context></context-group>
</trans-unit>
- <trans-unit id="_msg998">
+ <trans-unit id="_msg1000">
<source xml:space="preserve">Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
<context-group purpose="location"><context context-type="linenumber">71</context></context-group>
</trans-unit>
- <trans-unit id="_msg999">
+ <trans-unit id="_msg1001">
<source xml:space="preserve">Error: Legacy wallets only support the &quot;legacy&quot;, &quot;p2sh-segwit&quot;, and &quot;bech32&quot; address types</source>
<context-group purpose="location"><context context-type="linenumber">77</context></context-group>
</trans-unit>
- <trans-unit id="_msg1000">
+ <trans-unit id="_msg1002">
<source xml:space="preserve">Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet&apos;s passphrase if it is encrypted.</source>
<context-group purpose="location"><context context-type="linenumber">83</context></context-group>
</trans-unit>
- <trans-unit id="_msg1001">
+ <trans-unit id="_msg1003">
<source xml:space="preserve">File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
<context-group purpose="location"><context context-type="linenumber">95</context></context-group>
</trans-unit>
- <trans-unit id="_msg1002">
+ <trans-unit id="_msg1004">
<source xml:space="preserve">Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start.</source>
<context-group purpose="location"><context context-type="linenumber">104</context></context-group>
</trans-unit>
- <trans-unit id="_msg1003">
+ <trans-unit id="_msg1005">
<source xml:space="preserve">More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
<context-group purpose="location"><context context-type="linenumber">108</context></context-group>
</trans-unit>
- <trans-unit id="_msg1004">
+ <trans-unit id="_msg1006">
<source xml:space="preserve">No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
<context-group purpose="location"><context context-type="linenumber">111</context></context-group>
</trans-unit>
- <trans-unit id="_msg1005">
+ <trans-unit id="_msg1007">
<source xml:space="preserve">No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
<context-group purpose="location"><context context-type="linenumber">114</context></context-group>
</trans-unit>
- <trans-unit id="_msg1006">
+ <trans-unit id="_msg1008">
<source xml:space="preserve">No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
<context-group purpose="location"><context context-type="linenumber">116</context></context-group>
</trans-unit>
- <trans-unit id="_msg1007">
+ <trans-unit id="_msg1009">
<source xml:space="preserve">Please check that your computer&apos;s date and time are correct! If your clock is wrong, %s will not work properly.</source>
<context-group purpose="location"><context context-type="linenumber">132</context></context-group>
</trans-unit>
- <trans-unit id="_msg1008">
+ <trans-unit id="_msg1010">
<source xml:space="preserve">Please contribute if you find %s useful. Visit %s for further information about the software.</source>
<context-group purpose="location"><context context-type="linenumber">135</context></context-group>
</trans-unit>
- <trans-unit id="_msg1009">
+ <trans-unit id="_msg1011">
<source xml:space="preserve">Prune configured below the minimum of %d MiB. Please use a higher number.</source>
<context-group purpose="location"><context context-type="linenumber">138</context></context-group>
</trans-unit>
- <trans-unit id="_msg1010">
+ <trans-unit id="_msg1012">
<source xml:space="preserve">Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<context-group purpose="location"><context context-type="linenumber">140</context></context-group>
</trans-unit>
- <trans-unit id="_msg1011">
+ <trans-unit id="_msg1013">
<source xml:space="preserve">Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
<context-group purpose="location"><context context-type="linenumber">143</context></context-group>
</trans-unit>
- <trans-unit id="_msg1012">
+ <trans-unit id="_msg1014">
<source xml:space="preserve">Rename of &apos;%s&apos; -&gt; &apos;%s&apos; failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
<context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
- <trans-unit id="_msg1013">
+ <trans-unit id="_msg1015">
<source xml:space="preserve">SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<context-group purpose="location"><context context-type="linenumber">150</context></context-group>
</trans-unit>
- <trans-unit id="_msg1014">
+ <trans-unit id="_msg1016">
<source xml:space="preserve">The block database contains a block which appears to be from the future. This may be due to your computer&apos;s date and time being set incorrectly. Only rebuild the block database if you are sure that your computer&apos;s date and time are correct</source>
<context-group purpose="location"><context context-type="linenumber">153</context></context-group>
</trans-unit>
- <trans-unit id="_msg1015">
+ <trans-unit id="_msg1017">
<source xml:space="preserve">The transaction amount is too small to send after the fee has been deducted</source>
<context-group purpose="location"><context context-type="linenumber">165</context></context-group>
</trans-unit>
- <trans-unit id="_msg1016">
+ <trans-unit id="_msg1018">
<source xml:space="preserve">This error could occur if this wallet was not shutdown cleanly and was last loaded using a build with a newer version of Berkeley DB. If so, please use the software that last loaded this wallet</source>
<context-group purpose="location"><context context-type="linenumber">167</context></context-group>
</trans-unit>
- <trans-unit id="_msg1017">
+ <trans-unit id="_msg1019">
<source xml:space="preserve">This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
<context-group purpose="location"><context context-type="linenumber">171</context></context-group>
</trans-unit>
- <trans-unit id="_msg1018">
+ <trans-unit id="_msg1020">
<source xml:space="preserve">This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
<context-group purpose="location"><context context-type="linenumber">174</context></context-group>
</trans-unit>
- <trans-unit id="_msg1019">
+ <trans-unit id="_msg1021">
<source xml:space="preserve">This is the transaction fee you may discard if change is smaller than dust at this level</source>
<context-group purpose="location"><context context-type="linenumber">177</context></context-group>
</trans-unit>
- <trans-unit id="_msg1020">
+ <trans-unit id="_msg1022">
<source xml:space="preserve">This is the transaction fee you may pay when fee estimates are not available.</source>
<context-group purpose="location"><context context-type="linenumber">180</context></context-group>
</trans-unit>
- <trans-unit id="_msg1021">
+ <trans-unit id="_msg1023">
<source xml:space="preserve">Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
<context-group purpose="location"><context context-type="linenumber">182</context></context-group>
</trans-unit>
- <trans-unit id="_msg1022">
+ <trans-unit id="_msg1024">
<source xml:space="preserve">Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate.</source>
<context-group purpose="location"><context context-type="linenumber">191</context></context-group>
</trans-unit>
- <trans-unit id="_msg1023">
+ <trans-unit id="_msg1025">
<source xml:space="preserve">Unknown wallet file format &quot;%s&quot; provided. Please provide one of &quot;bdb&quot; or &quot;sqlite&quot;.</source>
<context-group purpose="location"><context context-type="linenumber">201</context></context-group>
</trans-unit>
- <trans-unit id="_msg1024">
+ <trans-unit id="_msg1026">
<source xml:space="preserve">Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
<context-group purpose="location"><context context-type="linenumber">209</context></context-group>
</trans-unit>
- <trans-unit id="_msg1025">
+ <trans-unit id="_msg1027">
<source xml:space="preserve">Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<context-group purpose="location"><context context-type="linenumber">212</context></context-group>
</trans-unit>
- <trans-unit id="_msg1026">
+ <trans-unit id="_msg1028">
<source xml:space="preserve">Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
<context-group purpose="location"><context context-type="linenumber">215</context></context-group>
</trans-unit>
- <trans-unit id="_msg1027">
+ <trans-unit id="_msg1029">
<source xml:space="preserve">Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
<context-group purpose="location"><context context-type="linenumber">219</context></context-group>
</trans-unit>
- <trans-unit id="_msg1028">
+ <trans-unit id="_msg1030">
<source xml:space="preserve">Warning: Dumpfile wallet format &quot;%s&quot; does not match command line specified format &quot;%s&quot;.</source>
<context-group purpose="location"><context context-type="linenumber">224</context></context-group>
</trans-unit>
- <trans-unit id="_msg1029">
+ <trans-unit id="_msg1031">
<source xml:space="preserve">Warning: Private keys detected in wallet {%s} with disabled private keys</source>
<context-group purpose="location"><context context-type="linenumber">227</context></context-group>
</trans-unit>
- <trans-unit id="_msg1030">
+ <trans-unit id="_msg1032">
<source xml:space="preserve">Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
<context-group purpose="location"><context context-type="linenumber">229</context></context-group>
</trans-unit>
- <trans-unit id="_msg1031">
+ <trans-unit id="_msg1033">
<source xml:space="preserve">Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
<context-group purpose="location"><context context-type="linenumber">232</context></context-group>
</trans-unit>
- <trans-unit id="_msg1032">
+ <trans-unit id="_msg1034">
<source xml:space="preserve">You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
<context-group purpose="location"><context context-type="linenumber">235</context></context-group>
</trans-unit>
- <trans-unit id="_msg1033">
+ <trans-unit id="_msg1035">
<source xml:space="preserve">%s is set very high!</source>
<context-group purpose="location"><context context-type="linenumber">244</context></context-group>
</trans-unit>
- <trans-unit id="_msg1034">
+ <trans-unit id="_msg1036">
<source xml:space="preserve">-maxmempool must be at least %d MB</source>
<context-group purpose="location"><context context-type="linenumber">245</context></context-group>
</trans-unit>
- <trans-unit id="_msg1035">
+ <trans-unit id="_msg1037">
<source xml:space="preserve">A fatal internal error occurred, see debug.log for details</source>
<context-group purpose="location"><context context-type="linenumber">246</context></context-group>
</trans-unit>
- <trans-unit id="_msg1036">
+ <trans-unit id="_msg1038">
<source xml:space="preserve">Cannot resolve -%s address: &apos;%s&apos;</source>
<context-group purpose="location"><context context-type="linenumber">248</context></context-group>
</trans-unit>
- <trans-unit id="_msg1037">
+ <trans-unit id="_msg1039">
<source xml:space="preserve">Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
<context-group purpose="location"><context context-type="linenumber">249</context></context-group>
</trans-unit>
- <trans-unit id="_msg1038">
+ <trans-unit id="_msg1040">
<source xml:space="preserve">Cannot set -peerblockfilters without -blockfilterindex.</source>
<context-group purpose="location"><context context-type="linenumber">250</context></context-group>
</trans-unit>
- <trans-unit id="_msg1039">
+ <trans-unit id="_msg1041">
<source xml:space="preserve">Cannot write to data directory &apos;%s&apos;; check permissions.</source>
<context-group purpose="location"><context context-type="linenumber">251</context></context-group>
</trans-unit>
- <trans-unit id="_msg1040">
+ <trans-unit id="_msg1042">
<source xml:space="preserve">%s is set very high! Fees this large could be paid on a single transaction.</source>
<context-group purpose="location"><context context-type="linenumber">26</context></context-group>
</trans-unit>
- <trans-unit id="_msg1041">
+ <trans-unit id="_msg1043">
<source xml:space="preserve">Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<context-group purpose="location"><context context-type="linenumber">37</context></context-group>
</trans-unit>
- <trans-unit id="_msg1042">
+ <trans-unit id="_msg1044">
<source xml:space="preserve">Error loading %s: External signer wallet being loaded without external signer support compiled</source>
<context-group purpose="location"><context context-type="linenumber">50</context></context-group>
</trans-unit>
- <trans-unit id="_msg1043">
+ <trans-unit id="_msg1045">
<source xml:space="preserve">Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
<context-group purpose="location"><context context-type="linenumber">58</context></context-group>
</trans-unit>
- <trans-unit id="_msg1044">
+ <trans-unit id="_msg1046">
<source xml:space="preserve">Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<context-group purpose="location"><context context-type="linenumber">64</context></context-group>
</trans-unit>
- <trans-unit id="_msg1045">
+ <trans-unit id="_msg1047">
<source xml:space="preserve">Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
<context-group purpose="location"><context context-type="linenumber">74</context></context-group>
</trans-unit>
- <trans-unit id="_msg1046">
+ <trans-unit id="_msg1048">
<source xml:space="preserve">Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
<context-group purpose="location"><context context-type="linenumber">80</context></context-group>
</trans-unit>
- <trans-unit id="_msg1047">
+ <trans-unit id="_msg1049">
<source xml:space="preserve">Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
<context-group purpose="location"><context context-type="linenumber">86</context></context-group>
</trans-unit>
- <trans-unit id="_msg1048">
+ <trans-unit id="_msg1050">
<source xml:space="preserve">Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<context-group purpose="location"><context context-type="linenumber">89</context></context-group>
</trans-unit>
- <trans-unit id="_msg1049">
+ <trans-unit id="_msg1051">
<source xml:space="preserve">Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
<context-group purpose="location"><context context-type="linenumber">92</context></context-group>
</trans-unit>
- <trans-unit id="_msg1050">
+ <trans-unit id="_msg1052">
<source xml:space="preserve">Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<context-group purpose="location"><context context-type="linenumber">98</context></context-group>
</trans-unit>
- <trans-unit id="_msg1051">
+ <trans-unit id="_msg1053">
<source xml:space="preserve">Invalid amount for %s=&lt;amount&gt;: &apos;%s&apos; (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
<context-group purpose="location"><context context-type="linenumber">101</context></context-group>
</trans-unit>
- <trans-unit id="_msg1052">
+ <trans-unit id="_msg1054">
<source xml:space="preserve">Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<context-group purpose="location"><context context-type="linenumber">119</context></context-group>
</trans-unit>
- <trans-unit id="_msg1053">
+ <trans-unit id="_msg1055">
<source xml:space="preserve">Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is explicitly forbidden: -onion=0</source>
<context-group purpose="location"><context context-type="linenumber">122</context></context-group>
</trans-unit>
- <trans-unit id="_msg1054">
+ <trans-unit id="_msg1056">
<source xml:space="preserve">Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is not provided: none of -proxy, -onion or -listenonion is given</source>
<context-group purpose="location"><context context-type="linenumber">125</context></context-group>
</trans-unit>
- <trans-unit id="_msg1055">
+ <trans-unit id="_msg1057">
<source xml:space="preserve">Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
<context-group purpose="location"><context context-type="linenumber">129</context></context-group>
</trans-unit>
- <trans-unit id="_msg1056">
+ <trans-unit id="_msg1058">
<source xml:space="preserve">The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet&apos;s UTXOs</source>
<context-group purpose="location"><context context-type="linenumber">158</context></context-group>
</trans-unit>
- <trans-unit id="_msg1057">
+ <trans-unit id="_msg1059">
<source xml:space="preserve">The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
<context-group purpose="location"><context context-type="linenumber">161</context></context-group>
</trans-unit>
- <trans-unit id="_msg1058">
+ <trans-unit id="_msg1060">
<source xml:space="preserve">Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
<context-group purpose="location"><context context-type="linenumber">185</context></context-group>
</trans-unit>
- <trans-unit id="_msg1059">
+ <trans-unit id="_msg1061">
<source xml:space="preserve">UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
<context-group purpose="location"><context context-type="linenumber">188</context></context-group>
</trans-unit>
- <trans-unit id="_msg1060">
+ <trans-unit id="_msg1062">
<source xml:space="preserve">Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
<context-group purpose="location"><context context-type="linenumber">194</context></context-group>
</trans-unit>
- <trans-unit id="_msg1061">
+ <trans-unit id="_msg1063">
<source xml:space="preserve">Unexpected legacy entry in descriptor wallet found. Loading wallet %s
The wallet might have been tampered with or created with malicious intent.
</source>
<context-group purpose="location"><context context-type="linenumber">197</context></context-group>
</trans-unit>
- <trans-unit id="_msg1062">
+ <trans-unit id="_msg1064">
<source xml:space="preserve">Unrecognized descriptor found. Loading wallet %s
The wallet might had been created on a newer version.
@@ -4845,563 +4855,583 @@ Please try running the latest software version.
</source>
<context-group purpose="location"><context context-type="linenumber">204</context></context-group>
</trans-unit>
- <trans-unit id="_msg1063">
+ <trans-unit id="_msg1065">
<source xml:space="preserve">
Unable to cleanup failed migration</source>
<context-group purpose="location"><context context-type="linenumber">238</context></context-group>
</trans-unit>
- <trans-unit id="_msg1064">
+ <trans-unit id="_msg1066">
<source xml:space="preserve">
Unable to restore backup of wallet.</source>
<context-group purpose="location"><context context-type="linenumber">241</context></context-group>
</trans-unit>
- <trans-unit id="_msg1065">
+ <trans-unit id="_msg1067">
<source xml:space="preserve">Block verification was interrupted</source>
<context-group purpose="location"><context context-type="linenumber">247</context></context-group>
</trans-unit>
- <trans-unit id="_msg1066">
+ <trans-unit id="_msg1068">
<source xml:space="preserve">Config setting for %s only applied on %s network when in [%s] section.</source>
<context-group purpose="location"><context context-type="linenumber">252</context></context-group>
</trans-unit>
- <trans-unit id="_msg1067">
+ <trans-unit id="_msg1069">
<source xml:space="preserve">Copyright (C) %i-%i</source>
<context-group purpose="location"><context context-type="linenumber">253</context></context-group>
</trans-unit>
- <trans-unit id="_msg1068">
+ <trans-unit id="_msg1070">
<source xml:space="preserve">Corrupted block database detected</source>
<context-group purpose="location"><context context-type="linenumber">254</context></context-group>
</trans-unit>
- <trans-unit id="_msg1069">
+ <trans-unit id="_msg1071">
<source xml:space="preserve">Could not find asmap file %s</source>
<context-group purpose="location"><context context-type="linenumber">255</context></context-group>
</trans-unit>
- <trans-unit id="_msg1070">
+ <trans-unit id="_msg1072">
<source xml:space="preserve">Could not parse asmap file %s</source>
<context-group purpose="location"><context context-type="linenumber">256</context></context-group>
</trans-unit>
- <trans-unit id="_msg1071">
+ <trans-unit id="_msg1073">
<source xml:space="preserve">Disk space is too low!</source>
<context-group purpose="location"><context context-type="linenumber">257</context></context-group>
</trans-unit>
- <trans-unit id="_msg1072">
+ <trans-unit id="_msg1074">
<source xml:space="preserve">Do you want to rebuild the block database now?</source>
<context-group purpose="location"><context context-type="linenumber">258</context></context-group>
</trans-unit>
- <trans-unit id="_msg1073">
+ <trans-unit id="_msg1075">
<source xml:space="preserve">Done loading</source>
<context-group purpose="location"><context context-type="linenumber">259</context></context-group>
</trans-unit>
- <trans-unit id="_msg1074">
+ <trans-unit id="_msg1076">
<source xml:space="preserve">Dump file %s does not exist.</source>
<context-group purpose="location"><context context-type="linenumber">260</context></context-group>
</trans-unit>
- <trans-unit id="_msg1075">
- <source xml:space="preserve">Error creating %s</source>
+ <trans-unit id="_msg1077">
+ <source xml:space="preserve">Error committing db txn for wallet transactions removal</source>
<context-group purpose="location"><context context-type="linenumber">261</context></context-group>
</trans-unit>
- <trans-unit id="_msg1076">
- <source xml:space="preserve">Error initializing block database</source>
+ <trans-unit id="_msg1078">
+ <source xml:space="preserve">Error creating %s</source>
<context-group purpose="location"><context context-type="linenumber">262</context></context-group>
</trans-unit>
- <trans-unit id="_msg1077">
- <source xml:space="preserve">Error initializing wallet database environment %s!</source>
+ <trans-unit id="_msg1079">
+ <source xml:space="preserve">Error initializing block database</source>
<context-group purpose="location"><context context-type="linenumber">263</context></context-group>
</trans-unit>
- <trans-unit id="_msg1078">
- <source xml:space="preserve">Error loading %s</source>
+ <trans-unit id="_msg1080">
+ <source xml:space="preserve">Error initializing wallet database environment %s!</source>
<context-group purpose="location"><context context-type="linenumber">264</context></context-group>
</trans-unit>
- <trans-unit id="_msg1079">
- <source xml:space="preserve">Error loading %s: Private keys can only be disabled during creation</source>
+ <trans-unit id="_msg1081">
+ <source xml:space="preserve">Error loading %s</source>
<context-group purpose="location"><context context-type="linenumber">265</context></context-group>
</trans-unit>
- <trans-unit id="_msg1080">
- <source xml:space="preserve">Error loading %s: Wallet corrupted</source>
+ <trans-unit id="_msg1082">
+ <source xml:space="preserve">Error loading %s: Private keys can only be disabled during creation</source>
<context-group purpose="location"><context context-type="linenumber">266</context></context-group>
</trans-unit>
- <trans-unit id="_msg1081">
- <source xml:space="preserve">Error loading %s: Wallet requires newer version of %s</source>
+ <trans-unit id="_msg1083">
+ <source xml:space="preserve">Error loading %s: Wallet corrupted</source>
<context-group purpose="location"><context context-type="linenumber">267</context></context-group>
</trans-unit>
- <trans-unit id="_msg1082">
- <source xml:space="preserve">Error loading block database</source>
+ <trans-unit id="_msg1084">
+ <source xml:space="preserve">Error loading %s: Wallet requires newer version of %s</source>
<context-group purpose="location"><context context-type="linenumber">268</context></context-group>
</trans-unit>
- <trans-unit id="_msg1083">
- <source xml:space="preserve">Error opening block database</source>
+ <trans-unit id="_msg1085">
+ <source xml:space="preserve">Error loading block database</source>
<context-group purpose="location"><context context-type="linenumber">269</context></context-group>
</trans-unit>
- <trans-unit id="_msg1084">
- <source xml:space="preserve">Error reading configuration file: %s</source>
+ <trans-unit id="_msg1086">
+ <source xml:space="preserve">Error opening block database</source>
<context-group purpose="location"><context context-type="linenumber">270</context></context-group>
</trans-unit>
- <trans-unit id="_msg1085">
- <source xml:space="preserve">Error reading from database, shutting down.</source>
+ <trans-unit id="_msg1087">
+ <source xml:space="preserve">Error reading configuration file: %s</source>
<context-group purpose="location"><context context-type="linenumber">271</context></context-group>
</trans-unit>
- <trans-unit id="_msg1086">
- <source xml:space="preserve">Error reading next record from wallet database</source>
+ <trans-unit id="_msg1088">
+ <source xml:space="preserve">Error reading from database, shutting down.</source>
<context-group purpose="location"><context context-type="linenumber">272</context></context-group>
</trans-unit>
- <trans-unit id="_msg1087">
- <source xml:space="preserve">Error: Cannot extract destination from the generated scriptpubkey</source>
+ <trans-unit id="_msg1089">
+ <source xml:space="preserve">Error reading next record from wallet database</source>
<context-group purpose="location"><context context-type="linenumber">273</context></context-group>
</trans-unit>
- <trans-unit id="_msg1088">
- <source xml:space="preserve">Error: Could not delete watchonly transactions</source>
+ <trans-unit id="_msg1090">
+ <source xml:space="preserve">Error starting db txn for wallet transactions removal</source>
+ <context-group purpose="location"><context context-type="linenumber">274</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1091">
+ <source xml:space="preserve">Error: Cannot extract destination from the generated scriptpubkey</source>
<context-group purpose="location"><context context-type="linenumber">275</context></context-group>
</trans-unit>
- <trans-unit id="_msg1089">
+ <trans-unit id="_msg1092">
<source xml:space="preserve">Error: Couldn&apos;t create cursor into database</source>
- <context-group purpose="location"><context context-type="linenumber">276</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">278</context></context-group>
</trans-unit>
- <trans-unit id="_msg1090">
+ <trans-unit id="_msg1093">
<source xml:space="preserve">Error: Disk space is low for %s</source>
- <context-group purpose="location"><context context-type="linenumber">277</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">279</context></context-group>
</trans-unit>
- <trans-unit id="_msg1091">
+ <trans-unit id="_msg1094">
<source xml:space="preserve">Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
- <context-group purpose="location"><context context-type="linenumber">278</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">280</context></context-group>
</trans-unit>
- <trans-unit id="_msg1092">
+ <trans-unit id="_msg1095">
<source xml:space="preserve">Error: Failed to create new watchonly wallet</source>
- <context-group purpose="location"><context context-type="linenumber">279</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">281</context></context-group>
</trans-unit>
- <trans-unit id="_msg1093">
+ <trans-unit id="_msg1096">
<source xml:space="preserve">Error: Got key that was not hex: %s</source>
- <context-group purpose="location"><context context-type="linenumber">280</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">282</context></context-group>
</trans-unit>
- <trans-unit id="_msg1094">
+ <trans-unit id="_msg1097">
<source xml:space="preserve">Error: Got value that was not hex: %s</source>
- <context-group purpose="location"><context context-type="linenumber">281</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">283</context></context-group>
</trans-unit>
- <trans-unit id="_msg1095">
+ <trans-unit id="_msg1098">
<source xml:space="preserve">Error: Keypool ran out, please call keypoolrefill first</source>
- <context-group purpose="location"><context context-type="linenumber">282</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">284</context></context-group>
</trans-unit>
- <trans-unit id="_msg1096">
+ <trans-unit id="_msg1099">
<source xml:space="preserve">Error: Missing checksum</source>
- <context-group purpose="location"><context context-type="linenumber">283</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">285</context></context-group>
</trans-unit>
- <trans-unit id="_msg1097">
+ <trans-unit id="_msg1100">
<source xml:space="preserve">Error: No %s addresses available.</source>
- <context-group purpose="location"><context context-type="linenumber">284</context></context-group>
- </trans-unit>
- <trans-unit id="_msg1098">
- <source xml:space="preserve">Error: Not all watchonly txs could be deleted</source>
- <context-group purpose="location"><context context-type="linenumber">285</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">286</context></context-group>
</trans-unit>
- <trans-unit id="_msg1099">
+ <trans-unit id="_msg1101">
<source xml:space="preserve">Error: This wallet already uses SQLite</source>
- <context-group purpose="location"><context context-type="linenumber">286</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">287</context></context-group>
</trans-unit>
- <trans-unit id="_msg1100">
+ <trans-unit id="_msg1102">
<source xml:space="preserve">Error: This wallet is already a descriptor wallet</source>
- <context-group purpose="location"><context context-type="linenumber">287</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">288</context></context-group>
</trans-unit>
- <trans-unit id="_msg1101">
+ <trans-unit id="_msg1103">
<source xml:space="preserve">Error: Unable to begin reading all records in the database</source>
- <context-group purpose="location"><context context-type="linenumber">288</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">289</context></context-group>
</trans-unit>
- <trans-unit id="_msg1102">
+ <trans-unit id="_msg1104">
<source xml:space="preserve">Error: Unable to make a backup of your wallet</source>
- <context-group purpose="location"><context context-type="linenumber">289</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">290</context></context-group>
</trans-unit>
- <trans-unit id="_msg1103">
+ <trans-unit id="_msg1105">
<source xml:space="preserve">Error: Unable to parse version %u as a uint32_t</source>
- <context-group purpose="location"><context context-type="linenumber">290</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">291</context></context-group>
</trans-unit>
- <trans-unit id="_msg1104">
+ <trans-unit id="_msg1106">
<source xml:space="preserve">Error: Unable to read all records in the database</source>
- <context-group purpose="location"><context context-type="linenumber">291</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">292</context></context-group>
</trans-unit>
- <trans-unit id="_msg1105">
+ <trans-unit id="_msg1107">
<source xml:space="preserve">Error: Unable to read wallet&apos;s best block locator record</source>
- <context-group purpose="location"><context context-type="linenumber">292</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">293</context></context-group>
</trans-unit>
- <trans-unit id="_msg1106">
+ <trans-unit id="_msg1108">
<source xml:space="preserve">Error: Unable to remove watchonly address book data</source>
- <context-group purpose="location"><context context-type="linenumber">293</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">294</context></context-group>
</trans-unit>
- <trans-unit id="_msg1107">
+ <trans-unit id="_msg1109">
<source xml:space="preserve">Error: Unable to write record to new wallet</source>
- <context-group purpose="location"><context context-type="linenumber">294</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">295</context></context-group>
</trans-unit>
- <trans-unit id="_msg1108">
+ <trans-unit id="_msg1110">
<source xml:space="preserve">Error: Unable to write solvable wallet best block locator record</source>
- <context-group purpose="location"><context context-type="linenumber">295</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">296</context></context-group>
</trans-unit>
- <trans-unit id="_msg1109">
+ <trans-unit id="_msg1111">
<source xml:space="preserve">Error: Unable to write watchonly wallet best block locator record</source>
- <context-group purpose="location"><context context-type="linenumber">296</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">297</context></context-group>
</trans-unit>
- <trans-unit id="_msg1110">
+ <trans-unit id="_msg1112">
+ <source xml:space="preserve">Error: address book copy failed for wallet %s</source>
+ <context-group purpose="location"><context context-type="linenumber">298</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1113">
+ <source xml:space="preserve">Error: database transaction cannot be executed for wallet %s</source>
+ <context-group purpose="location"><context context-type="linenumber">299</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1114">
<source xml:space="preserve">Failed to listen on any port. Use -listen=0 if you want this.</source>
- <context-group purpose="location"><context context-type="linenumber">297</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">300</context></context-group>
</trans-unit>
- <trans-unit id="_msg1111">
+ <trans-unit id="_msg1115">
<source xml:space="preserve">Failed to rescan the wallet during initialization</source>
- <context-group purpose="location"><context context-type="linenumber">298</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">301</context></context-group>
</trans-unit>
- <trans-unit id="_msg1112">
+ <trans-unit id="_msg1116">
<source xml:space="preserve">Failed to start indexes, shutting down..</source>
- <context-group purpose="location"><context context-type="linenumber">299</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">302</context></context-group>
</trans-unit>
- <trans-unit id="_msg1113">
+ <trans-unit id="_msg1117">
<source xml:space="preserve">Failed to verify database</source>
- <context-group purpose="location"><context context-type="linenumber">300</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">303</context></context-group>
</trans-unit>
- <trans-unit id="_msg1114">
+ <trans-unit id="_msg1118">
+ <source xml:space="preserve">Failure removing transaction: %s</source>
+ <context-group purpose="location"><context context-type="linenumber">304</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1119">
<source xml:space="preserve">Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
- <context-group purpose="location"><context context-type="linenumber">301</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">305</context></context-group>
</trans-unit>
- <trans-unit id="_msg1115">
+ <trans-unit id="_msg1120">
<source xml:space="preserve">Ignoring duplicate -wallet %s.</source>
- <context-group purpose="location"><context context-type="linenumber">302</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">306</context></context-group>
</trans-unit>
- <trans-unit id="_msg1116">
+ <trans-unit id="_msg1121">
<source xml:space="preserve">Importing…</source>
- <context-group purpose="location"><context context-type="linenumber">303</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">307</context></context-group>
</trans-unit>
- <trans-unit id="_msg1117">
+ <trans-unit id="_msg1122">
<source xml:space="preserve">Incorrect or no genesis block found. Wrong datadir for network?</source>
- <context-group purpose="location"><context context-type="linenumber">304</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">308</context></context-group>
</trans-unit>
- <trans-unit id="_msg1118">
+ <trans-unit id="_msg1123">
<source xml:space="preserve">Initialization sanity check failed. %s is shutting down.</source>
- <context-group purpose="location"><context context-type="linenumber">305</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">309</context></context-group>
</trans-unit>
- <trans-unit id="_msg1119">
+ <trans-unit id="_msg1124">
<source xml:space="preserve">Input not found or already spent</source>
- <context-group purpose="location"><context context-type="linenumber">306</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">310</context></context-group>
</trans-unit>
- <trans-unit id="_msg1120">
+ <trans-unit id="_msg1125">
<source xml:space="preserve">Insufficient dbcache for block verification</source>
- <context-group purpose="location"><context context-type="linenumber">307</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">311</context></context-group>
</trans-unit>
- <trans-unit id="_msg1121">
+ <trans-unit id="_msg1126">
<source xml:space="preserve">Insufficient funds</source>
- <context-group purpose="location"><context context-type="linenumber">308</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">312</context></context-group>
</trans-unit>
- <trans-unit id="_msg1122">
+ <trans-unit id="_msg1127">
<source xml:space="preserve">Invalid -i2psam address or hostname: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">309</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">313</context></context-group>
</trans-unit>
- <trans-unit id="_msg1123">
+ <trans-unit id="_msg1128">
<source xml:space="preserve">Invalid -onion address or hostname: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">310</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">314</context></context-group>
</trans-unit>
- <trans-unit id="_msg1124">
+ <trans-unit id="_msg1129">
<source xml:space="preserve">Invalid -proxy address or hostname: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">311</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">315</context></context-group>
</trans-unit>
- <trans-unit id="_msg1125">
+ <trans-unit id="_msg1130">
<source xml:space="preserve">Invalid P2P permission: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">312</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">316</context></context-group>
</trans-unit>
- <trans-unit id="_msg1126">
+ <trans-unit id="_msg1131">
<source xml:space="preserve">Invalid amount for %s=&lt;amount&gt;: &apos;%s&apos; (must be at least %s)</source>
- <context-group purpose="location"><context context-type="linenumber">313</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">317</context></context-group>
</trans-unit>
- <trans-unit id="_msg1127">
+ <trans-unit id="_msg1132">
<source xml:space="preserve">Invalid amount for %s=&lt;amount&gt;: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">314</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">318</context></context-group>
</trans-unit>
- <trans-unit id="_msg1128">
+ <trans-unit id="_msg1133">
<source xml:space="preserve">Invalid amount for -%s=&lt;amount&gt;: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">315</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">319</context></context-group>
</trans-unit>
- <trans-unit id="_msg1129">
+ <trans-unit id="_msg1134">
<source xml:space="preserve">Invalid netmask specified in -whitelist: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">316</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">320</context></context-group>
</trans-unit>
- <trans-unit id="_msg1130">
+ <trans-unit id="_msg1135">
<source xml:space="preserve">Invalid port specified in %s: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">317</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
- <trans-unit id="_msg1131">
+ <trans-unit id="_msg1136">
<source xml:space="preserve">Invalid pre-selected input %s</source>
- <context-group purpose="location"><context context-type="linenumber">318</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">322</context></context-group>
</trans-unit>
- <trans-unit id="_msg1132">
+ <trans-unit id="_msg1137">
<source xml:space="preserve">Listening for incoming connections failed (listen returned error %s)</source>
- <context-group purpose="location"><context context-type="linenumber">319</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">323</context></context-group>
</trans-unit>
- <trans-unit id="_msg1133">
+ <trans-unit id="_msg1138">
<source xml:space="preserve">Loading P2P addresses…</source>
- <context-group purpose="location"><context context-type="linenumber">320</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">324</context></context-group>
</trans-unit>
- <trans-unit id="_msg1134">
+ <trans-unit id="_msg1139">
<source xml:space="preserve">Loading banlist…</source>
- <context-group purpose="location"><context context-type="linenumber">321</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">325</context></context-group>
</trans-unit>
- <trans-unit id="_msg1135">
+ <trans-unit id="_msg1140">
<source xml:space="preserve">Loading block index…</source>
- <context-group purpose="location"><context context-type="linenumber">322</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">326</context></context-group>
</trans-unit>
- <trans-unit id="_msg1136">
+ <trans-unit id="_msg1141">
<source xml:space="preserve">Loading wallet…</source>
- <context-group purpose="location"><context context-type="linenumber">323</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">327</context></context-group>
</trans-unit>
- <trans-unit id="_msg1137">
+ <trans-unit id="_msg1142">
<source xml:space="preserve">Missing amount</source>
- <context-group purpose="location"><context context-type="linenumber">324</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">328</context></context-group>
</trans-unit>
- <trans-unit id="_msg1138">
+ <trans-unit id="_msg1143">
<source xml:space="preserve">Missing solving data for estimating transaction size</source>
- <context-group purpose="location"><context context-type="linenumber">325</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">329</context></context-group>
</trans-unit>
- <trans-unit id="_msg1139">
+ <trans-unit id="_msg1144">
<source xml:space="preserve">Need to specify a port with -whitebind: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">326</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">330</context></context-group>
</trans-unit>
- <trans-unit id="_msg1140">
+ <trans-unit id="_msg1145">
<source xml:space="preserve">No addresses available</source>
- <context-group purpose="location"><context context-type="linenumber">327</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">331</context></context-group>
</trans-unit>
- <trans-unit id="_msg1141">
+ <trans-unit id="_msg1146">
<source xml:space="preserve">Not enough file descriptors available.</source>
- <context-group purpose="location"><context context-type="linenumber">328</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">332</context></context-group>
</trans-unit>
- <trans-unit id="_msg1142">
+ <trans-unit id="_msg1147">
<source xml:space="preserve">Not found pre-selected input %s</source>
- <context-group purpose="location"><context context-type="linenumber">329</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">333</context></context-group>
</trans-unit>
- <trans-unit id="_msg1143">
+ <trans-unit id="_msg1148">
<source xml:space="preserve">Not solvable pre-selected input %s</source>
- <context-group purpose="location"><context context-type="linenumber">330</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">334</context></context-group>
</trans-unit>
- <trans-unit id="_msg1144">
+ <trans-unit id="_msg1149">
<source xml:space="preserve">Prune cannot be configured with a negative value.</source>
- <context-group purpose="location"><context context-type="linenumber">331</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">335</context></context-group>
</trans-unit>
- <trans-unit id="_msg1145">
+ <trans-unit id="_msg1150">
<source xml:space="preserve">Prune mode is incompatible with -txindex.</source>
- <context-group purpose="location"><context context-type="linenumber">332</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">336</context></context-group>
</trans-unit>
- <trans-unit id="_msg1146">
+ <trans-unit id="_msg1151">
<source xml:space="preserve">Pruning blockstore…</source>
- <context-group purpose="location"><context context-type="linenumber">333</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">337</context></context-group>
</trans-unit>
- <trans-unit id="_msg1147">
+ <trans-unit id="_msg1152">
<source xml:space="preserve">Reducing -maxconnections from %d to %d, because of system limitations.</source>
- <context-group purpose="location"><context context-type="linenumber">334</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">338</context></context-group>
</trans-unit>
- <trans-unit id="_msg1148">
+ <trans-unit id="_msg1153">
<source xml:space="preserve">Replaying blocks…</source>
- <context-group purpose="location"><context context-type="linenumber">335</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">339</context></context-group>
</trans-unit>
- <trans-unit id="_msg1149">
+ <trans-unit id="_msg1154">
<source xml:space="preserve">Rescanning…</source>
- <context-group purpose="location"><context context-type="linenumber">336</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">340</context></context-group>
</trans-unit>
- <trans-unit id="_msg1150">
+ <trans-unit id="_msg1155">
<source xml:space="preserve">SQLiteDatabase: Failed to execute statement to verify database: %s</source>
- <context-group purpose="location"><context context-type="linenumber">337</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">341</context></context-group>
</trans-unit>
- <trans-unit id="_msg1151">
+ <trans-unit id="_msg1156">
<source xml:space="preserve">SQLiteDatabase: Failed to prepare statement to verify database: %s</source>
- <context-group purpose="location"><context context-type="linenumber">338</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">342</context></context-group>
</trans-unit>
- <trans-unit id="_msg1152">
+ <trans-unit id="_msg1157">
<source xml:space="preserve">SQLiteDatabase: Failed to read database verification error: %s</source>
- <context-group purpose="location"><context context-type="linenumber">339</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">343</context></context-group>
</trans-unit>
- <trans-unit id="_msg1153">
+ <trans-unit id="_msg1158">
<source xml:space="preserve">SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
- <context-group purpose="location"><context context-type="linenumber">340</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">344</context></context-group>
</trans-unit>
- <trans-unit id="_msg1154">
+ <trans-unit id="_msg1159">
<source xml:space="preserve">Section [%s] is not recognized.</source>
- <context-group purpose="location"><context context-type="linenumber">341</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">345</context></context-group>
</trans-unit>
- <trans-unit id="_msg1155">
+ <trans-unit id="_msg1160">
<source xml:space="preserve">Signing transaction failed</source>
- <context-group purpose="location"><context context-type="linenumber">344</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">348</context></context-group>
</trans-unit>
- <trans-unit id="_msg1156">
+ <trans-unit id="_msg1161">
<source xml:space="preserve">Specified -walletdir &quot;%s&quot; does not exist</source>
- <context-group purpose="location"><context context-type="linenumber">345</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">349</context></context-group>
</trans-unit>
- <trans-unit id="_msg1157">
+ <trans-unit id="_msg1162">
<source xml:space="preserve">Specified -walletdir &quot;%s&quot; is a relative path</source>
- <context-group purpose="location"><context context-type="linenumber">346</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">350</context></context-group>
</trans-unit>
- <trans-unit id="_msg1158">
+ <trans-unit id="_msg1163">
<source xml:space="preserve">Specified -walletdir &quot;%s&quot; is not a directory</source>
- <context-group purpose="location"><context context-type="linenumber">347</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">351</context></context-group>
</trans-unit>
- <trans-unit id="_msg1159">
+ <trans-unit id="_msg1164">
<source xml:space="preserve">Specified blocks directory &quot;%s&quot; does not exist.</source>
- <context-group purpose="location"><context context-type="linenumber">348</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">352</context></context-group>
</trans-unit>
- <trans-unit id="_msg1160">
+ <trans-unit id="_msg1165">
<source xml:space="preserve">Specified data directory &quot;%s&quot; does not exist.</source>
- <context-group purpose="location"><context context-type="linenumber">349</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">353</context></context-group>
</trans-unit>
- <trans-unit id="_msg1161">
+ <trans-unit id="_msg1166">
<source xml:space="preserve">Starting network threads…</source>
- <context-group purpose="location"><context context-type="linenumber">350</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">354</context></context-group>
</trans-unit>
- <trans-unit id="_msg1162">
+ <trans-unit id="_msg1167">
<source xml:space="preserve">The source code is available from %s.</source>
- <context-group purpose="location"><context context-type="linenumber">351</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">355</context></context-group>
</trans-unit>
- <trans-unit id="_msg1163">
+ <trans-unit id="_msg1168">
<source xml:space="preserve">The specified config file %s does not exist</source>
- <context-group purpose="location"><context context-type="linenumber">352</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">356</context></context-group>
</trans-unit>
- <trans-unit id="_msg1164">
+ <trans-unit id="_msg1169">
<source xml:space="preserve">The transaction amount is too small to pay the fee</source>
- <context-group purpose="location"><context context-type="linenumber">353</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">357</context></context-group>
</trans-unit>
- <trans-unit id="_msg1165">
+ <trans-unit id="_msg1170">
<source xml:space="preserve">The wallet will avoid paying less than the minimum relay fee.</source>
- <context-group purpose="location"><context context-type="linenumber">354</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">358</context></context-group>
</trans-unit>
- <trans-unit id="_msg1166">
+ <trans-unit id="_msg1171">
<source xml:space="preserve">This is experimental software.</source>
- <context-group purpose="location"><context context-type="linenumber">355</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">359</context></context-group>
</trans-unit>
- <trans-unit id="_msg1167">
+ <trans-unit id="_msg1172">
<source xml:space="preserve">This is the minimum transaction fee you pay on every transaction.</source>
- <context-group purpose="location"><context context-type="linenumber">356</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">360</context></context-group>
</trans-unit>
- <trans-unit id="_msg1168">
+ <trans-unit id="_msg1173">
<source xml:space="preserve">This is the transaction fee you will pay if you send a transaction.</source>
- <context-group purpose="location"><context context-type="linenumber">357</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">361</context></context-group>
</trans-unit>
- <trans-unit id="_msg1169">
+ <trans-unit id="_msg1174">
+ <source xml:space="preserve">Transaction %s does not belong to this wallet</source>
+ <context-group purpose="location"><context context-type="linenumber">362</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1175">
<source xml:space="preserve">Transaction amount too small</source>
- <context-group purpose="location"><context context-type="linenumber">358</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">363</context></context-group>
</trans-unit>
- <trans-unit id="_msg1170">
+ <trans-unit id="_msg1176">
<source xml:space="preserve">Transaction amounts must not be negative</source>
- <context-group purpose="location"><context context-type="linenumber">359</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">364</context></context-group>
</trans-unit>
- <trans-unit id="_msg1171">
+ <trans-unit id="_msg1177">
<source xml:space="preserve">Transaction change output index out of range</source>
- <context-group purpose="location"><context context-type="linenumber">360</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">365</context></context-group>
</trans-unit>
- <trans-unit id="_msg1172">
+ <trans-unit id="_msg1178">
<source xml:space="preserve">Transaction must have at least one recipient</source>
- <context-group purpose="location"><context context-type="linenumber">361</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">366</context></context-group>
</trans-unit>
- <trans-unit id="_msg1173">
+ <trans-unit id="_msg1179">
<source xml:space="preserve">Transaction needs a change address, but we can&apos;t generate it.</source>
- <context-group purpose="location"><context context-type="linenumber">362</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">367</context></context-group>
</trans-unit>
- <trans-unit id="_msg1174">
+ <trans-unit id="_msg1180">
<source xml:space="preserve">Transaction too large</source>
- <context-group purpose="location"><context context-type="linenumber">363</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">368</context></context-group>
</trans-unit>
- <trans-unit id="_msg1175">
+ <trans-unit id="_msg1181">
<source xml:space="preserve">Unable to allocate memory for -maxsigcachesize: &apos;%s&apos; MiB</source>
- <context-group purpose="location"><context context-type="linenumber">364</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">369</context></context-group>
</trans-unit>
- <trans-unit id="_msg1176">
+ <trans-unit id="_msg1182">
<source xml:space="preserve">Unable to bind to %s on this computer (bind returned error %s)</source>
- <context-group purpose="location"><context context-type="linenumber">365</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">370</context></context-group>
</trans-unit>
- <trans-unit id="_msg1177">
+ <trans-unit id="_msg1183">
<source xml:space="preserve">Unable to bind to %s on this computer. %s is probably already running.</source>
- <context-group purpose="location"><context context-type="linenumber">366</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">371</context></context-group>
</trans-unit>
- <trans-unit id="_msg1178">
+ <trans-unit id="_msg1184">
<source xml:space="preserve">Unable to create the PID file &apos;%s&apos;: %s</source>
- <context-group purpose="location"><context context-type="linenumber">367</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">372</context></context-group>
</trans-unit>
- <trans-unit id="_msg1179">
+ <trans-unit id="_msg1185">
<source xml:space="preserve">Unable to find UTXO for external input</source>
- <context-group purpose="location"><context context-type="linenumber">368</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">373</context></context-group>
</trans-unit>
- <trans-unit id="_msg1180">
+ <trans-unit id="_msg1186">
<source xml:space="preserve">Unable to generate initial keys</source>
- <context-group purpose="location"><context context-type="linenumber">369</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">374</context></context-group>
</trans-unit>
- <trans-unit id="_msg1181">
+ <trans-unit id="_msg1187">
<source xml:space="preserve">Unable to generate keys</source>
- <context-group purpose="location"><context context-type="linenumber">370</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">375</context></context-group>
</trans-unit>
- <trans-unit id="_msg1182">
+ <trans-unit id="_msg1188">
<source xml:space="preserve">Unable to open %s for writing</source>
- <context-group purpose="location"><context context-type="linenumber">371</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">376</context></context-group>
</trans-unit>
- <trans-unit id="_msg1183">
+ <trans-unit id="_msg1189">
<source xml:space="preserve">Unable to parse -maxuploadtarget: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">372</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">377</context></context-group>
</trans-unit>
- <trans-unit id="_msg1184">
+ <trans-unit id="_msg1190">
<source xml:space="preserve">Unable to start HTTP server. See debug log for details.</source>
- <context-group purpose="location"><context context-type="linenumber">373</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">378</context></context-group>
</trans-unit>
- <trans-unit id="_msg1185">
+ <trans-unit id="_msg1191">
<source xml:space="preserve">Unable to unload the wallet before migrating</source>
- <context-group purpose="location"><context context-type="linenumber">374</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">379</context></context-group>
</trans-unit>
- <trans-unit id="_msg1186">
+ <trans-unit id="_msg1192">
<source xml:space="preserve">Unknown -blockfilterindex value %s.</source>
- <context-group purpose="location"><context context-type="linenumber">375</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">380</context></context-group>
</trans-unit>
- <trans-unit id="_msg1187">
+ <trans-unit id="_msg1193">
<source xml:space="preserve">Unknown address type &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">376</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
- <trans-unit id="_msg1188">
+ <trans-unit id="_msg1194">
<source xml:space="preserve">Unknown change type &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">377</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">382</context></context-group>
</trans-unit>
- <trans-unit id="_msg1189">
+ <trans-unit id="_msg1195">
<source xml:space="preserve">Unknown network specified in -onlynet: &apos;%s&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">378</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">383</context></context-group>
</trans-unit>
- <trans-unit id="_msg1190">
+ <trans-unit id="_msg1196">
<source xml:space="preserve">Unknown new rules activated (versionbit %i)</source>
- <context-group purpose="location"><context context-type="linenumber">379</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">384</context></context-group>
</trans-unit>
- <trans-unit id="_msg1191">
+ <trans-unit id="_msg1197">
<source xml:space="preserve">Unsupported global logging level %s=%s. Valid values: %s.</source>
- <context-group purpose="location"><context context-type="linenumber">380</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">385</context></context-group>
</trans-unit>
- <trans-unit id="_msg1192">
+ <trans-unit id="_msg1198">
<source xml:space="preserve">Wallet file creation failed: %s</source>
- <context-group purpose="location"><context context-type="linenumber">385</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">390</context></context-group>
</trans-unit>
- <trans-unit id="_msg1193">
+ <trans-unit id="_msg1199">
<source xml:space="preserve">acceptstalefeeestimates is not supported on %s chain.</source>
- <context-group purpose="location"><context context-type="linenumber">387</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">392</context></context-group>
</trans-unit>
- <trans-unit id="_msg1194">
+ <trans-unit id="_msg1200">
<source xml:space="preserve">Unsupported logging category %s=%s.</source>
- <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">386</context></context-group>
</trans-unit>
- <trans-unit id="_msg1195">
+ <trans-unit id="_msg1201">
<source xml:space="preserve">Error: Could not add watchonly tx %s to watchonly wallet</source>
- <context-group purpose="location"><context context-type="linenumber">274</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">276</context></context-group>
</trans-unit>
- <trans-unit id="_msg1196">
+ <trans-unit id="_msg1202">
+ <source xml:space="preserve">Error: Could not delete watchonly transactions. </source>
+ <context-group purpose="location"><context context-type="linenumber">277</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1203">
<source xml:space="preserve">User Agent comment (%s) contains unsafe characters.</source>
- <context-group purpose="location"><context context-type="linenumber">382</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">387</context></context-group>
</trans-unit>
- <trans-unit id="_msg1197">
+ <trans-unit id="_msg1204">
<source xml:space="preserve">Verifying blocks…</source>
- <context-group purpose="location"><context context-type="linenumber">383</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">388</context></context-group>
</trans-unit>
- <trans-unit id="_msg1198">
+ <trans-unit id="_msg1205">
<source xml:space="preserve">Verifying wallet(s)…</source>
- <context-group purpose="location"><context context-type="linenumber">384</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">389</context></context-group>
</trans-unit>
- <trans-unit id="_msg1199">
+ <trans-unit id="_msg1206">
<source xml:space="preserve">Wallet needed to be rewritten: restart %s to complete</source>
- <context-group purpose="location"><context context-type="linenumber">386</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">391</context></context-group>
</trans-unit>
- <trans-unit id="_msg1200">
+ <trans-unit id="_msg1207">
<source xml:space="preserve">Settings file could not be read</source>
- <context-group purpose="location"><context context-type="linenumber">342</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">346</context></context-group>
</trans-unit>
- <trans-unit id="_msg1201">
+ <trans-unit id="_msg1208">
<source xml:space="preserve">Settings file could not be written</source>
- <context-group purpose="location"><context context-type="linenumber">343</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">347</context></context-group>
</trans-unit>
</group>
</body></file>
diff --git a/src/qt/locale/bitcoin_es.ts b/src/qt/locale/bitcoin_es.ts
index 001906ba25..585df2e497 100644
--- a/src/qt/locale/bitcoin_es.ts
+++ b/src/qt/locale/bitcoin_es.ts
@@ -3,11 +3,11 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Pulse con el botón secundario para editar la dirección o etiqueta</translation>
+ <translation type="unfinished">Haz clic derecho para editar dirección o etiqueta</translation>
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">Crea una dirección nueva</translation>
+ <translation type="unfinished">Crear una nueva dirección</translation>
</message>
<message>
<source>&amp;New</source>
@@ -23,19 +23,19 @@
</message>
<message>
<source>C&amp;lose</source>
- <translation type="unfinished">C&amp;errar</translation>
+ <translation type="unfinished">&amp;Cerrar</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Eliminar la dirección del listado actualmente seleccionada</translation>
+ <translation type="unfinished">Eliminar la dirección seleccionada actualmente de la lista</translation>
</message>
<message>
<source>Enter address or label to search</source>
- <translation type="unfinished">Introduce una dirección o etiqueta a buscar</translation>
+ <translation type="unfinished">Introduce una dirección o etiqueta que buscar</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exportar a un archivo los datos de esta pestaña</translation>
+ <translation type="unfinished">Exportar los datos de la pestaña actual a un archivo</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -47,11 +47,11 @@
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation type="unfinished">Elija la dirección a la que se enviarán las monedas</translation>
+ <translation type="unfinished">Elige la dirección a la que se enviarán las monedas</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">Elija la dirección a la que se recibirán las monedas</translation>
+ <translation type="unfinished">Elige la dirección con la que se recibirán las monedas</translation>
</message>
<message>
<source>C&amp;hoose</source>
@@ -59,13 +59,13 @@
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">Esta es tus dirección Bitcoin para enviar pagos. Comprueba siempre el importe y la dirección de recepción antes de hacer una transferencia de monedas.</translation>
+ <translation type="unfinished">Estas son tus direcciones de Bitcoin para enviar pagos. Revisa siempre el importe y la dirección de recepción antes de enviar monedas.</translation>
</message>
<message>
<source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
Signing is only possible with addresses of the type 'legacy'.</source>
- <translation type="unfinished">Estas son tus direcciones Bitcoin para recibir pagos. Utilice el botón «Crear una nueva dirección para recepción» en la pestaña «Recibir»
-La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
+ <translation type="unfinished">Estas son tus direcciones de Bitcoin para recibir pagos. Usa el botón "Crear nueva dirección de recepción" en la pestaña "Recibir" para crear nuevas direcciones.
+Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>&amp;Copy Address</source>
@@ -81,7 +81,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">Exportar Lista de Direcciones</translation>
+ <translation type="unfinished">Exportar lista de direcciones</translation>
</message>
<message>
<source>Comma separated file</source>
@@ -91,7 +91,11 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
<message>
<source>There was an error trying to save the address list to %1. Please try again.</source>
<extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
- <translation type="unfinished">Hubo un error al intentar guardar la lista de direcciones %1. Por favor, inténtalo nuevamente.</translation>
+ <translation type="unfinished">Hubo un error al intentar guardar la lista de direcciones %1. Inténtalo nuevamente.</translation>
+ </message>
+ <message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Direcciones de envío - %1</translation>
</message>
<message>
<source>Receiving addresses - %1</source>
@@ -99,7 +103,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Exportación Errónea</translation>
+ <translation type="unfinished">Error al exportar</translation>
</message>
</context>
<context>
@@ -121,23 +125,23 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
<name>AskPassphraseDialog</name>
<message>
<source>Passphrase Dialog</source>
- <translation type="unfinished">Diálogo de contraseña</translation>
+ <translation type="unfinished">Diálogo de frase de contraseña</translation>
</message>
<message>
<source>Enter passphrase</source>
- <translation type="unfinished">Introduce la frase-contraseña</translation>
+ <translation type="unfinished">Ingresa la frase de contraseña</translation>
</message>
<message>
<source>New passphrase</source>
- <translation type="unfinished">Nueva frase-contraseña</translation>
+ <translation type="unfinished">Nueva frase de contraseña</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation type="unfinished">Repite la frase-contraseña nueva</translation>
+ <translation type="unfinished">Repite la nueva frase de contraseña</translation>
</message>
<message>
<source>Show passphrase</source>
- <translation type="unfinished">Mostrar frase-contraseña</translation>
+ <translation type="unfinished">Mostrar la frase de contraseña</translation>
</message>
<message>
<source>Encrypt wallet</source>
@@ -145,7 +149,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">Esta operación necesita la contraseña para desbloquear el monedero.</translation>
+ <translation type="unfinished">Esta operación requiere la frase de contraseña del monedero para desbloquearlo.</translation>
</message>
<message>
<source>Unlock wallet</source>
@@ -153,19 +157,19 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Change passphrase</source>
- <translation type="unfinished">Cambiar contraseña</translation>
+ <translation type="unfinished">Cambiar frase de contraseña</translation>
</message>
<message>
<source>Confirm wallet encryption</source>
- <translation type="unfinished">Confirma el cifrado de este monedero</translation>
+ <translation type="unfinished">Confirmar cifrado del monedero</translation>
</message>
<message>
<source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">Atención: Si cifras tu monedero y pierdes la contraseña, &lt;b&gt;¡PERDERÁS TODOS TUS BITCOINS!&lt;/b&gt;</translation>
+ <translation type="unfinished">Atención: Si cifras el monedero y pierdes la frase de contraseña, &lt;b&gt;¡PERDERÁS TODOS TUS BITCOINS&lt;/b&gt;!</translation>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
- <translation type="unfinished">¿Esta seguro que quieres cifrar tu monedero?</translation>
+ <translation type="unfinished">¿Seguro deseas cifrar el monedero?</translation>
</message>
<message>
<source>Wallet encrypted</source>
@@ -173,31 +177,31 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
- <translation type="unfinished">Introduce la contraseña nueva para el monedero. &lt;br/&gt;Por favor utilice una contraseña de &lt;b&gt;diez o más caracteres aleatorios&lt;/b&gt;, u &lt;b&gt;ocho o más palabras&lt;/b&gt;.</translation>
+ <translation type="unfinished">Introduce la nueva frase de contraseña para el monedero. &lt;br/&gt;Usa una frase de contraseña de &lt;b&gt;diez o más caracteres aleatorios&lt;/b&gt;, u &lt;b&gt;ocho o más palabras&lt;/b&gt;.</translation>
</message>
<message>
<source>Enter the old passphrase and new passphrase for the wallet.</source>
- <translation type="unfinished">Introduce la contraseña antigua y la nueva para el monedero.</translation>
+ <translation type="unfinished">Introduce la frase de contraseña antigua y la nueva para el monedero.</translation>
</message>
<message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation type="unfinished">Recuerda que cifrar tu monedero no garantiza la protección de tus bitcoin si tu equipo está infectado con malware.</translation>
+ <translation type="unfinished">Recuerda que cifrar tu monedero no garantiza la protección total de tus bitcoins contra robos si el equipo está infectado con malware.</translation>
</message>
<message>
<source>Wallet to be encrypted</source>
- <translation type="unfinished">Monedero a ser cifrado</translation>
+ <translation type="unfinished">Monedero para cifrar</translation>
</message>
<message>
<source>Your wallet is about to be encrypted. </source>
- <translation type="unfinished">Tu monedero va a ser cifrado</translation>
+ <translation type="unfinished">Tu monedero va a ser cifrado.</translation>
</message>
<message>
<source>Your wallet is now encrypted. </source>
- <translation type="unfinished">Tu monedero está ahora cifrado</translation>
+ <translation type="unfinished">Tu monedero está ahora cifrado.</translation>
</message>
<message>
<source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
- <translation type="unfinished">IMPORTANTE: Cualquier respaldo que hayas hecho del archivo de tu monedero debe ser reemplazada por el archivo cifrado del monedero recién generado. Por razones de seguridad, los respaldos anteriores del archivo monedero sin cifrar serán inútiles cuando empieces a usar el monedero cifrado nuevo.</translation>
+ <translation type="unfinished">IMPORTANTE: Cualquier respaldo que hayas hecho del archivo de tu monedero debe ser reemplazado por el archivo cifrado del monedero recién generado. Por razones de seguridad, los respaldos anteriores del archivo del monedero sin cifrar serán inútiles cuando empieces a usar el monedero cifrado nuevo.</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -209,7 +213,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>The supplied passphrases do not match.</source>
- <translation type="unfinished">Las contraseñas proporcionadas no coinciden.</translation>
+ <translation type="unfinished">Las frases de contraseña proporcionadas no coinciden.</translation>
</message>
<message>
<source>Wallet unlock failed</source>
@@ -217,23 +221,23 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">La contraseña introducida para descifrar el monedero es incorrecta.</translation>
+ <translation type="unfinished">La frase de contraseña introducida para descifrar el monedero es incorrecta.</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">La contraseña ingresada para el descifrado del monedero es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelva a intentarlo solo con los caracteres hasta el primer carácter nulo, --pero sin incluirlo--. Si esto es correcto, establezca una contraseña nueva para evitar este problema en el futuro.</translation>
+ <translation type="unfinished">La frase de contraseña ingresada para el descifrado del monedero es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelve a intentarlo solo con los caracteres hasta el primer carácter nulo, pero sin incluirlo. Si esto es correcto, establece una frase de contraseña nueva para evitar este problema en el futuro.</translation>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">La frase-contraseña del monedero ha sido cambiada.</translation>
+ <translation type="unfinished">La frase de contraseña del monedero ha sido cambiada correctamente.</translation>
</message>
<message>
<source>Passphrase change failed</source>
- <translation type="unfinished">Cambio de frase-contraseña erróneo</translation>
+ <translation type="unfinished">Error al cambiar la frase de contraseña</translation>
</message>
<message>
<source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
- <translation type="unfinished">La contraseña antigua ingresada para el descifrado del monedero es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelva a intentarlo solo con los caracteres hasta el primer carácter nulo, --pero sin incluirlo--.</translation>
+ <translation type="unfinished">La frase de contraseña antigua que se ingresó para el descifrado del monedero es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelve a intentarlo solo con los caracteres hasta el primer carácter nulo, pero sin incluirlo.</translation>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
@@ -263,7 +267,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
- <translation type="unfinished">Ha ocurrido un error fatal. %1 no puede seguir seguro y se cerrará.</translation>
+ <translation type="unfinished">Ha ocurrido un error fatal. %1 no puede seguir ejecutándose de manera segura y se cerrará.</translation>
</message>
<message>
<source>Internal error</source>
@@ -271,7 +275,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
- <translation type="unfinished">Ha ocurrido un error interno. %1 intentará continuar. Este es un error inesperado que puede ser comunicado de las formas que se muestran debajo.</translation>
+ <translation type="unfinished">Ha ocurrido un error interno. %1 intentará continuar de manera segura. Este es un error inesperado que puede ser comunicado de las formas que se muestran debajo.</translation>
</message>
</context>
<context>
@@ -279,7 +283,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
<message>
<source>Do you want to reset settings to default values, or to abort without making changes?</source>
<extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
- <translation type="unfinished">¿Deseas restablecer los valores a la configuración predeterminada, o interrumpir sin realizar los cambios?</translation>
+ <translation type="unfinished">¿Deseas restablecer la configuración a los valores predeterminados o interrumpir sin realizar cambios?</translation>
</message>
<message>
<source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
@@ -295,12 +299,24 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
<translation type="unfinished">desconocido</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">"%1" insertado</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizada...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Importe</translation>
</message>
<message>
<source>Enter a Bitcoin address (e.g. %1)</source>
- <translation type="unfinished">Ingresa una dirección de Bitcoin (Ejemplo: %1)</translation>
+ <translation type="unfinished">Ingresa una dirección de Bitcoin (p. ej., %1)</translation>
</message>
<message>
<source>Unroutable</source>
@@ -319,12 +335,12 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
<message>
<source>Full Relay</source>
<extracomment>Peer connection type that relays all network information.</extracomment>
- <translation type="unfinished">Transmisión completa</translation>
+ <translation type="unfinished">Retransmisión completa</translation>
</message>
<message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">Transmisión de Bloque</translation>
+ <translation type="unfinished">Retransmisión de bloques</translation>
</message>
<message>
<source>Feeler</source>
@@ -334,12 +350,16 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
<message>
<source>Address Fetch</source>
<extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
- <translation type="unfinished">Búsqueda de dirección</translation>
+ <translation type="unfinished">Recuperación de direcciones</translation>
</message>
<message>
<source>None</source>
<translation type="unfinished">Ninguno</translation>
</message>
+ <message>
+ <source>N/A</source>
+ <translation type="unfinished">N/D</translation>
+ </message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
@@ -415,7 +435,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>&amp;About %1</source>
- <translation type="unfinished">Acerca &amp;de %1</translation>
+ <translation type="unfinished">&amp;Acerca de %1</translation>
</message>
<message>
<source>Show information about %1</source>
@@ -452,7 +472,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
- <translation type="unfinished">Proxy está &lt;b&gt;habilitado&lt;/b&gt;: %1</translation>
+ <translation type="unfinished">El proxy está &lt;b&gt;habilitado&lt;/b&gt;: %1</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
@@ -464,7 +484,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Cambiar la contraseña utilizada para el cifrado del monedero</translation>
+ <translation type="unfinished">Cambiar la frase de contraseña utilizada para el cifrado del monedero</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -480,7 +500,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;Cifrar monedero</translation>
+ <translation type="unfinished">&amp;Cifrar monedero…</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
@@ -492,7 +512,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Cambiar frase-contraseña…</translation>
+ <translation type="unfinished">&amp;Cambiar frase de contraseña…</translation>
</message>
<message>
<source>Sign &amp;message…</source>
@@ -500,7 +520,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Firmar mensajes con sus direcciones Bitcoin para probar la propiedad</translation>
+ <translation type="unfinished">Firmar mensajes con tus direcciones Bitcoin para probar la propiedad</translation>
</message>
<message>
<source>&amp;Verify message…</source>
@@ -508,7 +528,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Verificar un mensaje para comprobar que fue firmado con la dirección Bitcoin indicada</translation>
+ <translation type="unfinished">Verificar mensajes para comprobar que fueron firmados con la dirección Bitcoin indicada</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
@@ -536,11 +556,11 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">Parámetro&amp;s</translation>
+ <translation type="unfinished">&amp;Parámetros</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">Ay&amp;uda</translation>
+ <translation type="unfinished">&amp;Ayuda</translation>
</message>
<message>
<source>Tabs toolbar</source>
@@ -548,7 +568,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizando cabeceras (%1%)...</translation>
+ <translation type="unfinished">Sincronizando encabezados (%1%)...</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -564,34 +584,34 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Conectando con parejas…</translation>
+ <translation type="unfinished">Conectando con pares…</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Solicitar abonaciones (generadas por código QR y bitcoin: URI)</translation>
+ <translation type="unfinished">Solicitar pagos (genera códigos QR y URI de tipo "bitcoin:")</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Muestra el listado de direcciones de envío utilizadas</translation>
+ <translation type="unfinished">Muestra el listado de direcciones de envío y etiquetas utilizadas</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Muestra el listado de direcciones de remitentes utilizadas y las etiquetas</translation>
+ <translation type="unfinished">Muestra el listado de direcciones de recepción y etiquetas utilizadas</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">Opciones por línea de &amp;instrucciones</translation>
+ <translation type="unfinished">&amp;Opciones de línea de comandos</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>Procesado %n bloque del historial de transacciones.</numerusform>
- <numerusform>Procesados %n bloques del historial de transacciones.</numerusform>
+ <numerusform>Se ha procesado %n bloque del historial de transacciones.</numerusform>
+ <numerusform>Se han procesado %n bloques del historial de transacciones.</numerusform>
</translation>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 se comporta</translation>
+ <translation type="unfinished">%1 detrás</translation>
</message>
<message>
<source>Catching up…</source>
@@ -599,11 +619,11 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">Último bloque recibido fue generado hace %1.</translation>
+ <translation type="unfinished">El último bloque recibido fue generado hace %1.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Transacciones tras esta no aún será visible.</translation>
+ <translation type="unfinished">Las transacciones posteriores aún no estarán visibles.</translation>
</message>
<message>
<source>Warning</source>
@@ -623,7 +643,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">Cargar PSBT desde &amp;portapapeles...</translation>
+ <translation type="unfinished">Cargar TBPF desde &amp;portapapeles...</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
@@ -635,19 +655,19 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">Abrir consola de depuración y diagnóstico de nodo</translation>
+ <translation type="unfinished">Abrir la consola de depuración y diagnóstico de nodos</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">Direcciones de &amp;envío</translation>
+ <translation type="unfinished">&amp;Direcciones de envío</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">Direcciones de &amp;recepción</translation>
+ <translation type="unfinished">&amp;Direcciones de recepción</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Bitcoin: abrir URI</translation>
+ <translation type="unfinished">Abrir un URI de tipo "bitcoin:"</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -677,11 +697,11 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Migrate Wallet</source>
- <translation type="unfinished">Migrar billetera</translation>
+ <translation type="unfinished">Migrar monedero</translation>
</message>
<message>
<source>Migrate a wallet</source>
- <translation type="unfinished">Migrar una billetera</translation>
+ <translation type="unfinished">Migrar un monedero</translation>
</message>
<message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
@@ -751,8 +771,8 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
- <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n conexión activa con la red Bitcoin.</numerusform>
+ <numerusform>%n conexiones activas con la red Bitcoin.</numerusform>
</translation>
</message>
<message>
@@ -777,15 +797,15 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
+ <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
</message>
<message>
<source>Error creating wallet</source>
- <translation type="unfinished">Error al crear billetera</translation>
+ <translation type="unfinished">Error al crear monedero</translation>
</message>
<message>
<source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">No se puede crear una nueva billetera, el software se compiló sin soporte sqlite (requerido para billeteras descriptivas)</translation>
+ <translation type="unfinished">No se puede crear un nuevo monedero, ya que el software se compiló sin compatibilidad con sqlite (requerido para monederos basados en descriptores)</translation>
</message>
<message>
<source>Warning: %1</source>
@@ -833,7 +853,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Incoming transaction</source>
- <translation type="unfinished">Transacción recibida</translation>
+ <translation type="unfinished">Transacción entrante</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
@@ -864,14 +884,14 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
- <translation type="unfinished">Unidad en la que se muestran los importes. Haga clic para seleccionar otra unidad.</translation>
+ <translation type="unfinished">Unidad en la que se muestran los importes. Haz clic para seleccionar otra unidad.</translation>
</message>
</context>
<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
- <translation type="unfinished">Selección de moneda</translation>
+ <translation type="unfinished">Selección de monedas</translation>
</message>
<message>
<source>Quantity:</source>
@@ -895,7 +915,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>(un)select all</source>
- <translation type="unfinished">(des)selecionar todo</translation>
+ <translation type="unfinished">(de)seleccionar todo</translation>
</message>
<message>
<source>Tree mode</source>
@@ -911,11 +931,11 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>Received with label</source>
- <translation type="unfinished">Recibido con dirección</translation>
+ <translation type="unfinished">Recibido con etiqueta</translation>
</message>
<message>
<source>Received with address</source>
- <translation type="unfinished">Recibido con etiqueta</translation>
+ <translation type="unfinished">Recibido con dirección</translation>
</message>
<message>
<source>Date</source>
@@ -951,11 +971,11 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">Bl&amp;oquear lo no gastado</translation>
+ <translation type="unfinished">&amp;Bloquear importe no gastado</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
- <translation type="unfinished">&amp;Desbloquear lo no gastado</translation>
+ <translation type="unfinished">&amp;Desbloquear importe no gastado</translation>
</message>
<message>
<source>Copy quantity</source>
@@ -991,7 +1011,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
</message>
<message>
<source>change from %1 (%2)</source>
- <translation type="unfinished">cambia desde %1 (%2)</translation>
+ <translation type="unfinished">cambio de %1 (%2)</translation>
</message>
<message>
<source>(change)</source>
@@ -1003,7 +1023,7 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
<message>
<source>Create Wallet</source>
<extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
- <translation type="unfinished">Crear Monedero</translation>
+ <translation type="unfinished">Crear monedero</translation>
</message>
<message>
<source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1044,11 +1064,11 @@ La firma sólo es posible con direcciones del tipo 'legacy'.</translation>
<name>MigrateWalletActivity</name>
<message>
<source>Migrate wallet</source>
- <translation type="unfinished">Migrar billetera</translation>
+ <translation type="unfinished">Migrar monedero</translation>
</message>
<message>
<source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">¿Estás seguro de que deseas migrar el monedero &lt;i&gt;%1&lt;/i&gt; ?</translation>
+ <translation type="unfinished">¿Seguro deseas migrar el monedero &lt;i&gt;%1&lt;/i&gt;?</translation>
</message>
<message>
<source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
@@ -1056,31 +1076,31 @@ If this wallet contains any watchonly scripts, a new wallet will be created whic
If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
- <translation type="unfinished">La migración de la billetera la convertirá en una o más billeteras basadas en descriptores. Será necesario realizar una nueva copia de seguridad de la billetera.
-Si esta billetera contiene scripts solo de lectura, se creará una nueva billetera que los contenga.
-Si esta billetera contiene scripts solucionables pero no de lectura, se creará una nueva billetera diferente que los contenga.
+ <translation type="unfinished">La migración del monedero lo convertirá en uno o más monederos basados en descriptores. Será necesario realizar una nueva copia de seguridad del monedero.
+Si este monedero contiene scripts solo de observación, se creará un nuevo monedero que los contenga.
+Si este monedero contiene scripts solucionables pero no de observación, se creará un nuevo monedero diferente que los contenga.
-El proceso de migración creará una copia de seguridad de la billetera antes de migrar. Este archivo de copia de seguridad se llamará &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak y se encontrará en el directorio de esta billetera. En el caso de una migración incorrecta, la copia de seguridad puede restaurarse con la funcionalidad "Restore Wallet" (Restaurar billetera).</translation>
+El proceso de migración creará una copia de seguridad del monedero antes de migrar. Este archivo de copia de seguridad se llamará &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak y se encontrará en el directorio de este monedero. En el caso de una migración incorrecta, la copia de seguridad puede restaurarse con la funcionalidad "Restaurar monedero".</translation>
</message>
<message>
<source>Migrate Wallet</source>
- <translation type="unfinished">Migrar billetera</translation>
+ <translation type="unfinished">Migrar monedero</translation>
</message>
<message>
<source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <translation type="unfinished">Migrando billetera &lt;b&gt;%1&lt;/b&gt;…</translation>
+ <translation type="unfinished">Migrando monedero &lt;b&gt;%1&lt;/b&gt;…</translation>
</message>
<message>
<source>The wallet '%1' was migrated successfully.</source>
- <translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
+ <translation type="unfinished">La migración del monedero "%1" se realizó correctamente.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Los scripts solo de lectura se migraron a una nueva billetera llamada "%1".</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Los scripts solo de observación se han migrado a un nuevo monedero llamado "%1".</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Los scripts solucionables pero no de lectura se migraron a una nueva billetera llamada "%1".</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Los scripts solucionables pero no de observación se han migrado a un nuevo monedero llamado "%1".</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1095,11 +1115,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
- <translation type="unfinished">Abrir monedero ha fallado</translation>
+ <translation type="unfinished">Error al abrir monedero</translation>
</message>
<message>
<source>Open wallet warning</source>
- <translation type="unfinished">Advertencia sobre crear monedero</translation>
+ <translation type="unfinished">Advertencia al abrir monedero</translation>
</message>
<message>
<source>default wallet</source>
@@ -1152,7 +1172,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">¿Estás seguro de que deseas cerrar el monedero &lt;i&gt;%1&lt;/i&gt;?</translation>
+ <translation type="unfinished">¿Seguro deseas cerrar el monedero &lt;i&gt;%1&lt;/i&gt;?</translation>
</message>
<message>
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
@@ -1164,18 +1184,18 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">¿Estás seguro de que deseas cerrar todos los monederos?</translation>
+ <translation type="unfinished">¿Seguro deseas cerrar todos los monederos?</translation>
</message>
</context>
<context>
<name>CreateWalletDialog</name>
<message>
<source>Create Wallet</source>
- <translation type="unfinished">Crear Monedero</translation>
+ <translation type="unfinished">Crear monedero</translation>
</message>
<message>
<source>You are one step away from creating your new wallet!</source>
- <translation type="unfinished">Estás a un paso de crear tu nueva billetera.</translation>
+ <translation type="unfinished">Estás a un paso de crear tu nuevo monedero.</translation>
</message>
<message>
<source>Please provide a name and, if desired, enable any advanced options</source>
@@ -1191,27 +1211,27 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
- <translation type="unfinished">Cifrar monedero. El monedero será cifrado con la contraseña que elija.</translation>
+ <translation type="unfinished">Cifrar el monedero. El monedero será cifrado con la frase de contraseña que elijas.</translation>
</message>
<message>
<source>Encrypt Wallet</source>
- <translation type="unfinished">Cifrar Monedero</translation>
+ <translation type="unfinished">Cifrar monedero</translation>
</message>
<message>
<source>Advanced Options</source>
- <translation type="unfinished">Opciones Avanzadas</translation>
+ <translation type="unfinished">Opciones avanzadas</translation>
</message>
<message>
<source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">Deshabilita las claves privadas para este monedero. Los monederos con claves privadas deshabilitadas no tendrán claves privadas y no podrán tener ni una semilla HD ni claves privadas importadas. Esto es ideal para monederos de solo lectura.</translation>
+ <translation type="unfinished">Deshabilita las claves privadas para este monedero. Los monederos con claves privadas deshabilitadas no tendrán claves privadas y no podrán tener ni una semilla HD ni claves privadas importadas. Esto es ideal para monederos solo de observación.</translation>
</message>
<message>
<source>Disable Private Keys</source>
- <translation type="unfinished">Deshabilita las Claves Privadas</translation>
+ <translation type="unfinished">Deshabilitar claves privadas</translation>
</message>
<message>
<source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
- <translation type="unfinished">Crear un monedero vacío. Los monederos vacíos no tienen claves privadas ni scripts. Las claves privadas y direcciones pueden importarse después o también establecer una semilla HD.</translation>
+ <translation type="unfinished">Crear un monedero vacío. Los monederos vacíos inicialmente no tienen claves privadas ni scripts. Las claves privadas y direcciones pueden importarse, o puede establecerse una semilla HD, posteriormente.</translation>
</message>
<message>
<source>Make Blank Wallet</source>
@@ -1239,7 +1259,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<name>EditAddressDialog</name>
<message>
<source>Edit Address</source>
- <translation type="unfinished">Editar Dirección</translation>
+ <translation type="unfinished">Editar dirección</translation>
</message>
<message>
<source>&amp;Label</source>
@@ -1247,11 +1267,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>The label associated with this address list entry</source>
- <translation type="unfinished">La etiqueta asociada con este apunte en la libreta</translation>
+ <translation type="unfinished">La etiqueta asociada con esta entrada en la lista de direcciones</translation>
</message>
<message>
<source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation type="unfinished">La dirección asociada con este apunte en la guía. Solo puede ser modificada para direcciones de envío.</translation>
+ <translation type="unfinished">La dirección asociada con esta entrada en la lista de direcciones. Solo se puede modificar para las direcciones de envío.</translation>
</message>
<message>
<source>&amp;Address</source>
@@ -1263,7 +1283,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Edit receiving address</source>
- <translation type="unfinished">Editar dirección de recibimiento</translation>
+ <translation type="unfinished">Editar dirección de recepción</translation>
</message>
<message>
<source>Edit sending address</source>
@@ -1271,15 +1291,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation type="unfinished">La dirección introducida «%1» no es una dirección Bitcoin válida.</translation>
+ <translation type="unfinished">La dirección introducida "%1" no es una dirección Bitcoin válida.</translation>
</message>
<message>
<source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
- <translation type="unfinished">La dirección «%1» ya existe como dirección de recepción con la etiqueta «%2» y, por lo tanto, no se puede agregar como dirección de envío.</translation>
+ <translation type="unfinished">La dirección "%1" ya existe como dirección de recepción con la etiqueta "%2" y, por lo tanto, no se puede agregar como dirección de envío.</translation>
</message>
<message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
- <translation type="unfinished">La dirección ingresada «%1» ya está en la libreta de direcciones con la etiqueta «%2».</translation>
+ <translation type="unfinished">La dirección ingresada "%1" ya está en la libreta de direcciones con la etiqueta "%2".</translation>
</message>
<message>
<source>Could not unlock wallet.</source>
@@ -1287,7 +1307,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>New key generation failed.</source>
- <translation type="unfinished">La generación de la nueva clave fallo</translation>
+ <translation type="unfinished">Error al generar clave nueva.</translation>
</message>
</context>
<context>
@@ -1302,15 +1322,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
- <translation type="unfinished">El directorio ya existe. Agrega %1 si tiene la intención de crear un nuevo directorio aquí.</translation>
+ <translation type="unfinished">El directorio ya existe. Agrega %1 si tienes la intención de crear un nuevo directorio aquí.</translation>
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">La ruta ya existe, y no es un directorio.</translation>
+ <translation type="unfinished">La ruta ya existe y no es un directorio.</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
- <translation type="unfinished">No puede crear directorio de datos aquí.</translation>
+ <translation type="unfinished">No se puede crear un directorio de datos aquí.</translation>
</message>
</context>
<context>
@@ -1318,8 +1338,8 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform>%n GB of space available</numerusform>
- <numerusform>%n GB of space available</numerusform>
+ <numerusform>%n GB de espacio disponible</numerusform>
+ <numerusform>%n GB de espacio disponible</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -1342,18 +1362,18 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <translation type="unfinished">Al menos %1 GB de información será almacenada en este directorio, y seguirá creciendo a través del tiempo.</translation>
+ <translation type="unfinished">Se almacenará al menos %1 GB de datos en este directorio, que aumentará con el tiempo.</translation>
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">Aproximadamente %1 GB de información será almacenada en este directorio.</translation>
+ <translation type="unfinished">Se almacenará aproximadamente %1 GB de datos en este directorio.</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
<translation type="unfinished">
<numerusform>(suficiente para restaurar copias de seguridad de %n día de antigüedad)</numerusform>
- <numerusform>(suficiente para restaurar copias de seguridad de %n días de antigüedad)</numerusform>
+ <numerusform>(suficiente para restaurar copias de seguridad de %n días de antigüedad)|</numerusform>
</translation>
</message>
<message>
@@ -1366,39 +1386,39 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Error: Specified data directory "%1" cannot be created.</source>
- <translation type="unfinished">Error: El directorio de datos especificado «%1» no pudo ser creado.</translation>
+ <translation type="unfinished">Error: El directorio de datos especificado "%1" no pudo ser creado.</translation>
</message>
<message>
<source>Welcome</source>
- <translation type="unfinished">Bienvenido</translation>
+ <translation type="unfinished">Te damos la bienvenida</translation>
</message>
<message>
<source>Welcome to %1.</source>
- <translation type="unfinished">Bienvenido a %1.</translation>
+ <translation type="unfinished">Te damos la bienvenida a %1.</translation>
</message>
<message>
<source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
- <translation type="unfinished">Al ser ésta la primera vez que se ejecuta el programa, puedes escoger donde %1 almacenará los datos.</translation>
+ <translation type="unfinished">Al ser esta la primera vez que se ejecuta el programa, puedes escoger dónde %1 almacenará los datos.</translation>
</message>
<message>
<source>Limit block chain storage to</source>
- <translation type="unfinished">Limitar el almacenamiento de cadena de bloques a</translation>
+ <translation type="unfinished">Limitar el almacenamiento de la cadena de bloques a</translation>
</message>
<message>
<source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
- <translation type="unfinished">Revertir este parámetro requiere re-descargar la cadena de bloque completa. Es más rápido descargar primero la cadena completa y podarla después. Desactiva algunas características avanzadas.</translation>
+ <translation type="unfinished">Revertir este parámetro requiere volver a descargar la cadena de bloques completa. Es más rápido descargar primero la cadena completa y podarla después. Se desactivan algunas funciones avanzadas.</translation>
</message>
<message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
- <translation type="unfinished">La sincronización inicial está muy demandada, y puede exponer problemas del hardware con su equipo que tuvo anteriormente se colgó de forma inadvertida. Cada vez que ejecuta %1, continuará descargándose donde éste se detuvo.</translation>
+ <translation type="unfinished">La sincronización inicial consume muchos recursos y es posible que exponga problemas de hardware en el equipo que anteriormente habían pasado desapercibidos. Cada vez que ejecutes %1, seguirá descargando desde el punto en el que quedó.</translation>
</message>
<message>
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
- <translation type="unfinished">Cuando pulse en Aceptar, %1 se iniciará la descarga y procesamiento de toda la cadena %4 de bloques (%2 GB) empezando con las primeras transacciones en %3 cuando %4 fue inicialmente lanzado.</translation>
+ <translation type="unfinished">Al hacer clic en "Aceptar", %1 iniciará el proceso de descarga y procesará la cadena de bloques %4 completa (%2 GB), empezando con la transacción más antigua en %3 cuando %4 se ejecutó inicialmente.</translation>
</message>
<message>
<source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
- <translation type="unfinished">Si ha elegido limitar el almacenamiento de la cadena de bloques (pruning o poda), los datos históricos todavía se deben descargar y procesar, pero se eliminarán posteriormente para mantener el uso del disco bajo.</translation>
+ <translation type="unfinished">Si has elegido limitar el almacenamiento de la cadena de bloques (pruning o poda), los datos históricos todavía se deben descargar y procesar, pero se eliminarán posteriormente para mantener el uso del disco bajo.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -1432,7 +1452,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">No apague el equipo hasta que desaparezca esta ventana.</translation>
+ <translation type="unfinished">No apagues el equipo hasta que desaparezca esta ventana.</translation>
</message>
</context>
<context>
@@ -1443,7 +1463,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
- <translation type="unfinished">Es posible que las transacciones recientes aún no estén visibles y por lo tanto, el saldo de su monedero podría ser incorrecto. Esta información será correcta una vez que su monedero haya terminado de sincronizarse con la red bitcoin, como se detalla a continuación.</translation>
+ <translation type="unfinished">Es posible que las transacciones recientes aún no estén visibles y, por lo tanto, el saldo del monedero podría ser incorrecto. Esta información será correcta una vez que el monedero haya terminado de sincronizarse con la red Bitcoin, como se detalla a continuación.</translation>
</message>
<message>
<source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
@@ -1451,7 +1471,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">Numero de bloques pendientes</translation>
+ <translation type="unfinished">Número de bloques pendientes</translation>
</message>
<message>
<source>Unknown…</source>
@@ -1479,26 +1499,26 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Hide</source>
- <translation type="unfinished">Ocultar </translation>
+ <translation type="unfinished">Ocultar</translation>
</message>
<message>
<source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
- <translation type="unfinished">%1 está actualmente sincronizándose. Descargará cabeceras y bloques de nodos semejantes y los validará hasta alcanzar la cabeza de la cadena de bloques.</translation>
+ <translation type="unfinished">%1 está actualmente sincronizándose. Descargará encabezados y bloques de nodos semejantes y los validará hasta alcanzar la cabeza de la cadena de bloques.</translation>
</message>
<message>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Desconocido. Sincronizando cabeceras (%1, %2%)…</translation>
+ <translation type="unfinished">Desconocido. Sincronizando encabezados (%1, %2%)…</translation>
</message>
<message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Desconocido. Presincronizando cabeceras (%1, %2%)…</translation>
+ <translation type="unfinished">Desconocido. Presincronizando encabezados (%1, %2%)…</translation>
</message>
</context>
<context>
<name>OpenURIDialog</name>
<message>
<source>Open bitcoin URI</source>
- <translation type="unfinished">Abrir URI de bitcoin</translation>
+ <translation type="unfinished">Abrir URI de tipo "bitcoin:"</translation>
</message>
<message>
<source>Paste address from clipboard</source>
@@ -1530,27 +1550,31 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">Tamaño de la caché de la base de &amp;datos</translation>
+ <translation type="unfinished">Tamaño de la caché de la &amp;base de datos</translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">Número de hilos de &amp;verificación de scripts</translation>
+ <translation type="unfinished">Número de subprocesos de &amp;verificación de scripts</translation>
</message>
<message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
- <translation type="unfinished">Ruta completa a un %1 script compatible (por ejemplo, C:\Downloads\hwi.exe o /Users/you/Downloads/hwi.py). ¡Cuidado: un malware puede robar tus monedas!</translation>
+ <translation type="unfinished">Ruta completa a un script compatible con %1 (p. ej., C:\Descargas\hwi.exe o /Usuarios/Tú/Descargas/hwi.py). Advertencia: ¡El malware podría robarte tus monedas!</translation>
</message>
<message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
- <translation type="unfinished">Dirección IP del proxy (Ejemplo. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
+ <translation type="unfinished">Dirección IP del proxy (por ejemplo, IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
<message>
<source>Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
- <translation type="unfinished">Muestra si el proxy SOCKS5 por defecto se utiliza para conectarse a pares a través de este tipo de red.</translation>
+ <translation type="unfinished">Muestra si el proxy SOCKS5 por defecto que se ha suministrado se utiliza para conectarse a pares a través de este tipo de red.</translation>
</message>
<message>
<source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</source>
- <translation type="unfinished">Minimizar en vez de salir de la aplicación cuando la ventana está cerrada. Cuando se activa esta opción, la aplicación sólo se cerrará después de seleccionar Salir en el menú.</translation>
+ <translation type="unfinished">Minimizar en vez de salir de la aplicación cuando la ventana está cerrada. Cuando se activa esta opción, la aplicación sólo se cerrará después de seleccionar "Salir" en el menú.</translation>
+ </message>
+ <message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fuente en la pestaña de vista general:</translation>
</message>
<message>
<source>Options set in this dialog are overridden by the command line:</source>
@@ -1558,7 +1582,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Open the %1 configuration file from the working directory.</source>
- <translation type="unfinished">Abrir el %1archivo de configuración en el directorio de trabajo.</translation>
+ <translation type="unfinished">Abrir el archivo de configuración %1 en el directorio de trabajo.</translation>
</message>
<message>
<source>Open Configuration File</source>
@@ -1582,17 +1606,17 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
- <translation type="unfinished">Revertir estas configuraciones requiere descargar de nuevo la cadena de bloques completa.</translation>
+ <translation type="unfinished">Para revertir esta configuración, se debe descargar de nuevo la cadena de bloques completa.</translation>
</message>
<message>
<source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
<extracomment>Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</extracomment>
- <translation type="unfinished">Tamaño máximo de la caché de la base de datos. Una caché más grande puede contribuir a una sincronización más rápida, después de lo cual el beneficio es menos pronunciado para la mayoría de los casos de uso. Disminuir el tamaño de la caché reducirá el uso de la memoria. La compartición de memoria no utilizada se comparte para esta caché.</translation>
+ <translation type="unfinished">Tamaño máximo de la caché de la base de datos. Una caché más grande puede contribuir a una sincronización más rápida, después de lo cual el beneficio es menos pronunciado para la mayoría de los casos de uso. Disminuir el tamaño de la caché reducirá el uso de la memoria. La memoria mempool no utilizada se comparte para esta caché.</translation>
</message>
<message>
<source>Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
<extracomment>Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</extracomment>
- <translation type="unfinished">Establezca el número de hilos de verificación de scripts. Los valores negativos corresponden al número de núcleos que se desea dejar libres al sistema.</translation>
+ <translation type="unfinished">Establece el número de subprocesos de verificación de scripts. Los valores negativos corresponden al número de núcleos que se desea dejar libres al sistema.</translation>
</message>
<message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
@@ -1601,7 +1625,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<message>
<source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
<extracomment>Tooltip text for Options window setting that enables the RPC server.</extracomment>
- <translation type="unfinished">Esto te permite a ti o a una herramienta de terceros comunicarse con el nodo a través de la línea de órdenes e instrucciones JSON-RPC.</translation>
+ <translation type="unfinished">Esto te permite a ti o a una herramienta de terceros comunicarse con el nodo a través de la línea de comandos y los comandos JSON-RPC.</translation>
</message>
<message>
<source>Enable R&amp;PC server</source>
@@ -1628,11 +1652,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Enable coin &amp;control features</source>
- <translation type="unfinished">Habilitar características de &amp;control de moneda.</translation>
+ <translation type="unfinished">Habilitar funciones de &amp;control de monedas</translation>
</message>
<message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
- <translation type="unfinished">Si deshabilitas el gasto de un cambio no confirmado, el cambio de una transacción no se puede usar hasta que esa transacción tenga al menos una confirmación. Esto también afecta a cómo se calcula tu saldo.</translation>
+ <translation type="unfinished">Si deshabilitas el gasto del cambio sin confirmar, el cambio de una transacción no se puede usar hasta que esta tenga al menos una confirmación. Esto también afecta el cálculo del saldo.</translation>
</message>
<message>
<source>&amp;Spend unconfirmed change</source>
@@ -1650,27 +1674,27 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>External Signer (e.g. hardware wallet)</source>
- <translation type="unfinished">Dispositivo externo de firma (ej. monedero de hardware)</translation>
+ <translation type="unfinished">Dispositivo externo de firma (p. ej., monedero de hardware)</translation>
</message>
<message>
<source>&amp;External signer script path</source>
- <translation type="unfinished">Ruta de script de firma &amp;externo</translation>
+ <translation type="unfinished">&amp;Ruta al script del firmante externo</translation>
</message>
<message>
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
- <translation type="unfinished">Abrir automáticamente el puerto del cliente Bitcoin en el enrutador. Esta opción solo funciona cuando el enrutado admite UPnP y está activado.</translation>
+ <translation type="unfinished">Abrir automáticamente el puerto del cliente Bitcoin en el enrutador. Esta opción solo funciona cuando el enrutador admite UPnP y está activado.</translation>
</message>
<message>
<source>Map port using &amp;UPnP</source>
- <translation type="unfinished">Mapear el puerto usando &amp;UPnP</translation>
+ <translation type="unfinished">Asignar puerto mediante &amp;UPnP</translation>
</message>
<message>
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
- <translation type="unfinished">Abre el puerto del cliente de Bitcoin en el enrutado automáticamente. Esto solo funciona cuando el enrutado soporta NAT-PMP y está activo. El puerto externo podría ser elegido al azar.</translation>
+ <translation type="unfinished">Abre el puerto del cliente de Bitcoin en el enrutador automáticamente. Esto solo funciona cuando el enrutador soporta NAT-PMP y está activo. El puerto externo podría ser elegido al azar.</translation>
</message>
<message>
<source>Map port using NA&amp;T-PMP</source>
- <translation type="unfinished">Mapear el puerto usando NA&amp;T-PMP</translation>
+ <translation type="unfinished">Asignar puerto usando NA&amp;T-PMP</translation>
</message>
<message>
<source>Accept connections from outside.</source>
@@ -1690,7 +1714,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Proxy &amp;IP:</source>
- <translation type="unfinished">IP &amp;Proxy:</translation>
+ <translation type="unfinished">IP del &amp;proxy:</translation>
</message>
<message>
<source>&amp;Port:</source>
@@ -1698,7 +1722,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Port of the proxy (e.g. 9050)</source>
- <translation type="unfinished">Puerto del proxy (ej. 9050)</translation>
+ <translation type="unfinished">Puerto del proxy (p. ej., 9050)</translation>
</message>
<message>
<source>Used for reaching peers via:</source>
@@ -1714,7 +1738,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>&amp;Show tray icon</source>
- <translation type="unfinished">Mostrar la &amp;bandeja del sistema.</translation>
+ <translation type="unfinished">&amp;Mostrar el icono de la bandeja</translation>
</message>
<message>
<source>Show only a tray icon after minimizing the window.</source>
@@ -1722,15 +1746,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>&amp;Minimize to the tray instead of the taskbar</source>
- <translation type="unfinished">&amp;Minimiza a la bandeja en vez de la barra de tareas</translation>
+ <translation type="unfinished">&amp;Minimizar a la bandeja en vez de la barra de tareas</translation>
</message>
<message>
<source>M&amp;inimize on close</source>
- <translation type="unfinished">M&amp;inimizar al cerrar</translation>
+ <translation type="unfinished">&amp;Minimizar al cerrar</translation>
</message>
<message>
<source>&amp;Display</source>
- <translation type="unfinished">&amp;Representar</translation>
+ <translation type="unfinished">&amp;Visualización</translation>
</message>
<message>
<source>User Interface &amp;language:</source>
@@ -1742,43 +1766,31 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>&amp;Unit to show amounts in:</source>
- <translation type="unfinished">&amp;Unidad en la que mostrar importes:</translation>
+ <translation type="unfinished">&amp;Unidad en la que se muestran los importes:</translation>
</message>
<message>
<source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
- <translation type="unfinished">Elegir la subdivisión predeterminada para mostrar cantidades en la interfaz y cuando se envían monedas.</translation>
+ <translation type="unfinished">Elegir la unidad de subdivisión predeterminada para mostrar en la interfaz y al enviar monedas.</translation>
</message>
<message>
<source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
- <translation type="unfinished">URLs de terceros (por ejemplo, un explorador de bloques) que aparecen en la pestaña de transacciones como elementos del menú contextual. %s en la URL se sustituye por el hash de la transacción. Las URL múltiples se separan con una barra vertical |.</translation>
+ <translation type="unfinished">URL de terceros (por ejemplo, un explorador de bloques) que aparecen en la pestaña de transacciones como elementos del menú contextual. %s en la URL se sustituye por el hash de la transacción. Las URL múltiples se separan con una barra vertical |.</translation>
</message>
<message>
<source>&amp;Third-party transaction URLs</source>
- <translation type="unfinished">URLs de transacciones de &amp;terceros</translation>
+ <translation type="unfinished">&amp;URL de transacciones de terceros</translation>
</message>
<message>
<source>Whether to show coin control features or not.</source>
- <translation type="unfinished">Mostrar o no funcionalidad del control de moneda</translation>
+ <translation type="unfinished">Mostrar o no la funcionalidad de control de monedas.</translation>
</message>
<message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
- <translation type="unfinished">Conectar a la red de Bitcoin a través de un proxy SOCKS5 diferente para los servicios anónimos de Tor.</translation>
+ <translation type="unfinished">Conectarse a la red de Bitcoin a través de un proxy SOCKS5 independiente para los servicios onion de Tor.</translation>
</message>
<message>
<source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
- <translation type="unfinished">Usar proxy SOCKS&amp;5 para alcanzar nodos vía servicios anónimos Tor:</translation>
- </message>
- <message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fuente monoespaciada en la pestaña Resumen:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">embebido «%1»</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">coincidencia más aproximada «%1»</translation>
+ <translation type="unfinished">Usar proxy SOCKS&amp;5 para conectar a pares a través de los servicios anónimos de Tor:</translation>
</message>
<message>
<source>&amp;OK</source>
@@ -1791,7 +1803,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Compilado sin soporte de firma externa (necesario para la firma externa)</translation>
+ <translation type="unfinished">Compilado sin soporte de firma externa (requerido para la firma externa)</translation>
</message>
<message>
<source>default</source>
@@ -1814,7 +1826,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<message>
<source>Current settings will be backed up at "%1".</source>
<extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
- <translation type="unfinished">Los parámetros actuales se guardarán en «%1».</translation>
+ <translation type="unfinished">Los parámetros actuales se guardarán en "%1".</translation>
</message>
<message>
<source>Client will be shut down. Do you want to proceed?</source>
@@ -1829,7 +1841,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<message>
<source>The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file.</source>
<extracomment>Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings.</extracomment>
- <translation type="unfinished">El archivo de configuración se utiliza para especificar opciones de usuario avanzadas que anulan la configuración de la GUI. Además, cualquier opción de línea de comandos anulará este archivo de configuración.</translation>
+ <translation type="unfinished">El archivo de configuración se usa para especificar opciones avanzadas del usuario, que remplazan la configuración de la GUI. Además, las opciones de la línea de comandos remplazarán este archivo de configuración.</translation>
</message>
<message>
<source>Continue</source>
@@ -1856,7 +1868,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<name>OptionsModel</name>
<message>
<source>Could not read setting "%1", %2.</source>
- <translation type="unfinished">No se pudo leer el ajuste «%1», %2.</translation>
+ <translation type="unfinished">No se puede leer la configuración "%1", %2.</translation>
</message>
</context>
<context>
@@ -1867,11 +1879,11 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source>
- <translation type="unfinished">La información mostrada puede estar desactualizada. Su monedero se sincroniza automáticamente con la red de Bitcoin después de establecer una conexión, pero este proceso aún no se ha completado.</translation>
+ <translation type="unfinished">La información mostrada puede estar desactualizada. El monedero se sincroniza automáticamente con la red de Bitcoin después de establecer una conexión, pero este proceso aún no se ha completado.</translation>
</message>
<message>
<source>Watch-only:</source>
- <translation type="unfinished">Solo observación:</translation>
+ <translation type="unfinished">Solo de observación:</translation>
</message>
<message>
<source>Available:</source>
@@ -1879,7 +1891,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Your current spendable balance</source>
- <translation type="unfinished">Su saldo disponible actual</translation>
+ <translation type="unfinished">Tu saldo disponible actual</translation>
</message>
<message>
<source>Pending:</source>
@@ -1887,27 +1899,31 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
- <translation type="unfinished">Total de transacciones que aún no se han sido confirmadas, y que no son contabilizadas dentro del saldo disponible para gastar</translation>
+ <translation type="unfinished">Total de transacciones que aún no han sido confirmadas y que no son contabilizadas dentro del saldo disponible para gastar</translation>
</message>
<message>
<source>Immature:</source>
- <translation type="unfinished">No disponible:</translation>
+ <translation type="unfinished">Inmadura:</translation>
</message>
<message>
<source>Mined balance that has not yet matured</source>
- <translation type="unfinished">Saldo recién minado que aún no está disponible</translation>
+ <translation type="unfinished">Saldo minado que aún no ha madurado</translation>
+ </message>
+ <message>
+ <source>Balances</source>
+ <translation type="unfinished">Saldos</translation>
</message>
<message>
<source>Your current total balance</source>
- <translation type="unfinished">Su saldo total actual</translation>
+ <translation type="unfinished">Tu saldo total actual</translation>
</message>
<message>
<source>Your current balance in watch-only addresses</source>
- <translation type="unfinished">Su saldo actual en direcciones de observación</translation>
+ <translation type="unfinished">Tu saldo actual en direcciones solo de observación</translation>
</message>
<message>
<source>Spendable:</source>
- <translation type="unfinished">Disponible:</translation>
+ <translation type="unfinished">Gastable:</translation>
</message>
<message>
<source>Recent transactions</source>
@@ -1915,34 +1931,34 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Unconfirmed transactions to watch-only addresses</source>
- <translation type="unfinished">Transacciones sin confirmar a direcciones de observación</translation>
+ <translation type="unfinished">Transacciones sin confirmar a direcciones solo de observación</translation>
</message>
<message>
<source>Mined balance in watch-only addresses that has not yet matured</source>
- <translation type="unfinished">Saldo minado en direcciones de observación que aún no está disponible</translation>
+ <translation type="unfinished">Saldo minado en direcciones solo de observación que aún no ha madurado</translation>
</message>
<message>
<source>Current total balance in watch-only addresses</source>
- <translation type="unfinished">Saldo total actual en direcciones de observación</translation>
+ <translation type="unfinished">Saldo total actual en direcciones solo de observación</translation>
</message>
<message>
<source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
- <translation type="unfinished">Modo de privacidad activado para la pestaña de visión general. Para desenmascarar los valores, desmarcar los valores de Configuración → Enmascarar valores.</translation>
+ <translation type="unfinished">Modo de privacidad activado para la pestaña de vista general. Para mostrar los valores, anula la selección de "Configuración-&gt;Ocultar valores".</translation>
</message>
</context>
<context>
<name>PSBTOperationsDialog</name>
<message>
<source>PSBT Operations</source>
- <translation type="unfinished">Operaciones PSBT</translation>
+ <translation type="unfinished">Operaciones TBPF</translation>
</message>
<message>
<source>Sign Tx</source>
- <translation type="unfinished">Firmar Tx</translation>
+ <translation type="unfinished">Firmar transacción</translation>
</message>
<message>
<source>Broadcast Tx</source>
- <translation type="unfinished">Emitir Tx</translation>
+ <translation type="unfinished">Transmitir transacción</translation>
</message>
<message>
<source>Copy to Clipboard</source>
@@ -1978,7 +1994,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Signed transaction successfully. Transaction is ready to broadcast.</source>
- <translation type="unfinished">Se ha firmado correctamente. La transacción está lista para difundirse.</translation>
+ <translation type="unfinished">La transacción se ha firmado correctamente y está lista para transmitirse.</translation>
</message>
<message>
<source>Unknown error processing transaction.</source>
@@ -1986,44 +2002,44 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Transaction broadcast successfully! Transaction ID: %1</source>
- <translation type="unfinished">¡La transacción se ha difundido correctamente! Código ID de la transacción: %1</translation>
+ <translation type="unfinished">¡La transacción se ha transmitido correctamente! Identificador de transacción: %1</translation>
</message>
<message>
<source>Transaction broadcast failed: %1</source>
- <translation type="unfinished">Ha habido un error en la difusión de la transacción: %1</translation>
+ <translation type="unfinished">Error al transmitir la transacción: %1</translation>
</message>
<message>
<source>PSBT copied to clipboard.</source>
- <translation type="unfinished">PSBT copiado al portapapeles</translation>
+ <translation type="unfinished">TBPF copiada al portapapeles.</translation>
</message>
<message>
<source>Save Transaction Data</source>
- <translation type="unfinished">Guardar la transacción de datos</translation>
+ <translation type="unfinished">Guardar datos de la transacción</translation>
</message>
<message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">Transacción parcialmente firmada (binario) </translation>
+ <translation type="unfinished">Transacción parcialmente firmada (binario)</translation>
</message>
<message>
<source>PSBT saved to disk.</source>
- <translation type="unfinished">PSBT guardado en disco.</translation>
+ <translation type="unfinished">TBPF guardada en disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Envia %1 a %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envía %1 a %2</translation>
</message>
<message>
<source>own address</source>
- <translation type="unfinished">mi dirección</translation>
+ <translation type="unfinished">dirección propia</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
- <translation type="unfinished">No se ha podido calcular la comisión por transacción o la totalidad del importe de la transacción.</translation>
+ <translation type="unfinished">No se ha podido calcular la comisión de transacción o la totalidad del importe de la transacción.</translation>
</message>
<message>
<source>Pays transaction fee: </source>
- <translation type="unfinished">Pagar comisión por transacción:</translation>
+ <translation type="unfinished">Pagar comisión de transacción:</translation>
</message>
<message>
<source>Total Amount</source>
@@ -2039,7 +2055,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Transaction is missing some information about inputs.</source>
- <translation type="unfinished">Falta alguna información sobre las entradas de la transacción.</translation>
+ <translation type="unfinished">A la transacción le falta información sobre entradas.</translation>
</message>
<message>
<source>Transaction still needs signature(s).</source>
@@ -2047,19 +2063,19 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>(But no wallet is loaded.)</source>
- <translation type="unfinished">(No existe ningún monedero cargado.)</translation>
+ <translation type="unfinished">(No existe ningún monedero cargado).</translation>
</message>
<message>
<source>(But this wallet cannot sign transactions.)</source>
- <translation type="unfinished">(Este monedero no puede firmar transacciones.)</translation>
+ <translation type="unfinished">(Este monedero no puede firmar transacciones).</translation>
</message>
<message>
<source>(But this wallet does not have the right keys.)</source>
- <translation type="unfinished">(Este monedero no tiene las claves adecuadas.)</translation>
+ <translation type="unfinished">(Este monedero no tiene las claves adecuadas).</translation>
</message>
<message>
<source>Transaction is fully signed and ready for broadcast.</source>
- <translation type="unfinished">La transacción se ha firmado correctamente y está lista para difundirse.</translation>
+ <translation type="unfinished">La transacción se ha firmado completamente y está lista para transmitirse.</translation>
</message>
<message>
<source>Transaction status is unknown.</source>
@@ -2074,7 +2090,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Cannot start bitcoin: click-to-pay handler</source>
- <translation type="unfinished">No se puede iniciar bitcoin: controlador pulsar-para-pagar</translation>
+ <translation type="unfinished">No se puede iniciar el controlador "bitcoin: click-to-pay"</translation>
</message>
<message>
<source>URI handling</source>
@@ -2082,19 +2098,19 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>'bitcoin://' is not a valid URI. Use 'bitcoin:' instead.</source>
- <translation type="unfinished">«bitcoin: //» no es un URI válido. Use «bitcoin:» en su lugar.</translation>
+ <translation type="unfinished">"bitcoin://" no es un URI válido. Usa "bitcoin:" en su lugar.</translation>
</message>
<message>
<source>Cannot process payment request because BIP70 is not supported.
Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
- <translation type="unfinished">No se puede procesar la solicitud de pago debido a que no se mantiene BIP70.
-Debido a los fallos de seguridad generalizados en el BIP70, se recomienda encarecidamente ignorar las instrucciones del comerciante para cambiar de monedero.
-Si recibe este error, debe solicitar al comerciante que le proporcione un URI compatible con BIP21.</translation>
+ <translation type="unfinished">No se puede procesar la solicitud de pago porque no existe compatibilidad con BIP70.
+Debido a los fallos de seguridad generalizados en BIP70, se recomienda encarecidamente ignorar las instrucciones del comerciante para cambiar de monedero.
+Si recibes este error, debes solicitar al comerciante que te proporcione un URI compatible con BIP21.</translation>
</message>
<message>
<source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation type="unfinished">¡No se puede interpretar la URI! Esto puede deberse a una dirección Bitcoin inválida o a parámetros de URI mal formados.</translation>
+ <translation type="unfinished">No se puede analizar el URI. Esto se puede deber a una dirección de Bitcoin inválida o a parámetros de URI con formato incorrecto.</translation>
</message>
<message>
<source>Payment request file handling</source>
@@ -2106,12 +2122,17 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>User Agent</source>
<extracomment>Title of Peers Table column which contains the peer's User Agent string.</extracomment>
- <translation type="unfinished">Agente del usuario</translation>
+ <translation type="unfinished">Agente de usuario</translation>
+ </message>
+ <message>
+ <source>Peer</source>
+ <extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
+ <translation type="unfinished">Par</translation>
</message>
<message>
<source>Age</source>
<extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
- <translation type="unfinished">Duración</translation>
+ <translation type="unfinished">Antigüedad</translation>
</message>
<message>
<source>Direction</source>
@@ -2121,7 +2142,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>Sent</source>
<extracomment>Title of Peers Table column which indicates the total amount of network information we have sent to the peer.</extracomment>
- <translation type="unfinished">Enviar</translation>
+ <translation type="unfinished">Enviado</translation>
</message>
<message>
<source>Received</source>
@@ -2166,7 +2187,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation type="unfinished">URI resultante demasiado larga. Intente reducir el texto de la etiqueta / mensaje.</translation>
+ <translation type="unfinished">URI resultante demasiado largo. Intenta reducir el texto de la etiqueta o el mensaje.</translation>
</message>
<message>
<source>Error encoding URI into QR Code.</source>
@@ -2174,7 +2195,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>QR code support not available.</source>
- <translation type="unfinished">Soporte de código QR no disponible.</translation>
+ <translation type="unfinished">La compatibilidad con el código QR no está disponible.</translation>
</message>
<message>
<source>Save QR Code</source>
@@ -2189,6 +2210,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<context>
<name>RPCConsole</name>
<message>
+ <source>N/A</source>
+ <translation type="unfinished">N/D</translation>
+ </message>
+ <message>
<source>Client version</source>
<translation type="unfinished">Versión del cliente</translation>
</message>
@@ -2202,15 +2227,15 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>To specify a non-default location of the data directory use the '%1' option.</source>
- <translation type="unfinished">Para especificar una localización personalizada del directorio de datos, usa la opción «%1».</translation>
+ <translation type="unfinished">Para especificar una localización personalizada del directorio de datos, usa la opción "%1".</translation>
</message>
<message>
<source>Blocksdir</source>
- <translation type="unfinished">Dirección de Bloque</translation>
+ <translation type="unfinished">Directorio de bloques</translation>
</message>
<message>
<source>To specify a non-default location of the blocks directory use the '%1' option.</source>
- <translation type="unfinished">Para especificar una localización personalizada del directorio de bloques, usa la opción «%1». </translation>
+ <translation type="unfinished">Para especificar una localización personalizada del directorio de bloques, usa la opción "%1". </translation>
</message>
<message>
<source>Startup time</source>
@@ -2234,7 +2259,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Memory Pool</source>
- <translation type="unfinished">Sondeo de memoria</translation>
+ <translation type="unfinished">Pool de memoria</translation>
</message>
<message>
<source>Current number of transactions</source>
@@ -2262,19 +2287,19 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Sent</source>
- <translation type="unfinished">Enviar</translation>
+ <translation type="unfinished">Enviado</translation>
</message>
<message>
<source>&amp;Peers</source>
- <translation type="unfinished">&amp;Parejas</translation>
+ <translation type="unfinished">&amp;Pares</translation>
</message>
<message>
<source>Banned peers</source>
- <translation type="unfinished">Parejas bloqueadas</translation>
+ <translation type="unfinished">Pares bloqueados</translation>
</message>
<message>
<source>Select a peer to view detailed information.</source>
- <translation type="unfinished">Selecciona una pareja para ver la información detallada.</translation>
+ <translation type="unfinished">Selecciona un par para ver la información detallada.</translation>
</message>
<message>
<source>The transport layer version: %1</source>
@@ -2286,7 +2311,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Cadena de identificación de la sesión BIP324 en formato hexadecimal, si existe.</translation>
+ <translation type="unfinished">Cadena de identificador de la sesión BIP324 en formato hexadecimal, si existe.</translation>
</message>
<message>
<source>Session ID</source>
@@ -2298,11 +2323,11 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">Retransmitimos transacciones a esta pareja.</translation>
+ <translation type="unfinished">Si retransmitimos las transacciones a este par.</translation>
</message>
<message>
<source>Transaction Relay</source>
- <translation type="unfinished">Posta de Transacción</translation>
+ <translation type="unfinished">Retransmisión de transacciones</translation>
</message>
<message>
<source>Starting Block</source>
@@ -2322,31 +2347,31 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>The mapped Autonomous System used for diversifying peer selection.</source>
- <translation type="unfinished">El Sistema Autónomo mapeado utilizado para la selección diversificada de pares.</translation>
+ <translation type="unfinished">El sistema autónomo asignado que se usó para diversificar la selección de pares.</translation>
</message>
<message>
<source>Mapped AS</source>
- <translation type="unfinished"> Distribuido AS</translation>
+ <translation type="unfinished">Sistema autónomo asignado</translation>
</message>
<message>
<source>Whether we relay addresses to this peer.</source>
<extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">Si retransmitimos las direcciones a este peer.</translation>
+ <translation type="unfinished">Si retransmitimos las direcciones a este par.</translation>
</message>
<message>
<source>Address Relay</source>
<extracomment>Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">Dirección de Transmisión </translation>
+ <translation type="unfinished">Retransmisión de direcciones</translation>
</message>
<message>
<source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
<extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">El número total de direcciones recibidas desde esta pareja que han sido procesadas (excluyendo las direcciones que han sido desestimadas debido a la limitación de proporción).</translation>
+ <translation type="unfinished">El número total de direcciones recibidas desde este par que han sido procesadas (excluyendo las direcciones que han sido desestimadas debido a la limitación de volumen).</translation>
</message>
<message>
<source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
<extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">El número total de direcciones recibidas desde esta pareja que han sido desestimadas (no procesadas) debido a la limitación de proporción.</translation>
+ <translation type="unfinished">El número total de direcciones recibidas desde este par que han sido desestimadas (no procesadas) debido a la limitación de volumen.</translation>
</message>
<message>
<source>Addresses Processed</source>
@@ -2356,11 +2381,11 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>Addresses Rate-Limited</source>
<extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">Direcciones con límite de proporción</translation>
+ <translation type="unfinished">Direcciones desestimadas por limitación de volumen</translation>
</message>
<message>
<source>User Agent</source>
- <translation type="unfinished">Agente del usuario</translation>
+ <translation type="unfinished">Agente de usuario</translation>
</message>
<message>
<source>Node window</source>
@@ -2372,15 +2397,15 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation type="unfinished">Abra el archivo de registro de depuración %1 del directorio de datos actual. Esto puede tomar unos segundos para archivos de registro grandes.</translation>
+ <translation type="unfinished">Abre el archivo de registro de depuración %1 del directorio de datos actual. Esto puede tomar unos segundos para archivos de registro grandes.</translation>
</message>
<message>
<source>Decrease font size</source>
- <translation type="unfinished">Reducir el tamaño de la tipografía</translation>
+ <translation type="unfinished">Reducir el tamaño de la fuente</translation>
</message>
<message>
<source>Increase font size</source>
- <translation type="unfinished">Aumentar el tamaño de la tipografía</translation>
+ <translation type="unfinished">Aumentar el tamaño de la fuente</translation>
</message>
<message>
<source>Permissions</source>
@@ -2388,15 +2413,15 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>The direction and type of peer connection: %1</source>
- <translation type="unfinished">La dirección y tipo de conexión de la pareja: %1</translation>
+ <translation type="unfinished">El sentido y el tipo de conexión entre pares: %1</translation>
</message>
<message>
<source>Direction/Type</source>
- <translation type="unfinished">Dirección/Tipo</translation>
+ <translation type="unfinished">Sentido/Tipo</translation>
</message>
<message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
- <translation type="unfinished">El protocolo de red de este par está conectado a través de: IPv4, IPv6, Onion, I2P, o CJDNS.</translation>
+ <translation type="unfinished">El protocolo de red de este par está conectado a través de: IPv4, IPv6, Onion, I2P o CJDNS.</translation>
</message>
<message>
<source>Services</source>
@@ -2404,7 +2429,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>High bandwidth BIP152 compact block relay: %1</source>
- <translation type="unfinished">Transmisión de bloque compacto BIP152 banda ancha: %1</translation>
+ <translation type="unfinished">Retransmisión de bloques compactos BIP152 en banda ancha: %1</translation>
</message>
<message>
<source>High Bandwidth</source>
@@ -2425,7 +2450,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
<extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
- <translation type="unfinished">Tiempo transcurrido desde que se recibió de esta pareja una nueva transacción aceptada en nuestra memoria compartida.</translation>
+ <translation type="unfinished">Tiempo transcurrido desde que se recibió de este par una nueva transacción aceptada en la mempool.</translation>
</message>
<message>
<source>Last Send</source>
@@ -2453,7 +2478,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Time Offset</source>
- <translation type="unfinished">Desplazamiento de hora</translation>
+ <translation type="unfinished">Desfase temporal</translation>
</message>
<message>
<source>Last block time</source>
@@ -2481,7 +2506,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Clear console</source>
- <translation type="unfinished">Vaciar consola</translation>
+ <translation type="unfinished">Borrar consola</translation>
</message>
<message>
<source>In:</source>
@@ -2494,32 +2519,32 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>Inbound: initiated by peer</source>
<extracomment>Explanatory text for an inbound peer connection.</extracomment>
- <translation type="unfinished">Entrante: iniciado por la pareja</translation>
+ <translation type="unfinished">Entrante: iniciada por el par</translation>
</message>
<message>
<source>Outbound Full Relay: default</source>
<extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
- <translation type="unfinished">Retransmisión completa saliente: predeterminado</translation>
+ <translation type="unfinished">Retransmisión completa saliente: predeterminada</translation>
</message>
<message>
<source>Outbound Block Relay: does not relay transactions or addresses</source>
<extracomment>Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">Retransmisión de bloques de salida: no transmite transacciones o direcciones</translation>
+ <translation type="unfinished">Retransmisión de bloque saliente: no retransmite transacciones o direcciones</translation>
</message>
<message>
<source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
<extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
- <translation type="unfinished">Manual de salida: añadido usando las opciones de configuración RPC %1 o %2/%3</translation>
+ <translation type="unfinished">Manual saliente: agregada usando las opciones de configuración %1 o %2/%3 de RPC</translation>
</message>
<message>
<source>Outbound Feeler: short-lived, for testing addresses</source>
<extracomment>Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</extracomment>
- <translation type="unfinished">Tanteador de salida: de corta duración, para probar las direcciones</translation>
+ <translation type="unfinished">Sensor saliente: de corta duración para probar direcciones</translation>
</message>
<message>
<source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
<extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
- <translation type="unfinished">Búsqueda de direcciones de salida: de corta duración, para solicitar direcciones</translation>
+ <translation type="unfinished">Recuperación de direcciones saliente: de corta duración para solicitar direcciones</translation>
</message>
<message>
<source>detecting: peer could be v1 or v2</source>
@@ -2534,19 +2559,19 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>v2: BIP324 encrypted transport protocol</source>
<extracomment>Explanatory text for v2 transport type.</extracomment>
- <translation type="unfinished">v2: protocolo de transporte encriptado BIP324</translation>
+ <translation type="unfinished">v2: protocolo de transporte cifrado BIP324</translation>
</message>
<message>
<source>we selected the peer for high bandwidth relay</source>
- <translation type="unfinished">hemos seleccionado la pareja para la retransmisión por banda ancha</translation>
+ <translation type="unfinished">Seleccionamos el par para la retransmisión de banda ancha</translation>
</message>
<message>
<source>the peer selected us for high bandwidth relay</source>
- <translation type="unfinished">la pareja nos ha seleccionado para transmisión por banda ancha</translation>
+ <translation type="unfinished">El par nos seleccionó para la retransmisión de banda ancha</translation>
</message>
<message>
<source>no high bandwidth relay selected</source>
- <translation type="unfinished">ninguna transmisión de banda ancha seleccionada</translation>
+ <translation type="unfinished">No se seleccionó la retransmisión de banda ancha</translation>
</message>
<message>
<source>&amp;Copy address</source>
@@ -2576,11 +2601,11 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
- <translation type="unfinished">&amp;Copiar IP/Netmask</translation>
+ <translation type="unfinished">&amp;Copiar IP/Máscara de red</translation>
</message>
<message>
<source>&amp;Unban</source>
- <translation type="unfinished">&amp;Permitir</translation>
+ <translation type="unfinished">&amp;Desbloquear</translation>
</message>
<message>
<source>Network activity disabled</source>
@@ -2588,11 +2613,15 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Executing command without any wallet</source>
- <translation type="unfinished">Ejecutar instrucción sin ningún monedero</translation>
+ <translation type="unfinished">Ejecutar comando sin monedero</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Ventana de nodo - [%1]</translation>
</message>
<message>
<source>Executing command using "%1" wallet</source>
- <translation type="unfinished">Ejecutar instrucción usando el monedero «%1»</translation>
+ <translation type="unfinished">Ejecutar comando con el monedero "%1"</translation>
</message>
<message>
<source>Welcome to the %1 RPC console.
@@ -2603,12 +2632,13 @@ For more information on using this console, type %6.
%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
<extracomment>RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</extracomment>
- <translation type="unfinished">Bienvenido a la consola RPC
-%1. Utiliza las flechas arriba y abajo para navegar por el historial, y %2 para borrar la pantalla.
-Utiliza %3 y %4 para aumentar o disminuir el tamaño de la tipografía.
-Escribe %5 para ver un resumen de las instrucciones disponibles. Para más información sobre cómo usar esta consola, escribe %6.
+ <translation type="unfinished">Te damos la bienvenida a la consola RPC de %1.
+Utiliza las flechas hacia arriba y abajo para navegar por el historial y %2 para borrar la pantalla.
+Utiliza %3 y %4 para aumentar o disminuir el tamaño de la fuente.
+Escribe %5 para ver los comandos disponibles.
+Para obtener más información sobre cómo usar esta consola, escribe %6.
-%7 AVISO: Los estafadores han estado activos diciendo a los usuarios que escriban ordenes aquí, robando el contenido de sus monederos. No uses esta consola sin entender completamente las ramificaciones de una instrucción.%8</translation>
+%7 ADVERTENCIA: Los estafadores suelen decirles a los usuarios que escriban comandos aquí para robarles el contenido de sus monederos. No uses esta consola si no entiendes completamente las ramificaciones de un comando.%8</translation>
</message>
<message>
<source>Executing…</source>
@@ -2617,7 +2647,7 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(pareja: %1)</translation>
+ <translation type="unfinished">(par: %1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2629,15 +2659,15 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
</message>
<message>
<source>To</source>
- <translation type="unfinished">Destino</translation>
+ <translation type="unfinished">A</translation>
</message>
<message>
<source>From</source>
- <translation type="unfinished">Remite</translation>
+ <translation type="unfinished">De</translation>
</message>
<message>
<source>Ban for</source>
- <translation type="unfinished">Prohibido para</translation>
+ <translation type="unfinished">Bloqueo por</translation>
</message>
<message>
<source>Never</source>
@@ -2652,7 +2682,7 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
<name>ReceiveCoinsDialog</name>
<message>
<source>&amp;Amount:</source>
- <translation type="unfinished">&amp;Importe</translation>
+ <translation type="unfinished">&amp;Importe:</translation>
</message>
<message>
<source>&amp;Label:</source>
@@ -2660,7 +2690,7 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
</message>
<message>
<source>&amp;Message:</source>
- <translation type="unfinished">&amp;Mensaje</translation>
+ <translation type="unfinished">&amp;Mensaje:</translation>
</message>
<message>
<source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
@@ -2680,7 +2710,7 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
</message>
<message>
<source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
- <translation type="unfinished">Etiqueta opcional para asociar con la nueva dirección de recepción (utilizado por ti para identificar una factura). También esta asociado a la solicitud de pago.</translation>
+ <translation type="unfinished">Etiqueta opcional para asociar con la nueva dirección de recepción (puedes usarla para identificar una factura). También esta asociada a la solicitud de pago.</translation>
</message>
<message>
<source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
@@ -2688,15 +2718,15 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
</message>
<message>
<source>&amp;Create new receiving address</source>
- <translation type="unfinished">&amp;Crear una nueva dirección de recepción</translation>
+ <translation type="unfinished">&amp;Crear nueva dirección de recepción</translation>
</message>
<message>
<source>Clear all fields of the form.</source>
- <translation type="unfinished">Vacía todos los campos del formulario.</translation>
+ <translation type="unfinished">Borrar todos los campos del formulario.</translation>
</message>
<message>
<source>Clear</source>
- <translation type="unfinished">Vaciar</translation>
+ <translation type="unfinished">Borrar</translation>
</message>
<message>
<source>Requested payments history</source>
@@ -2704,7 +2734,7 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
</message>
<message>
<source>Show the selected request (does the same as double clicking an entry)</source>
- <translation type="unfinished">Mostrar la solicitud seleccionada (hace lo mismo que hacer doble clic en una entrada)</translation>
+ <translation type="unfinished">Mostrar la solicitud seleccionada (equivale a hacer doble clic en una entrada)</translation>
</message>
<message>
<source>Show</source>
@@ -2712,7 +2742,7 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
</message>
<message>
<source>Remove the selected entries from the list</source>
- <translation type="unfinished">Eliminar los apuntes seleccionados del listado</translation>
+ <translation type="unfinished">Eliminar las entradas seleccionadas de la lista</translation>
</message>
<message>
<source>Remove</source>
@@ -2739,10 +2769,6 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
<translation type="unfinished">Copiar &amp;importe</translation>
</message>
<message>
- <source>Base58 (Legacy)</source>
- <translation type="unfinished">Base58 (Heredado)</translation>
- </message>
- <message>
<source>Not recommended due to higher fees and less protection against typos.</source>
<translation type="unfinished">No se recomienda debido a las altas comisiones y la poca protección contra errores tipográficos.</translation>
</message>
@@ -2807,7 +2833,7 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">Verifica esta dirección en la pantalla de tu monedero frío u otro dispositivo</translation>
+ <translation type="unfinished">Verifica esta dirección, por ejemplo, en la pantalla de un monedero de hardware.</translation>
</message>
<message>
<source>&amp;Save Image…</source>
@@ -2861,7 +2887,7 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
</message>
<message>
<source>Coin Control Features</source>
- <translation type="unfinished">Características de control de moneda</translation>
+ <translation type="unfinished">Funciones de control de monedas</translation>
</message>
<message>
<source>automatically selected</source>
@@ -2893,7 +2919,7 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
</message>
<message>
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
- <translation type="unfinished">Al activarse, si la dirección está vacía o no es válida, las monedas serán enviadas a una dirección generada nueva.</translation>
+ <translation type="unfinished">Si se activa, pero la dirección de cambio está vacía o es inválida, el cambio se enviará a una dirección generada recientemente.</translation>
</message>
<message>
<source>Custom change address</source>
@@ -2905,7 +2931,7 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
</message>
<message>
<source>Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
- <translation type="unfinished">Si utilizas la comisión por defecto, la transacción puede tardar varias horas o incluso días (o nunca) en confirmarse. Considera elegir la comisión de forma manual o espera hasta que se haya validado completamente la cadena.</translation>
+ <translation type="unfinished">Si usas la opción "fallbackfee", la transacción puede tardar varias horas o días en confirmarse (o nunca hacerlo). Considera elegir la comisión de forma manual o espera hasta que hayas validado la cadena completa.</translation>
</message>
<message>
<source>Warning: Fee estimation is currently not possible.</source>
@@ -2917,7 +2943,7 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
</message>
<message>
<source>Hide</source>
- <translation type="unfinished">Ocultar </translation>
+ <translation type="unfinished">Ocultar</translation>
</message>
<message>
<source>Recommended:</source>
@@ -2933,11 +2959,11 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
</message>
<message>
<source>Add &amp;Recipient</source>
- <translation type="unfinished">Agrega &amp;destinatario</translation>
+ <translation type="unfinished">Agregar &amp;destinatario</translation>
</message>
<message>
<source>Clear all fields of the form.</source>
- <translation type="unfinished">Vacía todos los campos del formulario.</translation>
+ <translation type="unfinished">Borrar todos los campos del formulario.</translation>
</message>
<message>
<source>Inputs…</source>
@@ -2955,21 +2981,21 @@ Escribe %5 para ver un resumen de las instrucciones disponibles. Para más infor
<source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">Especifica una comisión personalizada por kB (1.000 bytes) del tamaño virtual de la transacción.
+ <translation type="unfinished">Especifica una comisión personalizada por kB (1000 bytes) del tamaño virtual de la transacción.
-Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis por kvB» para una transacción de 500 bytes virtuales (la mitad de 1 kvB), supondría finalmente una comisión de sólo 50 satoshis.</translation>
+Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por kvB" para una transacción de 500 bytes virtuales (la mitad de 1 kvB) supondría finalmente una comisión de solo 50 satoshis.</translation>
</message>
<message>
<source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
- <translation type="unfinished">Cuando hay menos volumen de transacciones que espacio en los bloques, los mineros y los nodos de retransmisión pueden imponer una comisión mínima. Pagar solo esta comisión mínima está bien, pero tenga en cuenta que esto puede resultar en una transacción nunca confirmada una vez que haya más demanda de transacciones de Bitcoin de la que la red puede procesar.</translation>
+ <translation type="unfinished">Cuando hay menos volumen de transacciones que espacio en los bloques, los mineros y los nodos de retransmisión pueden aplicar una comisión mínima. Está bien pagar solo esta comisión mínima, pero ten en cuenta que esto puede ocasionar que una transacción nunca se confirme una vez que haya más demanda de transacciones de Bitcoin de la que puede procesar la red.</translation>
</message>
<message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
- <translation type="unfinished">Una comisión demasiado pequeña puede resultar en una transacción que nunca será confirmada (leer herramientas de información).</translation>
+ <translation type="unfinished">Si la comisión es demasiado baja, es posible que la transacción nunca se confirme (leer la información en pantalla).</translation>
</message>
<message>
<source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
- <translation type="unfinished">(Comisión inteligente no inicializada todavía. Esto normalmente tarda unos pocos bloques…)</translation>
+ <translation type="unfinished">(La comisión inteligente no se ha inicializado todavía. Esto tarda normalmente algunos bloques…)</translation>
</message>
<message>
<source>Confirmation time target:</source>
@@ -2977,15 +3003,15 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Enable Replace-By-Fee</source>
- <translation type="unfinished">Habilitar Replace-By-Fee</translation>
+ <translation type="unfinished">Activar "Reemplazar por comisión"</translation>
</message>
<message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
- <translation type="unfinished">Con Replace-By-Fee (BIP-125) puede incrementar la comisión después de haber enviado la transacción. Si no utiliza esto, se recomienda que añada una comisión mayor para compensar el riesgo adicional de que la transacción se retrase.</translation>
+ <translation type="unfinished">Con la función "Reemplazar por comisión" (BIP-125), puedes aumentar la comisión de una transacción después de enviarla. Sin esta, es posible que se recomiende una comisión más alta para compensar el mayor riesgo de retraso de la transacción.</translation>
</message>
<message>
<source>Clear &amp;All</source>
- <translation type="unfinished">Vaciar &amp;todo</translation>
+ <translation type="unfinished">Borrar &amp;todo</translation>
</message>
<message>
<source>Balance:</source>
@@ -3030,32 +3056,28 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<message>
<source>Sign on device</source>
<extracomment>"device" usually means a hardware wallet.</extracomment>
- <translation type="unfinished">Iniciar sesión en el dispositivo</translation>
+ <translation type="unfinished">Firmar en el dispositivo</translation>
</message>
<message>
<source>Connect your hardware wallet first.</source>
- <translation type="unfinished">Conecta tu monedero externo primero.</translation>
+ <translation type="unfinished">Conecta primero tu monedero de hardware.</translation>
</message>
<message>
<source>Set external signer script path in Options -&gt; Wallet</source>
<extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Configura una ruta externa al script en Opciones → Monedero</translation>
+ <translation type="unfinished">Establecer la ruta al script del firmante externo en "Opciones -&gt; Monedero"</translation>
</message>
<message>
<source>Cr&amp;eate Unsigned</source>
- <translation type="unfinished">Cr&amp;ear sin firmar</translation>
+ <translation type="unfinished">&amp;Crear sin firmar</translation>
</message>
<message>
<source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">Crea una Transacción de Bitcoin Parcialmente Firmada (TBPF) para uso con p.ej. un monedero fuera de linea %1, o un monedero de hardware compatible con TBPF</translation>
- </message>
- <message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">desde monedero '%1'</translation>
+ <translation type="unfinished">Crea una transacción de Bitcoin parcialmente firmada (TBPF) para usarla, por ejemplo, con un monedero %1 sin conexión o un monedero de hardware compatible con TBPF.</translation>
</message>
<message>
<source>%1 to '%2'</source>
- <translation type="unfinished">%1 a '%2'</translation>
+ <translation type="unfinished">%1 a "%2"</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -3063,35 +3085,35 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>To review recipient list click "Show Details…"</source>
- <translation type="unfinished">Para ver la lista de receptores pulse en "Mostrar detalles..."</translation>
+ <translation type="unfinished">Para consultar la lista de destinatarios, haz clic en "Mostrar detalles..."</translation>
</message>
<message>
<source>Sign failed</source>
- <translation type="unfinished">Firma errónea</translation>
+ <translation type="unfinished">Error de firma</translation>
</message>
<message>
<source>External signer not found</source>
<extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Dispositivo externo de firma no encontrado</translation>
+ <translation type="unfinished">No se encontró el dispositivo firmante externo</translation>
</message>
<message>
<source>External signer failure</source>
<extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Dispositivo externo de firma no encontrado</translation>
+ <translation type="unfinished">Error de firmante externo</translation>
</message>
<message>
<source>Save Transaction Data</source>
- <translation type="unfinished">Guardar la transacción de datos</translation>
+ <translation type="unfinished">Guardar datos de la transacción</translation>
</message>
<message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">Transacción parcialmente firmada (binario) </translation>
+ <translation type="unfinished">Transacción parcialmente firmada (binario)</translation>
</message>
<message>
<source>PSBT saved</source>
<extracomment>Popup message when a PSBT has been saved to a file</extracomment>
- <translation type="unfinished">TBPF guardado </translation>
+ <translation type="unfinished">TBPF guardada</translation>
</message>
<message>
<source>External balance:</source>
@@ -3103,12 +3125,16 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
- <translation type="unfinished">Replace-By-FeePuede incrementar la comisión más tarde (señales de reemplazo por tarifa, BIP-125).</translation>
+ <translation type="unfinished">Puedes aumentar la comisión después (indica "Reemplazar por comisión", BIP-125).</translation>
</message>
<message>
<source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
- <translation type="unfinished">Por favor, revisa tu propuesta de transacción. Esto producirá una Transacción de Bitcoin Parcialmente Firmada (TBPF) que puedes guardar o copiar y después firmar p.ej. un monedero fuera de línea %1, o un monedero de hardware compatible con TBPF.</translation>
+ <translation type="unfinished">Revisa por favor la propuesta de transacción. Esto producirá una transacción de Bitcoin parcialmente firmada (TBPF) que puedes guardar o copiar y, luego, firmar; por ejemplo, con un monedero %1 fuera de línea o un monedero de hardware compatible con TBPF.</translation>
+ </message>
+ <message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 desde el monedero "%2"</translation>
</message>
<message>
<source>Do you want to create this transaction?</source>
@@ -3118,20 +3144,20 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<message>
<source>Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</extracomment>
- <translation type="unfinished">Por favor, revisa tu transacción. Puedes crear y enviar esta transacción o crear una Transacción Bitcoin Parcialmente Firmada (TBPF), que puedes guardar o copiar y luego firmar con, por ejemplo, un monedero %1 offline o un monedero hardware compatible con TBPF.</translation>
+ <translation type="unfinished">Revisa por favor la transacción. Puedes crear y enviar esta transacción de Bitcoin parcialmente firmada (TBPF), que además puedes guardar o copiar y, luego, firmar; por ejemplo, con un monedero %1 sin conexión o un monedero de hardware compatible con TBPF.</translation>
</message>
<message>
<source>Please, review your transaction.</source>
<extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
- <translation type="unfinished">Por favor, revisa tu transacción</translation>
+ <translation type="unfinished">Revisa la transacción.</translation>
</message>
<message>
<source>Transaction fee</source>
- <translation type="unfinished">Comisión por transacción.</translation>
+ <translation type="unfinished">Comisión de transacción</translation>
</message>
<message>
<source>Not signalling Replace-By-Fee, BIP-125.</source>
- <translation type="unfinished">No indica Reemplazo por tarifa, BIP-125.</translation>
+ <translation type="unfinished">No indica "Reemplazar por comisión", BIP-125.</translation>
</message>
<message>
<source>Total Amount</source>
@@ -3141,15 +3167,15 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<source>Unsigned Transaction</source>
<comment>PSBT copied</comment>
<extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
- <translation type="unfinished">Transacción no asignada</translation>
+ <translation type="unfinished">Transacción sin firmar</translation>
</message>
<message>
<source>The PSBT has been copied to the clipboard. You can also save it.</source>
- <translation type="unfinished">Se ha copiado la PSBT al portapapeles. También puedes guardarla.</translation>
+ <translation type="unfinished">Se ha copiado la TBPF al portapapeles. También puedes guardarla.</translation>
</message>
<message>
<source>PSBT saved to disk</source>
- <translation type="unfinished">PSBT guardada en el disco</translation>
+ <translation type="unfinished">TBPF guardada en disco</translation>
</message>
<message>
<source>Confirm send coins</source>
@@ -3157,27 +3183,27 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Watch-only balance:</source>
- <translation type="unfinished">Balance solo observación:</translation>
+ <translation type="unfinished">Saldo solo de observación:</translation>
</message>
<message>
<source>The recipient address is not valid. Please recheck.</source>
- <translation type="unfinished">La dirección de envío no es válida. Por favor revísela.</translation>
+ <translation type="unfinished">La dirección del destinatario no es válida. Revísala.</translation>
</message>
<message>
<source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">El importe a pagar debe ser mayor que 0.</translation>
+ <translation type="unfinished">El importe por pagar tiene que ser mayor que 0.</translation>
</message>
<message>
<source>The amount exceeds your balance.</source>
- <translation type="unfinished">El importe sobrepasa su saldo.</translation>
+ <translation type="unfinished">El importe sobrepasa el saldo.</translation>
</message>
<message>
<source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation type="unfinished">El total sobrepasa su saldo cuando se incluye la comisión de envío de %1.</translation>
+ <translation type="unfinished">El total sobrepasa el saldo cuando se incluye la comisión de transacción de %1.</translation>
</message>
<message>
<source>Duplicate address found: addresses should only be used once each.</source>
- <translation type="unfinished">Dirección duplicada encontrada: las direcciones sólo deben ser utilizadas una vez.</translation>
+ <translation type="unfinished">Se encontró una dirección duplicada: las direcciones solo se deben usar una vez.</translation>
</message>
<message>
<source>Transaction creation failed!</source>
@@ -3185,22 +3211,22 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation type="unfinished">Una comisión mayor que %1 se considera como una comisión absurdamente alta.</translation>
+ <translation type="unfinished">Una comisión mayor que %1 se considera absurdamente alta.</translation>
</message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform>Estimado para comenzar confirmación dentro de %n bloque.</numerusform>
- <numerusform>Estimado para comenzar confirmación dentro de %n bloques.</numerusform>
+ <numerusform>Se estima que empiece a confirmarse dentro de %n bloque.</numerusform>
+ <numerusform>Se estima que empiece a confirmarse dentro de %n bloques.</numerusform>
</translation>
</message>
<message>
<source>Warning: Invalid Bitcoin address</source>
- <translation type="unfinished">Alerta: Dirección de Bitcoin no válida</translation>
+ <translation type="unfinished">Advertencia: Dirección de Bitcoin no válida</translation>
</message>
<message>
<source>Warning: Unknown change address</source>
- <translation type="unfinished">Alerta: Dirección de cambio desconocida</translation>
+ <translation type="unfinished">Advertencia: Dirección de cambio desconocida</translation>
</message>
<message>
<source>Confirm custom change address</source>
@@ -3208,7 +3234,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
- <translation type="unfinished">La dirección que ha seleccionado para el cambio no es parte de su monedero. Parte o todos sus fondos pueden ser enviados a esta dirección. ¿Está seguro?</translation>
+ <translation type="unfinished">La dirección que seleccionaste para el cambio no es parte de este monedero. Una parte o la totalidad de los fondos en el monedero se enviará a esta dirección. ¿Seguro deseas continuar?</translation>
</message>
<message>
<source>(no label)</source>
@@ -3219,7 +3245,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<name>SendCoinsEntry</name>
<message>
<source>A&amp;mount:</source>
- <translation type="unfinished">I&amp;mporte:</translation>
+ <translation type="unfinished">&amp;Importe:</translation>
</message>
<message>
<source>Pay &amp;To:</source>
@@ -3231,11 +3257,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Choose previously used address</source>
- <translation type="unfinished">Escoger una dirección previamente usada</translation>
+ <translation type="unfinished">Escoger una dirección usada anteriormente</translation>
</message>
<message>
<source>The Bitcoin address to send the payment to</source>
- <translation type="unfinished">Dirección Bitcoin a la que se enviará el pago</translation>
+ <translation type="unfinished">La dirección de Bitcoin a la que se enviará el pago</translation>
</message>
<message>
<source>Paste address from clipboard</source>
@@ -3243,19 +3269,19 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Remove this entry</source>
- <translation type="unfinished">Quita este apunte</translation>
+ <translation type="unfinished">Eliminar esta entrada</translation>
</message>
<message>
<source>The amount to send in the selected unit</source>
- <translation type="unfinished">El importe a enviar en la unidad seleccionada</translation>
+ <translation type="unfinished">El importe que se enviará en la unidad seleccionada</translation>
</message>
<message>
<source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
- <translation type="unfinished">La comisión será deducida de la cantidad enviada. El destinatario recibirá menos bitcoins que la cantidad introducida en el campo Importe. Si hay varios destinatarios seleccionados, la comisión será distribuida a partes iguales.</translation>
+ <translation type="unfinished">La comisión se deducirá del monto del envío. El destinatario recibirá menos bitcoins que los que ingreses en el campo de cantidad. Si se seleccionan varios destinatarios, la comisión se divide por igual.</translation>
</message>
<message>
<source>S&amp;ubtract fee from amount</source>
- <translation type="unfinished">S&amp;ustraer comisión del importe</translation>
+ <translation type="unfinished">&amp;Sustraer la comisión del importe</translation>
</message>
<message>
<source>Use available balance</source>
@@ -3267,11 +3293,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Enter a label for this address to add it to the list of used addresses</source>
- <translation type="unfinished">Introduce una etiqueta para esta dirección para añadirla al listado de direcciones utilizadas</translation>
+ <translation type="unfinished">Ingresar una etiqueta para esta dirección a fin de agregarla a la lista de direcciones utilizadas</translation>
</message>
<message>
<source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
- <translation type="unfinished">Mensaje que se agregara al URI de Bitcoin, el cual será almacenado con la transacción para su referencia. Nota: este mensaje no será enviado a través de la red de Bitcoin.</translation>
+ <translation type="unfinished">Un mensaje adjunto al URI de tipo "bitcoin:" que se almacenará con la transacción a modo de referencia. Nota: Este mensaje no se enviará por la red de Bitcoin.</translation>
</message>
</context>
<context>
@@ -3289,7 +3315,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<name>SignVerifyMessageDialog</name>
<message>
<source>Signatures - Sign / Verify a Message</source>
- <translation type="unfinished">Firmas - Firmar / verificar un mensaje</translation>
+ <translation type="unfinished">Firmas: firmar o verificar un mensaje</translation>
</message>
<message>
<source>&amp;Sign Message</source>
@@ -3297,15 +3323,15 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Puedes firmar los mensajes con tus direcciones para demostrar que las posees. Ten cuidado de no firmar cualquier cosa vaga, ya que los ataques de phishing pueden tratar de engañarte firmando tu identidad a través de ellos. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
+ <translation type="unfinished">Puedes firmar mensajes o acuerdos con tus direcciones para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
- <translation type="unfinished">La dirección Bitcoin con la que se firmó el mensaje</translation>
+ <translation type="unfinished">La dirección de Bitcoin con la que se firmará el mensaje</translation>
</message>
<message>
<source>Choose previously used address</source>
- <translation type="unfinished">Escoger una dirección previamente usada</translation>
+ <translation type="unfinished">Escoger una dirección usada anteriormente</translation>
</message>
<message>
<source>Paste address from clipboard</source>
@@ -3321,11 +3347,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Copy the current signature to the system clipboard</source>
- <translation type="unfinished">Copia la firma actual al portapapeles del sistema</translation>
+ <translation type="unfinished">Copiar la dirección seleccionada actualmente al portapapeles del sistema</translation>
</message>
<message>
<source>Sign the message to prove you own this Bitcoin address</source>
- <translation type="unfinished">Firma un mensaje para demostrar que se posee una dirección Bitcoin</translation>
+ <translation type="unfinished">Firmar el mensaje para demostrar que esta dirección de Bitcoin te pertenece</translation>
</message>
<message>
<source>Sign &amp;Message</source>
@@ -3333,11 +3359,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Reset all sign message fields</source>
- <translation type="unfinished">Vacía todos los campos de la firma de mensaje</translation>
+ <translation type="unfinished">Restablecer todos los campos de firma de mensaje</translation>
</message>
<message>
<source>Clear &amp;All</source>
- <translation type="unfinished">Vaciar &amp;todo</translation>
+ <translation type="unfinished">Borrar &amp;todo</translation>
</message>
<message>
<source>&amp;Verify Message</source>
@@ -3345,11 +3371,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
- <translation type="unfinished">Introduzca la dirección para la firma, el mensaje (asegurándose de copiar tal cual los saltos de línea, espacios, tabulaciones, etc.) y la firma a continuación para verificar el mensaje. Tenga cuidado de no asumir más información de lo que dice el propio mensaje firmado para evitar fraudes basados en ataques de tipo man-in-the-middle. Tenga en cuenta que esto solo prueba que la parte firmante recibe con esta dirección, ¡no puede probar el envío de ninguna transacción!</translation>
+ <translation type="unfinished">Ingresa la dirección del destinatario, el mensaje (recuerda copiar los saltos de línea, espacios, tabulaciones, etc. con exactitud) y la firma a continuación para verificar el mensaje. Ten cuidado de no leer en la firma más de lo que contiene el propio mensaje firmado, para evitar ser víctima de un engaño por ataque de intermediario. Ten en cuenta que esto solo prueba que la parte firmante recibe con esta dirección; no puede demostrar la condición de remitente de ninguna transacción.</translation>
</message>
<message>
<source>The Bitcoin address the message was signed with</source>
- <translation type="unfinished">Dirección Bitcoin con la que firmar el mensaje</translation>
+ <translation type="unfinished">La dirección de Bitcoin con la que se firmó el mensaje</translation>
</message>
<message>
<source>The signed message to verify</source>
@@ -3361,7 +3387,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
- <translation type="unfinished">Verifique el mensaje para comprobar que fue firmado con la dirección Bitcoin indicada</translation>
+ <translation type="unfinished">Verifica el mensaje para asegurarte de que se firmó con la dirección de Bitcoin especificada.</translation>
</message>
<message>
<source>Verify &amp;Message</source>
@@ -3369,19 +3395,19 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Reset all verify message fields</source>
- <translation type="unfinished">Vacía todos los campos de la verificación de mensaje</translation>
+ <translation type="unfinished">Restablecer todos los campos de verificación de mensaje</translation>
</message>
<message>
<source>Click "Sign Message" to generate signature</source>
- <translation type="unfinished">Pulse «Firmar mensaje» para generar la firma</translation>
+ <translation type="unfinished">Hacer clic en "Firmar mensaje" para generar una firma</translation>
</message>
<message>
<source>The entered address is invalid.</source>
- <translation type="unfinished">La dirección introducida no es válida</translation>
+ <translation type="unfinished">La dirección introducida no es válida.</translation>
</message>
<message>
<source>Please check the address and try again.</source>
- <translation type="unfinished">Revise la dirección e inténtelo nuevamente.</translation>
+ <translation type="unfinished">Revisa la dirección e intenta de nuevo.</translation>
</message>
<message>
<source>The entered address does not refer to a key.</source>
@@ -3401,7 +3427,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Message signing failed.</source>
- <translation type="unfinished">Error de firma del mensaje.</translation>
+ <translation type="unfinished">Error al firmar el mensaje.</translation>
</message>
<message>
<source>Message signed.</source>
@@ -3413,15 +3439,15 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Please check the signature and try again.</source>
- <translation type="unfinished">Por favor, compruebe la firma e inténtelo de nuevo.</translation>
+ <translation type="unfinished">Comprueba la firma e intenta de nuevo.</translation>
</message>
<message>
<source>The signature did not match the message digest.</source>
- <translation type="unfinished">La firma no coincide con el resumen del mensaje.</translation>
+ <translation type="unfinished">La firma no coincide con la síntesis del mensaje.</translation>
</message>
<message>
<source>Message verification failed.</source>
- <translation type="unfinished">Verificación errónea del mensaje.</translation>
+ <translation type="unfinished">Error al verificar el mensaje.</translation>
</message>
<message>
<source>Message verified.</source>
@@ -3436,7 +3462,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>press q to shutdown</source>
- <translation type="unfinished">pulse q para apagar</translation>
+ <translation type="unfinished">Presionar q para apagar </translation>
</message>
</context>
<context>
@@ -3449,12 +3475,12 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<message>
<source>0/unconfirmed, in memory pool</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
- <translation type="unfinished">0/sin confirmar, en la memoria compartida</translation>
+ <translation type="unfinished">0/sin confirmar, en el pool de memoria</translation>
</message>
<message>
<source>0/unconfirmed, not in memory pool</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
- <translation type="unfinished">0/sin confirmar, no en la memoria compartida</translation>
+ <translation type="unfinished">0/sin confirmar, no está en el pool de memoria</translation>
</message>
<message>
<source>abandoned</source>
@@ -3489,7 +3515,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>From</source>
- <translation type="unfinished">Remite</translation>
+ <translation type="unfinished">De</translation>
</message>
<message>
<source>unknown</source>
@@ -3497,15 +3523,15 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>To</source>
- <translation type="unfinished">Destino</translation>
+ <translation type="unfinished">A</translation>
</message>
<message>
<source>own address</source>
- <translation type="unfinished">mi dirección</translation>
+ <translation type="unfinished">dirección propia</translation>
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">Solo observación</translation>
+ <translation type="unfinished">Solo de observación</translation>
</message>
<message>
<source>label</source>
@@ -3518,8 +3544,8 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform>disponible en %n bloque</numerusform>
- <numerusform>disponible en %n bloques</numerusform>
+ <numerusform>madura en %n bloque más</numerusform>
+ <numerusform>madura en %n bloques más</numerusform>
</translation>
</message>
<message>
@@ -3540,7 +3566,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Transaction fee</source>
- <translation type="unfinished">Comisión por transacción.</translation>
+ <translation type="unfinished">Comisión de transacción</translation>
</message>
<message>
<source>Net amount</source>
@@ -3556,23 +3582,23 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Transaction ID</source>
- <translation type="unfinished">ID transacción</translation>
+ <translation type="unfinished">ID de transacción</translation>
</message>
<message>
<source>Transaction total size</source>
- <translation type="unfinished">Tamaño total transacción</translation>
+ <translation type="unfinished">Tamaño total de transacción</translation>
</message>
<message>
<source>Transaction virtual size</source>
- <translation type="unfinished">Tamaño virtual transacción</translation>
+ <translation type="unfinished">Tamaño virtual de transacción</translation>
</message>
<message>
<source>Output index</source>
<translation type="unfinished">Índice de salida</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished"> (No se ha verificado el certificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3580,7 +3606,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
- <translation type="unfinished">Las monedas generadas deben madurar %1 bloques antes de que puedan ser gastadas. Una vez que generas este bloque, es propagado por la red para ser añadido a la cadena de bloques. Si falla el intento de añadirse en la cadena, su estado cambiará a «no aceptado» y ya no se puede gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque a los pocos segundos del tuyo.</translation>
+ <translation type="unfinished">Las monedas generadas deben madurar %1 bloques antes de que se puedan gastar. Cuando generaste este bloque, se transmitió a la red para agregarlo a la cadena de bloques. Si no logra entrar a la cadena, su estado cambiará a "no aceptado" y no se podrá gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque a pocos segundos del tuyo.</translation>
</message>
<message>
<source>Debug information</source>
@@ -3654,7 +3680,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Immature (%1 confirmations, will be available after %2)</source>
- <translation type="unfinished">No disponible (%1 confirmaciones, disponible después de %2)</translation>
+ <translation type="unfinished">Inmadura (%1 confirmaciones; estará disponibles después de %2)</translation>
</message>
<message>
<source>Generated but not accepted</source>
@@ -3678,7 +3704,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">Solo observación</translation>
+ <translation type="unfinished">Solo de observación</translation>
+ </message>
+ <message>
+ <source>(n/a)</source>
+ <translation type="unfinished">(n/d)</translation>
</message>
<message>
<source>(no label)</source>
@@ -3686,11 +3716,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation type="unfinished">Estado de transacción. Pasa el ratón sobre este campo para ver el número de confirmaciones.</translation>
+ <translation type="unfinished">Estado de la transacción. Pasa el ratón sobre este campo para ver el número de confirmaciones.</translation>
</message>
<message>
<source>Date and time that the transaction was received.</source>
- <translation type="unfinished">Fecha y hora cuando se recibió la transacción.</translation>
+ <translation type="unfinished">Fecha y hora en las que se recibió la transacción.</translation>
</message>
<message>
<source>Type of transaction.</source>
@@ -3698,15 +3728,15 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation type="unfinished">Si una dirección de solo observación está involucrada en esta transacción o no.</translation>
+ <translation type="unfinished">Si una dirección solo de observación está involucrada en esta transacción o no.</translation>
</message>
<message>
<source>User-defined intent/purpose of the transaction.</source>
- <translation type="unfinished">Descripción de la transacción definida por el usuario.</translation>
+ <translation type="unfinished">Intención o propósito de la transacción definidos por el usuario.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
- <translation type="unfinished">Importe sustraído o añadido al balance.</translation>
+ <translation type="unfinished">Importe restado del saldo o sumado a este.</translation>
</message>
</context>
<context>
@@ -3753,7 +3783,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Enter address, transaction id, or label to search</source>
- <translation type="unfinished">Introduzca dirección, id de transacción o etiqueta a buscar</translation>
+ <translation type="unfinished">Ingresar la dirección, el identificador de transacción o la etiqueta para buscar</translation>
</message>
<message>
<source>Min amount</source>
@@ -3781,7 +3811,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Copy &amp;raw transaction</source>
- <translation type="unfinished">Copiar transacción en c&amp;rudo</translation>
+ <translation type="unfinished">Copiar transacción &amp;sin procesar</translation>
</message>
<message>
<source>Copy full transaction &amp;details</source>
@@ -3797,7 +3827,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>A&amp;bandon transaction</source>
- <translation type="unfinished">A&amp;bandonar transacción</translation>
+ <translation type="unfinished">&amp;Abandonar transacción</translation>
</message>
<message>
<source>&amp;Edit address label</source>
@@ -3823,7 +3853,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Watch-only</source>
- <translation type="unfinished">Solo observación</translation>
+ <translation type="unfinished">Solo de observación</translation>
</message>
<message>
<source>Date</source>
@@ -3843,11 +3873,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Error al Exportar!</translation>
+ <translation type="unfinished">Error al exportar</translation>
</message>
<message>
<source>There was an error trying to save the transaction history to %1.</source>
- <translation type="unfinished">Ha habido un error al intentar guardar en el histórico la transacción con %1.</translation>
+ <translation type="unfinished">Ocurrió un error al intentar guardar el historial de transacciones en %1.</translation>
</message>
<message>
<source>Exporting Successful</source>
@@ -3873,7 +3903,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
Go to File &gt; Open Wallet to load a wallet.
- OR -</source>
<translation type="unfinished">No se ha cargado ningún monedero.
-Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
+Ve a "Archivo &gt; Abrir monedero" para cargar uno.
- O -</translation>
</message>
<message>
@@ -3882,7 +3912,7 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Unable to decode PSBT from clipboard (invalid base64)</source>
- <translation type="unfinished">No se puede decodificar TBPF desde el portapapeles (inválido base64)</translation>
+ <translation type="unfinished">No se puede decodificar la TBPF desde el portapapeles (Base64 inválida)</translation>
</message>
<message>
<source>Load Transaction Data</source>
@@ -3890,15 +3920,15 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Partially Signed Transaction (*.psbt)</source>
- <translation type="unfinished">Transacción firmada de manera parcial (*.psbt)</translation>
+ <translation type="unfinished">Transacción parcialmente firmada (*.psbt)</translation>
</message>
<message>
<source>PSBT file must be smaller than 100 MiB</source>
- <translation type="unfinished">El archivo PSBT debe ser más pequeño de 100 MiB</translation>
+ <translation type="unfinished">El archivo TBPF debe ser más pequeño de 100 MiB</translation>
</message>
<message>
<source>Unable to decode PSBT</source>
- <translation type="unfinished">No es posible descodificar PSBT</translation>
+ <translation type="unfinished">No es posible descodificar la TBPF</translation>
</message>
</context>
<context>
@@ -3918,7 +3948,7 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
<message>
<source>Do you want to increase the fee?</source>
<extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
- <translation type="unfinished">¿Desea incrementar la comisión?</translation>
+ <translation type="unfinished">¿Deseas incrementar la comisión?</translation>
</message>
<message>
<source>Current fee:</source>
@@ -3934,7 +3964,7 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy.</source>
- <translation type="unfinished">Advertencia: Esto puede pagar la comisión adicional al reducir el cambio de salidas o agregar entradas, cuando sea necesario. Puede agregar una nueva salida de cambio si aún no existe. Potencialmente estos cambios pueden comprometer la privacidad.</translation>
+ <translation type="unfinished">Advertencia: Esta acción puede pagar la comisión adicional al reducir las salidas de cambio o agregar entradas, cuando sea necesario. Asimismo, puede agregar una nueva salida de cambio si aún no existe una. Estos cambios pueden filtrar potencialmente información privada.</translation>
</message>
<message>
<source>Confirm fee bump</source>
@@ -3946,7 +3976,7 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>PSBT copied</source>
- <translation type="unfinished">PSBT copiado </translation>
+ <translation type="unfinished">TBPF copiada </translation>
</message>
<message>
<source>Copied to clipboard</source>
@@ -3982,7 +4012,7 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Backup Wallet</source>
- <translation type="unfinished">Respaldar Monedero</translation>
+ <translation type="unfinished">Respaldar monedero</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -3991,11 +4021,11 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Backup Failed</source>
- <translation type="unfinished">Respaldo Erróneo</translation>
+ <translation type="unfinished">Error de respaldo</translation>
</message>
<message>
<source>There was an error trying to save the wallet data to %1.</source>
- <translation type="unfinished">Ha habido un error al intentar guardar los datos del monedero a %1.</translation>
+ <translation type="unfinished">Ha habido un error al intentar guardar los datos del monedero en %1.</translation>
</message>
<message>
<source>Backup Successful</source>
@@ -4018,211 +4048,211 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
- <translation type="unfinished">%s corrupto. Intenta utilizar la herramienta del monedero bitcoin-monedero para guardar o restaurar un respaldo.</translation>
+ <translation type="unfinished">%s corrupto. Intenta utilizar la herramienta del monedero de Bitcoin para rescatar o restaurar una copia de seguridad.</translation>
</message>
<message>
<source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea no válida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Comunique este incidente a %s, indicando cómo obtuvo la instantánea. Se dejó el estado de encadenamiento de la instantánea no válida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
+ <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea inválida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Reporta este incidente a %s, indicando cómo obtuviste la instantánea. Se dejó el estado de cadena de la instantánea inválida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
</message>
<message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
- <translation type="unfinished">%ssolicitud para escuchar en el puerto%u. Este puerto se considera «malo» y, por lo tanto, es poco probable que alguna pareja se conecte a él. Consulte doc/p2p-bad-ports.md para obtener detalles y un listado completo.</translation>
+ <translation type="unfinished">%s solicitud para escuchar en el puerto %u. Este puerto se considera "malo" y, por lo tanto, es poco probable que algún par se conecte a él. Consulta doc/p2p-bad-ports.md para obtener detalles y una lista completa.</translation>
</message>
<message>
<source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
- <translation type="unfinished">No se pudo cambiar la versión %i a la versión anterior %i. Versión del monedero sin cambios.</translation>
+ <translation type="unfinished">No se puede pasar de la versión %i a la versión anterior %i. La versión del monedero no tiene cambios.</translation>
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">No se puede bloquear el directorio %s. %s probablemente ya se está ejecutando.</translation>
+ <translation type="unfinished">No se puede bloquear el directorio de datos %s. %s probablemente ya se está ejecutando.</translation>
</message>
<message>
<source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
- <translation type="unfinished">No se puede actualizar un monedero no dividido en HD de la versión %i a la versión %i sin actualizar para admitir el grupo de claves pre-desglosado. Emplee la versión %i o ninguna versión especificada.</translation>
+ <translation type="unfinished">No se puede actualizar un monedero dividido no HD de la versión %i a la versión %i sin actualizar, para admitir el pool de claves anterior a la división. Usa la versión %i o no especifiques la versión.</translation>
</message>
<message>
<source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
- <translation type="unfinished">Es posible que el espacio en disco%s no se adapte a los archivos de bloque. Aproximadamente %uGB de datos se almacenarán en este directorio.</translation>
+ <translation type="unfinished">Es posible que el espacio en disco %s no tenga capacidad para los archivos de bloque. Aproximadamente %u GB de datos se almacenarán en este directorio.</translation>
</message>
<message>
<source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
- <translation type="unfinished">Distribuido bajo la licencia de software MIT, vea el archivo adjunto %s o %s</translation>
+ <translation type="unfinished">Distribuido bajo la licencia de software MIT; ver el archivo adjunto %s o %s.</translation>
</message>
<message>
<source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
- <translation type="unfinished">Error al cargar el monedero. El monedero requiere que se descarguen bloques, y el software actualmente no admite la carga de monederos mientras los bloques se descargan desordenadamente cuando se usan instantáneas de assumeutxo. El monedero debería poder cargarse correctamente después de que la sincronización del nodo alcance la altura %s</translation>
+ <translation type="unfinished">Error al cargar el monedero. Este requiere que se descarguen bloques, y el software actualmente no admite la carga de monederos mientras los bloques se descargan fuera de orden, cuando se usan instantáneas de assumeutxo. El monedero debería poder cargarse correctamente después de que la sincronización del nodo alcance la altura %s.</translation>
</message>
<message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
- <translation type="unfinished">¡Error de lectura %s! Los datos de la transacción pueden faltar o ser incorrectos. Re-analice el monedero.</translation>
+ <translation type="unfinished">¡Error al leer %s! Es probable que falten los datos de la transacción o que sean incorrectos. Rescaneando monedero.</translation>
</message>
<message>
<source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
- <translation type="unfinished">Error: el formato del registro del archivo de volcado es incorrecto. Se obtuvo «%s», se esperaba «formato».</translation>
+ <translation type="unfinished">Error: El registro del formato del archivo de volcado es incorrecto. Se obtuvo "%s", mientras que se esperaba "formato".</translation>
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">Error: el registro del identificador del archivo de volcado es incorrecto. Se obtuvo «%s» pero se esperaba «%s».</translation>
+ <translation type="unfinished">Error: El registro del identificador del archivo de volcado es incorrecto. Se obtuvo "%s", mientras que se esperaba "%s".</translation>
</message>
<message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
- <translation type="unfinished">Error: la versión del archivo volcado no es compatible. Esta versión de monedero bitcoin solo admite archivos de volcado de la versión 1. Consigue volcado de fichero con la versión %s</translation>
+ <translation type="unfinished">Error: la versión del archivo volcado no es compatible. Esta versión del monedero de Bitcoin solo admite archivos de volcado de la versión 1. Se obtuvo un archivo de volcado con la versión %s.</translation>
</message>
<message>
<source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
- <translation type="unfinished">Error: Los monederos heredados solo admiten los tipos de dirección «legacy», «p2sh-segwit» y «bech32»</translation>
+ <translation type="unfinished">Error: los monederos heredados solo admiten los tipos de dirección "legacy", "p2sh-segwit" y "bech32".</translation>
</message>
<message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
- <translation type="unfinished">Error: no se pueden producir descriptores para este monedero Legacy. Asegúrese de proporcionar la contraseña del monedero si está cifrado.</translation>
+ <translation type="unfinished">Error: No se pueden producir descriptores para este monedero tipo "legacy". Asegúrate de proporcionar la frase de contraseña del monedero si está encriptada.</translation>
</message>
<message>
<source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
- <translation type="unfinished">El archivo %s ya existe. Si está seguro que esto es lo que quiere, muévalo primero fuera del lugar.</translation>
+ <translation type="unfinished">El archivo %s ya existe. Si definitivamente quieres hacerlo, quítalo primero.</translation>
</message>
<message>
<source>Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start.</source>
- <translation type="unfinished">Archivo peers.dat no válido o corrupto (%s). Si cree que se trata de un error, infórmelo a %s. Como alternativa, puede mover el archivo (%s) (renombrarlo, moverlo o eliminarlo) para que se cree uno nuevo al siguiente inicio.</translation>
+ <translation type="unfinished">Archivo peers.dat inválido o corrupto (%s). Si crees que se trata de un error, infórmalo a %s. Como alternativa, puedes quitar el archivo %s (renombrarlo, moverlo o eliminarlo) para que se cree uno nuevo en el siguiente inicio.</translation>
</message>
<message>
<source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
- <translation type="unfinished">Se proporciona más de una dirección de enlace onion. Utilizando %s para el servicio onion de Tor creado automáticamente.</translation>
+ <translation type="unfinished">Se proporciona más de una dirección de enlace onion. Se está usando %s para el servicio onion de Tor creado automáticamente.</translation>
</message>
<message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">No se ha proporcionado ningún archivo de volcado. Para usar createfromdump, se debe proporcionar -dumpfile=&lt;filename&gt;.</translation>
+ <translation type="unfinished">No se proporcionó ningún archivo de volcado. Para usar createfromdump, se debe proporcionar -dumpfile=&lt;filename&gt;.</translation>
</message>
<message>
<source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">No se ha proporcionado ningún archivo de volcado. Para usar el volcado, debe proporcionarse -dumpfile=&lt;filename&gt;.</translation>
+ <translation type="unfinished">No se proporcionó ningún archivo de volcado. Para usar createfromdump, se debe proporcionar -dumpfile=&lt;filename&gt;.</translation>
</message>
<message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
- <translation type="unfinished">Ningún archivo de formato monedero facilitado. Para usar createfromdump, -format=&lt;format&gt;debe ser facilitado.</translation>
+ <translation type="unfinished">No se ha proporcionado el formato de archivo del monedero. Para usar createfromdump, se debe proporcionar -format=&lt;format&gt;.</translation>
</message>
<message>
<source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">¡Por favor, compruebe si la fecha y hora en su equipo son correctas! Si su reloj está mal, %s no funcionará correctamente.</translation>
+ <translation type="unfinished">Verifica que la fecha y hora del equipo sean correctas. Si el reloj está mal configurado, %s no funcionará correctamente.</translation>
</message>
<message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
- <translation type="unfinished">Contribuya si encuentra %s de utilidad. Visite %s para más información acerca del programa.</translation>
+ <translation type="unfinished">Contribuye si te parece que %s es útil. Visita %s para obtener más información sobre el software.</translation>
</message>
<message>
<source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
- <translation type="unfinished">La poda se ha configurado por debajo del mínimo de %d MiB. Por favor utiliza un valor mas alto.</translation>
+ <translation type="unfinished">La poda se configuró por debajo del mínimo de %d MiB. Usa un valor más alto.</translation>
</message>
<message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
- <translation type="unfinished">El modo poda no es compatible con -reindex-chainstate. Haga uso de un -reindex completo en su lugar.</translation>
+ <translation type="unfinished">El modo de poda es incompatible con -reindex-chainstate. Usa en su lugar un -reindex completo.</translation>
</message>
<message>
<source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
- <translation type="unfinished">Poda: la última sincronización del monedero sobrepasa los datos podados. Necesita reindexar con -reindex (o descargar la cadena de bloques de nuevo en el caso de un nodo podado)</translation>
+ <translation type="unfinished">Poda: la última sincronización del monedero sobrepasa los datos podados. Tienes que ejecutar -reindex (descarga toda la cadena de bloques de nuevo en caso de tener un nodo podado).</translation>
</message>
<message>
<source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
- <translation type="unfinished">Error de renombrado de «%s» → «%s». Debería resolver esto manualmente moviendo o borrando el directorio %s de la instantánea no válida, en otro caso encontrará el mismo error de nuevo en el arranque siguiente.</translation>
+ <translation type="unfinished">Error al cambiar el nombre de "%s" a "%s". Para resolverlo, mueve o elimina manualmente el directorio %s de la instantánea no válida. De lo contrario, encontrarás el mismo error de nuevo en el siguiente inicio.</translation>
</message>
<message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
- <translation type="unfinished">SQLiteDatabase: versión del esquema de la monedero sqlite desconocido %d. Sólo version %d se admite</translation>
+ <translation type="unfinished">SQLiteDatabase: versión desconocida del esquema del monedero sqlite %d. Solo se admite la versión %d</translation>
</message>
<message>
<source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
- <translation type="unfinished">La base de datos de bloques contiene un bloque que parece ser del futuro. Esto puede ser porque la fecha y hora de su equipo están mal ajustados. Reconstruya la base de datos de bloques solo si está seguro de que la fecha y hora de su equipo están ajustadas correctamente.</translation>
+ <translation type="unfinished">La base de datos de bloques contiene un bloque que parece ser del futuro. Es posible que se deba a que la fecha y hora del equipo están mal configuradas. Reconstruye la base de datos de bloques solo si tienes la certeza de que la fecha y hora del equipo son correctas.</translation>
</message>
<message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
- <translation type="unfinished">Importe de transacción muy pequeño después de la deducción de la comisión</translation>
+ <translation type="unfinished">El importe de la transacción es demasiado pequeño para enviarlo después de deducir la comisión.</translation>
</message>
<message>
<source>This error could occur if this wallet was not shutdown cleanly and was last loaded using a build with a newer version of Berkeley DB. If so, please use the software that last loaded this wallet</source>
- <translation type="unfinished">Este error podría ocurrir si el monedero no fuese apagado correctamente y fuese cargado usando una compilación con una versión más nueva de Berkeley DB. Si es así, utilice el software que cargó por última vez este monedero.</translation>
+ <translation type="unfinished">Este error podría ocurrir si el monedero no se cerró correctamente y se cargó por última vez usando una compilación con una versión más reciente de Berkeley DB. Si es así, usa el software que cargó por última vez este monedero.</translation>
</message>
<message>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
- <translation type="unfinished">Esta es una versión de pre-prueba - utilícela bajo su propio riesgo. No la utilice para usos comerciales o de minería.</translation>
+ <translation type="unfinished">Esta es una compilación preliminar de prueba. Úsala bajo tu propia responsabilidad. No la uses para aplicaciones comerciales o de minería.</translation>
</message>
<message>
<source>This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
- <translation type="unfinished">Esta es la máxima tarifa de transacción que pagas (en adicional a la tarifa normal de transacción) para primordialmente evitar gastar un sobrecosto.</translation>
+ <translation type="unfinished">Esta es la comisión máxima de transacción que pagas (además de la comisión normal) para priorizar la elusión del gasto parcial sobre la selección regular de monedas.</translation>
</message>
<message>
<source>This is the transaction fee you may discard if change is smaller than dust at this level</source>
- <translation type="unfinished">Esta es la comisión de transacción que puede descartar si el cambio es más pequeño que el polvo a este nivel.</translation>
+ <translation type="unfinished">Esta es la comisión de transacción que puedes descartar si el cambio es más pequeño que el remanente en este nivel.</translation>
</message>
<message>
<source>This is the transaction fee you may pay when fee estimates are not available.</source>
- <translation type="unfinished">Esta es la comisión por transacción que deberá pagar cuando la estimación de comisión no esté disponible.</translation>
+ <translation type="unfinished">Esta es la comisión de transacción que puedes pagar cuando los cálculos de comisiones no estén disponibles.</translation>
</message>
<message>
<source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
- <translation type="unfinished">La longitud total de la cadena de versión de red ( %i ) supera la longitud máxima ( %i ) . Reducir el número o tamaño de uacomments .</translation>
+ <translation type="unfinished">La longitud total de la cadena de versión de red (%i) supera la longitud máxima (%i). Reduce el número o tamaño de uacomments .</translation>
</message>
<message>
<source>Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate.</source>
- <translation type="unfinished">No se ha podido reproducir los bloques. Deberá reconstruir la base de datos utilizando -reindex-chainstate.</translation>
+ <translation type="unfinished">No se pueden reproducir bloques. Tendrás que reconstruir la base de datos usando -reindex-chainstate.</translation>
</message>
<message>
<source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
- <translation type="unfinished">Formato de monedero desconocido «%s» proporcionado. Por favor, proporcione uno de «bdb» o «sqlite».</translation>
+ <translation type="unfinished">Se proporcionó un formato de monedero desconocido "%s". Proporciona uno entre "bdb" o "sqlite".</translation>
</message>
<message>
<source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
- <translation type="unfinished">Nivel de boletín del acceso especificado en categoría no mantenida en %1$s=%2$s. Se esperaba %1$s=&lt;category&gt;:&lt;loglevel&gt;. Categorías válidas: %3$s. Niveles de boletín válidos: %4 $s.</translation>
+ <translation type="unfinished">El nivel de registro de la categoría específica no es compatible: %1$s=%2$s. Se esperaba %1$s=&lt;category&gt;:&lt;loglevel&gt;. Categorías válidas: %3$s. Niveles de registro válidos: %4 $s.</translation>
</message>
<message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
- <translation type="unfinished">Formato de la base de datos chainstate encontrado. Por favor reinicia con -reindex-chainstate. Esto reconstruirá la base de datos chainstate.</translation>
+ <translation type="unfinished">El formato de la base de datos chainstate es incompatible. Reinicia con -reindex-chainstate para reconstruir la base de datos chainstate.</translation>
</message>
<message>
<source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
- <translation type="unfinished">Monedero creado satisfactoriamente. El tipo de monedero «Heredado» está descontinuado y la asistencia para crear y abrir monederos «heredada» será eliminada en el futuro.</translation>
+ <translation type="unfinished">El monedero se creó correctamente. El tipo de monedero "legacy" se está descontinuando, por lo que la asistencia para crear y abrir estos monederos se eliminará en el futuro.</translation>
</message>
<message>
<source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
- <translation type="unfinished">Monedero correctamente cargado. El tipo de billetero heredado está siendo obsoleto y mantenimiento para creación de monederos heredados serán eliminados en el futuro. Los monederos heredados pueden ser migrados a un descriptor de monedero con migratewallet.</translation>
+ <translation type="unfinished">El monedero se cargó correctamente. El tipo de monedero "legacy" se está descontinuando, por lo que la asistencia para crear y abrir estos monederos se eliminará en el futuro. Los monederos tipo "legacy" se pueden migrar a un monedero basado en descriptores con "migratewallet".</translation>
</message>
<message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
- <translation type="unfinished">Aviso: el formato del monedero del archivo de volcado «%s» no coincide con el formato especificado en la línea de comandos «%s».</translation>
+ <translation type="unfinished">Advertencia: El formato del monedero del archivo de volcado "%s" no coincide con el formato especificado en la línea de comandos "%s".</translation>
</message>
<message>
<source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
- <translation type="unfinished">Advertencia: Claves privadas detectadas en el monedero {%s} con claves privadas deshabilitadas</translation>
+ <translation type="unfinished">Advertencia: Claves privadas detectadas en el monedero {%s} con claves privadas deshabilitadas.</translation>
</message>
<message>
<source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
- <translation type="unfinished">Advertencia: ¡No parecemos concordar del todo con nuestras parejas! Puede que necesite actualizarse, o puede que otros nodos necesiten actualizarse.</translation>
+ <translation type="unfinished">Advertencia: Al parecer no estamos completamente de acuerdo con nuestros pares. Es posible que tengas que realizar una actualización o que los demás nodos tengan que hacerlo.</translation>
</message>
<message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
- <translation type="unfinished">Hay que validar los datos de los testigos de los bloques después de la altura%d. Por favor, reinicie con -reindex.</translation>
+ <translation type="unfinished">Los datos del testigo para los bloques después de la altura %d requieren validación. Reinicia con -reindex.</translation>
</message>
<message>
<source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
- <translation type="unfinished">Necesita reconstruir la base de datos utilizando -reindex para volver al modo sin poda. Esto volverá a descargar toda la cadena de bloques</translation>
+ <translation type="unfinished">Tienes que reconstruir la base de datos usando -reindex para volver al modo sin poda. Esto volverá a descargar toda la cadena de bloques.</translation>
</message>
<message>
<source>%s is set very high!</source>
- <translation type="unfinished">¡%s está configurado muy alto!</translation>
+ <translation type="unfinished">¡El valor de %s es muy alto!</translation>
</message>
<message>
<source>-maxmempool must be at least %d MB</source>
- <translation type="unfinished">-maxmempool debe ser por lo menos de %d MB</translation>
+ <translation type="unfinished">-maxmempool debe ser por lo menos de %d MB.</translation>
</message>
<message>
<source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Ha ocurrido un error interno grave. Consulte debug.log para más detalles.</translation>
+ <translation type="unfinished">Ocurrió un error interno grave. Consulta debug.log para obtener más información.</translation>
</message>
<message>
<source>Cannot resolve -%s address: '%s'</source>
- <translation type="unfinished">No se puede resolver -%s dirección: '%s'</translation>
+ <translation type="unfinished">No se puede resolver la dirección de -%s: "%s"</translation>
</message>
<message>
<source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
- <translation type="unfinished">No se puede establecer -forcednsseed a true cuando se establece -dnsseed a false.</translation>
+ <translation type="unfinished">No se puede establecer el valor de -forcednsseed con la variable true al establecer el valor de -dnsseed con la variable false.</translation>
</message>
<message>
<source>Cannot set -peerblockfilters without -blockfilterindex.</source>
@@ -4230,7 +4260,7 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">No es posible escribir datos en el directorio '%s'; comprueba permisos.</translation>
+ <translation type="unfinished">No se puede escribir en el directorio de datos "%s"; comprueba los permisos.</translation>
</message>
<message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
@@ -4238,19 +4268,19 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
- <translation type="unfinished">No se puede proporcionar conexiones específicas y hacer que addrman encuentre conexiones salientes a la vez.</translation>
+ <translation type="unfinished">No se pueden proporcionar conexiones específicas y hacer que addrman encuentre conexiones salientes al mismo tiempo.</translation>
</message>
<message>
<source>Error loading %s: External signer wallet being loaded without external signer support compiled</source>
- <translation type="unfinished">Error de carga %s: se está cargando el monedero del firmante externo sin que se haya compilado el soporte del firmante externo</translation>
+ <translation type="unfinished">Error al cargar %s: Se está cargando el monedero del firmante externo sin que se haya compilado la compatibilidad del firmante externo.</translation>
</message>
<message>
<source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
- <translation type="unfinished">Error leyendo %s! Todas las teclas leídas correctamente, pero los datos de transacción o metadatos de dirección puedan estar ausentes o sean incorrectos.</translation>
+ <translation type="unfinished">Error al leer %s. Todas las claves se leyeron correctamente, pero es probable que falten los datos de la transacción o metadatos de direcciones, o bien que sean incorrectos.</translation>
</message>
<message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Error: los datos de la libreta de direcciones en el monedero no se identifican como pertenecientes a monederos migrados</translation>
+ <translation type="unfinished">Error: No se puede identificar si los datos de la libreta de direcciones en el monedero pertenecen a monederos migrados.</translation>
</message>
<message>
<source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
@@ -4258,7 +4288,7 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Error: La transacción %s del monedero no se puede identificar como perteneciente a monederos migrados</translation>
+ <translation type="unfinished">Error: No se puede identificar si la transacción %s en el monedero pertenece a monederos migrados.</translation>
</message>
<message>
<source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
@@ -4266,47 +4296,47 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
- <translation type="unfinished">No se ha podido cambiar el nombre del archivo peers.dat. Por favor, muévalo o elimínelo e inténtelo de nuevo.</translation>
+ <translation type="unfinished">No se pudo cambiar el nombre del archivo peers.dat inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
</message>
<message>
<source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
- <translation type="unfinished">Error al calcular la comisión. La opción «fallbackfee» está desactivada. Espera algunos bloques o activa %s.</translation>
+ <translation type="unfinished">Error al calcular la comisión. La opción "fallbackfee" está desactivada. Espera algunos bloques o activa %s.</translation>
</message>
<message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
- <translation type="unfinished">Opciones incompatibles: -dnsseed=1 se especificó explícitamente, pero -onlynet impide conexiones a IPv4/IPv6</translation>
+ <translation type="unfinished">Opciones incompatibles: -dnsseed=1 se especificó explícitamente, pero -onlynet prohíbe conexiones a IPv4/IPv6.</translation>
</message>
<message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
- <translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: '%s' (debe ser al menos la comisión mínima de retransmisión de %s para evitar transacciones atascadas)</translation>
+ <translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%s" (debe ser al menos la comisión mínima de retransmisión de %s para evitar transacciones atascadas)</translation>
</message>
<message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
- <translation type="unfinished">Conexiones salientes restringidas a CJDNS (-onlynet=cjdns) pero no se proporciona -cjdnsreachable</translation>
+ <translation type="unfinished">Las conexiones salientes están restringidas a CJDNS (-onlynet=cjdns), pero no se proporciona -cjdnsreachable.</translation>
</message>
<message>
<source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is explicitly forbidden: -onion=0</source>
- <translation type="unfinished">Conexiones salientes restringidas a Tor (-onlynet=onion) pero el proxy para alcanzar la red Tor está explícitamente prohibido: -onion=0</translation>
+ <translation type="unfinished">Las conexiones salientes están restringidas a Tor (-onlynet=onion), pero el proxy para conectarse con la red Tor está explícitamente prohibido: -onion=0.</translation>
</message>
<message>
<source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is not provided: none of -proxy, -onion or -listenonion is given</source>
- <translation type="unfinished">Conexiones salientes restringidas a Tor (-onlynet=onion) pero no se proporciona el proxy para alcanzar la red Tor: no se indica ninguna de las opciones -proxy, -onion, o -listenonion </translation>
+ <translation type="unfinished">Las conexiones salientes están restringidas a Tor (-onlynet=onion), pero no se proporciona el proxy para conectarse con la red Tor: no se indican -proxy, -onion ni -listenonion.</translation>
</message>
<message>
<source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
- <translation type="unfinished">Conexiones salientes restringidas a i2p (-onlynet=i2p) pero no se proporciona -i2psam</translation>
+ <translation type="unfinished">Las conexiones salientes están restringidas a i2p (-onlynet=i2p), pero no se proporciona -i2psam.</translation>
</message>
<message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
- <translation type="unfinished">El tamaño de las entradas supera el peso máximo. Intente enviar una cantidad menor o consolidar manualmente los UTXO de su monedero</translation>
+ <translation type="unfinished">El tamaño de las entradas supera el peso máximo. Intenta enviar un importe menor o consolidar manualmente las UTXO del monedero.</translation>
</message>
<message>
<source>The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
- <translation type="unfinished">La cantidad total de monedas preseleccionadas no cubre el total de la transacción. Permita que otras entradas se seleccionen automáticamente o incluya más monedas manualmente</translation>
+ <translation type="unfinished">El importe total de las monedas preseleccionadas no cubre la meta de la transacción. Permite que se seleccionen automáticamente otras entradas o incluye más monedas manualmente.</translation>
</message>
<message>
<source>Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
- <translation type="unfinished">La transacción requiere un destino de valor distinto de -0, una tasa de comisión distinta de -0, o una entrada preseleccionada</translation>
+ <translation type="unfinished">La transacción requiere un destino de valor distinto de cero, una tasa de comisión distinta de cero, o una entrada preseleccionada.</translation>
</message>
<message>
<source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
@@ -4314,14 +4344,14 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">Las UTXO sin confirmar están disponibles, pero si se gastan, se crea una cadena de transacciones que rechazará la compartición de memoria.</translation>
+ <translation type="unfinished">Las UTXO sin confirmar están disponibles, pero si se gastan, se crea una cadena de transacciones que rechazará la mempool.</translation>
</message>
<message>
<source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
The wallet might have been tampered with or created with malicious intent.
</source>
- <translation type="unfinished">Se encontró una entrada heredada inesperada en la billetera del descriptor. Cargando monedero%s
+ <translation type="unfinished">Se encontró una entrada inesperada tipo "legacy" en el monedero basado en descriptores. Cargando monedero %s
Es posible que el monedero haya sido manipulado o creado con malas intenciones.
</translation>
@@ -4332,47 +4362,47 @@ Es posible que el monedero haya sido manipulado o creado con malas intenciones.
The wallet might had been created on a newer version.
Please try running the latest software version.
</source>
- <translation type="unfinished">Se encontró un descriptor desconocido. Cargando monedero %s
+ <translation type="unfinished">Se encontró un descriptor desconocido. Cargando monedero %s.
-El monedero puede haber sido creado con una versión más nueva.
-Por favor intenta ejecutar la última versión del software.
+El monedero se podría haber creado con una versión más reciente.
+Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
-No es posible vaciar la migración errónea</translation>
+No se puede limpiar la migración fallida</translation>
</message>
<message>
<source>
Unable to restore backup of wallet.</source>
<translation type="unfinished">
-No es posible restaurar el respaldo del monedero.</translation>
+No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Block verification was interrupted</source>
- <translation type="unfinished">La verificación del bloque fue interrumpida</translation>
+ <translation type="unfinished">Se interrumpió la verificación de bloques</translation>
</message>
<message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
- <translation type="unfinished">Los ajustes de configuración para %s solo aplicados en la red %s cuando se encuentra en la sección [%s].</translation>
+ <translation type="unfinished">La configuración para %s solo se aplica en la red %s cuando se encuentra en la sección [%s].</translation>
</message>
<message>
<source>Copyright (C) %i-%i</source>
- <translation type="unfinished">©%i-%i</translation>
+ <translation type="unfinished">Derechos de autor (C) %i-%i</translation>
</message>
<message>
<source>Corrupted block database detected</source>
- <translation type="unfinished">Corrupción de base de datos de bloques detectada.</translation>
+ <translation type="unfinished">Se detectó que la base de datos de bloques está dañada.</translation>
</message>
<message>
<source>Could not find asmap file %s</source>
- <translation type="unfinished">No se pudo encontrar el archivo AS Map %s</translation>
+ <translation type="unfinished">No se pudo encontrar el archivo asmap %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
- <translation type="unfinished">No se pudo analizar el archivo AS Map %s</translation>
+ <translation type="unfinished">No se pudo analizar el archivo asmap %s</translation>
</message>
<message>
<source>Disk space is too low!</source>
@@ -4391,6 +4421,10 @@ No es posible restaurar el respaldo del monedero.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al confirmar transacción de la base de datos para eliminar transacciones del monedero</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error al crear %s</translation>
</message>
@@ -4404,27 +4438,27 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>Error loading %s</source>
- <translation type="unfinished">Error cargando %s</translation>
+ <translation type="unfinished">Error al cargar %s</translation>
</message>
<message>
<source>Error loading %s: Private keys can only be disabled during creation</source>
- <translation type="unfinished">Error cargando %s: Las claves privadas solo pueden ser deshabilitadas durante la creación.</translation>
+ <translation type="unfinished">Error al cargar %s: Las claves privadas solo se pueden deshabilitar durante la creación.</translation>
</message>
<message>
<source>Error loading %s: Wallet corrupted</source>
- <translation type="unfinished">Error cargando %s: Monedero corrupto</translation>
+ <translation type="unfinished">Error al cargar %s: monedero dañado.</translation>
</message>
<message>
<source>Error loading %s: Wallet requires newer version of %s</source>
- <translation type="unfinished">Error cargando %s: Monedero requiere una versión mas reciente de %s</translation>
+ <translation type="unfinished">Error al cargar %s: el monedero requiere una versión más reciente de %s.</translation>
</message>
<message>
<source>Error loading block database</source>
- <translation type="unfinished">Error cargando bloque de la base de datos</translation>
+ <translation type="unfinished">Error al cargar la base de datos de bloques</translation>
</message>
<message>
<source>Error opening block database</source>
- <translation type="unfinished">Error al abrir bloque de la base de datos</translation>
+ <translation type="unfinished">Error al abrir la base de datos de bloques</translation>
</message>
<message>
<source>Error reading configuration file: %s</source>
@@ -4432,23 +4466,19 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>Error reading from database, shutting down.</source>
- <translation type="unfinished">Error al leer la base de datos, cerrando aplicación.</translation>
+ <translation type="unfinished">Error al leer la base de datos. Se cerrará la aplicación.</translation>
</message>
<message>
<source>Error reading next record from wallet database</source>
<translation type="unfinished">Error al leer el siguiente registro de la base de datos del monedero</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al iniciar transacción de la base de datos para eliminar transacciones del monedero</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Error: No se puede añadir la transacción de observación al monedero de observación</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Error: No se pueden eliminar las transacciones de observación</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Error: No se puede extraer el destino del scriptpubkey generado</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4456,47 +4486,43 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>Error: Disk space is low for %s</source>
- <translation type="unfinished">Error: Espacio en disco bajo por %s</translation>
+ <translation type="unfinished">Error: El espacio en disco es pequeño para %s</translation>
</message>
<message>
<source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
- <translation type="unfinished">Error: La suma de comprobación del archivo de volcado no coincide. Calculada%s, prevista%s</translation>
+ <translation type="unfinished">Error: La suma de comprobación del archivo de volcado no coincide. Calculada:%s; prevista:%s.</translation>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Error: No se puede crear un monedero de observación</translation>
+ <translation type="unfinished">Error: No se puede crear un monedero solo de observación</translation>
</message>
<message>
<source>Error: Got key that was not hex: %s</source>
- <translation type="unfinished">Error: Se recibió una clave que no es hex: %s</translation>
+ <translation type="unfinished">Error: Se recibió una clave que no es hexadecimal (%s)</translation>
</message>
<message>
<source>Error: Got value that was not hex: %s</source>
- <translation type="unfinished">Error: Se recibió un valor que no es hex: %s</translation>
+ <translation type="unfinished">Error: Se recibió un valor que no es hexadecimal (%s)</translation>
</message>
<message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
- <translation type="unfinished">Error: Keypool se ha agotado, por favor, invoque keypoolrefill primero</translation>
+ <translation type="unfinished">Error: El pool de claves se agotó. Invoca keypoolrefill primero.</translation>
</message>
<message>
<source>Error: Missing checksum</source>
- <translation type="unfinished">Error: No se ha encontrado suma de comprobación</translation>
+ <translation type="unfinished">Error: Falta la suma de comprobación</translation>
</message>
<message>
<source>Error: No %s addresses available.</source>
<translation type="unfinished">Error: No hay direcciones %s disponibles .</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Error: No se pueden eliminar todas las transacciones de observación</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Error: Este monedero ya usa SQLite</translation>
</message>
<message>
<source>Error: This wallet is already a descriptor wallet</source>
- <translation type="unfinished">Error: Este monedero ya es un monedero descriptor</translation>
+ <translation type="unfinished">Error: Este monedero ya es un monedero basado en descriptores</translation>
</message>
<message>
<source>Error: Unable to begin reading all records in the database</source>
@@ -4504,47 +4530,71 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">Error: No es posible realizar el respaldo de tu monedero</translation>
+ <translation type="unfinished">Error: No es posible realizar el respaldo del monedero</translation>
</message>
<message>
<source>Error: Unable to parse version %u as a uint32_t</source>
- <translation type="unfinished">Error: No se ha podido analizar la versión %ucomo uint32_t</translation>
+ <translation type="unfinished">Error: No se ha podido analizar la versión %u como uint32_t</translation>
</message>
<message>
<source>Error: Unable to read all records in the database</source>
<translation type="unfinished">Error: No es posible leer todos los registros en la base de datos</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Error: No se ha podido leer el registro del mejor localizador de bloques del monedero</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">Error: No es posible eliminar los datos de la libreta de direcciones de observación</translation>
+ <translation type="unfinished">Error: No es posible eliminar los datos de la libreta de direcciones solo de observación</translation>
</message>
<message>
<source>Error: Unable to write record to new wallet</source>
- <translation type="unfinished">Error: No se pudo escribir el registro en el nuevo monedero</translation>
+ <translation type="unfinished">Error: No se puede escribir el registro en el nuevo monedero</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Error: No se ha podido escribir el registro del mejor localizador de bloques del monedero solucionable</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Error: No se ha podido escribir el registro del mejor localizador de bloques del monedero solo de observación</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para el monedero %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para el monedero %s</translation>
</message>
<message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation type="unfinished">Ha fallado la escucha en todos los puertos. Usa -listen=0 si deseas esto.</translation>
+ <translation type="unfinished">Fallo al escuchar en todos los puertos. Usa -listen=0 si quieres hacerlo.</translation>
</message>
<message>
<source>Failed to rescan the wallet during initialization</source>
- <translation type="unfinished">Error al volver a analizar el monedero durante el inicio</translation>
+ <translation type="unfinished">Error al rescanear el monedero durante la inicialización</translation>
</message>
<message>
<source>Failed to start indexes, shutting down..</source>
- <translation type="unfinished">Error al iniciar indizados, se apaga...</translation>
+ <translation type="unfinished">Error al iniciar índices, cerrando...</translation>
</message>
<message>
<source>Failed to verify database</source>
- <translation type="unfinished">No se ha podido verificar la base de datos</translation>
+ <translation type="unfinished">Fallo al verificar la base de datos</translation>
+ </message>
+ <message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Error al eliminar la transacción: %s</translation>
</message>
<message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
- <translation type="unfinished">La proporción de comisión (%s) es menor que la proporción mínima de comisión (%s)</translation>
+ <translation type="unfinished">La tasa de comisión (%s) es menor que el valor mínimo (%s)</translation>
</message>
<message>
<source>Ignoring duplicate -wallet %s.</source>
- <translation type="unfinished">No hacer caso de duplicado -wallet %s</translation>
+ <translation type="unfinished">Ignorar duplicación de -wallet %s.</translation>
</message>
<message>
<source>Importing…</source>
@@ -4552,11 +4602,11 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation type="unfinished">Bloque de génesis no encontrado o incorrecto. ¿datadir equivocada para la red?</translation>
+ <translation type="unfinished">El bloque génesis es incorrecto o no se encontró. ¿El directorio de datos es incorrecto para la red?</translation>
</message>
<message>
<source>Initialization sanity check failed. %s is shutting down.</source>
- <translation type="unfinished">La inicialización de la verificación de validez falló. Se está cerrando %s.</translation>
+ <translation type="unfinished">Fallo al inicializar la comprobación de estado. %s se cerrará.</translation>
</message>
<message>
<source>Input not found or already spent</source>
@@ -4564,7 +4614,7 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>Insufficient dbcache for block verification</source>
- <translation type="unfinished">dbcache insuficiente para la verificación de bloques</translation>
+ <translation type="unfinished">Insuficiente dbcache para la verificación de bloques</translation>
</message>
<message>
<source>Insufficient funds</source>
@@ -4572,47 +4622,47 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>Invalid -i2psam address or hostname: '%s'</source>
- <translation type="unfinished">Dirección de -i2psam o dominio '%s' no válido</translation>
+ <translation type="unfinished">Dirección o nombre de host de -i2psam inválido: "%s" </translation>
</message>
<message>
<source>Invalid -onion address or hostname: '%s'</source>
- <translation type="unfinished">Dirección -onion o nombre hospedado: '%s' no válido</translation>
+ <translation type="unfinished">Dirección o nombre de host de -onion inválido: "%s"</translation>
</message>
<message>
<source>Invalid -proxy address or hostname: '%s'</source>
- <translation type="unfinished">Dirección -proxy o nombre hospedado: '%s' no válido</translation>
+ <translation type="unfinished">Dirección o nombre de host de -proxy inválido: "%s"</translation>
</message>
<message>
<source>Invalid P2P permission: '%s'</source>
- <translation type="unfinished">Permiso P2P: '%s' inválido</translation>
+ <translation type="unfinished">Permiso P2P inválido: "%s"</translation>
</message>
<message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
- <translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: '%s' (debe ser por lo menos %s)</translation>
+ <translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%s" (debe ser por lo menos %s)</translation>
</message>
<message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: '%s'</translation>
+ <translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%s"</translation>
</message>
<message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">Importe para -%s=&lt;amount&gt;: '%s' inválido</translation>
+ <translation type="unfinished">Importe inválido para -%s=&lt;amount&gt;: "%s"</translation>
</message>
<message>
<source>Invalid netmask specified in -whitelist: '%s'</source>
- <translation type="unfinished">Máscara de red especificada en -whitelist: '%s' inválida</translation>
+ <translation type="unfinished">Máscara de red inválida especificada en -whitelist: "%s"</translation>
</message>
<message>
<source>Invalid port specified in %s: '%s'</source>
- <translation type="unfinished">Puerto no válido especificado en%s: '%s'</translation>
+ <translation type="unfinished">Puerto no válido especificado en %s: "%s"</translation>
</message>
<message>
<source>Invalid pre-selected input %s</source>
- <translation type="unfinished">Entrada preseleccionada no válida %s</translation>
+ <translation type="unfinished">La entrada preseleccionada no es válida %s</translation>
</message>
<message>
<source>Listening for incoming connections failed (listen returned error %s)</source>
- <translation type="unfinished">La escucha para conexiones entrantes falló (la escucha devolvió el error %s)</translation>
+ <translation type="unfinished">Fallo en la escucha para conexiones entrantes (la escucha devolvió el error %s)</translation>
</message>
<message>
<source>Loading P2P addresses…</source>
@@ -4624,7 +4674,7 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>Loading block index…</source>
- <translation type="unfinished">Cargando el índice de bloques...</translation>
+ <translation type="unfinished">Cargando índice de bloques...</translation>
</message>
<message>
<source>Loading wallet…</source>
@@ -4632,19 +4682,19 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>Missing amount</source>
- <translation type="unfinished">Importe faltante</translation>
+ <translation type="unfinished">Falta el importe</translation>
</message>
<message>
<source>Missing solving data for estimating transaction size</source>
- <translation type="unfinished">Faltan datos de resolución para estimar el tamaño de las transacciones</translation>
+ <translation type="unfinished">Faltan datos de resolución para estimar el tamaño de la transacción</translation>
</message>
<message>
<source>Need to specify a port with -whitebind: '%s'</source>
- <translation type="unfinished">Necesita especificar un puerto con -whitebind: '%s'</translation>
+ <translation type="unfinished">Se necesita especificar un puerto con -whitebind: "%s"</translation>
</message>
<message>
<source>No addresses available</source>
- <translation type="unfinished">Sin direcciones disponibles</translation>
+ <translation type="unfinished">No hay direcciones disponibles</translation>
</message>
<message>
<source>Not enough file descriptors available.</source>
@@ -4652,11 +4702,11 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>Not found pre-selected input %s</source>
- <translation type="unfinished">Entrada preseleccionada no encontrada%s</translation>
+ <translation type="unfinished">La entrada preseleccionada no se encontró %s</translation>
</message>
<message>
<source>Not solvable pre-selected input %s</source>
- <translation type="unfinished">Entrada preseleccionada no solucionable %s</translation>
+ <translation type="unfinished">La entrada preseleccionada no se puede solucionar %s</translation>
</message>
<message>
<source>Prune cannot be configured with a negative value.</source>
@@ -4668,7 +4718,7 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>Pruning blockstore…</source>
- <translation type="unfinished">Podando almacén de bloques…</translation>
+ <translation type="unfinished">Podando almacenamiento de bloques…</translation>
</message>
<message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
@@ -4680,59 +4730,59 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>Rescanning…</source>
- <translation type="unfinished">Volviendo a analizar...</translation>
+ <translation type="unfinished">Rescaneando...</translation>
</message>
<message>
<source>SQLiteDatabase: Failed to execute statement to verify database: %s</source>
- <translation type="unfinished">SQLiteDatabase: Fallado para ejecutar declaración para verificar base de datos: %s</translation>
+ <translation type="unfinished">SQLiteDatabase: Fallo al ejecutar la instrucción para verificar la base de datos: %s</translation>
</message>
<message>
<source>SQLiteDatabase: Failed to prepare statement to verify database: %s</source>
- <translation type="unfinished">SQLiteDatabase: Fallado para preparar declaración para verificar base de datos: %s</translation>
+ <translation type="unfinished">SQLiteDatabase: Fallo al preparar la instrucción para verificar la base de datos (%s)</translation>
</message>
<message>
<source>SQLiteDatabase: Failed to read database verification error: %s</source>
- <translation type="unfinished">SQLiteDatabase: Error al leer la verificación de la base de datos: %s</translation>
+ <translation type="unfinished">SQLiteDatabase: Fallo al leer el error de verificación de la base de datos (%s)</translation>
</message>
<message>
<source>SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
- <translation type="unfinished">SQLiteDatabase: id aplicación inesperada. Esperado %u, tiene %u</translation>
+ <translation type="unfinished">SQLiteDatabase: Identificador de aplicación inesperado. Se esperaba %u; se recibió %u.</translation>
</message>
<message>
<source>Section [%s] is not recognized.</source>
- <translation type="unfinished">Sección [%s] no reconocida.</translation>
+ <translation type="unfinished">La sección [%s] no se reconoce.</translation>
</message>
<message>
<source>Signing transaction failed</source>
- <translation type="unfinished">Firma de transacción errónea</translation>
+ <translation type="unfinished">Fallo al firmar la transacción</translation>
</message>
<message>
<source>Specified -walletdir "%s" does not exist</source>
- <translation type="unfinished">No existe -walletdir "%s" especificada</translation>
+ <translation type="unfinished">El valor especificado de -walletdir "%s" no existe</translation>
</message>
<message>
<source>Specified -walletdir "%s" is a relative path</source>
- <translation type="unfinished">Ruta relativa para -walletdir "%s" especificada</translation>
+ <translation type="unfinished">El valor especificado de -walletdir "%s" es una ruta relativa</translation>
</message>
<message>
<source>Specified -walletdir "%s" is not a directory</source>
- <translation type="unfinished">No existe directorio para -walletdir "%s" especificada</translation>
+ <translation type="unfinished">El valor especificado de -walletdir "%s" no es un directorio</translation>
</message>
<message>
<source>Specified blocks directory "%s" does not exist.</source>
- <translation type="unfinished">No existe directorio de bloques "%s" especificado.</translation>
+ <translation type="unfinished">El directorio de bloques especificado "%s" no existe.</translation>
</message>
<message>
<source>Specified data directory "%s" does not exist.</source>
- <translation type="unfinished">El directorio de datos especificado «%s» no existe.</translation>
+ <translation type="unfinished">El directorio de datos especificado "%s" no existe.</translation>
</message>
<message>
<source>Starting network threads…</source>
- <translation type="unfinished">Iniciando procesos de red...</translation>
+ <translation type="unfinished">Iniciando subprocesos de red...</translation>
</message>
<message>
<source>The source code is available from %s.</source>
- <translation type="unfinished">El código fuente esta disponible desde %s.</translation>
+ <translation type="unfinished">El código fuente está disponible en %s.</translation>
</message>
<message>
<source>The specified config file %s does not exist</source>
@@ -4744,7 +4794,7 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>The wallet will avoid paying less than the minimum relay fee.</source>
- <translation type="unfinished">El monedero evitará pagar menos de la comisión mínima de retransmisión. </translation>
+ <translation type="unfinished">El monedero evitará pagar menos que la comisión mínima de retransmisión. </translation>
</message>
<message>
<source>This is experimental software.</source>
@@ -4752,31 +4802,31 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>This is the minimum transaction fee you pay on every transaction.</source>
- <translation type="unfinished">Esta es la comisión mínima que pagarás en cada transacción.</translation>
+ <translation type="unfinished">Esta es la comisión mínima que pagas en cada transacción.</translation>
</message>
<message>
<source>This is the transaction fee you will pay if you send a transaction.</source>
- <translation type="unfinished">Esta es la comisión por transacción a pagar si realiza una transacción.</translation>
+ <translation type="unfinished">Esta es la comisión que pagarás si envías una transacción.</translation>
+ </message>
+ <message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transacción %s no pertenece a este monedero</translation>
</message>
<message>
<source>Transaction amount too small</source>
- <translation type="unfinished">Importe de la transacción muy pequeño</translation>
+ <translation type="unfinished">El importe de la transacción es demasiado pequeño</translation>
</message>
<message>
<source>Transaction amounts must not be negative</source>
- <translation type="unfinished">Los importes de la transacción no deben ser negativos</translation>
+ <translation type="unfinished">Los importes de la transacción no pueden ser negativos</translation>
</message>
<message>
<source>Transaction change output index out of range</source>
- <translation type="unfinished">Índice de salida de cambio de transacción fuera de intervalo</translation>
- </message>
- <message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transacción lleva largo tiempo en la memoria compartida</translation>
+ <translation type="unfinished">El índice de salidas de cambio de transacciones está fuera de alcance</translation>
</message>
<message>
<source>Transaction must have at least one recipient</source>
- <translation type="unfinished">La transacción debe tener al menos un destinatario</translation>
+ <translation type="unfinished">La transacción debe incluir al menos un destinatario</translation>
</message>
<message>
<source>Transaction needs a change address, but we can't generate it.</source>
@@ -4788,87 +4838,99 @@ No es posible restaurar el respaldo del monedero.</translation>
</message>
<message>
<source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">No se ha podido reservar memoria para -maxsigcachesize: '%s' MiB</translation>
+ <translation type="unfinished">No se puede asignar memoria para -maxsigcachesize: "%s" MiB</translation>
</message>
<message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
- <translation type="unfinished">No es posible conectar con %s en este sistema (bind ha devuelto el error %s)</translation>
+ <translation type="unfinished">No se puede establecer un enlace a %s en este equipo (bind devolvió el error %s)</translation>
</message>
<message>
<source>Unable to bind to %s on this computer. %s is probably already running.</source>
- <translation type="unfinished">No se ha podido conectar con %s en este equipo. %s es posible que esté todavía en ejecución.</translation>
+ <translation type="unfinished">No se puede establecer un enlace a %s en este equipo. Es posible que %s ya esté en ejecución.</translation>
</message>
<message>
<source>Unable to create the PID file '%s': %s</source>
- <translation type="unfinished">No es posible crear el fichero PID '%s': %s</translation>
+ <translation type="unfinished">No se puede crear el archivo PID "%s": %s</translation>
</message>
<message>
<source>Unable to find UTXO for external input</source>
- <translation type="unfinished">No se encuentra UTXO para entrada externa</translation>
+ <translation type="unfinished">No se puede encontrar UTXO para la entrada externa</translation>
</message>
<message>
<source>Unable to generate initial keys</source>
- <translation type="unfinished">No es posible generar las claves iniciales</translation>
+ <translation type="unfinished">No se pueden generar las claves iniciales</translation>
</message>
<message>
<source>Unable to generate keys</source>
- <translation type="unfinished">No es posible generar claves</translation>
+ <translation type="unfinished">No se pueden generar claves</translation>
</message>
<message>
<source>Unable to open %s for writing</source>
- <translation type="unfinished">No se ha podido abrir %s para escribir</translation>
+ <translation type="unfinished">No se puede abrir %s para escribir</translation>
</message>
<message>
<source>Unable to parse -maxuploadtarget: '%s'</source>
- <translation type="unfinished">No se ha podido analizar -maxuploadtarget: '%s'</translation>
+ <translation type="unfinished">No se ha podido analizar -maxuploadtarget: "%s"</translation>
</message>
<message>
<source>Unable to start HTTP server. See debug log for details.</source>
- <translation type="unfinished">No se ha podido iniciar el servidor HTTP. Ver registro de depuración para detalles.</translation>
+ <translation type="unfinished">No se ha podido iniciar el servidor HTTP. Ver registro de depuración para obtener detalles.</translation>
</message>
<message>
<source>Unable to unload the wallet before migrating</source>
- <translation type="unfinished">Fallo al descargar el monedero antes de la migración</translation>
+ <translation type="unfinished">No se puede descargar el monedero antes de la migración</translation>
</message>
<message>
<source>Unknown -blockfilterindex value %s.</source>
- <translation type="unfinished">Valor -blockfilterindex %s desconocido.</translation>
+ <translation type="unfinished">Se desconoce el valor de -blockfilterindex %s.</translation>
</message>
<message>
<source>Unknown address type '%s'</source>
- <translation type="unfinished">Tipo de dirección '%s' desconocida</translation>
+ <translation type="unfinished">Se desconoce el tipo de dirección "%s"</translation>
</message>
<message>
<source>Unknown change type '%s'</source>
- <translation type="unfinished">Tipo de cambio '%s' desconocido</translation>
+ <translation type="unfinished">Se desconoce el tipo de cambio "%s"</translation>
</message>
<message>
<source>Unknown network specified in -onlynet: '%s'</source>
- <translation type="unfinished">Red especificada en -onlynet: '%s' desconocida</translation>
+ <translation type="unfinished">Se desconoce la red especificada en -onlynet: "%s"</translation>
</message>
<message>
<source>Unknown new rules activated (versionbit %i)</source>
- <translation type="unfinished">Nuevas reglas desconocidas activadas (versionbit %i)</translation>
+ <translation type="unfinished">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
<source>Unsupported global logging level %s=%s. Valid values: %s.</source>
- <translation type="unfinished">Nivel de acceso global %s = %s no mantenido. Los valores válidos son: %s.</translation>
+ <translation type="unfinished">El nivel de registro global %s=%s no es compatible. Valores válidos: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Error al crear el archivo del monedero: %s</translation>
</message>
<message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
- <translation type="unfinished">acceptstalefeeestimates no está mantenido en el encadenamiento %s.</translation>
+ <translation type="unfinished">acceptstalefeeestimates no se admite en la cadena %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
- <translation type="unfinished">Categoría de registro no soportada %s=%s. </translation>
+ <translation type="unfinished">La categoría de registro no es compatible %s=%s. </translation>
+ </message>
+ <message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Error: No se puede añadir la transacción solo de observación %s al monedero solo de observación</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Error: No se pueden eliminar las transacciones solo de observación</translation>
</message>
<message>
<source>User Agent comment (%s) contains unsafe characters.</source>
- <translation type="unfinished">El comentario del Agente de Usuario (%s) contiene caracteres inseguros.</translation>
+ <translation type="unfinished">El comentario del agente de usuario (%s) contiene caracteres inseguros.</translation>
</message>
<message>
<source>Verifying blocks…</source>
- <translation type="unfinished">Verificando bloques...</translation>
+ <translation type="unfinished">Verificando bloques…</translation>
</message>
<message>
<source>Verifying wallet(s)…</source>
diff --git a/src/qt/locale/bitcoin_es_CL.ts b/src/qt/locale/bitcoin_es_CL.ts
index e409cee992..0f4dda3755 100644
--- a/src/qt/locale/bitcoin_es_CL.ts
+++ b/src/qt/locale/bitcoin_es_CL.ts
@@ -10,6 +10,10 @@
<translation type="unfinished">&amp;Nuevo</translation>
</message>
<message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation type="unfinished">Copiar la dirección actualmente seleccionada al sistema de portapapeles</translation>
+ </message>
+ <message>
<source>&amp;Copy</source>
<translation type="unfinished">&amp;Copiar</translation>
</message>
@@ -34,6 +38,10 @@
<translation type="unfinished">&amp;Exportar</translation>
</message>
<message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Borrar</translation>
+ </message>
+ <message>
<source>Choose the address to send coins to</source>
<translation type="unfinished">Elija la dirección para enviar las monedas</translation>
</message>
@@ -280,6 +288,14 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">desconocido</translation>
</message>
<message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizada...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Cantidad</translation>
</message>
@@ -1043,12 +1059,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Los scripts solo de lectura se migraron a una nueva billetera llamada "%1".</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Guiones vigilantes han sido migrados a un monedero con el nombre '%1'.</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Los scripts solucionables pero no de lectura se migraron a una nueva billetera llamada "%1".</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Solucionable pero ninguno de los guiones vigilados han sido migrados a un monedero llamados '%1'.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1481,6 +1497,10 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Minimice en lugar de salir de la aplicación cuando la ventana esté cerrada. Cuando esta opción está habilitada, la aplicación se cerrará solo después de seleccionar Salir en el menú.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Las opciones establecidas en este diálogo serán anuladas por la línea de comandos:</translation>
</message>
@@ -1693,18 +1713,6 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Usar un proxy SOCKS&amp;5 independiente para comunicarse con pares a través de los servicios onion de Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fuente monoespaciada en la pestaña de vista general:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">"%1" insertado</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">"%1" con la coincidencia más aproximada</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
@@ -1930,8 +1938,8 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">PSBT guardada en en el disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Envía %1 a %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envía %1 a %2</translation>
</message>
<message>
<source>own address</source>
@@ -2500,6 +2508,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Ejecutar comando sin monedero</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Ventana de nodo - [%1]</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2935,10 +2947,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Crea una transacción de Bitcoin parcialmente firmada (PSBT) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">desde la billetera '%1'</translation>
- </message>
- <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 a %2</translation>
</message>
@@ -2987,6 +2995,10 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Puedes aumentar la comisión después (indica "Reemplazar-por-comisión", BIP-125).</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 desde monedero '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">¿Quieres crear esta transacción?</translation>
@@ -3439,8 +3451,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Indice de salida</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(No se verificó el certificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4247,6 +4259,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error al crear %s</translation>
</message>
@@ -4295,16 +4311,12 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error al leer el siguiente registro de la base de datos de la billetera</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción solo de observación a la billetera respectiva</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al iniciar db txn para eliminar transacciones de billetera</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Error: No se pudo eliminar las transacciones solo de observación</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4343,10 +4355,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No hay direcciones %s disponibles.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Error: No se pudo eliminar todas las transacciones solo de observación</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Error: Esta billetera ya usa SQLite</translation>
</message>
@@ -4371,6 +4379,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se pueden leer todos los registros en la base de datos</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de leer el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Error: No se pueden eliminar los datos de la libreta de direcciones solo de observación</translation>
</message>
@@ -4379,6 +4391,23 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se puede escribir el registro en la nueva billetera</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor monedero vigilado del bloque del registro localizador</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera 1%s
+ </translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Ha fallado la escucha en todos los puertos. Usa -listen=0 si desea esto.</translation>
</message>
@@ -4395,6 +4424,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">La tasa de comisión (%s) es menor que el valor mínimo (%s)</translation>
</message>
@@ -4615,6 +4648,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Impuesto por transacción a pagar si envías una transacción.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transacción %s no pertenece a esta billetera</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Monto a transferir muy pequeño</translation>
</message>
@@ -4627,10 +4664,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Índice de salidas de cambio de transacciones fuera de alcance</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transacción tiene demasiado tiempo de una cadena de mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transacción debe incluir al menos un destinatario.</translation>
</message>
@@ -4711,6 +4744,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Nivel de acceso global %s = %s no mantenido. Los valores válidos son: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates no está mantenido en el encadenamiento %s.</translation>
</message>
@@ -4719,6 +4756,14 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La categoría de registro no es compatible %s=%s. </translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Error: no pudo agregar tx de solo vigía %s para monedero de solo vigía</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">El comentario del agente de usuario (%s) contiene caracteres inseguros.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_CO.ts b/src/qt/locale/bitcoin_es_CO.ts
index feec32bd77..1451f88104 100644
--- a/src/qt/locale/bitcoin_es_CO.ts
+++ b/src/qt/locale/bitcoin_es_CO.ts
@@ -299,6 +299,14 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">desconocido</translation>
</message>
<message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizada...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Importe</translation>
</message>
@@ -430,7 +438,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Show information about Qt</source>
- <translation type="unfinished">Mostrar Información sobre Qt</translation>
+ <translation type="unfinished">Mostrar información sobre Qt</translation>
</message>
<message>
<source>Modify configuration options for %1</source>
@@ -478,6 +486,10 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">&amp;Recibir</translation>
</message>
<message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">&amp;Opciones…</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet…</source>
<translation type="unfinished">&amp;Encriptar billetera…</translation>
</message>
@@ -511,7 +523,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Cargar PSBT desde archivo...</translation>
+ <translation type="unfinished">&amp;Cargar TBPF desde archivo...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -579,7 +591,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">&amp;Opciones de línea de comando</translation>
+ <translation type="unfinished">&amp;Opciones de línea de comandos</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -622,7 +634,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">Cargar PSBT desde el &amp;portapapeles...</translation>
+ <translation type="unfinished">Cargar TBPF desde el &amp;portapapeles...</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
@@ -784,7 +796,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">No se puede crear una nueva billetera, el software se compiló sin soporte de sqlite (requerido para billeteras descriptivas)</translation>
+ <translation type="unfinished">No se puede crear una billetera nueva, ya que el software se compiló sin compatibilidad con sqlite (requerida para billeteras basadas en descriptores)</translation>
</message>
<message>
<source>Warning: %1</source>
@@ -1056,10 +1068,10 @@ If this wallet contains any solvable but not watched scripts, a different and ne
The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
<translation type="unfinished">La migración de la billetera la convertirá en una o más billeteras basadas en descriptores. Será necesario realizar una nueva copia de seguridad de la billetera.
-Si esta billetera contiene scripts solo de lectura, se creará una nueva billetera que los contenga.
-Si esta billetera contiene scripts solucionables pero no de lectura, se creará una nueva billetera diferente que los contenga.
+Si esta billetera contiene scripts solo de observación, se creará una nueva billetera que los contenga.
+Si esta billetera contiene scripts solucionables pero no de observación, se creará una nueva billetera diferente que los contenga.
-El proceso de migración creará una copia de seguridad de la billetera antes de proceder. Este archivo de copia de seguridad se llamará &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak y se encontrará en el directorio de esta billetera. En caso de que la migración falle, se puede restaurar la copia de seguridad con la funcionalidad "Restore Wallet" (Restaurar billetera).</translation>
+El proceso de migración creará una copia de seguridad de la billetera antes de proceder. Este archivo de copia de seguridad se llamará &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak y se encontrará en el directorio de esta billetera. En caso de que la migración falle, se puede restaurar la copia de seguridad con la funcionalidad "Restaurar billetera".</translation>
</message>
<message>
<source>Migrate Wallet</source>
@@ -1074,12 +1086,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Los scripts solo de lectura se migraron a una nueva billetera llamada "%1".</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Guiones vigilantes han sido migrados a un monedero con el nombre '%1'.</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Los scripts solucionables pero no de lectura se migraron a una nueva billetera llamada "%1".</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Solucionable pero ninguno de los guiones vigilados han sido migrados a un monedero llamados '%1'.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1202,7 +1214,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">Desactivar las claves privadas para esta billetera. Las billeteras con claves privadas desactivadas no tendrán claves privadas y no podrán tener ninguna semilla HD ni claves privadas importadas. Esto es ideal para billeteras de solo lectura.</translation>
+ <translation type="unfinished">Desactivar las claves privadas para esta billetera. Las billeteras con claves privadas desactivadas no tendrán claves privadas y no podrán tener ninguna semilla HD ni claves privadas importadas. Esto es ideal para billeteras solo de observación.</translation>
</message>
<message>
<source>Disable Private Keys</source>
@@ -1231,7 +1243,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Compilado sin soporte de firma externa (requerido para la firma externa)</translation>
+ <translation type="unfinished">Compilado sin compatibilidad con firma externa (requerida para la firma externa)</translation>
</message>
</context>
<context>
@@ -1420,7 +1432,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Command-line options</source>
- <translation type="unfinished">Opciones de línea de comando</translation>
+ <translation type="unfinished">Opciones de línea de comandos</translation>
</message>
</context>
<context>
@@ -1431,7 +1443,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">No apagues el equipo hasta que desaparezca esta ventana.</translation>
+ <translation type="unfinished">No apagues la computadora hasta que desaparezca esta ventana.</translation>
</message>
</context>
<context>
@@ -1552,6 +1564,10 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Minimizar en vez de salir de la aplicación cuando la ventana está cerrada. Cuando se activa esta opción, la aplicación solo se cerrará después de seleccionar "Salir" en el menú.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Las opciones establecidas en este diálogo serán anuladas por la línea de comandos:</translation>
</message>
@@ -1640,12 +1656,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
- <translation type="unfinished">Activar controles de &amp;PSBT</translation>
+ <translation type="unfinished">Activar controles de &amp;TBPF</translation>
</message>
<message>
<source>Whether to show PSBT controls.</source>
<extracomment>Tooltip text for options window setting that enables PSBT controls.</extracomment>
- <translation type="unfinished">Si se muestran los controles de PSBT.</translation>
+ <translation type="unfinished">Si se muestran los controles de TBPF.</translation>
</message>
<message>
<source>External Signer (e.g. hardware wallet)</source>
@@ -1768,25 +1784,13 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Usar un proxy SOCKS&amp;5 independiente para comunicarse con pares a través de los servicios onion de Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fuente monoespaciada en la pestaña de vista general:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">"%1" insertado</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">"%1" con la coincidencia más aproximada</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Cancelar</translation>
</message>
<message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Compilado sin soporte de firma externa (requerido para la firma externa)</translation>
+ <translation type="unfinished">Compilado sin compatibilidad con firma externa (requerida para la firma externa)</translation>
</message>
<message>
<source>default</source>
@@ -1866,7 +1870,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Watch-only:</source>
- <translation type="unfinished">Solo lectura:</translation>
+ <translation type="unfinished">Solo de observación:</translation>
</message>
<message>
<source>Available:</source>
@@ -1902,7 +1906,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Your current balance in watch-only addresses</source>
- <translation type="unfinished">Tu saldo actual en direcciones de solo lectura</translation>
+ <translation type="unfinished">Tu saldo actual en direcciones solo de observación</translation>
</message>
<message>
<source>Spendable:</source>
@@ -1914,26 +1918,26 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Unconfirmed transactions to watch-only addresses</source>
- <translation type="unfinished">Transacciones sin confirmar hacia direcciones de solo lectura</translation>
+ <translation type="unfinished">Transacciones sin confirmar hacia direcciones solo de observación</translation>
</message>
<message>
<source>Mined balance in watch-only addresses that has not yet matured</source>
- <translation type="unfinished">Saldo minado en direcciones de solo lectura que aún no ha madurado</translation>
+ <translation type="unfinished">Saldo minado en direcciones solo de observación que aún no ha madurado</translation>
</message>
<message>
<source>Current total balance in watch-only addresses</source>
- <translation type="unfinished">Saldo total actual en direcciones de solo lectura</translation>
+ <translation type="unfinished">Saldo total actual en direcciones solo de observación</translation>
</message>
<message>
<source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
- <translation type="unfinished">Modo de privacidad activado para la pestaña de vista general. Para mostrar los valores, anula la selección de Configuración-&gt;Ocultar valores.</translation>
+ <translation type="unfinished">Modo de privacidad activado para la pestaña de vista general. Para mostrar los valores, anula la selección de "Configuración-&gt;Ocultar valores".</translation>
</message>
</context>
<context>
<name>PSBTOperationsDialog</name>
<message>
<source>PSBT Operations</source>
- <translation type="unfinished">Operaciones PSBT</translation>
+ <translation type="unfinished">Operaciones TBPF</translation>
</message>
<message>
<source>Sign Tx</source>
@@ -1993,7 +1997,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>PSBT copied to clipboard.</source>
- <translation type="unfinished">PSBT copiada al portapapeles.</translation>
+ <translation type="unfinished">TBPF copiada al portapapeles.</translation>
</message>
<message>
<source>Save Transaction Data</source>
@@ -2002,15 +2006,15 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">Transacción firmada parcialmente (binaria) </translation>
+ <translation type="unfinished">Transacción parcialmente firmada (binario) </translation>
</message>
<message>
<source>PSBT saved to disk.</source>
- <translation type="unfinished">PSBT guardada en en el disco.</translation>
+ <translation type="unfinished">TBPF guardada en el disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Envía %1 a %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envía %1 a %2</translation>
</message>
<message>
<source>own address</source>
@@ -2073,7 +2077,7 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
<message>
<source>Cannot start bitcoin: click-to-pay handler</source>
- <translation type="unfinished">No se puede iniciar Bitcoin: controlador de clic para pagar</translation>
+ <translation type="unfinished">No se puede iniciar el controlador "bitcoin: click-to-pay"</translation>
</message>
<message>
<source>URI handling</source>
@@ -2198,7 +2202,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>Client version</source>
- <translation type="unfinished">Versión del Cliente</translation>
+ <translation type="unfinished">Versión del cliente</translation>
</message>
<message>
<source>&amp;Information</source>
@@ -2294,11 +2298,11 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Cadena de identificación de la sesión BIP324 en formato hexadecimal, si existe.</translation>
+ <translation type="unfinished">Cadena de identificador de la sesión BIP324 en formato hexadecimal, si existe.</translation>
</message>
<message>
<source>Session ID</source>
- <translation type="unfinished">Identificación de la sesión</translation>
+ <translation type="unfinished">Identificador de sesión</translation>
</message>
<message>
<source>Version</source>
@@ -2314,7 +2318,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>Starting Block</source>
- <translation type="unfinished">Bloque de inicio</translation>
+ <translation type="unfinished">Bloque inicial</translation>
</message>
<message>
<source>Synced Headers</source>
@@ -2344,17 +2348,17 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<message>
<source>Address Relay</source>
<extracomment>Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">Retransmisión de dirección</translation>
+ <translation type="unfinished">Retransmisión de direcciones</translation>
</message>
<message>
<source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
<extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">El número total de direcciones recibidas desde este par que se procesaron (excluye las direcciones omitidas debido a la limitación de volumen).</translation>
+ <translation type="unfinished">El número total de direcciones recibidas desde este par que se procesaron (excluye las direcciones desestimadas debido a la limitación de volumen).</translation>
</message>
<message>
<source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
<extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">El número total de direcciones recibidas desde este par que se omitieron (no se procesaron) debido a la limitación de volumen.</translation>
+ <translation type="unfinished">El número total de direcciones recibidas desde este par que se desestimaron (no se procesaron) debido a la limitación de volumen.</translation>
</message>
<message>
<source>Addresses Processed</source>
@@ -2364,7 +2368,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<message>
<source>Addresses Rate-Limited</source>
<extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">Direcciones omitidas por limitación de volumen</translation>
+ <translation type="unfinished">Direcciones desestimadas por limitación de volumen</translation>
</message>
<message>
<source>User Agent</source>
@@ -2412,7 +2416,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>High bandwidth BIP152 compact block relay: %1</source>
- <translation type="unfinished">Retransmisión de bloque compacto BIP152 en modo de banda ancha: %1</translation>
+ <translation type="unfinished">Retransmisión de bloques compactos BIP152 en banda ancha: %1</translation>
</message>
<message>
<source>High Bandwidth</source>
@@ -2489,7 +2493,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>Clear console</source>
- <translation type="unfinished">Limpiar consola</translation>
+ <translation type="unfinished">Borrar consola</translation>
</message>
<message>
<source>In:</source>
@@ -2532,7 +2536,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<message>
<source>detecting: peer could be v1 or v2</source>
<extracomment>Explanatory text for "detecting" transport type.</extracomment>
- <translation type="unfinished">detectando: el par puede ser v1 o v2</translation>
+ <translation type="unfinished">Detectando: el par puede ser v1 o v2</translation>
</message>
<message>
<source>v1: unencrypted, plaintext transport protocol</source>
@@ -2588,7 +2592,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>&amp;Unban</source>
- <translation type="unfinished">&amp;Desbloquear</translation>
+ <translation type="unfinished">&amp;Levantar prohibición</translation>
</message>
<message>
<source>Network activity disabled</source>
@@ -2599,6 +2603,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Ejecutar comando sin ninguna billetera</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Ventana de nodo - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Ejecutar comando usando la billetera "%1"</translation>
</message>
@@ -2617,7 +2625,7 @@ Utiliza %3 y %4 para aumentar o disminuir el tamaño de la fuente.
Escribe %5 para ver los comandos disponibles.
Para obtener más información sobre cómo usar esta consola, escribe %6.
-%7 ADVERTENCIA: Los estafadores han estado diciéndoles a los usuarios que escriban comandos aquí para robarles el contenido de sus billeteras. No uses esta consola sin entender completamente las ramificaciones de un comando.%8</translation>
+%7 ADVERTENCIA: Los estafadores suelen decirles a los usuarios que escriban comandos aquí para robarles el contenido de sus billeteras. No uses esta consola sin entender completamente las ramificaciones de un comando.%8</translation>
</message>
<message>
<source>Executing…</source>
@@ -2646,7 +2654,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>Ban for</source>
- <translation type="unfinished">Prohibir para</translation>
+ <translation type="unfinished">Prohibir por</translation>
</message>
<message>
<source>Never</source>
@@ -2689,7 +2697,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
- <translation type="unfinished">Una etiqueta opcional para asociar con la nueva dirección de recepción (utilizada por ti para identificar una factura). También se adjunta a la solicitud de pago.</translation>
+ <translation type="unfinished">Una etiqueta opcional para asociar con la nueva dirección de recepción (puedes usarla para identificar una factura). También se adjunta a la solicitud de pago.</translation>
</message>
<message>
<source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
@@ -2970,7 +2978,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
- <translation type="unfinished">Si la comisión es demasiado baja, es posible que la transacción nunca se confirme (leer la información sobre herramientas).</translation>
+ <translation type="unfinished">Si la comisión es demasiado baja, es posible que la transacción nunca se confirme (leer la información en pantalla).</translation>
</message>
<message>
<source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
@@ -2982,11 +2990,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Enable Replace-By-Fee</source>
- <translation type="unfinished">Activar "Reemplazar-por-comisión"</translation>
+ <translation type="unfinished">Activar "Remplazar por comisión"</translation>
</message>
<message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
- <translation type="unfinished">Con la función "Reemplazar-por-comisión" (BIP-125), puedes aumentar la comisión de una transacción después de enviarla. Sin esta, es posible que se recomiende una comisión más alta para compensar el mayor riesgo de retraso de la transacción.</translation>
+ <translation type="unfinished">Con la función "Remplazar por comisión" (BIP-125), puedes aumentar la comisión de una transacción después de enviarla. Sin esta, es posible que se recomiende una comisión más alta para compensar el mayor riesgo de retraso de la transacción.</translation>
</message>
<message>
<source>Clear &amp;All</source>
@@ -3052,11 +3060,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">Crea una transacción de Bitcoin parcialmente firmada (PSBT) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</translation>
- </message>
- <message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">desde la billetera "%1"</translation>
+ <translation type="unfinished">Crea una transacción de Bitcoin parcialmente firmada (TBPF) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con TBPF.</translation>
</message>
<message>
<source>%1 to '%2'</source>
@@ -3091,12 +3095,12 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">Transacción firmada parcialmente (binaria) </translation>
+ <translation type="unfinished">Transacción parcialmente firmada (binario) </translation>
</message>
<message>
<source>PSBT saved</source>
<extracomment>Popup message when a PSBT has been saved to a file</extracomment>
- <translation type="unfinished">PSBT guardada</translation>
+ <translation type="unfinished">TBPF guardada</translation>
</message>
<message>
<source>External balance:</source>
@@ -3108,7 +3112,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
- <translation type="unfinished">Puedes aumentar la comisión después (indica "Reemplazar-por-comisión", BIP-125).</translation>
+ <translation type="unfinished">Puedes aumentar la comisión después (indica "Remplazar por comisión", BIP-125).</translation>
</message>
<message>
<source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
@@ -3116,6 +3120,10 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Revisa por favor la propuesta de transacción. Esto producirá una transacción de Bitcoin parcialmente firmada (TBPF) que puedes guardar o copiar y, luego, firmar; por ejemplo, una billetera %1 fuera de línea o una billetera de hardware compatible con TBPF.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 desde monedero "%2"</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">¿Quieres crear esta transacción?</translation>
@@ -3123,7 +3131,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<message>
<source>Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</extracomment>
- <translation type="unfinished">Revisa la transacción. Puedes crear y enviar esta transacción de Bitcoin parcialmente firmada (PSBT), que además puedes guardar o copiar y, luego, firmar; por ejemplo, una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</translation>
+ <translation type="unfinished">Revisa la transacción. Puedes crear y enviar esta transacción de Bitcoin parcialmente firmada (TBPF), que además puedes guardar o copiar y, luego, firmar; por ejemplo, una billetera %1 sin conexión o una billetera de hardware compatible con TBPF.</translation>
</message>
<message>
<source>Please, review your transaction.</source>
@@ -3136,7 +3144,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Not signalling Replace-By-Fee, BIP-125.</source>
- <translation type="unfinished">No indica "Reemplazar-por-comisión", BIP-125.</translation>
+ <translation type="unfinished">No indica "Remplazar por comisión", BIP-125.</translation>
</message>
<message>
<source>Total Amount</source>
@@ -3150,19 +3158,19 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>The PSBT has been copied to the clipboard. You can also save it.</source>
- <translation type="unfinished">Se copió la PSBT al portapapeles. También puedes guardarla.</translation>
+ <translation type="unfinished">Se copió la TBPF al portapapeles. También puedes guardarla.</translation>
</message>
<message>
<source>PSBT saved to disk</source>
- <translation type="unfinished">PSBT guardada en el disco</translation>
+ <translation type="unfinished">TBPF guardada en el disco</translation>
</message>
<message>
<source>Confirm send coins</source>
- <translation type="unfinished">Confirmar el envió de monedas</translation>
+ <translation type="unfinished">Confirmar el envío de monedas</translation>
</message>
<message>
<source>Watch-only balance:</source>
- <translation type="unfinished">Saldo de solo lectura:</translation>
+ <translation type="unfinished">Saldo solo de observación:</translation>
</message>
<message>
<source>The recipient address is not valid. Please recheck.</source>
@@ -3294,11 +3302,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<name>SignVerifyMessageDialog</name>
<message>
<source>Signatures - Sign / Verify a Message</source>
- <translation type="unfinished">Firmas - Firmar / verificar un mensaje</translation>
+ <translation type="unfinished">Firmas: firmar o verificar un mensaje</translation>
</message>
<message>
<source>&amp;Sign Message</source>
- <translation type="unfinished">&amp;Firmar Mensaje</translation>
+ <translation type="unfinished">&amp;Firmar mensaje</translation>
</message>
<message>
<source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
@@ -3510,7 +3518,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">Solo lectura</translation>
+ <translation type="unfinished">Solo de observación</translation>
</message>
<message>
<source>label</source>
@@ -3576,8 +3584,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Índice de salida</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(No se verificó el certificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3683,7 +3691,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">Solo lectura</translation>
+ <translation type="unfinished">Solo de observación</translation>
</message>
<message>
<source>(n/a)</source>
@@ -3707,7 +3715,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation type="unfinished">Si una dirección de solo lectura está involucrada en esta transacción o no.</translation>
+ <translation type="unfinished">Si una dirección solo de observación está involucrada en esta transacción o no.</translation>
</message>
<message>
<source>User-defined intent/purpose of the transaction.</source>
@@ -3832,7 +3840,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Watch-only</source>
- <translation type="unfinished">Solo lectura</translation>
+ <translation type="unfinished">Solo de observación</translation>
</message>
<message>
<source>Date</source>
@@ -3864,7 +3872,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Exporting Successful</source>
- <translation type="unfinished">Exportación exitosa</translation>
+ <translation type="unfinished">Exportación correcta</translation>
</message>
<message>
<source>The transaction history was successfully saved to %1.</source>
@@ -3895,7 +3903,7 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>Unable to decode PSBT from clipboard (invalid base64)</source>
- <translation type="unfinished">No se puede decodificar la PSBT desde el portapapeles (Base64 inválida)</translation>
+ <translation type="unfinished">No se puede decodificar la TBPF desde el portapapeles (Base64 inválida)</translation>
</message>
<message>
<source>Load Transaction Data</source>
@@ -3903,15 +3911,15 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>Partially Signed Transaction (*.psbt)</source>
- <translation type="unfinished">Transacción firmada parcialmente (*.psbt)</translation>
+ <translation type="unfinished">Transacción parcialmente firmada (*.psbt)</translation>
</message>
<message>
<source>PSBT file must be smaller than 100 MiB</source>
- <translation type="unfinished">El archivo PSBT debe ser más pequeño de 100 MiB</translation>
+ <translation type="unfinished">El archivo TBPF debe ser más pequeño de 100 MiB</translation>
</message>
<message>
<source>Unable to decode PSBT</source>
- <translation type="unfinished">No se puede decodificar PSBT</translation>
+ <translation type="unfinished">No se puede decodificar TBPF</translation>
</message>
</context>
<context>
@@ -3959,7 +3967,7 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>PSBT copied</source>
- <translation type="unfinished">PSBT copiada</translation>
+ <translation type="unfinished">TBPF copiada</translation>
</message>
<message>
<source>Copied to clipboard</source>
@@ -4079,7 +4087,7 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
- <translation type="unfinished">Error: La versión del archivo volcado no es compatible. Esta versión de la billetera de Bitcoin solo admite archivos de volcado de la versión 1. Se obtuvo un archivo de volcado con la versión %s</translation>
+ <translation type="unfinished">Error: La versión del archivo de volcado no es compatible. Esta versión de la billetera de Bitcoin solo admite archivos de volcado de la versión 1. Se obtuvo un archivo de volcado con la versión %s</translation>
</message>
<message>
<source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
@@ -4231,7 +4239,7 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>Cannot resolve -%s address: '%s'</source>
- <translation type="unfinished">No se puede resolver la dirección de -%s: '%s'</translation>
+ <translation type="unfinished">No se puede resolver la dirección de -%s: "%s"</translation>
</message>
<message>
<source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
@@ -4327,7 +4335,7 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">Las UTXO sin confirmar están disponibles, pero si se gastan, se crea una cadena de transacciones que rechazará el pool de memoria.</translation>
+ <translation type="unfinished">Las UTXO sin confirmar están disponibles, pero si se gastan, se crea una cadena de transacciones que rechazará la mempool.</translation>
</message>
<message>
<source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
@@ -4372,6 +4380,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La configuración para %s solo se aplica en la red %s cuando se encuentra en la sección [%s].</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">Derechos de autor (C) %i-%i</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Se detectó que la base de datos de bloques está dañada.</translation>
</message>
@@ -4400,6 +4412,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error al crear %s</translation>
</message>
@@ -4433,7 +4449,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Error opening block database</source>
- <translation type="unfinished">Error al abrir base de datos de bloques</translation>
+ <translation type="unfinished">Error al abrir la base de datos de bloques</translation>
</message>
<message>
<source>Error reading configuration file: %s</source>
@@ -4448,16 +4464,12 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error al leer el siguiente registro de la base de datos de la billetera</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Error: No se puede extraer el destino del scriptpubkey generado</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción solo de lectura a la billetera respectiva</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al iniciar db txn para eliminar transacciones de billetera</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Error: No se pudieron eliminar las transacciones solo de lectura</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Error: No se puede extraer el destino del scriptpubkey generado</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4473,15 +4485,15 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo crear una billetera solo de lectura</translation>
+ <translation type="unfinished">Error: No se pudo crear una billetera solo de observación</translation>
</message>
<message>
<source>Error: Got key that was not hex: %s</source>
- <translation type="unfinished">Error: Se recibió una clave que no es hex: %s</translation>
+ <translation type="unfinished">Error: Se recibió una clave que no es hexadecimal (%s)</translation>
</message>
<message>
<source>Error: Got value that was not hex: %s</source>
- <translation type="unfinished">Error: Se recibió un valor que no es hex: %s</translation>
+ <translation type="unfinished">Error: Se recibió un valor que no es hexadecimal (%s)</translation>
</message>
<message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
@@ -4496,10 +4508,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No hay direcciones %s disponibles.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Error: No se pudieron eliminar todas las transacciones solo de lectura</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Error: Esta billetera ya usa SQLite</translation>
</message>
@@ -4524,14 +4532,35 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se pueden leer todos los registros en la base de datos</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de leer el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">Error: No se pueden eliminar los datos de la libreta de direcciones solo de lectura</translation>
+ <translation type="unfinished">Error: No se pueden eliminar los datos de la libreta de direcciones solo de observación</translation>
</message>
<message>
<source>Error: Unable to write record to new wallet</source>
<translation type="unfinished">Error: No se puede escribir el registro en la nueva billetera</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor monedero vigilado del bloque del registro localizador</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera 1%s
+ </translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Fallo al escuchar en todos los puertos. Usa -listen=0 si quieres hacerlo.</translation>
</message>
@@ -4548,6 +4577,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">La tasa de comisión (%s) es menor que el valor mínimo (%s)</translation>
</message>
@@ -4605,11 +4638,11 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">Importe inválido para -%s=&lt;amount&gt;: '%s'</translation>
+ <translation type="unfinished">Importe inválido para -%s=&lt;amount&gt;: "%s"</translation>
</message>
<message>
<source>Invalid netmask specified in -whitelist: '%s'</source>
- <translation type="unfinished">Máscara de red inválida especificada en -whitelist: '%s'</translation>
+ <translation type="unfinished">Máscara de red inválida especificada en -whitelist: "%s"</translation>
</message>
<message>
<source>Invalid port specified in %s: '%s'</source>
@@ -4629,7 +4662,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Loading banlist…</source>
- <translation type="unfinished">Cargando lista de bloqueos...</translation>
+ <translation type="unfinished">Cargando lista de prohibiciones...</translation>
</message>
<message>
<source>Loading block index…</source>
@@ -4649,7 +4682,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Need to specify a port with -whitebind: '%s'</source>
- <translation type="unfinished">Se necesita especificar un puerto con -whitebind: '%s'</translation>
+ <translation type="unfinished">Se necesita especificar un puerto con -whitebind: "%s"</translation>
</message>
<message>
<source>No addresses available</source>
@@ -4677,7 +4710,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Pruning blockstore…</source>
- <translation type="unfinished">Podando almacén de bloques…</translation>
+ <translation type="unfinished">Podando almacenamiento de bloques…</translation>
</message>
<message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
@@ -4768,6 +4801,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Esta es la comisión de transacción que pagarás si envías una transacción.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transacción %s no pertenece a esta billetera</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">El importe de la transacción es demasiado pequeño</translation>
</message>
@@ -4780,10 +4817,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Índice de salidas de cambio de transacciones fuera de alcance</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transacción tiene una cadena demasiado larga del pool de memoria</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transacción debe incluir al menos un destinatario</translation>
</message>
@@ -4833,7 +4866,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Unable to start HTTP server. See debug log for details.</source>
- <translation type="unfinished">No puede iniciar el servidor HTTP. Consulta el registro de depuración para obtener información.</translation>
+ <translation type="unfinished">No se puede iniciar el servidor HTTP. Consulta el registro de depuración para obtener información.</translation>
</message>
<message>
<source>Unable to unload the wallet before migrating</source>
@@ -4864,6 +4897,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El nivel de registro global %s=%s no es compatible. Valores válidos: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates no se admite en la cadena %s.</translation>
</message>
@@ -4872,6 +4909,14 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La categoría de registro no es compatible %s=%s. </translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Error: no pudo agregar tx de solo vigía %s para monedero de solo vigía</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">El comentario del agente de usuario (%s) contiene caracteres inseguros.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_DO.ts b/src/qt/locale/bitcoin_es_DO.ts
index d77efacee1..b49fe13730 100644
--- a/src/qt/locale/bitcoin_es_DO.ts
+++ b/src/qt/locale/bitcoin_es_DO.ts
@@ -292,6 +292,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">desconocido</translation>
</message>
<message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizada...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Monto</translation>
</message>
@@ -1005,12 +1013,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Los scripts solo de lectura se migraron a una nueva billetera llamada "%1".</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Guiones vigilantes han sido migrados a un monedero con el nombre '%1'.</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Los scripts solucionables pero no de lectura se migraron a una nueva billetera llamada "%1".</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Solucionable pero ninguno de los guiones vigilados han sido migrados a un monedero llamados '%1'.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1388,6 +1396,10 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Minimice en lugar de salir de la aplicación cuando la ventana esté cerrada. Cuando esta opción está habilitada, la aplicación se cerrará solo después de seleccionar Salir en el menú.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Las opciones establecidas en este diálogo serán anuladas por la línea de comandos:</translation>
</message>
@@ -1592,18 +1604,6 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Usar un proxy SOCKS&amp;5 independiente para comunicarse con pares a través de los servicios onion de Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fuente monoespaciada en la pestaña de vista general:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">"%1" insertado</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">"%1" con la coincidencia más aproximada</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Aceptar</translation>
</message>
@@ -1829,8 +1829,8 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">PSBT guardada en en el disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Envía %1 a %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envía %1 a %2</translation>
</message>
<message>
<source>own address</source>
@@ -2358,6 +2358,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Ejecutar comando sin monedero</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Ventana de nodo - [%1]</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2773,10 +2777,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Crea una transacción de Bitcoin parcialmente firmada (PSBT) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">desde la billetera '%1'</translation>
- </message>
- <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 a %2</translation>
</message>
@@ -2825,6 +2825,10 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Puedes aumentar la comisión después (indica "Reemplazar-por-comisión", BIP-125).</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 desde monedero '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">¿Quieres crear esta transacción?</translation>
@@ -3260,8 +3264,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Indice de salida</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(No se verificó el certificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4028,6 +4032,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error al crear %s</translation>
</message>
@@ -4072,16 +4080,12 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error al leer el siguiente registro de la base de datos de la billetera</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción solo de observación a la billetera respectiva</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al iniciar db txn para eliminar transacciones de billetera</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Error: No se pudo eliminar las transacciones solo de observación</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4120,10 +4124,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No hay direcciones %s disponibles.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Error: No se pudo eliminar todas las transacciones solo de observación</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Error: Esta billetera ya usa SQLite</translation>
</message>
@@ -4148,6 +4148,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se pueden leer todos los registros en la base de datos</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de leer el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Error: No se pueden eliminar los datos de la libreta de direcciones solo de observación</translation>
</message>
@@ -4156,6 +4160,23 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se puede escribir el registro en la nueva billetera</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor monedero vigilado del bloque del registro localizador</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera 1%s
+ </translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Ha fallado la escucha en todos los puertos. Use -listen=0 si desea esto.</translation>
</message>
@@ -4172,6 +4193,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">La tasa de comisión (%s) es menor que el valor mínimo (%s)</translation>
</message>
@@ -4364,6 +4389,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Esta es la tarifa a pagar si realizas una transacción.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transacción %s no pertenece a esta billetera</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Transacción muy pequeña</translation>
</message>
@@ -4376,10 +4405,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Índice de salidas de cambio de transacciones fuera de alcance</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transacción tiene largo tiempo en una cadena mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transacción debe tener al menos un destinatario</translation>
</message>
@@ -4456,6 +4481,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Nivel de acceso global %s = %s no mantenido. Los valores válidos son: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates no está mantenido en el encadenamiento %s.</translation>
</message>
@@ -4464,6 +4493,14 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La categoría de registro no es compatible %s=%s. </translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Error: no pudo agregar tx de solo vigía %s para monedero de solo vigía</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">El comentario del agente de usuario (%s) contiene caracteres inseguros.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_MX.ts b/src/qt/locale/bitcoin_es_MX.ts
index f46d77e8d3..ee6865bbd7 100644
--- a/src/qt/locale/bitcoin_es_MX.ts
+++ b/src/qt/locale/bitcoin_es_MX.ts
@@ -2,6 +2,22 @@
<context>
<name>AddressBookPage</name>
<message>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished">0xB006A7c1B9639BE87461Ee9 0xB006A7c1B9639BE87461Ee9</translation>
+ </message>
+ <message>
+ <source>Create a new address</source>
+ <translation type="unfinished">0xB006A7c1B9639BE87461Ee9 0xB006A7c1B9639BE87461Ee9</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;Nuevo</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation type="unfinished">Copiar la dirección actualmente seleccionada al portapapeles del sistema</translation>
+ </message>
+ <message>
<source>Sending addresses - %1</source>
<translation type="unfinished">Enviando direcciones- %1</translation>
</message>
@@ -11,7 +27,22 @@
</message>
</context>
<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>Encrypt wallet</source>
+ <translation type="unfinished">Encrypt wallet jesus daniel</translation>
+ </message>
+ </context>
+<context>
<name>QObject</name>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizada...</translation>
+ </message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
@@ -225,12 +256,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Los scripts solo de lectura se migraron a una nueva billetera llamada "%1".</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Guiones vigilantes han sido migrados a un monedero con el nombre '%1'.</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Los scripts solucionables pero no de lectura se migraron a una nueva billetera llamada "%1".</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Solucionable pero ninguno de los guiones vigilados han sido migrados a un monedero llamados '%1'.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -285,6 +316,20 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
</message>
</context>
<context>
+ <name>OptionsDialog</name>
+ <message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
+ </message>
+ </context>
+<context>
+ <name>PSBTOperationsDialog</name>
+ <message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envía %1 a %2</translation>
+ </message>
+ </context>
+<context>
<name>RPCConsole</name>
<message>
<source>The transport layer version: %1</source>
@@ -317,9 +362,21 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<extracomment>Explanatory text for v2 transport type.</extracomment>
<translation type="unfinished">v2: protocolo de transporte encriptado BIP324</translation>
</message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Ventana de nodo - [%1]</translation>
+ </message>
</context>
<context>
<name>SendCoinsDialog</name>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">Cantidad:</translation>
+ </message>
+ <message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 desde monedero '%2'</translation>
+ </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -337,6 +394,10 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<numerusform>matures in %n more block(s)</numerusform>
</translation>
</message>
+ <message>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
+ </message>
</context>
<context>
<name>bitcoin-core</name>
@@ -344,5 +405,54 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
<translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
</message>
+ <message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
+ </message>
+ <message>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al iniciar db txn para eliminar transacciones de billetera</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de leer el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor monedero vigilado del bloque del registro localizador</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera 1%s
+ </translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
+ </message>
+ <message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ </message>
+ <message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transacción %s no pertenece a esta billetera</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
+ </message>
+ <message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Error: no pudo agregar tx de solo vigía %s para monedero de solo vigía</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_es_SV.ts b/src/qt/locale/bitcoin_es_SV.ts
index dae383a116..2edd75a5da 100644
--- a/src/qt/locale/bitcoin_es_SV.ts
+++ b/src/qt/locale/bitcoin_es_SV.ts
@@ -259,6 +259,14 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">%1 todavía no ha terminado de forma segura...</translation>
</message>
<message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizada...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Monto</translation>
</message>
@@ -895,12 +903,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Los scripts solo de lectura se migraron a una nueva billetera llamada "%1".</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Guiones vigilantes han sido migrados a un monedero con el nombre '%1'.</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Los scripts solucionables pero no de lectura se migraron a una nueva billetera llamada "%1".</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Solucionable pero ninguno de los guiones vigilados han sido migrados a un monedero llamados '%1'.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1254,6 +1262,10 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Minimice en lugar de salir de la aplicación cuando la ventana esté cerrada. Cuando esta opción está habilitada, la aplicación se cerrará solo después de seleccionar Salir en el menú.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Las opciones establecidas en este diálogo serán anuladas por la línea de comandos:</translation>
</message>
@@ -1426,18 +1438,6 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Usar un proxy SOCKS&amp;5 independiente para comunicarse con pares a través de los servicios onion de Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fuente monoespaciada en la pestaña Resumen:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">"%1" insertado</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">"%1" con la coincidencia más aproximada</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
@@ -1639,8 +1639,8 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">PSBT guardada en en el disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Envia %1 a %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envía %1 a %2</translation>
</message>
<message>
<source>own address</source>
@@ -2128,6 +2128,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Ejecutar comando sin monedero</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Ventana de nodo - [%1]</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2349,6 +2353,10 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaci
<translation type="unfinished">Fondos insuficientes!</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">Cantidad:</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation type="unfinished">Importe:</translation>
</message>
@@ -2475,10 +2483,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Crea una transacción de Bitcoin parcialmente firmada (PSBT) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">desde la billetera '%1'</translation>
- </message>
- <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 a %2</translation>
</message>
@@ -2527,6 +2531,10 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Puedes aumentar la comisión después (indica "Reemplazar-por-comisión", BIP-125).</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 desde monedero '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">¿Quieres crear esta transacción?</translation>
@@ -2890,8 +2898,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Indice de salida</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished"> (No se ha verificado el certificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3578,6 +3586,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error al crear %s</translation>
</message>
@@ -3606,16 +3618,12 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error al leer el siguiente registro de la base de datos de la billetera</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción solo de observación a la billetera respectiva</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al iniciar db txn para eliminar transacciones de billetera</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Error: No se pudo eliminar las transacciones solo de observación</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -3654,10 +3662,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No hay direcciones %s disponibles.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Error: No se pudo eliminar todas las transacciones solo de observación</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Error: Esta billetera ya usa SQLite</translation>
</message>
@@ -3682,6 +3686,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se pueden leer todos los registros en la base de datos</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de leer el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Error: No se pueden eliminar los datos de la libreta de direcciones solo de observación</translation>
</message>
@@ -3690,6 +3698,23 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se puede escribir el registro en la nueva billetera</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor monedero vigilado del bloque del registro localizador</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera 1%s
+ </translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Fallo al rescanear la billetera durante la inicialización</translation>
</message>
@@ -3702,6 +3727,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">La tasa de comisión (%s) es menor que el valor mínimo (%s)</translation>
</message>
@@ -3886,6 +3915,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Esta es la comisión por transacción a pagar si realiza una transacción.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transacción %s no pertenece a esta billetera</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">El importe de la transacción es demasiado pequeño</translation>
</message>
@@ -3898,10 +3931,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Índice de salidas de cambio de transacciones fuera de alcance</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transacción tiene largo tiempo en una cadena mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transacción debe tener al menos un destinatario</translation>
</message>
@@ -3978,6 +4007,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Nivel de acceso global %s = %s no mantenido. Los valores válidos son: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates no está mantenido en el encadenamiento %s.</translation>
</message>
@@ -3986,6 +4019,14 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La categoría de registro no es compatible %s=%s. </translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Error: no pudo agregar tx de solo vigía %s para monedero de solo vigía</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">El comentario del agente de usuario (%s) contiene caracteres inseguros.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_VE.ts b/src/qt/locale/bitcoin_es_VE.ts
index e550f43f23..139fc7b42e 100644
--- a/src/qt/locale/bitcoin_es_VE.ts
+++ b/src/qt/locale/bitcoin_es_VE.ts
@@ -177,7 +177,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
- <translation type="unfinished">Ingrese la nueva frase de contraseña para la billetera. &lt;br/&gt;Usa una frase de contraseña de &lt;b&gt;diez o más caracteres aleatorios&lt;/b&gt;, u &lt;b&gt;ocho o más palabras&lt;/b&gt;.</translation>
+ <translation type="unfinished">Ingresa la nueva frase de contraseña para la billetera. &lt;br/&gt;Usa una frase de contraseña de &lt;b&gt;diez o más caracteres aleatorios&lt;/b&gt;, u &lt;b&gt;ocho o más palabras&lt;/b&gt;.</translation>
</message>
<message>
<source>Enter the old passphrase and new passphrase for the wallet.</source>
@@ -291,6 +291,14 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">desconocido</translation>
</message>
<message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizada...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Cantidad</translation>
</message>
@@ -1013,12 +1021,12 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Los scripts solo de lectura se migraron a una nueva billetera llamada "%1".</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Guiones vigilantes han sido migrados a un monedero con el nombre '%1'.</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Los scripts solucionables pero no de lectura se migraron a una nueva billetera llamada "%1".</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Solucionable pero ninguno de los guiones vigilados han sido migrados a un monedero llamados '%1'.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1404,6 +1412,10 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Minimice en lugar de salir de la aplicación cuando la ventana esté cerrada. Cuando esta opción está habilitada, la aplicación se cerrará solo después de seleccionar Salir en el menú.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Las opciones establecidas en este diálogo serán anuladas por la línea de comandos:</translation>
</message>
@@ -1608,18 +1620,6 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">Usar un proxy SOCKS&amp;5 independiente para comunicarse con pares a través de los servicios onion de Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fuente monoespaciada en la pestaña de vista general:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">"%1" insertado</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">"%1" con la coincidencia más aproximada</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Aceptar</translation>
</message>
@@ -1845,8 +1845,8 @@ El proceso de migración creará una copia de seguridad de la billetera antes de
<translation type="unfinished">PSBT guardada en en el disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Envía %1 a %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envía %1 a %2</translation>
</message>
<message>
<source>own address</source>
@@ -2358,6 +2358,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Ejecutar comando sin monedero</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Ventana de nodo - [%1]</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2761,10 +2765,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Crea una transacción de Bitcoin parcialmente firmada (PSBT) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">desde la billetera '%1'</translation>
- </message>
- <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 a %2</translation>
</message>
@@ -2813,6 +2813,10 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Puedes aumentar la comisión después (indica "Reemplazar-por-comisión", BIP-125).</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 desde monedero '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">¿Quieres crear esta transacción?</translation>
@@ -3200,8 +3204,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Indice de salida</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(No se verificó el certificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3936,6 +3940,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error al crear %s</translation>
</message>
@@ -3980,16 +3988,12 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error al leer el siguiente registro de la base de datos de la billetera</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción solo de observación a la billetera respectiva</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al iniciar db txn para eliminar transacciones de billetera</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Error: No se pudo eliminar las transacciones solo de observación</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4028,10 +4032,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No hay direcciones %s disponibles.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Error: No se pudo eliminar todas las transacciones solo de observación</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Error: Esta billetera ya usa SQLite</translation>
</message>
@@ -4056,6 +4056,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se pueden leer todos los registros en la base de datos</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de leer el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Error: No se pueden eliminar los datos de la libreta de direcciones solo de observación</translation>
</message>
@@ -4064,6 +4068,23 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se puede escribir el registro en la nueva billetera</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor monedero vigilado del bloque del registro localizador</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera 1%s
+ </translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Ha fallado la escucha en todos los puertos. Use -listen=0 si desea esto.</translation>
</message>
@@ -4080,6 +4101,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">La tasa de comisión (%s) es menor que el valor mínimo (%s)</translation>
</message>
@@ -4272,6 +4297,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Esta es la tarifa a pagar si realizas una transacción.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transacción %s no pertenece a esta billetera</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Monto de la transacción muy pequeño</translation>
</message>
@@ -4284,10 +4313,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Índice de salidas de cambio de transacciones fuera de alcance</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transacción tiene largo tiempo en una cadena mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transacción debe tener al menos un destinatario</translation>
</message>
@@ -4364,6 +4389,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Nivel de acceso global %s = %s no mantenido. Los valores válidos son: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates no está mantenido en el encadenamiento %s.</translation>
</message>
@@ -4372,6 +4401,14 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La categoría de registro no es compatible %s=%s. </translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Error: no pudo agregar tx de solo vigía %s para monedero de solo vigía</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">El comentario del agente de usuario (%s) contiene caracteres inseguros.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fa.ts b/src/qt/locale/bitcoin_fa.ts
index a63f560c33..5da96344e5 100644
--- a/src/qt/locale/bitcoin_fa.ts
+++ b/src/qt/locale/bitcoin_fa.ts
@@ -1,5 +1,16 @@
<TS version="2.1" language="fa">
<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Create a new address</source>
+ <translation type="unfinished">یک آدرس جدید ایجاد کنید</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation type="unfinished">کپی آدرسی که اکنون انتخاب کردید در کلیپ بورد سیستم</translation>
+ </message>
+ </context>
+<context>
<name>AskPassphraseDialog</name>
<message>
<source>Your wallet is about to be encrypted. </source>
@@ -1413,18 +1424,6 @@
 </translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">فونت تک فضا(منو اسپیس) در برگه مرور کلی </translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">تعبیه شده%1</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">%1نزدیک ترین تطابق</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">تایید</translation>
</message>
@@ -2362,6 +2361,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">وجوه ناکافی</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">مقدار</translation>
+ </message>
+ <message>
<source>Bytes:</source>
<translation type="unfinished">بایت ها:</translation>
</message>
@@ -3657,11 +3660,6 @@ The wallet might have been tampered with or created with malicious intent.
<translation type="unfinished">مقدار تراکنش نمی‌تواند منفی باشد.</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">معاملات بسیار طولانی از یک زنجیره ممپول است
- </translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">تراکنش باید حداقل یک دریافت کننده داشته باشد</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fi.ts b/src/qt/locale/bitcoin_fi.ts
index 54eb41ed88..cbf81afdb2 100644
--- a/src/qt/locale/bitcoin_fi.ts
+++ b/src/qt/locale/bitcoin_fi.ts
@@ -2,10 +2,6 @@
<context>
<name>AddressBookPage</name>
<message>
- <source>Right-click to edit address or label</source>
- <translation type="unfinished">Valitse hiiren oikealla painikkeella muokataksesi osoitetta tai nimikettä</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation type="unfinished">Luo uusi osoite</translation>
</message>
@@ -1638,18 +1634,6 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Käytä erillistä SOCKS&amp;5-välityspalvelinta tavoittaaksesi vertaisia Torin onion-palvelujen kautta:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Monospaced-fontti Overview-välilehdellä:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">upotettu "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">lähin vastaavuus "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Peruuta</translation>
</message>
@@ -1871,10 +1855,6 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">PSBT (osittain tallennettu bitcoin-siirto) tallennettiin levylle.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">*Lähettää %1'n kohteeseen %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">oma osoite</translation>
</message>
@@ -2766,10 +2746,6 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Luo osittain allekirjoitetun bitcoin-siirtotapahtuman (PSBT) käytettäväksi mm. offline %1 lompakko tai PSBT-yhteensopiva hardware-lompakko.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished"> lompakosta '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 - '%2'</translation>
</message>
@@ -3249,10 +3225,6 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Ulostulon indeksi</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished"> (Sertifikaattia ei vahvistettu)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Kauppias</translation>
</message>
@@ -4073,10 +4045,6 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Lähetyksen siirtosumman tulee olla positiivinen</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Maksutapahtumalla on liian pitkä muistialtaan ketju</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Lähetyksessä tulee olla ainakin yksi vastaanottaja</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fil.ts b/src/qt/locale/bitcoin_fil.ts
index b0bfec07d4..a8d32b00c0 100644
--- a/src/qt/locale/bitcoin_fil.ts
+++ b/src/qt/locale/bitcoin_fil.ts
@@ -202,6 +202,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ang passphrase na inilagay para sa pag-dedekripto ng pitaka ay hindi tama</translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">Ang passphrase na isinumite para sa pag-decrypt ng pitaka ay mali. Naglalaman ito ng null character (halimbawa - isang zero byte). Kung ang passphrase ay itinakda gamit ang isang bersyon ng software na ito bago ang 25.0, subukan muli lamang ang mga karakter mula sa simula hanggang sa una nilalang null character. Kung magtagumpay ito, mangyaring magtakda ng bagong passphrase upang maiwasan ang isyung ito sa hinaharap.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">Matagumpay na nabago ang passphrase ng walet.</translation>
</message>
@@ -3003,10 +3007,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ang mga halaga ng transaksyon ay hindi dapat negative</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Ang transaksyon ay may masyadong mahabang chain ng mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Ang transaksyon ay dapat mayroong kahit isang tatanggap</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fo.ts b/src/qt/locale/bitcoin_fo.ts
index f16444c3d3..2d6a543454 100644
--- a/src/qt/locale/bitcoin_fo.ts
+++ b/src/qt/locale/bitcoin_fo.ts
@@ -7,7 +7,7 @@
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">Mynda nýggja adressu</translation>
+ <translation type="unfinished">Stovna adressu</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
@@ -66,7 +66,7 @@
<message>
<source>Do you want to reset settings to default values, or to abort without making changes?</source>
<extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
- <translation type="unfinished">Ynskir tú at endurstilla stillingar til sjálvsettar, ella at avbróta uttan at hava broytt stillingar?</translation>
+ <translation type="unfinished">Ynskir tú at endurstilla stillingar til upprunaligar stillingar, ella at avlýsa broytingar?</translation>
</message>
<message>
<source>Error: %1</source>
@@ -173,7 +173,7 @@
</message>
<message>
<source>Modify configuration options for %1</source>
- <translation type="unfinished">Broyt uppsetan fyri %1</translation>
+ <translation type="unfinished">Broyt uppsetanarstillingar fyri %1</translation>
</message>
<message>
<source>Network activity disabled.</source>
@@ -182,15 +182,15 @@
</message>
<message>
<source>Sign &amp;message…</source>
- <translation type="unfinished">&amp;Undirskriva boðini</translation>
+ <translation type="unfinished">&amp;Undirrita boð</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Undirskriva boðini við tíni Bitcoin-adressu til tess at prógva at tey eru tíni</translation>
+ <translation type="unfinished">Undirrita boðini við tíni Bitcoin-adressu fyri at prógva at tey eru tíni</translation>
</message>
<message>
<source>&amp;File</source>
- <translation type="unfinished">&amp;Fíl</translation>
+ <translation type="unfinished">&amp;Fíla</translation>
</message>
<message>
<source>&amp;Settings</source>
@@ -576,10 +576,6 @@
<translation type="unfinished">Goym...</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Sendir %1 til %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">egin adressa</translation>
</message>
@@ -1310,7 +1306,7 @@
</message>
<message>
<source>Error: Got value that was not hex: %s</source>
- <translation type="unfinished">Villa: Læs virði ið ikki er sekstandatal: %s</translation>
+ <translation type="unfinished">Villa: Fekk virði ið ikki er sekstandatal: %s</translation>
</message>
<message>
<source>Error: No %s addresses available.</source>
@@ -1318,7 +1314,7 @@
</message>
<message>
<source>Error: Unable to begin reading all records in the database</source>
- <translation type="unfinished">Villa: Bar ikki til at byrja at lesa allar skrásetingar í dátugrunninum</translation>
+ <translation type="unfinished">Villa: Bar ikki til at byrja at innlesa skrásetingar í dátugrunninum</translation>
</message>
<message>
<source>Error: Unable to parse version %u as a uint32_t</source>
@@ -1326,11 +1322,11 @@
</message>
<message>
<source>Error: Unable to read all records in the database</source>
- <translation type="unfinished">Villa: Bar ikki til at lesa allar skrásetingar í dátugrunninum</translation>
+ <translation type="unfinished">Villa: Bar ikki til at innlesa allar skrásetingar í dátugrunninum</translation>
</message>
<message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation type="unfinished">Miseydnaðist at lurta á portri. Brúka -listen=0 um tú ynskir hetta.</translation>
+ <translation type="unfinished">Miseydnaðist at lurta á nøkrum portri. Brúka -listen=0 um tú ikki ynskir at lurta á nøkrum portri.</translation>
</message>
<message>
<source>Listening for incoming connections failed (listen returned error %s)</source>
@@ -1354,7 +1350,7 @@
</message>
<message>
<source>Settings file could not be read</source>
- <translation type="unfinished">Lesing av uppsetanarfílu miseydnaðist.</translation>
+ <translation type="unfinished">Lesing av uppsetanarfílu miseydnaðist</translation>
</message>
<message>
<source>Settings file could not be written</source>
diff --git a/src/qt/locale/bitcoin_fr.ts b/src/qt/locale/bitcoin_fr.ts
index f4d0ccdc5c..796e1affe6 100644
--- a/src/qt/locale/bitcoin_fr.ts
+++ b/src/qt/locale/bitcoin_fr.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Clic droit pour modifier l'adresse ou l'étiquette</translation>
+ <translation type="unfinished">Cliquer à droite pour modifier l’adresse ou l’étiquette</translation>
</message>
<message>
<source>Create a new address</source>
@@ -15,7 +15,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Copier l’adresse sélectionnée dans le presse-papiers</translation>
+ <translation type="unfinished">Copier dans le presse-papiers l’adresse sélectionnée actuellement</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -27,15 +27,15 @@
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Supprimer l’adresse sélectionnée de la liste</translation>
+ <translation type="unfinished">Supprimer de la liste l’adresse sélectionnée actuellement</translation>
</message>
<message>
<source>Enter address or label to search</source>
- <translation type="unfinished">Saisir une adresse ou une étiquette à rechercher</translation>
+ <translation type="unfinished">Saisir une adresse ou une étiquette à chercher</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exporter les données de l’onglet actuel vers un fichier</translation>
+ <translation type="unfinished">Exporter les données de l'onglet actuel vers un fichier</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -47,7 +47,7 @@
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation type="unfinished">Choisir l’adresse à laquelle envoyer des pièces</translation>
+ <translation type="unfinished">Choisir l'adresse à laquelle envoyer des pièces</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
@@ -55,17 +55,17 @@
</message>
<message>
<source>C&amp;hoose</source>
- <translation type="unfinished">&amp;Choisir</translation>
+ <translation type="unfinished">C&amp;hoisir</translation>
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">Ce sont vos adresses Bitcoin pour envoyer des paiements. Vérifiez toujours le montant et l’adresse de réception avant d’envoyer des pièces.</translation>
+ <translation type="unfinished">Ce sont vos adresses Bitcoin pour envoyer des paiements. Vérifiez toujours le montant et l’adresse du destinataire avant d’envoyer des pièces.</translation>
</message>
<message>
<source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
Signing is only possible with addresses of the type 'legacy'.</source>
- <translation type="unfinished">Il s'agit de vos adresses Bitcoin pour la réception des paiements. Utilisez le bouton "Créer une nouvelle adresse de réception" dans l'onglet "Recevoir" pour créer de nouvelles adresses.
-La signature n'est possible qu'avec les adresses de type "patrimoine".</translation>
+ <translation type="unfinished">Ce sont vos adresses Bitcoin pour recevoir des paiements. Utilisez le bouton « Créer une nouvelle adresse de réception » dans l’onglet Recevoir afin de créer de nouvelles adresses.
+Il n’est possible de signer qu’avec les adresses de type « legacy ».</translation>
</message>
<message>
<source>&amp;Copy Address</source>
@@ -73,7 +73,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Copy &amp;Label</source>
- <translation type="unfinished">Copier &amp;l’étiquette</translation>
+ <translation type="unfinished">Copier l’é&amp;tiquette</translation>
</message>
<message>
<source>&amp;Edit</source>
@@ -81,29 +81,29 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">Exporter la liste d’adresses</translation>
+ <translation type="unfinished">Exporter la liste d'adresses</translation>
</message>
<message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">Fichier avec séparateur virgule</translation>
+ <translation type="unfinished">Fichier séparé par des virgules</translation>
</message>
<message>
<source>There was an error trying to save the address list to %1. Please try again.</source>
<extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
- <translation type="unfinished">Une erreur est survenue lors de l'enregistrement de la liste d'adresses vers %1. Veuillez réessayer plus tard.</translation>
+ <translation type="unfinished">Une erreur est survenue lors de l’enregistrement de la liste d’adresses vers %1. Veuillez réessayer plus tard.</translation>
</message>
<message>
<source>Sending addresses - %1</source>
- <translation type="unfinished">Adresses d’envois - %1</translation>
+ <translation type="unfinished">Adresses d’envois – %1</translation>
</message>
<message>
<source>Receiving addresses - %1</source>
- <translation type="unfinished">Adresses de réceptions - %1</translation>
+ <translation type="unfinished">Adresses de réception – %1</translation>
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Échec d’exportation</translation>
+ <translation type="unfinished">Échec d'exportation</translation>
</message>
</context>
<context>
@@ -165,7 +165,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">Avertissement : Si vous chiffrez votre porte-monnaie et perdez votre phrase de passe, vous allez &lt;b&gt;PERDRE TOUS VOS BITCOINS&lt;/b&gt; !</translation>
+ <translation type="unfinished">Avertissement : Si vous chiffrez votre porte-monnaie et perdez votre phrase de passe, vous &lt;b&gt;PERDREZ TOUS VOS BITCOINS&lt;/b&gt; !</translation>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
@@ -225,19 +225,19 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">La phrase secrète saisie pour le décryptage du portefeuille est incorrecte. Elle contient un caractère nul (c'est-à-dire un octet de zéro). Si la phrase secrète a été définie avec une version de ce logiciel antérieure à la version 25.0, veuillez réessayer en ne saisissant que les caractères jusqu'au premier caractère nul (non compris). Si vous y parvenez, définissez une nouvelle phrase secrète afin d'éviter ce problème à l'avenir.</translation>
+ <translation type="unfinished">La phrase de passe saisie pour le déchiffrement du porte-monnaie est erronée. Elle comporte un caractère nul (c.-à.-d. un octet de zéro). Si la phrase de passe a été définie avec une version de ce logiciel antérieure à 25.0, réessayez en ne saisissant que les caractères jusqu’au premier caractère nul, sans saisir ce dernier. En cas de réussite, définissez une nouvelle phrase de passe afin d’éviter ce problème à l’avenir.</translation>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">La phrase de passe du porte-monnaie a été modifiée avec succès.</translation>
+ <translation type="unfinished">La phrase de passe du porte-monnaie a été modifiée.</translation>
</message>
<message>
<source>Passphrase change failed</source>
- <translation type="unfinished">Le changement de phrase secrète a échoué</translation>
+ <translation type="unfinished">Échec de changement de la phrase de passe</translation>
</message>
<message>
<source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
- <translation type="unfinished">L'ancienne phrase secrète introduite pour le décryptage du portefeuille est incorrecte. Elle contient un caractère nul (c'est-à-dire un octet de zéro). Si la phrase secrète a été définie avec une version de ce logiciel antérieure à la version 25.0, veuillez réessayer en ne saisissant que les caractères jusqu'au premier caractère nul (non compris).</translation>
+ <translation type="unfinished">L’ancienne phrase de passe saisie pour le déchiffrement du porte-monnaie est erronée. Elle comporte un caractère nul (c.-à.-d. un octet de zéro). Si la phrase de passe a été définie avec une version de ce logiciel antérieure à 25.0, réessayez en ne saisissant que les caractères jusqu’au premier caractère nul, sans saisir ce dernier..</translation>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
@@ -259,7 +259,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<name>BitcoinApplication</name>
<message>
<source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">Le fichier de paramètres %1 est peut-être corrompu ou non valide.</translation>
+ <translation type="unfinished">Le fichier de paramètres %1 est peut-être corrompu ou invalide.</translation>
</message>
<message>
<source>Runaway exception</source>
@@ -271,7 +271,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Internal error</source>
- <translation type="unfinished">Eurrer interne</translation>
+ <translation type="unfinished">Erreur interne</translation>
</message>
<message>
<source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
@@ -303,6 +303,18 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">inconnue</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Intégrée « %1 »</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Police système par défaut « %1 »</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personnalisée…</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Montant</translation>
</message>
@@ -628,7 +640,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">Rattrapage en cours…</translation>
+ <translation type="unfinished">Rattrapage…</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
@@ -648,7 +660,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Information</source>
- <translation type="unfinished">Informations</translation>
+ <translation type="unfinished">Renseignements</translation>
</message>
<message>
<source>Up to date</source>
@@ -701,12 +713,12 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<message>
<source>Restore Wallet…</source>
<extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
- <translation type="unfinished">Restaurer le Portefeuille...</translation>
+ <translation type="unfinished">Restaurer le porte-monnaie…</translation>
</message>
<message>
<source>Restore a wallet from a backup file</source>
<extracomment>Status tip for Restore Wallet menu item</extracomment>
- <translation type="unfinished">Restaurer le Portefeuille depuis un fichier de sauvegarde</translation>
+ <translation type="unfinished">Restaurer le porte-monnaie d’un fichier de sauvegarde</translation>
</message>
<message>
<source>Close all wallets</source>
@@ -714,11 +726,11 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Migrate Wallet</source>
- <translation type="unfinished">Migrer le portefeuille</translation>
+ <translation type="unfinished">Migrer le porte-monnaie</translation>
</message>
<message>
<source>Migrate a wallet</source>
- <translation type="unfinished">Migrer un portefeuilles </translation>
+ <translation type="unfinished">Migrer un porte-monnaie</translation>
</message>
<message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
@@ -738,7 +750,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>No wallets available</source>
- <translation type="unfinished">Aucun porte-monnaie n’est disponible</translation>
+ <translation type="unfinished">Aucun porte-monnaie n’est proposé</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -748,12 +760,12 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">Lancer un Portefeuille de sauvegarde</translation>
+ <translation type="unfinished">Charger la sauvegarde d’un porte-monnaie</translation>
</message>
<message>
<source>Restore Wallet</source>
<extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
- <translation type="unfinished">Restaurer le portefeuille</translation>
+ <translation type="unfinished">Restaurer le porte-monnaie</translation>
</message>
<message>
<source>Wallet Name</source>
@@ -788,8 +800,8 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n connexion active avec le réseau Bitcoin.</numerusform>
- <numerusform>%n connexions actives avec le réseau Bitcoin.</numerusform>
+ <numerusform>%n connexion active vers le réseau Bitcoin.</numerusform>
+ <numerusform>%n de connexions actives vers le réseau Bitcoin.</numerusform>
</translation>
</message>
<message>
@@ -814,15 +826,15 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">En-têtes de pré-synchronisation (%1%)...</translation>
+ <translation type="unfinished">Présynchronisation des en-têtes (%1 %)…</translation>
</message>
<message>
<source>Error creating wallet</source>
- <translation type="unfinished">Erreur lors de la création du portefeuille</translation>
+ <translation type="unfinished">Erreur de création du porte-monnaie</translation>
</message>
<message>
<source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Impossible de créer un nouveau portefeuilles, le logiciel a été compilé sans support pour sqlite (nécessaire pour le portefeuille décris) </translation>
+ <translation type="unfinished">Impossible de créer un nouveau porte-monnaie. Le logiciel a été compilé sans prise en charge de sqlite (nécessaire pour les porte-monnaie de descripteurs) </translation>
</message>
<message>
<source>Error: %1</source>
@@ -976,11 +988,11 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">Copier l’&amp;étiquette</translation>
+ <translation type="unfinished">Copier l’é&amp;tiquette</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">Copier le &amp;montant</translation>
+ <translation type="unfinished">Copier le mont&amp;ant</translation>
</message>
<message>
<source>Copy transaction &amp;ID and output index</source>
@@ -1061,7 +1073,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Too many external signers found</source>
- <translation type="unfinished">Trop de signataires externes trouvés</translation>
+ <translation type="unfinished">Trop de signataires externes ont été trouvés</translation>
</message>
</context>
<context>
@@ -1081,11 +1093,11 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<name>MigrateWalletActivity</name>
<message>
<source>Migrate wallet</source>
- <translation type="unfinished">Migrer le portefeuille</translation>
+ <translation type="unfinished">Migrer le porte-monnaie</translation>
</message>
<message>
<source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">Êtes-vous sûr de vouloir migrer le portefeuille 1 %1 1?</translation>
+ <translation type="unfinished">Voulez-vous vraiment migrer le porte-monnaie &lt;i&gt;%1&lt;/i&gt; ?</translation>
</message>
<message>
<source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
@@ -1093,30 +1105,31 @@ If this wallet contains any watchonly scripts, a new wallet will be created whic
If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
- <translation type="unfinished">La migration du porte-monnaie convertira ce porte-monnaie en un ou plusieurs porte-monnaie de descripteurs. Une nouvelle sauvegarde du porte-monnaie devra être effectuée.
-Si ce porte-monnaie contient des scripts en lecture seule, un nouveau porte-monnaie sera créé contenant ces scripts en lecture seule.
-Si ce porte-monnaie contient des scripts solvables mais non surveillés, un autre nouveau porte-monnaie sera créé contenant ces scripts.
-Le processus de migration créera une sauvegarde du porte-monnaie avant la migration. Ce fichier de sauvegarde sera nommé &lt;nom du porte-monnaie&gt;-&lt;horodatage&gt;.legacy.bak et pourra être trouvé dans le répertoire de ce porte-monnaie. En cas de migration incorrecte, la sauvegarde peut être restaurée avec la fonctionnalité "Restaurer le porte-monnaie".</translation>
+ <translation type="unfinished">La migration du porte-monnaie le convertira en un ou plusieurs porte-monnaie de descripteurs. Une nouvelle sauvegarde du porte-monnaie devra être effectuée.
+Si ce porte-monnaie contient des scripts juste-regarder, un nouveau porte-monnaie sera créé qui comprendra ces scripts juste-regarder.
+Si ce porte-monnaie comprend des scripts solubles, mais non surveillés, un nouveau porte-monnaie différent sera créé comportant ces scripts.
+
+Le processus de migration créera une sauvegarde du porte-monnaie avant migration. Ce fichier de sauvegarde sera nommé &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak et se trouvera dans le dossier de ce porte-monnaie. En cas de migration erronée, la sauvegarde peut être restaurée avec la fonction « Restaurer le porte-monnaie ».</translation>
</message>
<message>
<source>Migrate Wallet</source>
- <translation type="unfinished">Migrer le portefeuille</translation>
+ <translation type="unfinished">Migrer le porte-monnaie</translation>
</message>
<message>
<source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <translation type="unfinished">Migration du portefeuille &lt;b&gt;%1&lt;/b&gt;…</translation>
+ <translation type="unfinished">Migration du porte-monnaie&lt;b&gt;%1&lt;/b&gt;…</translation>
</message>
<message>
<source>The wallet '%1' was migrated successfully.</source>
- <translation type="unfinished">Le porte-monnaie '%1' a été migré avec succès.</translation>
+ <translation type="unfinished">Le porte-monnaie « %1 » a été migré.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Les scripts en mode de visualisation ont été migrés vers un nouveau porte-monnaie nommé '%1'.</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Les scripts juste-regarder ont été migrés vers un nouveau porte-monnaie nommé « %1 ».</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Les scripts solvables mais non surveillés ont été migrés vers un nouveau porte-monnaie nommé '%1'.</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Les scripts solubles, mais non surveillés ont été migrés vers un nouveau porte-monnaie nommé « %1 ».</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1157,27 +1170,22 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<message>
<source>Restore Wallet</source>
<extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">Restaurer le portefeuille</translation>
- </message>
- <message>
- <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
- <translation type="unfinished">Restauration du Portefeuille&lt;b&gt;%1&lt;/b&gt;...</translation>
+ <translation type="unfinished">Restaurer le porte-monnaie</translation>
</message>
<message>
<source>Restore wallet failed</source>
<extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
- <translation type="unfinished">Échec de la restauration du portefeuille</translation>
+ <translation type="unfinished">Échec de restauration du porte-monnaie</translation>
</message>
<message>
<source>Restore wallet warning</source>
<extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
- <translation type="unfinished">Avertissement du Portefeuille restauré</translation>
+ <translation type="unfinished">Avertissement de restauration du porte-monnaie</translation>
</message>
<message>
<source>Restore wallet message</source>
<extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
- <translation type="unfinished">Message du Portefeuille restauré</translation>
+ <translation type="unfinished">Message de restauration du porte-monnaie</translation>
</message>
</context>
<context>
@@ -1211,7 +1219,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
</message>
<message>
<source>You are one step away from creating your new wallet!</source>
- <translation type="unfinished">Vous n'êtes qu'à un pas de la création de votre nouveau portefeuille !</translation>
+ <translation type="unfinished">Vous n’êtes qu’à un pas de créer votre nouveau porte-monnaie</translation>
</message>
<message>
<source>Please provide a name and, if desired, enable any advanced options</source>
@@ -1354,22 +1362,22 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n Go d’espace libre</numerusform>
+ <numerusform>%n Go d’espace libre</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(of %n GB needed)</source>
<translation type="unfinished">
- <numerusform>(of %n GB needed)</numerusform>
- <numerusform>(of %n GB needed)</numerusform>
+ <numerusform>(sur %n Go nécessaire)</numerusform>
+ <numerusform>(sur %n Go nécessaires)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(%n GB needed for full chain)</source>
<translation type="unfinished">
- <numerusform>(%n GB needed for full chain)</numerusform>
- <numerusform>(%n GB needed for full chain)</numerusform>
+ <numerusform>(sur %n Go nécessaire pour la chaîne entière)</numerusform>
+ <numerusform>(sur %n Go nécessaires pour la chaîne entière)</numerusform>
</translation>
</message>
<message>
@@ -1597,6 +1605,10 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">Quand la fenêtre est fermée, la réduire au lieu de quitter l’application. Si cette option est activée, l’application ne sera fermée qu’en sélectionnant Quitter dans le menu.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Police de l’onglet Vue d’ensemble :</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Les options définies dans cette boîte de dialogue sont remplacées par la ligne de commande :</translation>
</message>
@@ -1644,7 +1656,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<message>
<source>Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
<extracomment>Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</extracomment>
- <translation type="unfinished">Définissez le nombre de fils de vérification de script. Les valeurs négatives correspondent au nombre de cœurs que vous voulez laisser disponibles pour le système.</translation>
+ <translation type="unfinished">Définissez le nombre de fils de vérification de script. Les valeurs négatives correspondent au nombre de cœurs que vous voulez laisser à la disposition du système.</translation>
</message>
<message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
@@ -1817,18 +1829,6 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">Utiliser un mandataire SOCKS&amp;5 séparé pour atteindre les pairs par les services oignon de Tor :</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Police à espacement constant dans l’onglet Vue d’ensemble :</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">intégré « %1 »</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">correspondance la plus proche « %1 »</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Valider</translation>
</message>
@@ -1931,7 +1931,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
</message>
<message>
<source>Your current spendable balance</source>
- <translation type="unfinished">Votre solde actuel disponible</translation>
+ <translation type="unfinished">Votre solde utilisable actuel</translation>
</message>
<message>
<source>Pending:</source>
@@ -1939,7 +1939,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
</message>
<message>
<source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
- <translation type="unfinished">Total des transactions qui doivent encore être confirmées et qui ne sont pas prises en compte dans le solde disponible</translation>
+ <translation type="unfinished">Total des transactions qui doivent encore être confirmées et qui ne sont pas prises en compte dans le solde utilisable</translation>
</message>
<message>
<source>Immature:</source>
@@ -1967,7 +1967,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
</message>
<message>
<source>Spendable:</source>
- <translation type="unfinished">Disponible :</translation>
+ <translation type="unfinished">Utilisable :</translation>
</message>
<message>
<source>Recent transactions</source>
@@ -2038,7 +2038,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
</message>
<message>
<source>Signed transaction successfully. Transaction is ready to broadcast.</source>
- <translation type="unfinished">La transaction a été signée avec succès et est prête à être diffusée.</translation>
+ <translation type="unfinished">La transaction a été signée et est prête à être diffusée.</translation>
</message>
<message>
<source>Unknown error processing transaction.</source>
@@ -2046,7 +2046,7 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
</message>
<message>
<source>Transaction broadcast successfully! Transaction ID: %1</source>
- <translation type="unfinished">La transaction a été diffusée avec succès. ID de la transaction : %1</translation>
+ <translation type="unfinished">La transaction a été diffusée. ID de la transaction : %1</translation>
</message>
<message>
<source>Transaction broadcast failed: %1</source>
@@ -2070,8 +2070,8 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">La TBSP a été enregistrée sur le disque.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Envoie %1 à %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished"> Envoie %1 à %2</translation>
</message>
<message>
<source>own address</source>
@@ -2627,6 +2627,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Exécution de la commande sans aucun porte-monnaie</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Fenêtre des nœuds – [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Exécution de la commande en utilisant le porte-monnaie « %1 »</translation>
</message>
@@ -2768,7 +2772,7 @@ Pour plus de précisions sur cette console, tapez %6.
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">Copier l’&amp;étiquette</translation>
+ <translation type="unfinished">Copier l’é&amp;tiquette</translation>
</message>
<message>
<source>Copy &amp;message</source>
@@ -2776,7 +2780,7 @@ Pour plus de précisions sur cette console, tapez %6.
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">Copier le &amp;montant</translation>
+ <translation type="unfinished">Copier le mont&amp;ant</translation>
</message>
<message>
<source>Not recommended due to higher fees and less protection against typos.</source>
@@ -2784,15 +2788,15 @@ Pour plus de précisions sur cette console, tapez %6.
</message>
<message>
<source>Generates an address compatible with older wallets.</source>
- <translation type="unfinished">Génère une adresse compatible avec les anciens portefeuilles.</translation>
+ <translation type="unfinished">Génère une adresse compatible avec les anciens porte-monnaie.</translation>
</message>
<message>
<source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
- <translation type="unfinished">Génère une adresse segwit native (BIP-173). Certains anciens portefeuilles ne le supportent pas.</translation>
+ <translation type="unfinished">Génère une adresse segwit native (BIP-173). Certains anciens porte-monnaie ne la prennent pas en charge.</translation>
</message>
<message>
<source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
- <translation type="unfinished">Bech32m (BIP-350) est une mise à jour de Bech32, la prise en charge du portefeuille est encore limitée.</translation>
+ <translation type="unfinished">Bech32m (BIP-350) est une évolution de Bech32. La prise en charge par les porte-monnaie est encore limitée.</translation>
</message>
<message>
<source>Could not unlock wallet.</source>
@@ -3078,12 +3082,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Crée une transaction Bitcoin signée partiellement (TBSP) à utiliser, par exemple, avec un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">du porte-monnaie '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
- <translation type="unfinished">%1 à '%2'</translation>
+ <translation type="unfinished">%1 à « %2 ».</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -3139,6 +3139,10 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Veuillez réviser votre proposition de transaction. Une transaction Bitcoin partiellement signée (TBSP) sera produite, que vous pourrez enregistrer ou copier puis signer avec, par exemple, un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 du porte-monnaie « %2 ».</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Voulez-vous créer cette transaction ?</translation>
@@ -3414,7 +3418,7 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
</message>
<message>
<source>Private key for the entered address is not available.</source>
- <translation type="unfinished">La clé privée pour l’adresse saisie n’est pas disponible.</translation>
+ <translation type="unfinished">La clé privée pour l’adresse saisie n’est pas proposée.</translation>
</message>
<message>
<source>Message signing failed.</source>
@@ -3578,8 +3582,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Index des sorties</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Le certificat n’a pas été vérifié)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (le certificat n’a pas été vérifié)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3649,7 +3653,7 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
</message>
<message>
<source>Immature (%1 confirmations, will be available after %2)</source>
- <translation type="unfinished">Immature (%1 confirmations, sera disponible après %2)</translation>
+ <translation type="unfinished">Immature (%1 confirmations, sera accessible après %2)</translation>
</message>
<message>
<source>Generated but not accepted</source>
@@ -3768,11 +3772,11 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">Copier l’&amp;étiquette</translation>
+ <translation type="unfinished">Copier l’é&amp;tiquette</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">Copier le &amp;montant</translation>
+ <translation type="unfinished">Copier le mont&amp;ant</translation>
</message>
<message>
<source>Copy transaction &amp;ID</source>
@@ -3814,7 +3818,7 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">Fichier avec séparateur virgule</translation>
+ <translation type="unfinished">Fichier séparé par des virgules</translation>
</message>
<message>
<source>Confirmed</source>
@@ -3838,7 +3842,7 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Échec d’exportation</translation>
+ <translation type="unfinished">Échec d'exportation</translation>
</message>
<message>
<source>There was an error trying to save the transaction history to %1.</source>
@@ -3850,7 +3854,7 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
</message>
<message>
<source>The transaction history was successfully saved to %1.</source>
- <translation type="unfinished">L’historique transactionnel a été enregistré avec succès vers %1.</translation>
+ <translation type="unfinished">L’historique transactionnel a été enregistré vers %1.</translation>
</message>
<message>
<source>Range:</source>
@@ -3977,7 +3981,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exporter les données de l’onglet actuel vers un fichier</translation>
+ <translation type="unfinished">Exporter les données de l'onglet actuel vers un fichier</translation>
</message>
<message>
<source>Backup Wallet</source>
@@ -4002,7 +4006,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>The wallet data was successfully saved to %1.</source>
- <translation type="unfinished">Les données du porte-monnaie ont été enregistrées avec succès vers %1.</translation>
+ <translation type="unfinished">Les données du porte-monnaie ont été enregistrées vers %1.</translation>
</message>
<message>
<source>Cancel</source>
@@ -4017,7 +4021,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
- <translation type="unfinished">%s est corrompu. Essayez l’outil bitcoin-wallet pour le sauver ou restaurez une sauvegarde.</translation>
+ <translation type="unfinished">%s est corrompu. Essayez l’outil de porte-monnaie bitcoin-wallet pour le sauver ou le restaurer d’une sauvegarde.</translation>
</message>
<message>
<source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
@@ -4049,7 +4053,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
- <translation type="unfinished">Erreur de chargement du portefeuille. Le portefeuille nécessite le téléchargement de blocs, et le logiciel ne prend pas actuellement en charge le chargement de portefeuilles lorsque les blocs sont téléchargés dans le désordre lors de l'utilisation de snapshots assumeutxo. Le portefeuille devrait pouvoir être chargé avec succès une fois que la synchronisation des nœuds aura atteint la hauteur %s</translation>
+ <translation type="unfinished">Erreur de chargement du porte-monnaie. Le porte-monnaie exige le téléchargement de blocs, toutefois le logiciel ne prend pas actuellement en charge le chargement de porte-monnaie pendant que des blocs sont téléchargés dans le désordre lors de l’utilisation d’instantanés assumeutxo. Le porte-monnaie devrait pouvoir se charger une fois que la synchronisation des nœuds aura atteint la hauteur %s</translation>
</message>
<message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
@@ -4073,7 +4077,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
- <translation type="unfinished">Erreur : Impossible de produire des descripteurs pour ce portefeuille existant. Veillez à fournir la phrase secrète du portefeuille s'il est crypté.</translation>
+ <translation type="unfinished">Erreur : Impossible de produire des descripteurs pour cet ancien porte-monnaie. Veillez à fournir la phrase de passe du porte-monnaie s’il est chiffré.</translation>
</message>
<message>
<source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
@@ -4177,11 +4181,11 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
- <translation type="unfinished">Portefeuille créé avec succès. Le type de portefeuille ancien est en cours de suppression et la prise en charge de la création et de l'ouverture des portefeuilles anciens sera supprimée à l'avenir.</translation>
+ <translation type="unfinished">Le porte-monnaie a été créé. Le type de porte-monnaie ancien devient obsolète et la prise en charge de la création et de l’ouverture des porte-monnaie anciens sera supprimée à l’avenir.</translation>
</message>
<message>
<source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
- <translation type="unfinished">Portefeuille chargé avec succès. Le type de portefeuille existant est obsolète et la prise en charge de la création et de l'ouverture de portefeuilles existants sera supprimée à l'avenir. Les anciens portefeuilles peuvent être migrés vers un portefeuille descripteur avec migratewallet.</translation>
+ <translation type="unfinished">Le porte-monnaie a été créé. Le type de porte-monnaie ancien devient obsolète et la prise en charge de la création et de l’ouverture des porte-monnaie anciens sera supprimée à l’avenir. Les anciens porte-monnaie peuvent être migrés vers un porte-monnaie de descripteurs avec migratewallet.</translation>
</message>
<message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
@@ -4249,15 +4253,15 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Erreur : Les données du carnet d'adresses du portefeuille ne peuvent pas être identifiées comme appartenant à des portefeuilles migrés</translation>
+ <translation type="unfinished">Erreur : Les données du carnet d’adresses du porte-monnaie ne peuvent pas être identifiées comme appartenant à des porte-monnaie migrés</translation>
</message>
<message>
<source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
- <translation type="unfinished">Erreur : Descripteurs en double créés pendant la migration. Votre portefeuille est peut-être corrompu.</translation>
+ <translation type="unfinished">Erreur : Des descripteurs ont été créés en double lors de la migration. Votre porte-monnaie est peut-être corrompu.</translation>
</message>
<message>
<source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Erreur : La transaction %s dans le portefeuille ne peut pas être identifiée comme appartenant aux portefeuilles migrés</translation>
+ <translation type="unfinished">Erreur : La transaction %s dans le porte-monnaie ne peut pas être identifiée comme appartenant aux porte-monnaie migrés</translation>
</message>
<message>
<source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
@@ -4297,7 +4301,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
- <translation type="unfinished">La taille des entrées dépasse le poids maximum. Veuillez essayer d'envoyer un montant plus petit ou de consolider manuellement les UTXOs de votre portefeuille</translation>
+ <translation type="unfinished">La taille des entrées dépasse le poids maximum. Essayez d’envoyer un montant plus petit ou de consolider manuellement les UTXO de votre porte-monnaie</translation>
</message>
<message>
<source>The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
@@ -4313,16 +4317,16 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">Les UTXO non confirmés sont disponibles, mais les dépenser crée une chaîne de transactions qui sera rejetée par le mempool</translation>
+ <translation type="unfinished">Les UTXO non confirmés sont utilisables, mais les dépenser crée une chaîne de transactions qui sera rejetée par la réserve de mémoire</translation>
</message>
<message>
<source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
The wallet might have been tampered with or created with malicious intent.
</source>
- <translation type="unfinished">Une entrée héritée inattendue dans le portefeuille de descripteurs a été trouvée. Chargement du portefeuille %s
+ <translation type="unfinished">Une entrée héritée inattendue a été trouvée dans le porte-monnaie de descripteurs. Chargement du porte-monnaie %s
-Le portefeuille peut avoir été altéré ou créé avec des intentions malveillantes.
+Le porte-monnaie a peut-être avoir été altéré ou créé avec des intentions malveillantes.
</translation>
</message>
<message>
@@ -4331,10 +4335,10 @@ Le portefeuille peut avoir été altéré ou créé avec des intentions malveill
The wallet might had been created on a newer version.
Please try running the latest software version.
</source>
- <translation type="unfinished">Descripteur non reconnu trouvé. Chargement du portefeuille %s
+ <translation type="unfinished">Un descripteur non reconnu a été trouvé. Chargement du porte-monnaie %s
-Le portefeuille a peut-être été créé avec une version plus récente.
-Veuillez essayer d'utiliser la dernière version du logiciel.
+Le porte-monnaie a peut-être été créé avec une version plus récente.
+Essayez d’utiliser la version la plus récente du logiciel.
</translation>
</message>
<message>
@@ -4347,7 +4351,7 @@ Impossible de corriger l'échec de la migration</translation>
<source>
Unable to restore backup of wallet.</source>
<translation type="unfinished">
-Impossible de restaurer la sauvegarde du portefeuille.</translation>
+Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
<source>Block verification was interrupted</source>
@@ -4390,6 +4394,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Le fichier de vidage %s n’existe pas.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erreur de validation de la transaction de base de données pour la suppression des transactions du porte-monnaie</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Erreur de création de %s</translation>
</message>
@@ -4438,16 +4446,12 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur de lecture de l’enregistrement suivant de la base de données du porte-monnaie</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Erreur : Impossible d'extraire la destination du scriptpubkey généré</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Erreur : Impossible d'ajouter la transaction watchonly au portefeuille watchonly</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erreur de démarrage de la transaction de base de données pour la suppression des transactions du porte-monnaie</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Erreur : Impossible d'effacer les transactions de type "watchonly".</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Erreur : Impossible d'extraire la destination du scriptpubkey généré</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4463,7 +4467,7 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Erreur : Echec de la création d'un nouveau portefeuille watchonly</translation>
+ <translation type="unfinished">Erreur : Échec de création d’un nouveau porte-monnaie juste-regarder</translation>
</message>
<message>
<source>Error: Got key that was not hex: %s</source>
@@ -4483,27 +4487,23 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
<source>Error: No %s addresses available.</source>
- <translation type="unfinished">Erreur : Aucune adresse %s n’est disponible.</translation>
- </message>
- <message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Erreur : Toutes les transactions watchonly n'ont pas pu être supprimés.</translation>
+ <translation type="unfinished">Erreur : Aucune adresse %s n’est accessible.</translation>
</message>
<message>
<source>Error: This wallet already uses SQLite</source>
- <translation type="unfinished">Erreur : Ce portefeuille utilise déjà SQLite</translation>
+ <translation type="unfinished">Erreur : Ce porte-monnaie utilise déjà SQLite</translation>
</message>
<message>
<source>Error: This wallet is already a descriptor wallet</source>
- <translation type="unfinished">Erreur : Ce portefeuille est déjà un portefeuille de descripteurs</translation>
+ <translation type="unfinished">Erreur : Ce porte-monnaie est déjà un porte-monnaie de descripteurs</translation>
</message>
<message>
<source>Error: Unable to begin reading all records in the database</source>
- <translation type="unfinished">Erreur : Impossible de commencer à lire tous les enregistrements de la base de données</translation>
+ <translation type="unfinished">Erreur : Impossible de commencer à lire tous les enregistrements de la base de données</translation>
</message>
<message>
<source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">Erreur : Impossible d'effectuer une sauvegarde de votre portefeuille</translation>
+ <translation type="unfinished">Erreur : Impossible d’effectuer une sauvegarde de votre porte-monnaie</translation>
</message>
<message>
<source>Error: Unable to parse version %u as a uint32_t</source>
@@ -4511,19 +4511,39 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
<source>Error: Unable to read all records in the database</source>
- <translation type="unfinished">Erreur : Impossible de lire tous les enregistrements de la base de données</translation>
+ <translation type="unfinished">Erreur : Impossible de lire tous les enregistrements de la base de données</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible de lire l’enregistrement du meilleur bloc du porte-monnaie.</translation>
</message>
<message>
<source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">Erreur : Impossible de supprimer les données du carnet d'adresses watchonly</translation>
+ <translation type="unfinished">Erreur : Impossible de supprimer les données du carnet d’adresses juste-regarder</translation>
</message>
<message>
<source>Error: Unable to write record to new wallet</source>
<translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement dans le nouveau porte-monnaie</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc pour le porte-monnaie soluble</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc du porte-monnaie juste-regarder</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Erreur :Échec d’écriture du carnet d’adresses pour le porte-monnaie %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Erreur ; La transaction de la base de données ne peut pas être exécutée pour le porte-monnaie %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation type="unfinished">Échec d'écoute sur tous les ports. Si cela est voulu, utiliser -listen=0.</translation>
+ <translation type="unfinished">Échec d’écoute sur tous les ports. Si cela est voulu, utiliser -listen=0.</translation>
</message>
<message>
<source>Failed to rescan the wallet during initialization</source>
@@ -4538,12 +4558,16 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Échec de vérification de la base de données</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Échec de retrait de la transaction :%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Le taux de frais (%s) est inférieur au taux minimal de frais défini (%s)</translation>
</message>
<message>
<source>Ignoring duplicate -wallet %s.</source>
- <translation type="unfinished">Ignore -wallet %s en double.</translation>
+ <translation type="unfinished">Non prise en compte de -wallet %s en double.</translation>
</message>
<message>
<source>Importing…</source>
@@ -4643,11 +4667,11 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
<source>No addresses available</source>
- <translation type="unfinished">Aucune adresse n’est disponible</translation>
+ <translation type="unfinished">Aucune adresse n’est accessible</translation>
</message>
<message>
<source>Not enough file descriptors available.</source>
- <translation type="unfinished">Trop peu de descripteurs de fichiers sont disponibles.</translation>
+ <translation type="unfinished">Trop peu de descripteurs de fichiers sont proposés.</translation>
</message>
<message>
<source>Not found pre-selected input %s</source>
@@ -4655,7 +4679,7 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
<source>Not solvable pre-selected input %s</source>
- <translation type="unfinished">Entrée présélectionnée non solvable %s</translation>
+ <translation type="unfinished">Entrée présélectionnée non soluble %s</translation>
</message>
<message>
<source>Prune cannot be configured with a negative value.</source>
@@ -4758,6 +4782,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Il s’agit des frais minimaux que vous payerez si vous envoyez une transaction.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transaction %s n’appartient pas à ce porte-monnaie</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Le montant de la transaction est trop bas</translation>
</message>
@@ -4770,10 +4798,6 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">L’index des sorties de monnaie des transactions est hors échelle</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La chaîne de la réserve de mémoire de la transaction est trop longue</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transaction doit comporter au moins un destinataire</translation>
</message>
@@ -4854,6 +4878,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Niveau de journalisation global non pris en charge %s=%s. Valeurs valides : %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Échec de création du fichier du porte-monnaie : %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates n'est pas pris en charge sur la chaîne %s.</translation>
</message>
@@ -4862,6 +4890,14 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">La catégorie de journalisation %s=%s n’est pas prise en charge</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Erreur : Impossible d’ajouter la transaction juste-regarder %s au portefeuille juste-regarder</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Erreur : Impossible d’effacer les transactions juste-regarder.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Le commentaire de l’agent utilisateur (%s) comporte des caractères dangereux</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fr_CM.ts b/src/qt/locale/bitcoin_fr_CM.ts
index 8c2fd96681..50d27a4f85 100644
--- a/src/qt/locale/bitcoin_fr_CM.ts
+++ b/src/qt/locale/bitcoin_fr_CM.ts
@@ -299,6 +299,18 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">inconnue</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Intégré « %1 »</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Police système par défaut « %1 »</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Persnnalisé…</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Montant</translation>
</message>
@@ -1104,12 +1116,12 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">Le porte-monnaie '%1' a été migré avec succès.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Les scripts en mode de visualisation ont été migrés vers un nouveau porte-monnaie nommé '%1'.</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Les scripts juste-regarder ont été migrés vers un nouveau porte-monnaie nommé « %1 ».</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Les scripts solvables mais non surveillés ont été migrés vers un nouveau porte-monnaie nommé '%1'.</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Les scripts solubles, mais non surveillés ont été migrés vers un nouveau porte-monnaie nommé « %1 ».</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1347,8 +1359,8 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n Go d’espace libre</numerusform>
+ <numerusform>%n Go d’espace libre</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -1590,6 +1602,10 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">Quand la fenêtre est fermée, la réduire au lieu de quitter l’application. Si cette option est activée, l’application ne sera fermée qu’en sélectionnant Quitter dans le menu.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Police de l’onglet Vue d’ensemble :</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Les options définies dans cette boîte de dialogue sont remplacées par la ligne de commande :</translation>
</message>
@@ -1810,18 +1826,6 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">Utiliser un mandataire SOCKS&amp;5 séparé pour atteindre les pairs par les services oignon de Tor :</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Police à espacement constant dans l’onglet Vue d’ensemble :</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">intégré « %1 »</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">correspondance la plus proche « %1 »</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Valider</translation>
</message>
@@ -2063,8 +2067,8 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">La TBSP a été enregistrée sur le disque.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Envoie %1 à %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished"> Envoie %1 à %2</translation>
</message>
<message>
<source>own address</source>
@@ -2620,6 +2624,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Exécution de la commande sans aucun porte-monnaie</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Fenêtre des nœuds – [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Exécution de la commande en utilisant le porte-monnaie « %1 »</translation>
</message>
@@ -3071,10 +3079,6 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Crée une transaction Bitcoin signée partiellement (TBSP) à utiliser, par exemple, avec un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">du porte-monnaie '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 à '%2'</translation>
</message>
@@ -3132,6 +3136,10 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Veuillez réviser votre proposition de transaction. Une transaction Bitcoin partiellement signée (TBSP) sera produite, que vous pourrez enregistrer ou copier puis signer avec, par exemple, un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 du porte-monnaie « %2 ».</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Voulez-vous créer cette transaction ?</translation>
@@ -3571,8 +3579,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Index des sorties</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Le certificat n’a pas été vérifié)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (ce certificat n’a pas été vérifié)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4381,6 +4389,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Le fichier de vidage %s n’existe pas.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erreur de validation des transactions de la base de données pour la suppression des transactions du porte-monnaie</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Erreur de création de %s</translation>
</message>
@@ -4429,16 +4441,12 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur de lecture de l’enregistrement suivant de la base de données du porte-monnaie</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Erreur : Impossible d'extraire la destination du scriptpubkey généré</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Erreur : Impossible d'ajouter le tx watchonly au portefeuille watchonly</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erreur de démarrage des transactions de la base de données pour la suppression des transactions du porte-monnaie</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Erreur : Impossible d'effacer les transactions de type "watchonly".</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Erreur : Impossible d'extraire la destination du scriptpubkey généré</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4477,10 +4485,6 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur : Aucune adresse %s n’est disponible.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Erreur : Toutes les transactions watchonly n'ont pas pu être supprimés.</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Erreur : Ce portefeuille utilise déjà SQLite</translation>
</message>
@@ -4505,6 +4509,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur : Impossible de lire tous les enregistrements de la base de données</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible de lire l’enregistrement du meilleur bloc du porte-monnaie.</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Erreur : Impossible de supprimer les données du carnet d'adresses en mode veille</translation>
</message>
@@ -4513,6 +4521,22 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement dans le nouveau porte-monnaie</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc soluble du porte-monnaie</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc du porte-monnaie juste-regarder</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Erreur :Échec d’écriture du carnet d’adresses pour le porte-monnaie %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Erreur ; La transaction de la base de données ne peut pas être exécutée pour le porte-monnaie %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Échec d'écoute sur tous les ports. Si cela est voulu, utiliser -listen=0.</translation>
</message>
@@ -4529,6 +4553,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Échec de vérification de la base de données</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Échec de suppression de la transaction :%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Le taux de frais (%s) est inférieur au taux minimal de frais défini (%s)</translation>
</message>
@@ -4749,6 +4777,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Il s’agit des frais minimaux que vous payerez si vous envoyez une transaction.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transaction %s n’appartient pas à ce porte-monnaie</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Le montant de la transaction est trop bas</translation>
</message>
@@ -4761,10 +4793,6 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">L’index des sorties de monnaie des transactions est hors échelle</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La chaîne de la réserve de mémoire de la transaction est trop longue</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transaction doit comporter au moins un destinataire</translation>
</message>
@@ -4845,6 +4873,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Niveau de journalisation global non pris en charge %s=%s. Valeurs valides : %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Échec de création du fichier du porte-monnaie : %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates n'est pas pris en charge sur la chaîne %s.</translation>
</message>
@@ -4853,6 +4885,14 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">La catégorie de journalisation %s=%s n’est pas prise en charge</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Erreur : Impossible d’ajouter la transaction juste-regarder %s au portefeuille juste-regarder</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Erreur : Impossible d’effacer les transactions juste-regarder.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Le commentaire de l’agent utilisateur (%s) comporte des caractères dangereux</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fr_LU.ts b/src/qt/locale/bitcoin_fr_LU.ts
index cc235f0d56..1c0fd095c4 100644
--- a/src/qt/locale/bitcoin_fr_LU.ts
+++ b/src/qt/locale/bitcoin_fr_LU.ts
@@ -299,6 +299,18 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">inconnue</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Intégré « %1 »</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Police système par défaut « %1 »</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Persnnalisé…</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Montant</translation>
</message>
@@ -1104,12 +1116,12 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">Le porte-monnaie '%1' a été migré avec succès.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Les scripts en mode de visualisation ont été migrés vers un nouveau porte-monnaie nommé '%1'.</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Les scripts juste-regarder ont été migrés vers un nouveau porte-monnaie nommé « %1 ».</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Les scripts solvables mais non surveillés ont été migrés vers un nouveau porte-monnaie nommé '%1'.</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Les scripts solubles, mais non surveillés ont été migrés vers un nouveau porte-monnaie nommé « %1 ».</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1347,8 +1359,8 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n Go d’espace libre</numerusform>
+ <numerusform>%n Go d’espace libre</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -1590,6 +1602,10 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">Quand la fenêtre est fermée, la réduire au lieu de quitter l’application. Si cette option est activée, l’application ne sera fermée qu’en sélectionnant Quitter dans le menu.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Police de l’onglet Vue d’ensemble :</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Les options définies dans cette boîte de dialogue sont remplacées par la ligne de commande :</translation>
</message>
@@ -1810,18 +1826,6 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">Utiliser un mandataire SOCKS&amp;5 séparé pour atteindre les pairs par les services oignon de Tor :</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Police à espacement constant dans l’onglet Vue d’ensemble :</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">intégré « %1 »</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">correspondance la plus proche « %1 »</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Valider</translation>
</message>
@@ -2063,8 +2067,8 @@ Le processus de migration créera une sauvegarde du porte-monnaie avant la migra
<translation type="unfinished">La TBSP a été enregistrée sur le disque.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Envoie %1 à %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished"> Envoie %1 à %2</translation>
</message>
<message>
<source>own address</source>
@@ -2620,6 +2624,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Exécution de la commande sans aucun porte-monnaie</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Fenêtre des nœuds – [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Exécution de la commande en utilisant le porte-monnaie « %1 »</translation>
</message>
@@ -3071,10 +3079,6 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Crée une transaction Bitcoin signée partiellement (TBSP) à utiliser, par exemple, avec un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">du porte-monnaie '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 à '%2'</translation>
</message>
@@ -3132,6 +3136,10 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Veuillez réviser votre proposition de transaction. Une transaction Bitcoin partiellement signée (TBSP) sera produite, que vous pourrez enregistrer ou copier puis signer avec, par exemple, un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 du porte-monnaie « %2 ».</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Voulez-vous créer cette transaction ?</translation>
@@ -3571,8 +3579,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Index des sorties</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Le certificat n’a pas été vérifié)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (ce certificat n’a pas été vérifié)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4381,6 +4389,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Le fichier de vidage %s n’existe pas.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erreur de validation des transactions de la base de données pour la suppression des transactions du porte-monnaie</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Erreur de création de %s</translation>
</message>
@@ -4429,16 +4441,12 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur de lecture de l’enregistrement suivant de la base de données du porte-monnaie</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Erreur : Impossible d'extraire la destination du scriptpubkey généré</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Erreur : Impossible d'ajouter le tx watchonly au portefeuille watchonly</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erreur de démarrage des transactions de la base de données pour la suppression des transactions du porte-monnaie</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Erreur : Impossible d'effacer les transactions de type "watchonly".</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Erreur : Impossible d'extraire la destination du scriptpubkey généré</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4477,10 +4485,6 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur : Aucune adresse %s n’est disponible.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Erreur : Toutes les transactions watchonly n'ont pas pu être supprimés.</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Erreur : Ce portefeuille utilise déjà SQLite</translation>
</message>
@@ -4505,6 +4509,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur : Impossible de lire tous les enregistrements de la base de données</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible de lire l’enregistrement du meilleur bloc du porte-monnaie.</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Erreur : Impossible de supprimer les données du carnet d'adresses en mode veille</translation>
</message>
@@ -4513,6 +4521,22 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement dans le nouveau porte-monnaie</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc soluble du porte-monnaie</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc du porte-monnaie juste-regarder</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Erreur :Échec d’écriture du carnet d’adresses pour le porte-monnaie %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Erreur ; La transaction de la base de données ne peut pas être exécutée pour le porte-monnaie %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Échec d'écoute sur tous les ports. Si cela est voulu, utiliser -listen=0.</translation>
</message>
@@ -4529,6 +4553,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Échec de vérification de la base de données</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Échec de suppression de la transaction :%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Le taux de frais (%s) est inférieur au taux minimal de frais défini (%s)</translation>
</message>
@@ -4749,6 +4777,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Il s’agit des frais minimaux que vous payerez si vous envoyez une transaction.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transaction %s n’appartient pas à ce porte-monnaie</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Le montant de la transaction est trop bas</translation>
</message>
@@ -4761,10 +4793,6 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">L’index des sorties de monnaie des transactions est hors échelle</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La chaîne de la réserve de mémoire de la transaction est trop longue</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transaction doit comporter au moins un destinataire</translation>
</message>
@@ -4845,6 +4873,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Niveau de journalisation global non pris en charge %s=%s. Valeurs valides : %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Échec de création du fichier du porte-monnaie : %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates n'est pas pris en charge sur la chaîne %s.</translation>
</message>
@@ -4853,6 +4885,14 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">La catégorie de journalisation %s=%s n’est pas prise en charge</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Erreur : Impossible d’ajouter la transaction juste-regarder %s au portefeuille juste-regarder</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Erreur : Impossible d’effacer les transactions juste-regarder.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Le commentaire de l’agent utilisateur (%s) comporte des caractères dangereux</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ga.ts b/src/qt/locale/bitcoin_ga.ts
index a957a35a00..901748a146 100644
--- a/src/qt/locale/bitcoin_ga.ts
+++ b/src/qt/locale/bitcoin_ga.ts
@@ -1514,10 +1514,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">IBSP sábháilte ar dhiosca.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Seolann %1 chuig %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">seoladh féin</translation>
</message>
@@ -2267,10 +2263,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cruthaíonn Idirbheart Bitcoin Sínithe go Páirteach (IBSP) le húsáid le e.g. sparán as líne %1, nó sparán crua-earraí atá comhoiriúnach le IBSP.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">ó sparán '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 go '%2'</translation>
</message>
@@ -2718,10 +2710,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Innéacs aschuir</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Níor fíoraíodh teastas)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Ceannaí</translation>
</message>
@@ -3429,10 +3417,6 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Níor cheart go mbeadh suimeanna idirbhirt diúltach</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Tá slabhra mempool ró-fhada ag an idirbheart</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Caithfidh ar a laghad faighteoir amháin a bheith ag idirbheart</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ga_IE.ts b/src/qt/locale/bitcoin_ga_IE.ts
index fe030c889b..df252f82d5 100644
--- a/src/qt/locale/bitcoin_ga_IE.ts
+++ b/src/qt/locale/bitcoin_ga_IE.ts
@@ -1514,10 +1514,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">IBSP sábháilte ar dhiosca.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Seolann %1 chuig %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">seoladh féin</translation>
</message>
@@ -2267,10 +2263,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cruthaíonn Idirbheart Bitcoin Sínithe go Páirteach (IBSP) le húsáid le e.g. sparán as líne %1, nó sparán crua-earraí atá comhoiriúnach le IBSP.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">ó sparán '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 go '%2'</translation>
</message>
@@ -2718,10 +2710,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Innéacs aschuir</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Níor fíoraíodh teastas)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Ceannaí</translation>
</message>
@@ -3429,10 +3417,6 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Níor cheart go mbeadh suimeanna idirbhirt diúltach</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Tá slabhra mempool ró-fhada ag an idirbheart</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Caithfidh ar a laghad faighteoir amháin a bheith ag idirbheart</translation>
</message>
diff --git a/src/qt/locale/bitcoin_gl_ES.ts b/src/qt/locale/bitcoin_gl_ES.ts
index 74c7d4d4d3..854aebfc6f 100644
--- a/src/qt/locale/bitcoin_gl_ES.ts
+++ b/src/qt/locale/bitcoin_gl_ES.ts
@@ -123,10 +123,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Nova frase contrasinal</translation>
</message>
<message>
- <source>Repeat new passphrase</source>
- <translation type="unfinished">Repite a frase contrasinal</translation>
- </message>
- <message>
<source>Show passphrase</source>
<translation type="unfinished">Mostra frase contrasinal</translation>
</message>
diff --git a/src/qt/locale/bitcoin_hak.ts b/src/qt/locale/bitcoin_hak.ts
index c07373fb6e..ca7723785c 100644
--- a/src/qt/locale/bitcoin_hak.ts
+++ b/src/qt/locale/bitcoin_hak.ts
@@ -294,15 +294,45 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">请输入一个比特币地址 (例如 %1)</translation>
+ </message>
+ <message>
+ <source>Unroutable</source>
+ <translation type="unfinished">不可路由</translation>
+ </message>
+ <message>
<source>Inbound</source>
<extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
<message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
+ </message>
+ <message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
<translation type="unfinished">区块转发</translation>
@@ -313,6 +343,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手册</translation>
</message>
<message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation type="unfinished">%1 天</translation>
+ </message>
+ <message>
<source>%1 h</source>
<translation type="unfinished">%1 小时</translation>
</message>
@@ -321,6 +365,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">%1 分</translation>
</message>
<message>
+ <source>%1 s</source>
+ <translation type="unfinished">%1 秒</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
<source>N/A</source>
<translation type="unfinished">未知</translation>
</message>
@@ -792,12 +844,24 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">警告: %1</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">日期: %1
+</translation>
+ </message>
+ <message>
<source>Amount: %1
</source>
<translation type="unfinished">金額: %1
</translation>
</message>
<message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">錢包: %1
+</translation>
+ </message>
+ <message>
<source>Type: %1
</source>
<translation type="unfinished">種類: %1
@@ -816,6 +880,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">送出交易</translation>
+ </message>
+ <message>
<source>Incoming transaction</source>
<translation type="unfinished">收款交易</translation>
</message>
@@ -836,6 +904,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;解鎖中&lt;/b&gt;</translation>
</message>
<message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
+ </message>
+ <message>
<source>Original message:</source>
<translation type="unfinished">原消息:</translation>
</message>
@@ -854,10 +926,34 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手动选币</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">总量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組數:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">全(不)选</translation>
+ </message>
+ <message>
<source>Tree mode</source>
<translation type="unfinished">树状模式</translation>
</message>
@@ -870,10 +966,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation type="unfinished">收款标签</translation>
+ </message>
+ <message>
<source>Received with address</source>
<translation type="unfinished">收款地址</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation type="unfinished">复制金额</translation>
</message>
@@ -898,6 +1006,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">锁定未花费(&amp;O)</translation>
</message>
<message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">解锁未花费(&amp;U)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -933,7 +1045,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- </context>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(找零)</translation>
+ </message>
+</context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -998,12 +1114,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">仅观察脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> 可解但又未被监视的脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1076,7 +1192,11 @@ The migration process will create a backup of the wallet before migrating. This
<source>Close all wallets</source>
<translation type="unfinished">关闭所有钱包</translation>
</message>
- </context>
+ <message>
+ <source>Are you sure you wish to close all wallets?</source>
+ <translation type="unfinished">您确定想要关闭所有钱包吗?</translation>
+ </message>
+</context>
<context>
<name>CreateWalletDialog</name>
<message>
@@ -1123,6 +1243,10 @@ The migration process will create a backup of the wallet before migrating. This
<source>Make Blank Wallet</source>
<translation type="unfinished">製作空白錢包</translation>
</message>
+ <message>
+ <source>Create</source>
+ <translation type="unfinished">创建</translation>
+ </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -1143,6 +1267,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">跟這個地址清單關聯的地址。只有發送地址能被修改。</translation>
</message>
<message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">地址(&amp;A)</translation>
+ </message>
+ <message>
<source>New sending address</source>
<translation type="unfinished">新建付款地址</translation>
</message>
@@ -1155,6 +1283,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">编辑付款地址</translation>
</message>
<message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">地址“%1”已经存在,它是一个收款地址,标签为“%2”,所以它不能作为一个付款地址被添加进来。</translation>
+ </message>
+ <message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
<translation type="unfinished">输入的地址“%1”已经存在于地址簿中,标签为“%2”。</translation>
</message>
@@ -1174,10 +1306,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">就要產生新的資料目錄。</translation>
</message>
<message>
+ <source>name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
<translation type="unfinished">已經有這個目錄了。如果你要在裡面造出新的目錄的話,請加上 %1.</translation>
</message>
<message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">路径已存在,并且不是一个目录。</translation>
+ </message>
+ <message>
<source>Cannot create data directory here.</source>
<translation type="unfinished">无法在此创建数据目录。</translation>
</message>
@@ -1210,6 +1350,10 @@ The migration process will create a backup of the wallet before migrating. This
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
<translation type="unfinished">此目录中至少会保存 %1 GB 的数据,并且大小还会随着时间增长。</translation>
</message>
+ <message>
+ <source>Approximately %1 GB of data will be stored in this directory.</source>
+ <translation type="unfinished">会在此目录中存储约 %1 GB 的数据。</translation>
+ </message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
@@ -1238,10 +1382,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">欢迎</translation>
</message>
<message>
+ <source>Welcome to %1.</source>
+ <translation type="unfinished">欢迎使用 %1</translation>
+ </message>
+ <message>
<source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
<translation type="unfinished">由于这是第一次启动此程序,您可以选择%1存储数据的位置</translation>
</message>
<message>
+ <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
+ <translation type="unfinished">取消此设置需要重新下载整个区块链。先完整下载整条链再进行修剪会更快。这会禁用一些高级功能。</translation>
+ </message>
+ <message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
<translation type="unfinished">初始化同步过程是非常吃力的,同时可能会暴露您之前没有注意到的电脑硬件问题。你每次启动%1时,它都会从之前中断的地方继续下载。</translation>
</message>
@@ -1265,6 +1417,10 @@ The migration process will create a backup of the wallet before migrating. This
<context>
<name>HelpMessageDialog</name>
<message>
+ <source>version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>About %1</source>
<translation type="unfinished">关于 %1</translation>
</message>
@@ -1279,7 +1435,11 @@ The migration process will create a backup of the wallet before migrating. This
<source>%1 is shutting down…</source>
<translation type="unfinished">%1正在关闭...</translation>
</message>
- </context>
+ <message>
+ <source>Do not shut down the computer until this window disappears.</source>
+ <translation type="unfinished">在此窗口消失前不要关闭计算机。</translation>
+ </message>
+</context>
<context>
<name>ModalOverlay</name>
<message>
@@ -1287,6 +1447,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗体</translation>
</message>
<message>
+ <source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
+ <translation type="unfinished">近期交易可能尚未显示,因此当前余额可能不准确。以上信息将在与比特币网络完全同步后更正。详情如下</translation>
+ </message>
+ <message>
+ <source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
+ <translation type="unfinished">尝试使用受未可见交易影响的余额将不被网络接受。</translation>
+ </message>
+ <message>
+ <source>Number of blocks left</source>
+ <translation type="unfinished">剩余区块数量</translation>
+ </message>
+ <message>
<source>Unknown…</source>
<translation type="unfinished">未知...</translation>
</message>
@@ -1295,6 +1467,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">计算中...</translation>
</message>
<message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
<source>Progress</source>
<translation type="unfinished">进度</translation>
</message>
@@ -1303,6 +1479,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">每小时进度增加</translation>
</message>
<message>
+ <source>Estimated time left until synced</source>
+ <translation type="unfinished">预计剩余同步时间</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">隐藏</translation>
</message>
@@ -1325,7 +1505,12 @@ The migration process will create a backup of the wallet before migrating. This
<source>Open bitcoin URI</source>
<translation type="unfinished">打开比特币URI</translation>
</message>
- </context>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+</context>
<context>
<name>OptionsDialog</name>
<message>
@@ -1333,6 +1518,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">選項</translation>
</message>
<message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">主要(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">在登入系统后自动启动 %1</translation>
+ </message>
+ <message>
<source>&amp;Start %1 on system login</source>
<translation type="unfinished">系统登入时启动 %1 (&amp;S)</translation>
</message>
@@ -1341,6 +1534,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">启用区块修剪会显著减小存储交易对磁盘空间的需求。所有的区块仍然会被完整校验。取消这个设置需要重新下载整条区块链。</translation>
</message>
<message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">数据库缓存大小(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">脚本验证线程数(&amp;V)</translation>
+ </message>
+ <message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
<translation type="unfinished">与%1兼容的脚本文件路径(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:恶意软件可以偷币!</translation>
</message>
@@ -1357,6 +1558,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
@@ -1381,6 +1586,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">网络(&amp;N)</translation>
</message>
<message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">将区块存储修剪至(&amp;B)</translation>
+ </message>
+ <message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
<translation type="unfinished">警告:还原此设置需要重新下载整个区块链。</translation>
</message>
@@ -1409,6 +1618,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">启用R&amp;PC服务器</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">钱包(&amp;A)</translation>
+ </message>
+ <message>
<source>Whether to set subtract fee from amount as default or not.</source>
<extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
<translation type="unfinished">是否要默认从金额中减去手续费。</translation>
@@ -1419,10 +1632,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">默认从金额中减去交易手续费(&amp;F)</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation type="unfinished">专家</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">启用手动选币功能(&amp;C)</translation>
+ </message>
+ <message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished">如果您禁止动用尚未确认的找零资金,则一笔交易的找零资金至少需要有1个确认后才能动用。这同时也会影响账户余额的计算。</translation>
</message>
<message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">动用尚未确认的找零资金(&amp;S)</translation>
+ </message>
+ <message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
<translation type="unfinished">启用&amp;PSBT控件</translation>
@@ -1433,10 +1658,30 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">是否要显示PSBT控件</translation>
</message>
<message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">外接簽證設備 (e.g. 硬體錢包)</translation>
+ </message>
+ <message>
<source>&amp;External signer script path</source>
<translation type="unfinished">外部签名器脚本路径(&amp;E)</translation>
</message>
<message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">使用 &amp;UPnP 映射端口</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
<source>Accept connections from outside.</source>
<translation type="unfinished">接受外來連線</translation>
</message>
@@ -1453,6 +1698,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">通过 SO&amp;CKS5 代理连接(默认代理):</translation>
</message>
<message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">代理服务器 &amp;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">端口(&amp;P):</translation>
+ </message>
+ <message>
<source>Port of the proxy (e.g. 9050)</source>
<translation type="unfinished">代理伺服器的通訊埠(像是 9050)</translation>
</message>
@@ -1465,6 +1718,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗口(&amp;W)</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">視窗縮到最小後只在通知區顯示圖示。</translation>
</message>
@@ -1477,6 +1738,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">单击关闭按钮时最小化(&amp;I)</translation>
</message>
<message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">显示(&amp;D)</translation>
+ </message>
+ <message>
<source>User Interface &amp;language:</source>
<translation type="unfinished">使用界面語言(&amp;L):</translation>
</message>
@@ -1501,22 +1766,39 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">第三方交易网址(&amp;T)</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">是否显示手动选币功能。</translation>
+ </message>
+ <message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
<translation type="unfinished">连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
+ <source>&amp;OK</source>
+ <translation type="unfinished">确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">取消(&amp;C)</translation>
</message>
<message>
<source>default</source>
<translation type="unfinished">預設值</translation>
</message>
<message>
+ <source>none</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">确认恢复默认设置</translation>
+ </message>
+ <message>
<source>Client restart required to activate changes.</source>
<extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
<translation type="unfinished">需要重新開始客戶端軟體來讓改變生效。</translation>
@@ -1557,7 +1839,15 @@ The migration process will create a backup of the wallet before migrating. This
<source>The configuration file could not be opened.</source>
<translation type="unfinished">无法打开配置文件。</translation>
</message>
- </context>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">此更改需要重启客户端。</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">提供的代理服务器地址无效。</translation>
+ </message>
+</context>
<context>
<name>OptionsModel</name>
<message>
@@ -1576,6 +1866,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">顯示的資訊可能是過期的。跟 Bitcoin 網路的連線建立後,你的錢包會自動和網路同步,但是這個步驟還沒完成。</translation>
</message>
<message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
<source>Available:</source>
<translation type="unfinished">可用金額:</translation>
</message>
@@ -1604,10 +1898,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">餘額</translation>
</message>
<message>
+ <source>Total:</source>
+ <translation type="unfinished">总额:</translation>
+ </message>
+ <message>
<source>Your current total balance</source>
<translation type="unfinished">您当前的总余额</translation>
</message>
<message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">您当前在仅观察观察地址中的余额</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">可动用:</translation>
+ </message>
+ <message>
<source>Recent transactions</source>
<translation type="unfinished">最近的交易</translation>
</message>
@@ -1616,6 +1922,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">仅观察地址的未确认交易</translation>
</message>
<message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">仅观察地址中尚未成熟的挖矿收入余额:</translation>
+ </message>
+ <message>
<source>Current total balance in watch-only addresses</source>
<translation type="unfinished">仅观察地址中的当前总余额</translation>
</message>
@@ -1651,6 +1961,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">關閉</translation>
</message>
<message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">加载交易失败: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">签名交易失败: %1</translation>
+ </message>
+ <message>
<source>Cannot sign inputs while wallet is locked.</source>
<translation type="unfinished">钱包已锁定,无法签名交易输入项。</translation>
</message>
@@ -1663,6 +1981,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">已签名 %1 个交易输入项,但是仍然还有余下的项目需要签名。</translation>
</message>
<message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">成功签名交易。交易已经可以广播。</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">处理交易时遇到未知错误。</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">已复制PSBT到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -1672,6 +2006,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">PSBT已保存到硬盘</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">无法计算交易费用或总交易金额。</translation>
+ </message>
+ <message>
<source>Pays transaction fee: </source>
<translation type="unfinished">支付交易费用:</translation>
</message>
@@ -1700,6 +2046,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">(但这个钱包不能签名交易)</translation>
</message>
<message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(但这个钱包没有正确的密钥)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">交易已经完全签名,可以广播。</translation>
+ </message>
+ <message>
<source>Transaction status is unknown.</source>
<translation type="unfinished">交易状态未知。</translation>
</message>
@@ -1711,6 +2065,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">支付请求出错</translation>
</message>
<message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">无法启动 bitcoin: 协议的“一键支付”处理程序</translation>
+ </message>
+ <message>
<source>URI handling</source>
<translation type="unfinished">URI 處理</translation>
</message>
@@ -1787,7 +2145,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<extracomment>An Inbound Connection from a Peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
- </context>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
@@ -1795,10 +2158,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">复制图像(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">URI 太長,請縮短標籤或訊息文字。</translation>
+ </message>
+ <message>
<source>Error encoding URI into QR Code.</source>
<translation type="unfinished">把 URI 编码成二维码时发生错误。</translation>
</message>
<message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">不支持二维码。</translation>
+ </message>
+ <message>
<source>Save QR Code</source>
<translation type="unfinished">儲存 QR 碼</translation>
</message>
@@ -1823,6 +2198,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">資訊(&amp;I)</translation>
</message>
<message>
+ <source>General</source>
+ <translation type="unfinished">常规</translation>
+ </message>
+ <message>
<source>Datadir</source>
<translation type="unfinished">数据目录</translation>
</message>
@@ -1835,6 +2214,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">区块存储目录</translation>
</message>
<message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">如果要自訂區塊儲存目錄的位置,請使用 '%1' 這個選項來指定新的位置。</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation type="unfinished">啓動時間</translation>
</message>
@@ -1843,6 +2226,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络</translation>
</message>
<message>
+ <source>Name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Number of connections</source>
<translation type="unfinished">連線數</translation>
</message>
@@ -1851,10 +2238,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">區塊鏈</translation>
</message>
<message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">内存池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">当前交易数量</translation>
+ </message>
+ <message>
<source>Memory usage</source>
<translation type="unfinished">内存使用</translation>
</message>
<message>
+ <source>Wallet: </source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
<source>(none)</source>
<translation type="unfinished">(无)</translation>
</message>
@@ -1899,6 +2298,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">会话ID</translation>
</message>
<message>
+ <source>Version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">是否要将交易转发给这个节点。</translation>
</message>
@@ -1907,10 +2310,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">交易转发</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation type="unfinished">起步区块</translation>
+ </message>
+ <message>
<source>Synced Headers</source>
<translation type="unfinished">已同步前導資料</translation>
</message>
<message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">已同步区块</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">最近交易</translation>
</message>
@@ -1965,6 +2376,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">当前区块高度</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">打开当前数据目录中的 %1 调试日志文件。日志文件大的话可能要等上几秒钟。</translation>
+ </message>
+ <message>
<source>Decrease font size</source>
<translation type="unfinished">缩小字体大小</translation>
</message>
@@ -2001,10 +2416,23 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">高带宽</translation>
</message>
<message>
+ <source>Connection Time</source>
+ <translation type="unfinished">连接时间</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">來自這個節點上次成功驗證新區塊已經過的時間</translation>
+ </message>
+ <message>
<source>Last Block</source>
<translation type="unfinished">上一个区块</translation>
</message>
<message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">來自這個節點上次成功驗證新交易進入內存池已經過的時間</translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation type="unfinished">最近送出</translation>
</message>
@@ -2013,6 +2441,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">上次接收</translation>
</message>
<message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping 延时</translation>
+ </message>
+ <message>
<source>The duration of a currently outstanding ping.</source>
<translation type="unfinished">目前这一次 ping 已经过去的时间。</translation>
</message>
@@ -2021,6 +2453,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Ping 等待</translation>
</message>
<message>
+ <source>Min Ping</source>
+ <translation type="unfinished">最小 Ping 值</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">时间偏移</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
<source>&amp;Open</source>
<translation type="unfinished">打开(&amp;O)</translation>
</message>
@@ -2037,6 +2481,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">總計</translation>
</message>
<message>
+ <source>Debug log file</source>
+ <translation type="unfinished">调试日志文件</translation>
+ </message>
+ <message>
<source>Clear console</source>
<translation type="unfinished">清主控台</translation>
</message>
@@ -2074,6 +2522,11 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">出站触须: 短暂,用于测试地址</translation>
</message>
<message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">Outbound 地址取得: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
<source>detecting: peer could be v1 or v2</source>
<extracomment>Explanatory text for "detecting" transport type.</extracomment>
<translation type="unfinished">检测中: 节点可能是v1或是v2</translation>
@@ -2097,15 +2550,35 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">对端选择了我们用于高带宽转发</translation>
</message>
<message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">未選擇高頻寬轉發點</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">复制地址(&amp;C)</translation>
</message>
<message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">断开(&amp;D)</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
<translation type="unfinished">1 小时(&amp;H)</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 周(&amp;W)</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 年(&amp;Y)</translation>
+ </message>
+ <message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
<translation type="unfinished">复制IP/网络掩码(&amp;C)</translation>
@@ -2115,6 +2588,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">解封(&amp;U)</translation>
</message>
<message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">网络活动已禁用</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">不使用任何钱包执行命令</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">使用“%1”钱包执行命令</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2137,6 +2626,10 @@ For more information on using this console, type %6.
<translation type="unfinished">执行中……</translation>
</message>
<message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">經由 %1</translation>
</message>
@@ -2145,6 +2638,10 @@ For more information on using this console, type %6.
<translation type="unfinished">是</translation>
</message>
<message>
+ <source>No</source>
+ <translation type="unfinished">否</translation>
+ </message>
+ <message>
<source>To</source>
<translation type="unfinished">到</translation>
</message>
@@ -2172,6 +2669,10 @@ For more information on using this console, type %6.
<translation type="unfinished">金额(&amp;A):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
<source>&amp;Message:</source>
<translation type="unfinished">訊息(&amp;M):</translation>
</message>
@@ -2180,6 +2681,10 @@ For more information on using this console, type %6.
<translation type="unfinished">可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。</translation>
</message>
<message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">可为新建的收款地址添加一个标签。</translation>
+ </message>
+ <message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
<translation type="unfinished">使用此表单请求付款。所有字段都是&lt;b&gt;可选&lt;/b&gt;的。</translation>
</message>
@@ -2192,10 +2697,18 @@ For more information on using this console, type %6.
<translation type="unfinished">一个关联到新收款地址(被您用来识别发票)的可选标签。它也会被附加到付款请求中。</translation>
</message>
<message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">一条附加到付款请求中的可选消息,可以显示给付款方。</translation>
+ </message>
+ <message>
<source>&amp;Create new receiving address</source>
<translation type="unfinished">&amp;產生新的接收地址</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
<source>Clear</source>
<translation type="unfinished">清空</translation>
</message>
@@ -2216,6 +2729,10 @@ For more information on using this console, type %6.
<translation type="unfinished">从列表中移除选中的条目</translation>
</message>
<message>
+ <source>Remove</source>
+ <translation type="unfinished">移除</translation>
+ </message>
+ <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">複製 &amp;URI</translation>
</message>
@@ -2271,6 +2788,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请求支付至...</translation>
</message>
<message>
+ <source>Address:</source>
+ <translation type="unfinished">地址:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
<source>Label:</source>
<translation type="unfinished">标签:</translation>
</message>
@@ -2291,10 +2816,22 @@ For more information on using this console, type %6.
<translation type="unfinished">複製 &amp;地址</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
<source>&amp;Save Image…</source>
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>Payment information</source>
+ <translation type="unfinished">付款信息</translation>
+ </message>
+ <message>
<source>Request payment to %1</source>
<translation type="unfinished">付款給 %1 的要求</translation>
</message>
@@ -2302,14 +2839,26 @@ For more information on using this console, type %6.
<context>
<name>RecentRequestsTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
<message>
+ <source>(no message)</source>
+ <translation type="unfinished">(无消息)</translation>
+ </message>
+ <message>
<source>(no amount requested)</source>
<translation type="unfinished">(無要求金額)</translation>
</message>
@@ -2337,14 +2886,38 @@ For more information on using this console, type %6.
<translation type="unfinished">金额不足!</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">數量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
<translation type="unfinished">如果這項有打開,但是找零地址是空的或無效,那麼找零會送到一個產生出來的地址去。</translation>
</message>
<message>
+ <source>Custom change address</source>
+ <translation type="unfinished">自定义找零地址</translation>
+ </message>
+ <message>
<source>Transaction Fee:</source>
<translation type="unfinished">交易手续费:</translation>
</message>
@@ -2357,6 +2930,10 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 目前无法进行手续费估计。</translation>
</message>
<message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">每KB</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">隐藏</translation>
</message>
@@ -2369,10 +2946,22 @@ For more information on using this console, type %6.
<translation type="unfinished">自訂:</translation>
</message>
<message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">一次发送给多个收款人</translation>
+ </message>
+ <message>
<source>Add &amp;Recipient</source>
<translation type="unfinished">增加收款人(&amp;R)</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
+ </message>
+ <message>
<source>Choose…</source>
<translation type="unfinished">选择...</translation>
</message>
@@ -2381,18 +2970,54 @@ For more information on using this console, type %6.
<translation type="unfinished">隱藏交易手續費設定</translation>
</message>
<message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">當交易量小於可用區塊空間時,礦工和節點可能會執行最低手續費率限制。 以這個最低費率來支付手續費也是可以的,但請注意,一旦交易需求超出比特幣網路能處理的限度,你的交易可能永遠無法確認。</translation>
+ </message>
+ <message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
<translation type="unfinished">手續費太低的話可能會造成永遠無法確認的交易(請參考提示)</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">确认时间目标:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">启用手续费追加</translation>
+ </message>
+ <message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
<translation type="unfinished">手续费追加(Replace-By-Fee,BIP-125)可以让你在送出交易后继续追加手续费。不用这个功能的话,建议付比较高的手续费来降低交易延迟的风险。</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>Balance:</source>
<translation type="unfinished">餘額:</translation>
</message>
<message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">确认发送操作</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">发送(&amp;E)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -2421,12 +3046,26 @@ For more information on using this console, type %6.
<translation type="unfinished">%1 (%2个块)</translation>
</message>
<message>
- <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">在設備上簽證</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">從錢包 %1</translation>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">請先連接硬體錢包</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">在 選項 -&gt; 錢包 中設定外部簽名器腳本路徑 </translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">创建未签名交易(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2442,6 +3081,10 @@ For more information on using this console, type %6.
<translation type="unfinished">外部签名器失败</translation>
</message>
<message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -2455,6 +3098,10 @@ For more information on using this console, type %6.
<translation type="unfinished">你可以之後再提高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -2470,6 +3117,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请检查您的交易。</translation>
</message>
<message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">没有打上BIP-125手续费追加的标记。</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">總金額</translation>
</message>
@@ -2504,6 +3159,22 @@ For more information on using this console, type %6.
<translation type="unfinished">支付金额必须大于0。</translation>
</message>
<message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">金额超出您的余额。</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">计入 %1 手续费后,金额超出了您的余额。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">发现重复地址:每个地址应该只使用一次。</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">交易创建失败!</translation>
+ </message>
+ <message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">超过 %1 的手续费被视为高得离谱。</translation>
</message>
@@ -2518,10 +3189,18 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 比特币地址无效</translation>
</message>
<message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">警告:未知的找零地址</translation>
+ </message>
+ <message>
<source>Confirm custom change address</source>
<translation type="unfinished">确认自定义找零地址</translation>
</message>
<message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">你选择的找零地址未被包含在本钱包中,你钱包中的部分或全部金额将被发送至该地址。你确定要这样做吗?</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
@@ -2537,14 +3216,34 @@ For more information on using this console, type %6.
<translation type="unfinished">付給(&amp;T):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
<source>The Bitcoin address to send the payment to</source>
<translation type="unfinished">將支付發送到的比特幣地址給</translation>
</message>
<message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">移除此项</translation>
+ </message>
+ <message>
<source>The amount to send in the selected unit</source>
<translation type="unfinished">用被选单位表示的待发送金额</translation>
</message>
<message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">交易费将从发送金额中扣除。接收人收到的比特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。</translation>
+ </message>
+ <message>
<source>S&amp;ubtract fee from amount</source>
<translation type="unfinished">從付款金額減去手續費(&amp;U)</translation>
</message>
@@ -2591,6 +3290,22 @@ For more information on using this console, type %6.
<translation type="unfinished">您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的比特幣。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。</translation>
</message>
<message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">用来对消息签名的地址</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">在这里输入您想要签名的消息</translation>
+ </message>
+ <message>
<source>Signature</source>
<translation type="unfinished">簽章</translation>
</message>
@@ -2611,10 +3326,18 @@ For more information on using this console, type %6.
<translation type="unfinished">清空所有签名消息栏</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>&amp;Verify Message</source>
<translation type="unfinished">消息验证(&amp;V)</translation>
</message>
<message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">请在下面输入接收者地址、消息(确保换行符、空格符、制表符等完全相同)和签名以验证消息。请仔细核对签名信息,以提防中间人攻击。请注意,这只是证明接收方可以用这个地址签名,它不能证明任何交易的发送人身份!</translation>
+ </message>
+ <message>
<source>The Bitcoin address the message was signed with</source>
<translation type="unfinished">用来签名消息的地址</translation>
</message>
@@ -2631,6 +3354,14 @@ For more information on using this console, type %6.
<translation type="unfinished">驗證這個訊息來確定是用指定的比特幣地址簽名的</translation>
</message>
<message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">验证消息签名(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">清空所有验证消息栏</translation>
+ </message>
+ <message>
<source>Click "Sign Message" to generate signature</source>
<translation type="unfinished">請按一下「簽署訊息」來產生簽章</translation>
</message>
@@ -2647,6 +3378,10 @@ For more information on using this console, type %6.
<translation type="unfinished">找不到与输入地址相关的密钥。</translation>
</message>
<message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">已取消解锁钱包。</translation>
+ </message>
+ <message>
<source>No error</source>
<translation type="unfinished">沒有錯誤</translation>
</message>
@@ -2659,6 +3394,14 @@ For more information on using this console, type %6.
<translation type="unfinished">消息签名失败。</translation>
</message>
<message>
+ <source>Message signed.</source>
+ <translation type="unfinished">消息已签名。</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">签名无法解码。</translation>
+ </message>
+ <message>
<source>Please check the signature and try again.</source>
<translation type="unfinished">请检查签名后重试。</translation>
</message>
@@ -2667,6 +3410,10 @@ For more information on using this console, type %6.
<translation type="unfinished">這個簽章跟訊息的數位摘要不符。</translation>
</message>
<message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">消息验证失败。</translation>
+ </message>
+ <message>
<source>Message verified.</source>
<translation type="unfinished">消息验证成功。</translation>
</message>
@@ -2700,6 +3447,11 @@ For more information on using this console, type %6.
<translation type="unfinished">0/未确认,不在内存池中</translation>
</message>
<message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>%1/unconfirmed</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
<translation type="unfinished">%1 次/未確認</translation>
@@ -2714,10 +3466,18 @@ For more information on using this console, type %6.
<translation type="unfinished">状态</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Source</source>
<translation type="unfinished">來源</translation>
</message>
<message>
+ <source>Generated</source>
+ <translation type="unfinished">挖矿生成</translation>
+ </message>
+ <message>
<source>From</source>
<translation type="unfinished">來源</translation>
</message>
@@ -2730,6 +3490,10 @@ For more information on using this console, type %6.
<translation type="unfinished">到</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
<source>watch-only</source>
<translation type="unfinished">只能看</translation>
</message>
@@ -2737,6 +3501,10 @@ For more information on using this console, type %6.
<source>label</source>
<translation type="unfinished">标签</translation>
</message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">收入</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -2744,18 +3512,46 @@ For more information on using this console, type %6.
</translation>
</message>
<message>
+ <source>not accepted</source>
+ <translation type="unfinished">未被接受</translation>
+ </message>
+ <message>
+ <source>Debit</source>
+ <translation type="unfinished">支出</translation>
+ </message>
+ <message>
<source>Total debit</source>
<translation type="unfinished">总支出</translation>
</message>
<message>
+ <source>Total credit</source>
+ <translation type="unfinished">总收入</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
<source>Net amount</source>
<translation type="unfinished">淨額</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">备注</translation>
+ </message>
+ <message>
<source>Transaction ID</source>
<translation type="unfinished">交易 ID</translation>
</message>
<message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">交易总大小</translation>
+ </message>
+ <message>
<source>Transaction virtual size</source>
<translation type="unfinished">交易擬真大小</translation>
</message>
@@ -2764,14 +3560,26 @@ For more information on using this console, type %6.
<translation type="unfinished">输出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(證書未驗證)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
</message>
<message>
<source>Merchant</source>
<translation type="unfinished">商家</translation>
</message>
<message>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">新挖出的比特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">调试信息</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">交易</translation>
+ </message>
+ <message>
<source>Inputs</source>
<translation type="unfinished">輸入</translation>
</message>
@@ -2783,7 +3591,11 @@ For more information on using this console, type %6.
<source>true</source>
<translation type="unfinished">是</translation>
</message>
- </context>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">否</translation>
+ </message>
+</context>
<context>
<name>TransactionDescDialog</name>
<message>
@@ -2798,6 +3610,10 @@ For more information on using this console, type %6.
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2806,6 +3622,14 @@ For more information on using this console, type %6.
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">未确认</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>Confirming (%1 of %2 recommended confirmations)</source>
<translation type="unfinished">确认中 (推荐 %2个确认,已经有 %1个确认)</translation>
</message>
@@ -2814,6 +3638,18 @@ For more information on using this console, type %6.
<translation type="unfinished">已確認(%1 次)</translation>
</message>
<message>
+ <source>Conflicted</source>
+ <translation type="unfinished">有冲突</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">未成熟 (%1 个确认,将在 %2 个后可用)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">已生成但未被接受</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2850,6 +3686,10 @@ For more information on using this console, type %6.
<translation type="unfinished">收到交易的日期和時間。</translation>
</message>
<message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">交易类型。</translation>
+ </message>
+ <message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
<translation type="unfinished">该交易中是否涉及仅观察地址。</translation>
</message>
@@ -2865,6 +3705,10 @@ For more information on using this console, type %6.
<translation type="unfinished">全部</translation>
</message>
<message>
+ <source>Today</source>
+ <translation type="unfinished">今天</translation>
+ </message>
+ <message>
<source>This week</source>
<translation type="unfinished">這星期</translation>
</message>
@@ -2873,6 +3717,14 @@ For more information on using this console, type %6.
<translation type="unfinished">這個月</translation>
</message>
<message>
+ <source>Last month</source>
+ <translation type="unfinished">上个月</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">今年</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2893,6 +3745,10 @@ For more information on using this console, type %6.
<translation type="unfinished">输入地址、交易ID或标签进行搜索</translation>
</message>
<message>
+ <source>Min amount</source>
+ <translation type="unfinished">最小金额</translation>
+ </message>
+ <message>
<source>Range…</source>
<translation type="unfinished">范围...</translation>
</message>
@@ -2917,10 +3773,22 @@ For more information on using this console, type %6.
<translation type="unfinished">复制原始交易(&amp;R)</translation>
</message>
<message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">複製完整交易明細</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">顯示交易明細</translation>
+ </message>
+ <message>
<source>Increase transaction &amp;fee</source>
<translation type="unfinished">增加矿工费(&amp;F)</translation>
</message>
<message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">放棄交易(&amp;b)</translation>
+ </message>
+ <message>
<source>&amp;Edit address label</source>
<translation type="unfinished">编辑地址标签(&amp;E)</translation>
</message>
@@ -2930,15 +3798,27 @@ For more information on using this console, type %6.
<translation type="unfinished">在 %1中显示</translation>
</message>
<message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">导出交易历史</translation>
+ </message>
+ <message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">逗號分隔文件</translation>
</message>
<message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Watch-only</source>
<translation type="unfinished">只能觀看的</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2974,7 +3854,11 @@ For more information on using this console, type %6.
<source>Range:</source>
<translation type="unfinished">範圍:</translation>
</message>
- </context>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">到</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -3005,7 +3889,15 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Partially Signed Transaction (*.psbt)</source>
<translation type="unfinished">部分签名交易 (*.psbt)</translation>
</message>
- </context>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">PSBT文件必须小于100MiB</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">无法解码PSBT</translation>
+ </message>
+</context>
<context>
<name>WalletModel</name>
<message>
@@ -3013,6 +3905,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">付款</translation>
</message>
<message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">追加手续费出错</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">追加交易手续费失败</translation>
+ </message>
+ <message>
<source>Do you want to increase the fee?</source>
<extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
<translation type="unfinished">想要提高手續費嗎?</translation>
@@ -3022,6 +3922,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">当前手续费:</translation>
</message>
<message>
+ <source>Increase:</source>
+ <translation type="unfinished">增加量:</translation>
+ </message>
+ <message>
<source>New fee:</source>
<translation type="unfinished">新的費用:</translation>
</message>
@@ -3038,6 +3942,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">無法草擬交易。</translation>
</message>
<message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">PSBT已複製</translation>
+ </message>
+ <message>
<source>Copied to clipboard</source>
<comment>Fee-bump PSBT saved</comment>
<translation type="unfinished">复制到剪贴板</translation>
@@ -3051,6 +3959,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">沒辦法提交交易</translation>
</message>
<message>
+ <source>Can't display address</source>
+ <translation type="unfinished">無法顯示地址</translation>
+ </message>
+ <message>
<source>default wallet</source>
<translation type="unfinished">默认钱包</translation>
</message>
@@ -3114,6 +4026,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">无法把钱包版本从%i降级到%i。钱包版本未改变。</translation>
</message>
<message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">无法锁定数据目录 %s。%s 可能已经在运行。</translation>
+ </message>
+ <message>
<source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
<translation type="unfinished">无法在不支持“拆分前的密钥池”(pre split keypool)的情况下把“非拆分HD钱包”(non HD split wallet)从版本%i升级到%i。请使用版本号%i,或者压根不要指定版本号。</translation>
</message>
@@ -3138,6 +4054,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误: 转储文件格式不正确。得到是"%s",而预期本应得到的是 "format"。</translation>
</message>
<message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ </message>
+ <message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
<translation type="unfinished">错误: 转储文件版本不被支持。这个版本的 bitcoin-wallet 只支持版本为 1 的转储文件。得到的转储文件版本却是%s</translation>
</message>
@@ -3150,18 +4070,42 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误: 无法为该旧式钱包生成描述符。如果钱包已被加密,请确保提供的钱包加密密码正确。</translation>
</message>
<message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">檔案%s已經存在。 如果你確定這就是你想做的,先把這份檔案移開。</translation>
+ </message>
+ <message>
<source>Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start.</source>
<translation type="unfinished">无效或损坏的peers.dat (%s)。如果你确信这是一个bug,请反馈到%s。作为变通办法,你可以把现有文件 (%s) 移开(重命名、移动或删除),这样就可以在下次启动时创建一个新文件了。</translation>
</message>
<message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">提供多數TOR路由綁定位址。 對自動建立的Tor服務用%s</translation>
+ </message>
+ <message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
<translation type="unfinished">没有提供转储文件。要使用 createfromdump ,必须提供 -dumpfile=&lt;filename&gt;。</translation>
</message>
<message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 dump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
<translation type="unfinished">没有提供钱包格式。要使用 createfromdump ,必须提供 -format=&lt;format&gt;</translation>
</message>
<message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">请检查电脑的日期时间设置是否正确!时间错误可能会导致 %s 运行异常。</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">如果你认为%s对你比较有用的话,请对我们进行一些自愿贡献。请访问%s网站来获取有关这个软件的更多信息。</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">修剪被设置得太小,已经低于最小值%d MiB,请使用更大的数值。</translation>
+ </message>
+ <message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<translation type="unfinished">修剪模式与 -reindex-chainstate 不兼容。请进行一次完整的 -reindex 。</translation>
</message>
@@ -3186,6 +4130,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">扣除手續費後的交易金額太少而不能傳送</translation>
</message>
<message>
+ <source>This error could occur if this wallet was not shutdown cleanly and was last loaded using a build with a newer version of Berkeley DB. If so, please use the software that last loaded this wallet</source>
+ <translation type="unfinished">如果这个钱包之前没有正确关闭,而且上一次是被新版的Berkeley DB加载过,就会发生这个错误。如果是这样,请使用上次加载过这个钱包的那个软件。</translation>
+ </message>
+ <message>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
<translation type="unfinished">這是個還沒發表的測試版本 - 使用請自負風險 - 請不要用來開採或做商業應用</translation>
</message>
@@ -3238,6 +4186,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">警告:在已经禁用私钥的钱包 {%s} 中仍然检测到私钥</translation>
</message>
<message>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">警告:我们和其他节点似乎没达成共识!您可能需要升级,或者就是其他节点可能需要升级。</translation>
+ </message>
+ <message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
<translation type="unfinished">需要验证高度在%d之后的区块见证数据。请使用 -reindex 重新启动。</translation>
</message>
@@ -3254,6 +4206,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">參數 -maxmempool 至少要給 %d 百萬位元組(MB)</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">发生了致命的内部错误,请在debug.log中查看详情</translation>
+ </message>
+ <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">沒辦法解析 -%s 參數指定的地址: '%s'</translation>
</message>
@@ -3396,6 +4352,26 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">对 %s 的配置设置只对 %s 网络生效,如果它位于配置的 [%s] 章节的话</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">版权所有 (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">检测到区块数据库损坏</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">找不到asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">無法解析asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">磁盘空间太低!</translation>
+ </message>
+ <message>
<source>Do you want to rebuild the block database now?</source>
<translation type="unfinished">你想现在就重建区块数据库吗?</translation>
</message>
@@ -3408,6 +4384,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">转储文件 %s 不存在</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">创建%s时出错</translation>
</message>
@@ -3416,6 +4396,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">初始化区块数据库时出错</translation>
</message>
<message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">初始化钱包数据库环境错误 %s!</translation>
+ </message>
+ <message>
<source>Error loading %s</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤</translation>
</message>
@@ -3432,6 +4416,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤: 這個錢包需要新版的 %s</translation>
</message>
<message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">加载区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">打开区块数据库时出错</translation>
+ </message>
+ <message>
<source>Error reading configuration file: %s</source>
<translation type="unfinished">读取配置文件失败: %s</translation>
</message>
@@ -3440,16 +4432,16 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">读取数据库出错,关闭中。</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">從錢包資料庫讀取下一筆記錄時出錯</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -3468,10 +4460,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">錯誤:keypool已用完,請先重新呼叫keypoolrefill</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已经在使用SQLite</translation>
</message>
@@ -3496,6 +4484,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
@@ -3504,6 +4496,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法写入记录到新钱包</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法启动索引,关闭中...</translation>
</message>
@@ -3512,6 +4520,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数据库失败</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手续费率 (%s) 低于最大手续费率设置 (%s)</translation>
</message>
@@ -3680,6 +4692,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">这是你每次交易付款时最少要付的手续费。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amounts must not be negative</source>
<translation type="unfinished">交易金额不不可为负数</translation>
</message>
@@ -3752,6 +4768,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">%s链上acceptstalefeeestimates 不受支持。</translation>
</message>
@@ -3760,6 +4780,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的日志分类 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">用户代理备注(%s)包含不安全的字符。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_he.ts b/src/qt/locale/bitcoin_he.ts
index 2840b67afc..e3979b07e4 100644
--- a/src/qt/locale/bitcoin_he.ts
+++ b/src/qt/locale/bitcoin_he.ts
@@ -94,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">אירעה שגיאה בעת הניסיון לשמור את רשימת הכתובת אל %1. נא לנסות שוב.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">כתובות שליחה - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">כתובות קבלה - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">הייצוא נכשל</translation>
</message>
@@ -1755,10 +1763,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT נשמרה לדיסק.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * שליחת %1 אל %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">כתובת עצמית</translation>
</message>
@@ -2522,10 +2526,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">יוצר עסקת ביטקוין חתומה חלקית (PSBT) לשימוש עם ארנק %1 לא מחובר למשל, או עם PSBT ארנק חומרה תואם.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">מתוך ארנק "%1"</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 אל "%2"</translation>
</message>
@@ -2975,10 +2975,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">מפתח פלט</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(האישור לא אומת)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">סוחר</translation>
</message>
@@ -3679,10 +3675,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">סכומי ההעברה לא יכולים להיות שליליים</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">לעסקה יש שרשרת ארוכה מדי של mempool </translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">להעברה חייב להיות לפחות נמען אחד</translation>
</message>
diff --git a/src/qt/locale/bitcoin_hi.ts b/src/qt/locale/bitcoin_hi.ts
index 118269625e..414670e7a2 100644
--- a/src/qt/locale/bitcoin_hi.ts
+++ b/src/qt/locale/bitcoin_hi.ts
@@ -516,6 +516,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Load PSBT from &amp;clipboard…</source>
<translation type="unfinished">पीएसबीटी को &amp;क्लिपबोर्ड से लोड करें…</translation>
</message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">वॉलेट माइग्रेट करें</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">कोई वॉलेट माइग्रेट करें</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
@@ -672,6 +680,21 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">वॉलेट माइग्रेट करें</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">माइग्रेशन नहीं हो पाया</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">माइग्रेशन हो गया</translation>
+ </message>
+</context>
+<context>
<name>Intro</name>
<message numerus="yes">
<source>%n GB of space available</source>
@@ -1533,10 +1556,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">कॉपी बाइट्स</translation>
</message>
<message>
- <source>Copy change</source>
- <translation type="unfinished">कॉपी चैंज</translation>
- </message>
- <message>
<source>%1 (%2 blocks)</source>
<translation type="unfinished">%1 (%2 ब्लाकस)</translation>
</message>
@@ -1563,10 +1582,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">उदाहरण के लिए उपयोग के लिए आंशिक रूप से हस्ताक्षरित बिटकॉइन लेनदेन (PSBT) बनाता है। एक ऑफ़लाइन% 1 %1 वॉलेट, या एक PSBT-संगत हार्डवेयर वॉलेट।</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">वॉलिट से '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1टु '%2'</translation>
</message>
@@ -2092,10 +2107,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">आउटपुट इंडेक्स</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(प्रमाणपत्र सत्यापित नहीं किया गया था)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">सौदागर</translation>
</message>
@@ -2319,7 +2330,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">निर्यात विफल हो गया है</translation>
+ <translation type="unfinished">एक्सपोर्ट नहीं हो पाया</translation>
</message>
</context>
<context>
@@ -2349,7 +2360,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">मौजूदा टैब में डेटा को फ़ाइल में निर्यात करें</translation>
+ <translation type="unfinished">मौजूदा टैब में डेटा को फ़ाइल में एक्सपोर्ट करें</translation>
</message>
</context>
<context>
diff --git a/src/qt/locale/bitcoin_hr.ts b/src/qt/locale/bitcoin_hr.ts
index 741cd1cb2b..e843aed672 100644
--- a/src/qt/locale/bitcoin_hr.ts
+++ b/src/qt/locale/bitcoin_hr.ts
@@ -1651,18 +1651,6 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">Koristite zaseban SOCKS&amp;5 proxy kako biste dohvatili klijente preko Tora:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Font fiksne širine u tabu Pregled:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">ugrađen "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">najbliže poklapanje "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;U redu</translation>
</message>
@@ -1888,10 +1876,6 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">PBST spremljen na disk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Šalje %1 %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">vlastita adresa</translation>
</message>
@@ -2860,10 +2844,6 @@ Napomena: Budući da se naknada računa po bajtu, naknada od "100 satošija po k
<translation type="unfinished">Stvara djelomično potpisanu Bitcoin transakciju (Partially Signed Bitcoin Transaction - PSBT) za upotrebu sa npr. novčanikom %1 koji nije povezan s mrežom ili sa PSBT kompatibilnim hardverskim novčanikom.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">iz novčanika '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">od %1 do '%2'</translation>
</message>
@@ -3355,10 +3335,6 @@ Napomena: Budući da se naknada računa po bajtu, naknada od "100 satošija po k
<translation type="unfinished">Indeks outputa</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certifikat nije bio ovjeren)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Trgovac</translation>
</message>
@@ -4312,10 +4288,6 @@ Idi na Datoteka &gt; Otvori novčanik za učitanje novčanika.
<translation type="unfinished">Indeks change outputa transakcije je izvan dometa</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transakcija ima prevelik lanac memorijskog bazena</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transakcija mora imati barem jednog primatelja</translation>
</message>
diff --git a/src/qt/locale/bitcoin_hu.ts b/src/qt/locale/bitcoin_hu.ts
index 669a6269fc..a2f27b94a0 100644
--- a/src/qt/locale/bitcoin_hu.ts
+++ b/src/qt/locale/bitcoin_hu.ts
@@ -706,6 +706,14 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Összes tárca bezárása</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Tárca migrálása</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Egy tárca migrálása</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">A %1 súgó megjelenítése a Bitcoin lehetséges parancssori kapcsolóinak listájával</translation>
</message>
@@ -801,6 +809,10 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Fejlécek szinkronizálása (%1%)…</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Hiba a tárca létrehozása közben</translation>
+ </message>
+ <message>
<source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
<translation type="unfinished">Nem sikerült új tárcát létrehozni, a program sqlite támogatás nélkül lett fordítva (követelmény a leíró tárcákhoz)</translation>
</message>
@@ -1066,6 +1078,57 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Tárca migrálása</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Biztos benne, hogy migrálja ezt a tárcát &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">A tárca migrálása átalakítja ezt a tárcát egy vagy több leíró tárcává. Egy új tárca biztonsági mentés szükséges.
+Ha ez a tárca tartalmaz bármilyen figyelő szkripteket, akkor az új tárca is tartalmazni fogja ezeket a figyelő szkripteket.
+Ha ez a tárca tartalmaz bármilyen megoldható de nem megfigyelt szkripteket, akkor az új tárca is tartalmazni fogja ezeket a szkripteket.
+
+A migrációs folyamat készít biztonsági mentést a tárcáról migrálás előtt. Ennek a biztonsági mentésnek a neve &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak és a tárca könyvtárában lesz megtalálható. Hibás migrálás esetén ebből a biztonsági mentésből a tárca visszaállítható a "Tárca visszaállítása" funkcióval.</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Tárca migrálása</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">A &lt;b&gt;%1&lt;/b&gt; tárca migrálása folyamatban...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">A '%1' tárca sikeresen migrálva lett.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Figyelő szkriptek az új '%1' nevű tárcába lettek migrálva.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Megoldható de nem megfigyelt szkriptek az új '%1' nevű tárcába lettek migrálva.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migrálás meghiúsult</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migrálás sikeres</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1105,7 +1168,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<message>
<source>Restore wallet failed</source>
<extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
- <translation type="unfinished">Tárca helyreállítása sikertelen</translation>
+ <translation type="unfinished">Tárca visszaállítása sikertelen</translation>
</message>
<message>
<source>Restore wallet warning</source>
@@ -1148,6 +1211,14 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Tárca létrehozása</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Egy lépés választja el az új tárcája létrehozásától!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Kérjük adjon meg egy nevet, és ha szeretné, válasszon a haladó beállítások közül</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Tárca neve</translation>
</message>
@@ -1735,18 +1806,6 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Külön SOCKS&amp;5 proxy használata a partnerek Tor hálózaton keresztüli eléréséhez:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fix szélességű betűtípus használata az áttekintés fülön:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">beágyazott "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">legjobb találat "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Mégse</translation>
</message>
@@ -1984,8 +2043,8 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">PSBT lemezre mentve.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Küldés %1 to %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Küldés innen: %1 ide: %2</translation>
</message>
<message>
<source>own address</source>
@@ -2262,6 +2321,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Válasszon ki egy partnert a részletes információk megtekintéséhez.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Az átviteli réteg verziója: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Átvitel</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">A BIP324 munkamenet azonosító hex formátumú szöveglánca, ha van.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">Munkamenet azonosító</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Verzió</translation>
</message>
@@ -2491,6 +2566,21 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Outbound Address Fetch: rövid életű, címek lekérdezéséhez.</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">észlelve: partrer lehet v1 vagy v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: titkosítatlan, egyszerű szöveges átviteli protokol</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324 titkosított átviteli protokol</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">a partnert nagy sávszélességű elosztónak választottuk</translation>
</message>
@@ -3012,10 +3102,6 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
<translation type="unfinished">Létrehoz egy Részlegesen Aláírt Bitcoin Tranzakciót (PSBT) melyet offline %1 tárcával vagy egy PSBT kompatibilis hardver tárcával használhat.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished"> '%1' tárcából</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1-től '%2-ig'</translation>
</message>
@@ -3073,6 +3159,10 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
<translation type="unfinished">Kérjük nézze át a tranzakciós javaslatot. Ez létrehoz egy részlegesen aláírt bitcoin tranzakciót (PSBT) amit elmenthet vagy kimásolhat amit később aláírhatja offline %1 tárcával vagy egy PSBT kompatibilis hardvertárcával.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 ebből a tárcából: '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Biztosan létrehozza ezt a tranzakciót?</translation>
@@ -3531,8 +3621,8 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
<translation type="unfinished">Kimeneti index</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(A tanúsítvány nem ellenőrzött)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (A tanúsítvány nem ellenőrzött)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4233,6 +4323,10 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">Hiba: A tárcában lévő %s tranzakciót nem lehet beazonosítani, hogy a migrált tárcákhoz tartozna</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Sikertelen az emelt díjak becslése, mert a megerősítetlen UTXO-k hatalmas mennyiségű megerősítetlen tranzakcióktól függnek.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Az érvénytelen peers.dat fájl átnevezése sikertelen. Kérjük mozgassa vagy törölje, majd próbálja újra.</translation>
</message>
@@ -4411,14 +4505,6 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Hiba: Nem lehet kinyerni a célt az előállított scriptpubkey-ből</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Hiba: Nem sikerült figyelő tranzakció hozzáadása a figyelő tárcához</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Hiba: Nem sikerült a figyelő tranzakciók törlése</translation>
- </message>
- <message>
<source>Error: Couldn't create cursor into database</source>
<translation type="unfinished">Hiba: Kurzor létrehozása az adatbázisba sikertelen.</translation>
</message>
@@ -4455,10 +4541,6 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Hiba: Nem áll rendelkezésre %s cím.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Hiba: Nem minden figyelő tranzakció törlése sikerült</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Hiba: Ez a tárca már használja az SQLite-t</translation>
</message>
@@ -4483,6 +4565,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Hiba: Nem sikerült beolvasni minden bejegyzést az adatbázisban.</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Hiba: Nem lehet beolvasni a tárca legfelső blokkját megadó rekordot</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Hiba: Nem sikerült a figyelő címjegyzék adat eltávolítása</translation>
</message>
@@ -4491,6 +4577,14 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Hiba: Nem sikerült rekordot írni az új tárcába</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Hiba: Nem lehet írni a megoldható tárca legfelső blokkját megadó rekordot</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Hiba: Nem lehet írni a figyelő tárca legfelső blokkját megadó rekordot</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Egyik hálózati portot sem sikerül figyelni. Használja a -listen=0 kapcsolót, ha ezt szeretné.</translation>
</message>
@@ -4739,10 +4833,6 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Tartományon kívüli tranzakciós kimenet index</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">A tranzakcóhoz tartozó mempool elődlánc túl hosszú</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Legalább egy címzett kell a tranzakcióhoz</translation>
</message>
@@ -4823,6 +4913,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Nem támogatott globális naplózási szint %s=%s. Lehetséges értékek: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Tárca fájl létrehozása sikertelen: %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates nem támogatott ezen a láncon: %s</translation>
</message>
@@ -4831,6 +4925,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Nem támogatott naplózási kategória %s=%s</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Hiba: Nem sikerült hozzáadni a megfigyelt %s tranzakciót a figyelő tárcához</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">A felhasználói ügynök megjegyzés (%s) veszélyes karaktert tartalmaz.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_id.ts b/src/qt/locale/bitcoin_id.ts
index 989d7b1f40..975959d8b5 100644
--- a/src/qt/locale/bitcoin_id.ts
+++ b/src/qt/locale/bitcoin_id.ts
@@ -3,15 +3,15 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Klik kanan untuk mengedit atau label</translation>
+ <translation type="unfinished">Klik kanan untuk mengedit alamat atau label</translation>
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">O3@outlook.co.id</translation>
+ <translation type="unfinished">Membuat alamat baru</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Salin alamat yang saat ini dipilih ke papan klip sistem</translation>
+ <translation type="unfinished">Salin alamat terpilih ke papan klip</translation>
</message>
<message>
<source>C&amp;lose</source>
@@ -30,6 +30,15 @@
<translation type="unfinished">Ekspor data di tab saat ini ke sebuah file</translation>
</message>
<message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Ekspor
+wallet</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Hapus</translation>
+ </message>
+ <message>
<source>Choose the address to send coins to</source>
<translation type="unfinished">Pilih alamat tujuan pengiriman koin</translation>
</message>
@@ -49,7 +58,7 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
</message>
<message>
<source>&amp;Copy Address</source>
- <translation type="unfinished">&amp;Copy Alamat</translation>
+ <translation type="unfinished">&amp;Salin Alamat</translation>
</message>
<message>
<source>Copy &amp;Label</source>
@@ -89,23 +98,23 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<name>AskPassphraseDialog</name>
<message>
<source>Passphrase Dialog</source>
- <translation type="unfinished">Dialog passphrase</translation>
+ <translation type="unfinished">Dialog frasa sandi</translation>
</message>
<message>
<source>Enter passphrase</source>
- <translation type="unfinished">Masukan passphrase</translation>
+ <translation type="unfinished">Masukan frasa sandi</translation>
</message>
<message>
<source>New passphrase</source>
- <translation type="unfinished">Passphrase baru</translation>
+ <translation type="unfinished">Frasa sandi baru</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation type="unfinished">Ulangi passphrase baru</translation>
+ <translation type="unfinished">Ulangi frasa sandi baru</translation>
</message>
<message>
<source>Show passphrase</source>
- <translation type="unfinished">Perlihatkan passphrase</translation>
+ <translation type="unfinished">Tampilkan frasa sandi</translation>
</message>
<message>
<source>Encrypt wallet</source>
@@ -177,11 +186,11 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
</message>
<message>
<source>The supplied passphrases do not match.</source>
- <translation type="unfinished">Passphrase yang dimasukan tidak cocok.</translation>
+ <translation type="unfinished">Passphrase yang dimasukan tidak sesuai.</translation>
</message>
<message>
<source>Wallet unlock failed</source>
- <translation type="unfinished">Gagal membuka wallet</translation>
+ <translation type="unfinished">Gagal membuka dompet</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
@@ -516,10 +525,34 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Migrasi dompet</translation>
</message>
<message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Memindahkan dompet akan mengubah dompet ini menjadi satu atau beberapa dompet deskriptor. Cadangan dompet baru perlu dibuat.
+Jika dompet ini berisi skrip yang hanya bisa dilihat, dompet baru akan dibuat yang berisi skrip tersebut.
+Jika dompet ini berisi skrip yang dapat dipecahkan tetapi tidak dapat ditonton, dompet yang berbeda dan baru akan dibuat yang berisi skrip tersebut.
+
+Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadangan ini akan diberi nama -.legacy.bak dan dapat ditemukan di direktori untuk dompet ini. Jika terjadi gagal pemindahan, cadangan dapat dipulihkan dengan fungsi "Pulihkan Dompet".</translation>
+ </message>
+ <message>
<source>Migrate Wallet</source>
<translation type="unfinished">Migrasi dompet</translation>
</message>
<message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Memindahkan Dompet &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Dompet '%1' berhasil dipindahkan.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Skrip hanya lihat telah dimigrasikan ke dompet yang baru '%1'.</translation>
+ </message>
+ <message>
<source>Migration failed</source>
<translation type="unfinished">Migrasi gagal</translation>
</message>
@@ -1088,6 +1121,11 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Umur</translation>
</message>
<message>
+ <source>Received</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have received from the peer.</extracomment>
+ <translation type="unfinished">Diterima</translation>
+ </message>
+ <message>
<source>Address</source>
<extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
<translation type="unfinished">Alamat</translation>
@@ -1108,8 +1146,8 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Diterima</translation>
</message>
<message>
- <source>Sent</source>
- <translation type="unfinished">Terkirim</translation>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Versi lapisan transportasi: %1</translation>
</message>
<message>
<source>Transport</source>
@@ -1159,6 +1197,11 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<extracomment>Explanatory text for v1 transport type.</extracomment>
<translation type="unfinished">v1: protokol transportasi teks biasa tanpa enkripsi</translation>
</message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324 protokol transportasi terenkripsi</translation>
+ </message>
</context>
<context>
<name>ReceiveCoinsDialog</name>
@@ -1197,6 +1240,10 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Sembunyikan</translation>
</message>
<message>
+ <source>Copy change</source>
+ <translation type="unfinished">Salin Perubahan</translation>
+ </message>
+ <message>
<source>Unsigned Transaction</source>
<comment>PSBT copied</comment>
<extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
@@ -1285,6 +1332,11 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<context>
<name>WalletView</name>
<message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Ekspor
+wallet</translation>
+ </message>
+ <message>
<source>Export the data in the current tab to a file</source>
<translation type="unfinished">Ekspor data di tab saat ini ke sebuah file</translation>
</message>
@@ -1297,6 +1349,10 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<context>
<name>bitcoin-core</name>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s gagal memvalidasi status snapshot -assumeutxo. Ini mengindikasikan masalah perangkat keras, atau bug pada perangkat lunak, atau modifikasi perangkat lunak yang buruk yang memungkinkan snapshot yang tidak valid dimuat. Sebagai akibatnya, node akan dimatikan dan berhenti menggunakan status apa pun yang dibangun di atas snapshot, mengatur ulang tinggi rantai dari %d ke %d. Pada restart berikutnya, node akan melanjutkan sinkronisasi dari %d tanpa menggunakan data snapshot apa pun. Silakan laporkan kejadian ini ke %s, termasuk bagaimana Anda mendapatkan snapshot tersebut. Chainstate snapshot yang tidak valid akan dibiarkan di disk jika hal itu membantu dalam mendiagnosis masalah yang menyebabkan kesalahan ini.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s meminta mendengarkan di port %u. Port ini dianggap "buruk" dan oleh karena itu tidak mungkin peer lain akan terhubung kesini. Lihat doc/p2p-bad-ports.md untuk detail dan daftar lengkap.</translation>
</message>
@@ -1317,10 +1373,18 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Mode pangkas tidak kompatibel dengan -reindex-chainstate. Gunakan full -reindex sebagai gantinya.</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Penggantian nama '%s' -&gt; '%s' gagal. Anda harus menyelesaikannya dengan memindahkan atau menghapus secara manual direktori snapshot %s yang tidak valid, jika tidak, Anda akan menemukan kesalahan yang sama lagi pada startup berikutnya.</translation>
+ </message>
+ <message>
<source>This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
<translation type="unfinished">Ini adalah biaya transaksi maksimum yang Anda bayarkan (selain biaya normal) untuk memprioritaskan penghindaran pengeluaran sebagian daripada pemilihan koin biasa.</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Tingkat penebangan khusus kategori yang tidak didukung %1$s=%2$s. Diharapkan %1$s=&lt;kategori&gt;:&lt;loglevel&gt;. Kategori yang valid: %3$s. Tingkat pencatatan yang valid: %4$s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Ditemukan format database chainstate yang tidak didukung. Silakan mulai ulang dengan -reindex-chainstate. Ini akan membangun kembali database chainstate.</translation>
</message>
@@ -1333,6 +1397,14 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Dompet berhasil dimuat. Tipe dompet lama akan ditinggalkan dan dukungan untuk membuat dan membuka dompet ini akan dihapus di masa depan. Dompet lama dapat dimigrasikan ke dompet deskriptor dengan migratewallet.</translation>
</message>
<message>
+ <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation type="unfinished">%s ditetapkan sangat tinggi! Biaya sebesar ini dapat dibayarkan dalam satu transaksi.</translation>
+ </message>
+ <message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Kesalahan membaca %s! Semua kunci dibaca dengan benar, tetapi data transaksi atau metadata alamat mungkin hilang atau salah.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Kesalahan: Data buku alamat di dompet tidak dapat diidentifikasi sebagai dompet yang dimigrasikan</translation>
</message>
@@ -1349,10 +1421,18 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Gagal menghitung biaya peningkatan, karena UTXO yang belum dikonfirmasi bergantung pada kelompok besar transaksi yang belum dikonfirmasi.</translation>
</message>
<message>
+ <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
+ <translation type="unfinished">Estimasi biaya gagal. Fallbackfee dinonaktifkan. Tunggu beberapa blok atau aktifkan %s.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Opsi yang tidak kompatibel: -dnsseed=1 secara eksplisit ditentukan, tetapi -onlynet melarang koneksi ke IPv4/IPv6</translation>
</message>
<message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation type="unfinished">Jumlah yang tidak valid untuk %s=&lt;jumlah&gt;: '%s' (harus setidaknya biaya minrelay sebesar %s untuk mencegah transaksi macet)</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Koneksi keluar dibatasi untuk CJDNS (-onlynet=cjdns) tetapi -cjdnsreachable tidak disertakan</translation>
</message>
@@ -1377,6 +1457,10 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Jumlah total koin yang dipilih tidak menutupi transaksi target. Silahkan izinkan input yang lain untuk secara otomatis dipilih atau masukkan lebih banyak koin secara manual.</translation>
</message>
<message>
+ <source>Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
+ <translation type="unfinished">Transaksi membutuhkan satu tujuan dengan nilai non-0, feerate non-0, atau input yang telah dipilih sebelumnya</translation>
+ </message>
+ <message>
<source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
<translation type="unfinished">Snapshot UTXO gagal divalidasi. Mulai ulang untuk melanjutkan pengunduhan blok awal normal, atau coba muat snapshot yang berbeda.</translation>
</message>
@@ -1423,26 +1507,18 @@ Tidak dapat memulihkan cadangan dompet..</translation>
<translation type="unfinished">Verifikasi Blok terganggu</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Eror: Tidak dapat mengekstrak destinasi dari scriptpubkey yang dibuat</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Kesalahan: Tidak dapat menambahkan watchonly tx ke dompet watchonly</translation>
+ <source>Error reading configuration file: %s</source>
+ <translation type="unfinished">Kesalahan membaca file konfigurasi: %s</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Kesalahan: Tidak dapat menghapus transaksi hanya menonton</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Eror: Tidak dapat mengekstrak destinasi dari scriptpubkey yang dibuat</translation>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">Kesalahan: Gagal membuat dompet baru yang hanya dilihat</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Kesalahan: Tidak semua txs watchonly dapat dihapus</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Kesalahan: Dompet ini sudah menggunakan SQLite</translation>
</message>
@@ -1475,6 +1551,14 @@ Tidak dapat memulihkan cadangan dompet..</translation>
<translation type="unfinished">Kekurangan dbcache untuk verifikasi blok</translation>
</message>
<message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation type="unfinished">Jumlah yang tidak valid untuk %s=&lt;jumlah&gt;: '%s' (harus minimal %s)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Jumlah yang tidak valid untuk %s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid port specified in %s: '%s'</source>
<translation type="unfinished">Port tidak valid dalam %s:'%s'</translation>
</message>
@@ -1495,6 +1579,10 @@ Tidak dapat memulihkan cadangan dompet..</translation>
<translation type="unfinished">Tidak dapat diselesaikan input yang dipilih %s</translation>
</message>
<message>
+ <source>Specified data directory "%s" does not exist.</source>
+ <translation type="unfinished">Direktori data yang ditentukan "%s" tidak ada.</translation>
+ </message>
+ <message>
<source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
<translation type="unfinished">Tidak dapat mengalokasikan memori untuk -maxsigcachesize: '%s' MiB</translation>
</message>
@@ -1506,5 +1594,13 @@ Tidak dapat memulihkan cadangan dompet..</translation>
<source>Unable to unload the wallet before migrating</source>
<translation type="unfinished">Tidak dapat membongkar dompet sebelum bermigrasi</translation>
</message>
+ <message>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Tingkat penebangan global yang tidak didukung %s = %s. Nilai yang valid: %s.</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">menerima estimasi biaya basi tidak didukung pada %s rantai.</translation>
+ </message>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_it.ts b/src/qt/locale/bitcoin_it.ts
index 28320cff38..83410574dd 100644
--- a/src/qt/locale/bitcoin_it.ts
+++ b/src/qt/locale/bitcoin_it.ts
@@ -299,6 +299,14 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">sconosciuto</translation>
</message>
<message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Font default di sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizzato...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Importo</translation>
</message>
@@ -1083,12 +1091,12 @@ Il processo di migrazione creerà un backup del portafoglio prima della migrazio
<translation type="unfinished">Portafoglio '%1' migrato con successo.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Gli script di sola lettura sono stati trasferiti a un nuovo portafoglio chiamato '%1'.</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Gli script di sola lettura sono stati migrati su un nuovo wallet chiamato '%1'.</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Gli script risolvibili ma non osservati sono stati spostati su un nuovo portafoglio chiamato '%1'.</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Gli script risolvibili ma non monitorati sono stati migrati su un nuovo wallet chiamato '%1'.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1569,6 +1577,10 @@ Il processo di migrazione creerà un backup del portafoglio prima della migrazio
<translation type="unfinished">Riduci ad icona invece di uscire dall'applicazione quando la finestra viene chiusa. Attivando questa opzione l'applicazione terminerà solo dopo aver selezionato Esci dal menu File.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Font nella scheda Panoramica:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Le azioni da riga di comando hanno precedenza su quelle impostate da questo pannello:</translation>
</message>
@@ -1785,14 +1797,6 @@ Il processo di migrazione creerà un backup del portafoglio prima della migrazio
<translation type="unfinished">Usa un proxy SOCKS&amp;5 separato per raggiungere peers attraverso i Tor onion services.</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Font Monospaced nella tab di Overview</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">corrispondenza più vicina "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Cancella</translation>
</message>
@@ -2030,8 +2034,8 @@ Il processo di migrazione creerà un backup del portafoglio prima della migrazio
<translation type="unfinished">PSBT salvata su disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Invia %1 a %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Invia %1 a %2</translation>
</message>
<message>
<source>own address</source>
@@ -2599,6 +2603,10 @@ Se ricevi questo errore, dovresti richiedere al commerciante di fornire un URI c
<translation type="unfinished">Ctrl+W</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Finestra nodi - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Esecuzione del comando usando il portafoglio "%1"</translation>
</message>
@@ -3047,10 +3055,6 @@ Nota: poiché la commissione è calcolata su base per byte, una commissione di "
<translation type="unfinished">Crea una Transazione Bitcoin Parzialmente Firmata (PSBT) da utilizzare con ad es. un portafoglio %1 offline o un portafoglio hardware compatibile con PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">dal portafoglio '%1'</translation>
- </message>
- <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 a %2</translation>
</message>
@@ -3104,6 +3108,10 @@ Nota: poiché la commissione è calcolata su base per byte, una commissione di "
<translation type="unfinished">Per favore, controlla la tua proposta di transazione. Questo produrrà una Partially Signed Bitcoin Transaction (PSBT) che puoi salvare o copiare e quindi firmare con es. un portafoglio %1 offline o un portafoglio hardware compatibile con PSBT.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 dal wallet '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Vuoi creare questa transazione?</translation>
@@ -3564,8 +3572,8 @@ Nota: poiché la commissione è calcolata su base per byte, una commissione di "
<translation type="unfinished">Indice di output</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Il certificato non è stato verificato)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Il certificato non è stato verificato)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4392,6 +4400,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Il dumpfile %s non esiste.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Errore nel completamento della db txn per rimuovere transazioni dal wallet</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Errore di creazione %s</translation>
</message>
@@ -4440,16 +4452,12 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Si è verificato un errore leggendo la voce successiva dal database del portafogli elettronico</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Errore: Impossibile estrarre la destinazione dalla scriptpubkey generata</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Errore: Impossibile aggiungere la transazione in sola consultazione al wallet in sola consultazione</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Errore nell'inizializzazione della db txn per rimuovere transazioni dal wallet</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Errore: Non in grado di rimuovere le transazioni di sola lettura</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Errore: Impossibile estrarre la destinazione dalla scriptpubkey generata</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4488,10 +4496,6 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Errore: Nessun %s indirizzo disponibile</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Errore: Non è stato possibile cancellare tutte le transazioni in sola consultazione</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Errore: Questo portafoglio utilizza già SQLite</translation>
</message>
@@ -4516,6 +4520,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Errore: Non in grado di leggere tutti i record nel database</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Errore: Impossibile leggere il salvataggio del localizzatore del miglior blocco del wallet</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Errore: Impossibile rimuovere i dati della rubrica degli indirizzi in sola consultazione</translation>
</message>
@@ -4524,6 +4532,22 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Errore: non è possibile scrivere la voce nel nuovo portafogli elettronico</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Errore: Impossibile scrivere un localizzatore risolvibile del miglior blocco del wallet</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Errore: Impossibile scrivere il localizzatore di sola lettura del miglior blocco del wallet</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Errore: copia rubrica fallita per il wallet %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Errore: la transazione database non può essere eseguita per il portafoglio %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Nessuna porta disponibile per l'ascolto. Usa -listen=0 se vuoi procedere comunque.</translation>
</message>
@@ -4540,6 +4564,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Errore nella verifica del database</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">La rimozione della transazione è fallita: %s</translation>
+ </message>
+ <message>
<source>Ignoring duplicate -wallet %s.</source>
<translation type="unfinished">Ignorando il duplicato -wallet %s.</translation>
</message>
@@ -4756,6 +4784,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Questo è il costo di transazione che pagherai se invii una transazione.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transazione %s non appartiene a questo portafoglio</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Importo transazione troppo piccolo</translation>
</message>
@@ -4768,10 +4800,6 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">La transazione cambia l' indice dell'output fuori dal limite.</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transazione ha una sequenza troppo lunga nella mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transazione deve avere almeno un destinatario</translation>
</message>
@@ -4852,6 +4880,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Livello di logging globale non supportato %s=%s. Regole valide: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Creazione del file wallet fallita: %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates non è supportato sulla catena %s.</translation>
</message>
@@ -4860,6 +4892,14 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Categoria di registrazione non supportata %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Errore: Non è stato possibile aggiungere la transazione di sola lettura %s al wallet di sola lettura</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Errore: Non è stato possibile eliminare le transazioni di sola lettura</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Il commento del User Agent (%s) contiene caratteri non sicuri.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ja.ts b/src/qt/locale/bitcoin_ja.ts
index 27f7c18351..bdd23b7c04 100644
--- a/src/qt/locale/bitcoin_ja.ts
+++ b/src/qt/locale/bitcoin_ja.ts
@@ -413,6 +413,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n 年</numerusform>
</translation>
</message>
+ <message>
+ <source>%1 kB</source>
+ <translation type="unfinished">%1 KB</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -1112,12 +1116,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">ウォレット '%1' の移行が完了しました。</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">監視専用スクリプトは新しいウォレット '%1' に移行しました。</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">監視専用スクリプトは’%1’という名前の新しいウォレットに移行されました。</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">解決可能だが監視されないスクリプトは新しいウォレット '%1' に移行しました。</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">解決可能だが監視されないスクリプトは '%1' という名前の新しいウォレットに移行されました。</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1806,18 +1810,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">Tor onion serviceを介してピアに到達するために別のSOCKS&amp;5プロキシを使用する(&amp;5):</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">概要タブの等幅フォント: </translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">埋込み "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">最もマッチする "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">キャンセル(&amp;C)</translation>
</message>
@@ -2055,8 +2047,8 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">PSBTはディスクに保存されました。</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * %1 を %2 へ送金</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">%1を%2に送信</translation>
</message>
<message>
<source>own address</source>
@@ -2176,7 +2168,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
<message>
<source>Received</source>
<extracomment>Title of Peers Table column which indicates the total amount of network information we have received from the peer.</extracomment>
- <translation type="unfinished">受信</translation>
+ <translation type="unfinished">受信済</translation>
</message>
<message>
<source>Address</source>
@@ -2316,7 +2308,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
</message>
<message>
<source>Sent</source>
- <translation type="unfinished">送信済</translation>
+ <translation type="unfinished">送信</translation>
</message>
<message>
<source>&amp;Peers</source>
@@ -2688,7 +2680,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>To</source>
- <translation type="unfinished">外向き</translation>
+ <translation type="unfinished">送金先</translation>
</message>
<message>
<source>From</source>
@@ -2893,7 +2885,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(ラベル無し)</translation>
+ <translation type="unfinished">(ラベルなし)</translation>
</message>
<message>
<source>(no message)</source>
@@ -3109,10 +3101,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">オフラインの %1 ウォレット、あるいはPSBTに対応したハードウェアウォレットで使用するためのPSBT(部分的に署名された取引)を作成します。</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished"> ウォレット '%1' から</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 → '%2'</translation>
</message>
@@ -3170,6 +3158,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">取引の提案を確認してください。これにより、部分的に署名されたBitcoin取引(PSBT)が作成されます。これを保存するかコピーして例えばオフラインの %1 ウォレットやPSBTを扱えるハードウェアウォレットで残りの署名が出来ます。</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished"> ウォレット '%2' の%1</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">この取引を作成しますか?</translation>
@@ -3189,6 +3181,12 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">取引手数料</translation>
</message>
<message>
+ <source>%1 kvB</source>
+ <comment>PSBT transaction creation</comment>
+ <extracomment>When reviewing a newly created PSBT (via Send flow), the transaction fee is shown, with "virtual size" of the transaction displayed for context</extracomment>
+ <translation type="unfinished"> %1 kvB</translation>
+ </message>
+ <message>
<source>Not signalling Replace-By-Fee, BIP-125.</source>
<translation type="unfinished">Replace-By-Fee(手数料の上乗せ: BIP-125)機能は有効になっていません。</translation>
</message>
@@ -3246,6 +3244,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">%1 よりも高い手数料は、法外に高い手数料と判定されます。</translation>
</message>
+ <message>
+ <source>%1/kvB</source>
+ <translation type="unfinished">%1 /kvB</translation>
+ </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -3270,7 +3272,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(ラベル無し)</translation>
+ <translation type="unfinished">(ラベルなし)</translation>
</message>
</context>
<context>
@@ -3554,7 +3556,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>From</source>
- <translation type="unfinished">送金元</translation>
+ <translation type="unfinished">内向き</translation>
</message>
<message>
<source>unknown</source>
@@ -3635,8 +3637,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">アウトプット番号</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished"> (証明書は未検証)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (証明書は未検証)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4035,7 +4037,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>default wallet</source>
- <translation type="unfinished">デフォルトのウォレット</translation>
+ <translation type="unfinished">デフォルトウォレット</translation>
</message>
</context>
<context>
@@ -4055,7 +4057,7 @@ Go to File &gt; Open Wallet to load a wallet.
<message>
<source>Wallet Data</source>
<extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">ウォレットのデータ</translation>
+ <translation type="unfinished">ウォレットデータ</translation>
</message>
<message>
<source>Backup Failed</source>
@@ -4507,14 +4509,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">エラー: 生成されたscriptpubkeyから宛先を抽出できません</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">エラー: 監視対象取引を監視専用ウォレットに追加できませんでした</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">エラー: 監視対象取引を削除できませんでした</translation>
- </message>
- <message>
<source>Error: Couldn't create cursor into database</source>
<translation type="unfinished">エラー: データベースにカーソルを作成できませんでした</translation>
</message>
@@ -4551,10 +4545,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">エラー: %sアドレスは使えません。</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">エラー: 一部の監視対象取引を削除できませんでした</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">エラー: このウォレットはすでに SQLite を使用しています</translation>
</message>
@@ -4579,6 +4569,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">エラー: データベース内のすべてのレコードを読み取ることができません</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">エラー:ウォレットのベストブロックロケーターレコードを読み込めません</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">エラー: 監視専用アドレス帳データを削除できません</translation>
</message>
@@ -4587,6 +4581,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">エラー: 新しいウォレットにレコードを書き込めません</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">エラー:解決可能なウォレットのベストブロックロケーターレコードを書き込めません</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">エラー:監視専用ウォレットのベストブロックロケーターレコードを書き込めません</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">ポートのリッスンに失敗しました。必要であれば -listen=0 を指定してください。</translation>
</message>
@@ -4835,10 +4837,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">取引のお釣りのアウトプットインデックスが規定の範囲外です</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">取引のメモリープールチェーンが長すぎます</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">取引は最低ひとつの受取先が必要です</translation>
</message>
@@ -4919,6 +4917,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">未サポートのログレベル %s=%s。 正しい値は: %s。</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">ウォレットファイルの作成に失敗しました:%s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">%s チェーンでは acceptstalefeeestimates はサポートされていません。</translation>
</message>
@@ -4927,6 +4929,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">サポートされていないログカテゴリ %s=%s 。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">エラー: 監視対象取引%sを監視専用ウォレットに追加できませんでした</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">ユーザエージェントのコメント ( %s ) に安全でない文字が含まれています。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_km.ts b/src/qt/locale/bitcoin_km.ts
index fe83ac9a0f..e62aee0aff 100644
--- a/src/qt/locale/bitcoin_km.ts
+++ b/src/qt/locale/bitcoin_km.ts
@@ -2233,10 +2233,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ចម្លងតម្លៃ</translation>
</message>
<message>
- <source>Copy change</source>
- <translation type="unfinished">ចម្លងការផ្លាស់ប្តូរ</translation>
- </message>
- <message>
<source>Sign on device</source>
<extracomment>"device" usually means a hardware wallet.</extracomment>
<translation type="unfinished">ចុះហត្ថលេខាលើឧបករណ៍</translation>
@@ -3017,10 +3013,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">ចំនួនប្រត្តិបត្តិការ មិនអាចអវិជ្ជមានបានទេ</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">ប្រត្តិបត្តិការមានខ្សែចង្វាក់រងចាំដើម្បីធ្វើការផ្ទៀងផ្ទាត់វែង</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">ប្រត្តិបត្តិការត្រូវមានអ្នកទទួលម្នាក់យ៉ាងតិចបំផុត</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ko.ts b/src/qt/locale/bitcoin_ko.ts
index 53af80ddc3..ebf24eb372 100644
--- a/src/qt/locale/bitcoin_ko.ts
+++ b/src/qt/locale/bitcoin_ko.ts
@@ -1752,18 +1752,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Tor onion 서비스를 통해 피어에 도달하려면 별도의 SOCKS &amp; 5 프록시를 사용하십시오.</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">개요 탭의 고정 폭 글꼴:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">%1 포함됨</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">가장 가까운 의미 "1%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">확인(&amp;O)</translation>
</message>
@@ -1985,10 +1973,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT가 디스크에 저장 됨</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* %1을 %2로 보냅니다.</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">자신의 주소</translation>
</message>
@@ -2967,10 +2951,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">오프라인 %1 지갑 또는 PSBT가 호환되는 하드웨어 지갑과의 사용을 위한 '부분적으로 서명 된 비트 코인 트랜잭션(PSBT)'를 생성합니다.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">'%1' 지갑에서</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1을 '%2'로</translation>
</message>
@@ -3462,10 +3442,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">출력 인덱스</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(인증서가 확인되지 않았습니다)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">판매자</translation>
</message>
@@ -4346,10 +4322,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">거래액은 반드시 0보다 큰 값이어야 합니다.</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">거래가 너무 긴 메모리 풀 체인을 갖고 있습니다</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">거래에는 최소한 한명의 수령인이 있어야 합니다.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_la.ts b/src/qt/locale/bitcoin_la.ts
index 3d31ed8d79..eaf3c35f2d 100644
--- a/src/qt/locale/bitcoin_la.ts
+++ b/src/qt/locale/bitcoin_la.ts
@@ -42,6 +42,10 @@
<translation type="unfinished">&amp;Dele</translation>
</message>
<message>
+ <source>Choose the address to send coins to</source>
+ <translation type="unfinished">Elige quam peram mittere pecuniam</translation>
+ </message>
+ <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Hae sunt inscriptiones mittendi pensitationes. Semper inspice quantitatem et inscriptionem accipiendi antequam nummos mittis.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_lb.ts b/src/qt/locale/bitcoin_lb.ts
index 7e41cd0593..7e0c3b9228 100644
--- a/src/qt/locale/bitcoin_lb.ts
+++ b/src/qt/locale/bitcoin_lb.ts
@@ -7,7 +7,7 @@
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">Erschaf een nei adress</translation>
+ <translation type="unfinished">Eng nei Adress erstellen</translation>
</message>
<message>
<source>&amp;New</source>
@@ -57,7 +57,7 @@ D'Signatur ass nëmmen mat Adressen vum Typ 'legacy' méiglech.</translation>
<name>AskPassphraseDialog</name>
<message>
<source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">Warnung: Wann Dir Är Portemonnaie verschlësselt an Äert Passwort verléiert, da verléiert Dir 1ALLE ÄRE BITCOINS1!</translation>
+ <translation type="unfinished">Warnung: Wann Dir Är Portemonnaie verschlësselt an Äert Passwort verléiert, &lt;b&gt;DA VERLÉIERT DIR ALLE ÄRE BITCOINS&lt;/b&gt;!</translation>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
diff --git a/src/qt/locale/bitcoin_lt.ts b/src/qt/locale/bitcoin_lt.ts
index 2e85cc60c8..0df3a165aa 100644
--- a/src/qt/locale/bitcoin_lt.ts
+++ b/src/qt/locale/bitcoin_lt.ts
@@ -2117,10 +2117,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">%1 (%2 blokai)</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">iš piniginės '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">'%1' į '%2'</translation>
</message>
@@ -2957,10 +2953,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Transakcijos suma negali buti neigiama</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Sandoris turi per ilgą mempool grandinę</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transakcija privalo turėti bent vieną gavėją</translation>
</message>
diff --git a/src/qt/locale/bitcoin_mi.ts b/src/qt/locale/bitcoin_mi.ts
index 6a67a3e646..8dc535cd68 100644
--- a/src/qt/locale/bitcoin_mi.ts
+++ b/src/qt/locale/bitcoin_mi.ts
@@ -620,10 +620,6 @@ Ko te whakakī i ēnei whakaaronga e taea ana anake ki ngā whakararuraru o te m
<translation type="unfinished">He whakawhitiwhitinga whakaputanga hōputu whakararuraru te tūnga</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">He whakawhitiwhitinga whakapau kaha te whakapau kaha o te whakapau kaha.</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Me whiwhi whakaritenga tātari tētahi whiwhi whakaritenga ki te kaiwhiwhi kotahi i te minimuma</translation>
</message>
diff --git a/src/qt/locale/bitcoin_mk.ts b/src/qt/locale/bitcoin_mk.ts
index 3f4ba90a9a..9fd41c2646 100644
--- a/src/qt/locale/bitcoin_mk.ts
+++ b/src/qt/locale/bitcoin_mk.ts
@@ -11,7 +11,7 @@
</message>
<message>
<source>&amp;New</source>
- <translation type="unfinished">&amp;Нова</translation>
+ <translation type="unfinished">Нова</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
@@ -19,15 +19,15 @@
</message>
<message>
<source>&amp;Copy</source>
- <translation type="unfinished">&amp;Копирај</translation>
+ <translation type="unfinished">Копирај</translation>
</message>
<message>
<source>C&amp;lose</source>
- <translation type="unfinished">З&amp;атвори</translation>
+ <translation type="unfinished">Затвори</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Избриши ја избраната адреса од листата</translation>
+ <translation type="unfinished">Избриши ја избраната адреса од списокот</translation>
</message>
<message>
<source>Enter address or label to search</source>
@@ -35,19 +35,19 @@
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Експортирај ги податоците од активното јазиче во датотека</translation>
+ <translation type="unfinished">Извези ги податоците од активното јазиче во датотека</translation>
</message>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;Експорт</translation>
+ <translation type="unfinished">Извези</translation>
</message>
<message>
<source>&amp;Delete</source>
- <translation type="unfinished">&amp;Избриши</translation>
+ <translation type="unfinished">Избриши</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation type="unfinished">Извези ги податоците во избраниот дел кон датотека</translation>
+ <translation type="unfinished">Избери адреса на која ќе испратиш монети</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
@@ -120,19 +120,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Enter passphrase</source>
- <translation type="unfinished">Внеси тајна фраза</translation>
+ <translation type="unfinished">Внеси лозинка</translation>
</message>
<message>
<source>New passphrase</source>
- <translation type="unfinished">Нова тајна фраза</translation>
+ <translation type="unfinished">Нова лозинка</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation type="unfinished">Повторете ја новата тајна фраза</translation>
+ <translation type="unfinished">Повтори ја лозинката</translation>
</message>
<message>
<source>Show passphrase</source>
- <translation type="unfinished">Покажи ја лозинката</translation>
+ <translation type="unfinished">Покажување на лозинката</translation>
</message>
<message>
<source>Encrypt wallet</source>
@@ -216,7 +216,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">Лозинката за паричник е успешно променета.</translation>
+ <translation type="unfinished">Лозинката за паричникот е успешно променета.</translation>
</message>
<message>
<source>Passphrase change failed</source>
@@ -235,7 +235,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Banned Until</source>
- <translation type="unfinished">Блокиран до:</translation>
+ <translation type="unfinished">Блокиран до</translation>
</message>
</context>
<context>
@@ -370,7 +370,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<name>BitcoinGUI</name>
<message>
<source>&amp;Overview</source>
- <translation type="unfinished">&amp;Преглед</translation>
+ <translation type="unfinished">Преглед</translation>
</message>
<message>
<source>Show general overview of wallet</source>
@@ -378,19 +378,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Transactions</source>
- <translation type="unfinished">&amp;Трансакции</translation>
+ <translation type="unfinished">Трансакции</translation>
</message>
<message>
<source>Browse transaction history</source>
- <translation type="unfinished">Преглед на историјата на трансакции</translation>
+ <translation type="unfinished">Разгледај ја историјата на трансакциите</translation>
</message>
<message>
<source>E&amp;xit</source>
- <translation type="unfinished">И&amp;злез</translation>
+ <translation type="unfinished">Излез</translation>
</message>
<message>
<source>Quit application</source>
- <translation type="unfinished">Напушти ја апликацијата</translation>
+ <translation type="unfinished">Излез од примената</translation>
</message>
<message>
<source>&amp;About %1</source>
@@ -402,7 +402,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>About &amp;Qt</source>
- <translation type="unfinished">За &amp;Qt</translation>
+ <translation type="unfinished">За Qt</translation>
</message>
<message>
<source>Show information about Qt</source>
@@ -435,7 +435,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
- <translation type="unfinished">Испрати биткоини на Биткоин адреса</translation>
+ <translation type="unfinished">Испрати биткоини на биткоин-адреса</translation>
</message>
<message>
<source>Backup wallet to another location</source>
@@ -447,11 +447,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Send</source>
- <translation type="unfinished">&amp;Испрати</translation>
+ <translation type="unfinished">Испрати</translation>
</message>
<message>
<source>&amp;Receive</source>
- <translation type="unfinished">&amp;Прими</translation>
+ <translation type="unfinished">Прими</translation>
</message>
<message>
<source>&amp;Options…</source>
@@ -463,7 +463,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Криптирај ги приватните клучеви кои припаѓаат на твојот паричник</translation>
+ <translation type="unfinished">Шифрирање на личните клучеви што припаѓаат на вашиот паричник</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
@@ -515,7 +515,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">&amp;Подесувања</translation>
+ <translation type="unfinished">&amp;Поставки</translation>
</message>
<message>
<source>&amp;Help</source>
@@ -527,7 +527,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Синхронизација на заглавијата (%1 %)</translation>
+ <translation type="unfinished">Синхронизација на заглавијата (%1 %)...</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -539,7 +539,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Processing blocks on disk…</source>
- <translation type="unfinished">Обработување сектори на дискови...</translation>
+ <translation type="unfinished">Обработување блокови на дискови...</translation>
</message>
<message>
<source>Connecting to peers…</source>
@@ -571,7 +571,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 позади</translation>
+ <translation type="unfinished">%1 зад</translation>
</message>
<message>
<source>Catching up…</source>
@@ -591,7 +591,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Warning</source>
- <translation type="unfinished">Предупредување</translation>
+ <translation type="unfinished">Внимание</translation>
</message>
<message>
<source>Information</source>
@@ -607,7 +607,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">Вчитај PSBT од &amp;клипбордот...</translation>
+ <translation type="unfinished">Вчитајте PSBT од &amp;клипбордот...</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
@@ -635,7 +635,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Open Wallet</source>
- <translation type="unfinished">Отвори паричник</translation>
+ <translation type="unfinished">Отвори го паричникот</translation>
</message>
<message>
<source>Open a wallet</source>
@@ -1352,11 +1352,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;Експорт</translation>
+ <translation type="unfinished">Извези</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Експортирај ги податоците од активното јазиче во датотека</translation>
+ <translation type="unfinished">Извези ги податоците од активното јазиче во датотека</translation>
</message>
<message>
<source>Wallet Data</source>
diff --git a/src/qt/locale/bitcoin_ml.ts b/src/qt/locale/bitcoin_ml.ts
index de58050abd..2bb0d996df 100644
--- a/src/qt/locale/bitcoin_ml.ts
+++ b/src/qt/locale/bitcoin_ml.ts
@@ -84,6 +84,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">കയറ്റുമതി വിലാസങ്ങൾ </translation>
</message>
<message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">കോമയാൽ വേർതിരിച്ച ഫയൽ (* .csv)</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">കയറ്റുമതി പരാജയപ്പെട്ടു</translation>
</message>
@@ -206,10 +211,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">വാലറ്റ് ഡീക്രിപ്ഷനായി നൽകിയ പാസ്‌ഫ്രേസ് തെറ്റാണ്.</translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">വാലറ്റ് ഡീക്രിപ്ഷനായി നൽകിയ പാസ്ഫ്രെയ്സ് തെറ്റാണ്. അതിൽ ഒരു ശൂന്യ പ്രതീകം അടങ്ങിയിരിക്കുന്നു (അതായത് - ഒരു സീറോ ബൈറ്റ്). 25.0-ന് മുമ്പ് ഈ സോഫ്‌റ്റ്‌വെയറിൻ്റെ ഒരു പതിപ്പ് ഉപയോഗിച്ചാണ് പാസ്‌ഫ്രെയ്‌സ് സജ്ജീകരിച്ചതെങ്കിൽ, ആദ്യത്തെ അസാധുവായ പ്രതീകം വരെയുള്ള - എന്നാൽ ഉൾപ്പെടുത്താതെയുള്ള പ്രതീകങ്ങൾ മാത്രം ഉപയോഗിച്ച് വീണ്ടും ശ്രമിക്കുക. ഇത് വിജയകരമാണെങ്കിൽ, ഭാവിയിൽ ഈ പ്രശ്‌നം ഒഴിവാക്കുന്നതിന് ദയവായി ഒരു പുതിയ പാസ്‌ഫ്രെയ്‌സ് സജ്ജീകരിക്കുക.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">വാലറ്റ് പാസ്‌ഫ്രെയ്‌സ് വിജയകരമായി മാറ്റി.</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">പാസ്‌ഫ്രെയ്‌സ് മാറ്റം പരാജയപ്പെട്ടു</translation>
+ </message>
+ <message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">വാലറ്റ് ഡീക്രിപ്‌ഷനായി നൽകിയ പഴയ പാസ്‌ഫ്രെയ്‌സ് തെറ്റാണ്. അതിൽ ഒരു ശൂന്യ പ്രതീകം അടങ്ങിയിരിക്കുന്നു (അതായത് - ഒരു സീറോ ബൈറ്റ്). 25.0-ന് മുമ്പ് ഈ സോഫ്‌റ്റ്‌വെയറിൻ്റെ ഒരു പതിപ്പ് ഉപയോഗിച്ചാണ് പാസ്‌ഫ്രെയ്‌സ് സജ്ജീകരിച്ചതെങ്കിൽ, ആദ്യത്തെ അസാധുവായ പ്രതീകം വരെയുള്ള - എന്നാൽ ഉൾപ്പെടുത്താതെയുള്ള പ്രതീകങ്ങൾ മാത്രം ഉപയോഗിച്ച് വീണ്ടും ശ്രമിക്കുക.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">മുന്നറിയിപ്പ്: ക്യാപ്‌സ് ലോക്ക് കീ ഓണാണ്!</translation>
</message>
@@ -228,6 +245,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">ക്രമീകരണങ്ങൾ ഫയൽ %1 കേടായതോ അസാധുവായതോ ആയിരിക്കാം.</translation>
+ </message>
+ <message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">റൺവേ ഒഴിവാക്കൽ പിശക്</translation>
+ </message>
+ <message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
<translation type="unfinished">മാരകമായ ഒരു പിശക് സംഭവിച്ചു. %1 ന് മേലിൽ സുരക്ഷിതമായി തുടരാനാകില്ല, ഒപ്പം ഉപേക്ഷിക്കുകയും ചെയ്യും.</translation>
</message>
@@ -356,7 +381,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet:</source>
- <translation type="unfinished">വാലറ്റ്:</translation>
+ <translation type="unfinished">പണസഞ്ചി </translation>
</message>
<message>
<source>Network activity disabled.</source>
@@ -369,7 +394,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
- <translation type="unfinished">ഒരു ബിറ്റ്കോയിൻ വിലാസത്തിലേക്ക് നാണയങ്ങൾ അയയ്ക്കുക</translation>
+ <translation type="unfinished">ഒരു ബിറ്റ്‌കോയിൻ വിലാസത്തിലേക് പണം അയക്കുക </translation>
</message>
<message>
<source>Backup wallet to another location</source>
@@ -531,6 +556,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">വാലറ്റ് ഒന്നും ലഭ്യം അല്ല </translation>
</message>
<message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">വാലറ്റ് പുനഃസ്ഥാപിക്കുക</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">വാലറ്റ് പേര്</translation>
@@ -776,6 +806,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">വാലറ്റ് പുനഃസ്ഥാപിക്കുക</translation>
+ </message>
+ </context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -955,6 +993,26 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>OptionsDialog</name>
<message>
+ <source>(0 = auto, &lt;0 = leave that many cores free)</source>
+ <translation type="unfinished">(0 = ഓട്ടോ, &lt;0 = അത്രയും കോറുകൾ സൗജന്യമായി വിടുക)</translation>
+ </message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">വാലറ്റ്</translation>
+ </message>
+ <message>
+ <source>Expert</source>
+ <translation type="unfinished">വിദഗ്ധൻ</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">&amp;പോർട്ട്:</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation type="unfinished">ടോർ</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation type="unfinished">&amp;ജാലകം </translation>
</message>
@@ -1317,6 +1375,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>TransactionView</name>
<message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">കോമയാൽ വേർതിരിച്ച ഫയൽ (* .csv)</translation>
+ </message>
+ <message>
<source>Confirmed</source>
<translation type="unfinished">സ്ഥിതീകരിച്ചു</translation>
</message>
diff --git a/src/qt/locale/bitcoin_nb.ts b/src/qt/locale/bitcoin_nb.ts
index eb6d5993c6..015496d587 100644
--- a/src/qt/locale/bitcoin_nb.ts
+++ b/src/qt/locale/bitcoin_nb.ts
@@ -1564,14 +1564,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Bruk separate SOCKS&amp;5 proxy for å nå peers via Tor onion tjenester:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">Innebygd "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">nærmeste treff "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Avbryt</translation>
</message>
@@ -1789,10 +1781,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT lagret til disk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Sender %1 til %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">egen adresse</translation>
</message>
@@ -3168,10 +3156,6 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">Outputindeks</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(sertifikatet ble ikke bekreftet)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Forretningsdrivende</translation>
</message>
@@ -4023,10 +4007,6 @@ Mangler løsningsdata for å estimere transaksjonsstørrelse</translation>
<translation type="unfinished">Transaksjonsbeløpet kan ikke være negativt</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transaksjonen har for lang minnepoolkjede</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transaksjonen må ha minst én mottaker</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ne.ts b/src/qt/locale/bitcoin_ne.ts
index fae4ee4ecb..c54fb40a37 100644
--- a/src/qt/locale/bitcoin_ne.ts
+++ b/src/qt/locale/bitcoin_ne.ts
@@ -88,6 +88,14 @@
<translation type="unfinished">ठेगाना सुची %1मा बचत गर्ने प्रयासमा त्रुटि भएको छ। कृपया पुनः प्रयास गर्नुहोस।</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">ठेगानाहरू पठाउँदै - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">ठेगानाहरू प्राप्त गर्दै - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">निर्यात असफल</translation>
</message>
@@ -102,7 +110,11 @@
<source>Address</source>
<translation type="unfinished">ठेगाना</translation>
</message>
- </context>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(लेबल छैन)</translation>
+ </message>
+</context>
<context>
<name>AskPassphraseDialog</name>
<message>
@@ -130,6 +142,10 @@
<translation type="unfinished">वालेट इन्क्रिप्ट गर्नुहोस् </translation>
</message>
<message>
+ <source>This operation needs your wallet passphrase to unlock the wallet.</source>
+ <translation type="unfinished">यो अपरेसनलाई वालेट अनलक गर्न तपाईंको वालेट पासफ्रेज चाहिन्छ।</translation>
+ </message>
+ <message>
<source>Unlock wallet</source>
<translation type="unfinished">वालेट अनलक गर्नुहोस्</translation>
</message>
@@ -150,6 +166,26 @@
<translation type="unfinished">वालेट इन्क्रिप्ट भयो</translation>
</message>
<message>
+ <source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
+ <translation type="unfinished">वालेटको लागि नयाँ पासफ्रेज प्रविष्ट गर्नुहोस्। &lt;br/&gt;कृपया पासफ्रेज प्रयोग गर्नुहोस् &lt;b&gt;दस वा बढी अनियमित वर्णहरू &lt;/b&gt;, वा &lt;b&gt;आठ वा बढी शब्दहरू &lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>Enter the old passphrase and new passphrase for the wallet.</source>
+ <translation type="unfinished">वालेटको लागि पुरानो पासफ्रेज र नयाँ पासफ्रेज प्रविष्ट गर्नुहोस्।</translation>
+ </message>
+ <message>
+ <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation type="unfinished">याद गर्नुहोस् कि तपाईको वालेट इन्क्रिप्ट गर्नाले तपाईको बिटकोइनलाई तपाईको कम्प्युटरमा मालवेयरले चोरी हुनबाट पूर्णतया सुरक्षित गर्न सक्दैन।</translation>
+ </message>
+ <message>
+ <source>Wallet to be encrypted</source>
+ <translation type="unfinished">वालेट इन्क्रिप्ट गर्न</translation>
+ </message>
+ <message>
+ <source>Your wallet is about to be encrypted. </source>
+ <translation type="unfinished">तपाईंको वालेट इन्क्रिप्ट हुन लागेको छ।</translation>
+ </message>
+ <message>
<source>Your wallet is now encrypted. </source>
<translation type="unfinished">अब वालेट इन्क्रिप्ट भएको छ।</translation>
</message>
@@ -158,10 +194,30 @@
<translation type="unfinished">वालेट इन्क्रिप्सन असफल </translation>
</message>
<message>
+ <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
+ <translation type="unfinished">आन्तरिक त्रुटिका कारण वालेट इन्क्रिप्सन असफल भयो। तपाईंको वालेट इन्क्रिप्ट गरिएको थिएन।</translation>
+ </message>
+ <message>
+ <source>The supplied passphrases do not match.</source>
+ <translation type="unfinished">प्रदान गरिएका पासफ्रेजहरू मेल खाँदैनन्।</translation>
+ </message>
+ <message>
<source>Wallet unlock failed</source>
<translation type="unfinished">वालेट अनलक असफल </translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption was incorrect.</source>
+ <translation type="unfinished">वालेट डिक्रिप्शनको लागि प्रविष्ट गरिएको पासफ्रेज गलत थियो।</translation>
+ </message>
+ <message>
+ <source>Wallet passphrase was successfully changed.</source>
+ <translation type="unfinished">वालेट पासफ्रेज सफलतापूर्वक परिवर्तन गरियो।</translation>
+ </message>
+ <message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">पासफ्रेज परिवर्तन असफल भयो</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">चेतावनी: क्याप्स लक कीप्याड अन छ!</translation>
</message>
@@ -180,10 +236,18 @@
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">सेटिङ फाइल %1 भ्रष्ट वा अवैध हुन सक्छ।</translation>
+ </message>
+ <message>
<source>Runaway exception</source>
<translation type="unfinished">रनअवे अपवाद</translation>
</message>
<message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">एउटा घातक त्रुटि भयो। %1 अब सुरक्षित रूपमा जारी राख्न सक्दैन र छोड्नेछ।</translation>
+ </message>
+ <message>
<source>Internal error</source>
<translation type="unfinished">आन्तरिक दोष</translation>
</message>
@@ -191,6 +255,19 @@
<context>
<name>QObject</name>
<message>
+ <source>Do you want to reset settings to default values, or to abort without making changes?</source>
+ <extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
+ <translation type="unfinished">के तपाइँ पूर्वनिर्धारित मानहरूमा सेटिङहरू रिसेट गर्न चाहनुहुन्छ, वा परिवर्तन नगरी रद्द गर्न चाहनुहुन्छ?</translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">त्रुटि: %1</translation>
+ </message>
+ <message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">%1अझै सुरक्षित बाहिर निस्किएन...</translation>
+ </message>
+ <message>
<source>unknown</source>
<translation type="unfinished">थाहा नभयेको</translation>
</message>
@@ -382,6 +459,10 @@
<source>&amp;Help</source>
<translation type="unfinished">&amp;मद्दत</translation>
</message>
+ <message>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">ट्याबहरू उपकरणपट्टी</translation>
+ </message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
@@ -414,6 +495,10 @@
<numerusform />
</translation>
</message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">त्रुटि: %1</translation>
+ </message>
</context>
<context>
<name>CoinControlDialog</name>
@@ -433,6 +518,10 @@
<source>Confirmed</source>
<translation type="unfinished">पुष्टि भयो</translation>
</message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(लेबल छैन)</translation>
+ </message>
</context>
<context>
<name>CreateWalletDialog</name>
@@ -715,6 +804,10 @@
<source>Label</source>
<translation type="unfinished">लेबल</translation>
</message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(लेबल छैन)</translation>
+ </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -729,7 +822,11 @@
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(लेबल छैन)</translation>
+ </message>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -804,6 +901,10 @@
<source>Label</source>
<translation type="unfinished">लेबल</translation>
</message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(लेबल छैन)</translation>
+ </message>
</context>
<context>
<name>TransactionView</name>
diff --git a/src/qt/locale/bitcoin_nl.ts b/src/qt/locale/bitcoin_nl.ts
index bbe789f474..e0e3e3a138 100644
--- a/src/qt/locale/bitcoin_nl.ts
+++ b/src/qt/locale/bitcoin_nl.ts
@@ -94,6 +94,14 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Een fout is opgetreden tijdens het opslaan van deze adreslijst naar %1. Probeer nogmaals.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Verzendadressen - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Ontvangstadressen - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Exporteren Mislukt</translation>
</message>
@@ -693,6 +701,14 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Sluit alle portemonnees</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Wallet migreren</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Een wallet migreren</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Toon het %1 hulpbericht om een lijst te krijgen met mogelijke Bitcoin commandoregelopties</translation>
</message>
@@ -781,6 +797,14 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Blokhoofden synchroniseren (%1%)...</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Fout bij wallet maken</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Kan geen nieuwe wallet maken, de software werd gecompileerd zonder sqlite-ondersteuning (nodig voor descriptor wallets)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Fout: %1</translation>
</message>
@@ -1020,6 +1044,57 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Wallet migreren</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Weet je zeker dat je wil migreren van wallet &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">De wallet migreren converteert deze wallet naar één of meerdere descriptor wallets. Er moet een nieuwe wallet backup gemaakt worden.
+Indien deze wallet alleen lezen scripts bevat, wordt er een nieuwe wallet gemaakt die deze alleen lezen scripts bevat.
+Indien deze wallet oplosbare maar ongemonitorde scripts bevat, wordt er een andere en nieuwe wallet gemaakt die deze scripts bevat.
+
+Het migratieproces maakt voorafgaand aan het migreren een backup van de wallet. Dit backupbestand krijgt de naam &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak en is te vinden in de map van deze wallet. In het geval van een onjuiste migratie, kan de backup hersteld worden met de "Wallet Herstellen" functie.</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Wallet migreren</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migreren wallet &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">De wallet '%1' werd succesvol gemigreerd.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Alleen lezen scripts zijn gemigreerd naar een nieuwe wallet met de naam '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Oplosbare maar ongemonitorde scripts zijn gemigreerd naar een nieuwe wallet met de naam '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migreren mislukt</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migreren succesvol</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1102,6 +1177,14 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Wallet aanmaken</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Je bent één stap verwijderd van het maken van je nieuwe wallet!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Voer aub een naam in en activeer, indien gewenst, geavanceerde opties</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Walletnaam</translation>
</message>
@@ -1680,18 +1763,6 @@ Ongebruikte mempool geheugen is gedeeld voor deze cache.</translation>
<translation type="unfinished">Gebruik afzonderlijke SOCKS &amp; 5-proxy om peers te bereiken via Tor Onion-services:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Monospaced lettertype in het Overzicht tab:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">ingebed "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">best overeenkomende "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Oké</translation>
</message>
@@ -1933,8 +2004,8 @@ Ongebruikte mempool geheugen is gedeeld voor deze cache.</translation>
<translation type="unfinished">PSBT opgeslagen op de schijf</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">Verstuur %1 naar %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Verzenden %1 van %2</translation>
</message>
<message>
<source>own address</source>
@@ -2186,6 +2257,18 @@ Als je deze fout ziet zou je de aanbieder moeten verzoeken om een BIP21-compatib
<translation type="unfinished">Selecteer een peer om gedetailleerde informatie te bekijken.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">De transport layer versie: %1</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">De BIP324 sessie ID string in hex, indien aanwezig.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">Sessie ID</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Versie</translation>
</message>
@@ -2395,6 +2478,21 @@ Als je deze fout ziet zou je de aanbieder moeten verzoeken om een BIP21-compatib
<translation type="unfinished">Uitgaand adres verkrijgen: Kort levend, voor opvragen van adressen</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">detecteren: Peer kan v1 of v2 zijn</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: onversleuteld, platte tekst transportprotocol</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324 versleuteld transportprotocol</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">we selecteerden de peer voor relayen met hoge bandbreedte</translation>
</message>
@@ -2877,10 +2975,6 @@ Notitie: Omdat de vergoeding per byte wordt gerekend, zal een vergoeding van "10
<translation type="unfinished">Creëert een Gedeeltelijk Getekende Bitcoin Transactie (PSBT) om te gebruiken met b.v. een offline %1 wallet, of een PSBT-compatibele hardware wallet.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">van wallet '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 naar %2</translation>
</message>
@@ -2938,6 +3032,10 @@ Notitie: Omdat de vergoeding per byte wordt gerekend, zal een vergoeding van "10
<translation type="unfinished">Controleer aub je transactievoorstel. Dit zal een Gedeeltelijk Getekende Bitcoin Transactie (PSBT) produceren die je kan opslaan of kopiëren en vervolgens ondertekenen met bijv. een offline %1 wallet, of een PSBT-combatibele hardware wallet.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 van wallet '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Wilt u deze transactie aanmaken?</translation>
@@ -3378,8 +3476,8 @@ Notitie: Omdat de vergoeding per byte wordt gerekend, zal een vergoeding van "10
<translation type="unfinished">Transactie virtuele grootte</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certificaat kon niet worden geverifieerd)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Certificaat kon niet worden geverifieerd)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4056,6 +4154,10 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">Fout: Transactie %s in portemonnee kan niet worden geïdentificeerd als behorend bij gemigreerde portemonnees</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Berekenen van bump fees mislukt, omdat onbevestigde UTXO's afhankelijk zijn van een enorm cluster onbevestigde transacties.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Kan de naam van het ongeldige peers.dat bestand niet hernoemen. Verplaats of verwijder het en probeer het opnieuw.</translation>
</message>
@@ -4228,14 +4330,6 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Fout: Kan de bestemming niet extraheren uit de gegenereerde scriptpubkey</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Fout: kon alleen-bekijkbaar transactie niet toevoegen aan alleen-bekijkbaar portemonnee</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Fout: Kan alleen-bekijkbare transacties niet verwijderen</translation>
- </message>
- <message>
<source>Error: Couldn't create cursor into database</source>
<translation type="unfinished">Fout: Kan geen cursor in de database maken</translation>
</message>
@@ -4272,10 +4366,6 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Fout: Geen %s adressen beschikbaar</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Fout: niet alle alleen-bekijkbare transacties konden worden verwijderd</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Fout: deze portemonnee gebruikt al SQLite</translation>
</message>
@@ -4300,6 +4390,10 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Fout: Kan niet alle records in de database lezen</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Fout: Onleesbare beste block locatie aanduiding in wallet</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Fout: kan alleen-bekijkbaar adresboekgegevens niet verwijderen</translation>
</message>
@@ -4308,6 +4402,14 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Fout: Kan record niet naar nieuwe wallet schrijven</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Fout: Kan beste block locatie aanduiding niet opslaan in wallet</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Fout: Kan beste block locatie aanduiding niet opslaan in alleen lezen wallet</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Mislukt om op welke poort dan ook te luisteren. Gebruik -listen=0 as u dit wilt.</translation>
</message>
@@ -4556,10 +4658,6 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Transactie change output is buiten bereik</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transactie heeft een te lange mempoolketen</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transactie moet ten minste één ontvanger hebben</translation>
</message>
@@ -4640,6 +4738,10 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Niet-ondersteund globaal logniveau %s=%s. Geldige waarden: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Walletbestand maken mislukt: %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates worden niet ondersteund in de %s keten.</translation>
</message>
@@ -4648,6 +4750,10 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Niet-ondersteunde logcategorie %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Fout: Kon alleen lezen tx %s niet toevoegen aan alleen lezen wallet</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">User Agentcommentaar (%s) bevat onveilige karakters.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pam.ts b/src/qt/locale/bitcoin_pam.ts
index 6f8ef5ad2b..e5675cda24 100644
--- a/src/qt/locale/bitcoin_pam.ts
+++ b/src/qt/locale/bitcoin_pam.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">I-right click ban alilan ing address o libel</translation>
+ <translation type="unfinished">I-right click ban alilan ing address o label</translation>
</message>
<message>
<source>Create a new address</source>
@@ -15,7 +15,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Kopyan me ing salukuyan at makipiling address keng system clipboard</translation>
+ <translation type="unfinished">Kopyan me ing makalage address king system clipboard</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -27,11 +27,19 @@
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Ilako ya ing kasalungsungan makapiling address keng listahan</translation>
+ <translation type="unfinished">Ilako me ing kasalungsungang makalage address king listaan</translation>
</message>
<message>
<source>Enter address or label to search</source>
- <translation type="unfinished">Magpalub kang address o label para pantunan</translation>
+ <translation type="unfinished">Mangana kang address o label ban panintunan</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Export me ing data king tab a ini anting metung a file</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">I&amp;Export</translation>
</message>
<message>
<source>&amp;Delete</source>
@@ -39,11 +47,11 @@
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation type="unfinished">Pilinan ing address a magpadalang coins kang</translation>
+ <translation type="unfinished">Mamili kang address a mamarlang coins</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">Pilinan ing address a tumanggap coins a atin</translation>
+ <translation type="unfinished">Mamili kang address a tumanggap coins</translation>
</message>
<message>
<source>C&amp;hoose</source>
@@ -51,7 +59,7 @@
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">Reni reng kekang Bitcoin address king pamagpadalang kabayaran. Lawan mulang masalese reng alaga ampo ing address na ning tumanggap bayu ka magpadalang barya.</translation>
+ <translation type="unfinished">Oreni ring Bitcoin address mu king pamamarla karing bayad. Lawan mong masalese ring ulaga ra ampon ing address na ning mananggapan bayad bayu ka mamarla.</translation>
</message>
<message>
<source>&amp;Copy Address</source>
@@ -1074,6 +1082,17 @@
</message>
</context>
<context>
+ <name>WalletView</name>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">I&amp;Export</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Export me ing data king tab a ini anting metung a file</translation>
+ </message>
+ </context>
+<context>
<name>bitcoin-core</name>
<message>
<source>Corrupted block database detected</source>
diff --git a/src/qt/locale/bitcoin_pl.ts b/src/qt/locale/bitcoin_pl.ts
index 5730fd0b58..f1aab64ad2 100644
--- a/src/qt/locale/bitcoin_pl.ts
+++ b/src/qt/locale/bitcoin_pl.ts
@@ -56,6 +56,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Wysyłające adresy - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Odbierające adresy - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Eksportowanie nie powiodło się </translation>
</message>
@@ -178,6 +186,14 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Hasło do portfela zostało pomyślnie zmienione.</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Zmiana hasła nie powiodła się</translation>
+ </message>
+ <message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">Stare hasło wprowadzone do odszyfrowania portfela jest niepoprawne. Zawiera znak null (tj. zerowy bajt). Jeśli hasło zostało ustawione za pomocą wersji tego oprogramowania wcześniejszej niż 25.0, spróbuj ponownie używając tylko znaków do — ale nie włącznie — pierwszego znaku null.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">Uwaga: klawisz Caps Lock jest włączony!</translation>
</message>
@@ -642,6 +658,14 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Zamknij wszystkie portfele</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Przenieś Portfel</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Przenieś portfel</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Pokaż pomoc %1 aby zobaczyć listę wszystkich opcji lnii poleceń.</translation>
</message>
@@ -739,6 +763,10 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Błąd podczas tworzenia portfela</translation>
</message>
<message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Nie można stworzyć nowego protfela, program skompilowano bez wsparcia sqlite (wymaganego dla deskryptorów potfeli)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Błąd: %1</translation>
</message>
@@ -1000,6 +1028,49 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Przenieś portfel</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Na pewno chcesz przenieść portfel &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Migracja portfela przekonwertuje ten portfel na jeden lub więcej portfeli opisowych. Należy utworzyć nową kopię zapasową portfela.
+Jeśli ten portfel zawiera jakiekolwiek skrypty tylko do odczytu, zostanie utworzony nowy portfel, który zawiera te skrypty tylko do odczytu.
+Jeśli ten portfel zawiera jakiekolwiek skrypty rozwiązywalne, ale nie obserwowane, zostanie utworzony inny i nowy portfel, który zawiera te skrypty.
+
+Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii zapasowej będzie nosił nazwę &lt;nazwa portfela&gt;-&lt;znacznik czasu&gt;.legacy.bak i można go znaleźć w katalogu tego portfela. W przypadku nieprawidłowej migracji kopię zapasową można przywrócić za pomocą funkcji "Przywróć portfel".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Przenieś Portfel</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Przenoszenie portfela &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Portfel '%1' został poprawnie przeniesiony.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Przeniesienie nie powiodło się</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Przeniesienie powiodło się</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1082,6 +1153,10 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Stwórz potrfel</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Jesteś jeden krok od stworzenia swojego nowego portfela!</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Nazwa portfela</translation>
</message>
@@ -1240,6 +1315,10 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
</translation>
</message>
<message>
+ <source>Choose data directory</source>
+ <translation type="unfinished">Wybierz folder danych</translation>
+ </message>
+ <message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
<translation type="unfinished">Co najmniej %1 GB danych, zostanie zapisane w tym katalogu, dane te będą przyrastały w czasie.</translation>
</message>
@@ -1449,6 +1528,10 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Liczba wątków &amp;weryfikacji skryptu</translation>
</message>
<message>
+ <source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
+ <translation type="unfinished">Pełna ścieżka do skryptu zgodnego z %1 (np. C:\Downloads\hwi.exe lub /Users/you/Downloads/hwi.py). Uwaga: złośliwe oprogramowanie może ukraść Twoje monety!</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation type="unfinished">Adres IP serwera proxy (np. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
@@ -1673,14 +1756,6 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Użyj oddzielnego proxy SOCKS&amp;5 aby osiągnąć węzły w ukrytych usługach Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Czcionka o stałej szerokości w zakładce Przegląd:</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">najbliższy pasujący "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Anuluj</translation>
</message>
@@ -1914,7 +1989,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">PSBT zapisane na dysk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
+ <source>Sends %1 to %2</source>
<translation type="unfinished">Wysyłanie %1 do %2</translation>
</message>
<message>
@@ -2186,6 +2261,10 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP
<translation type="unfinished">Wybierz węzeł żeby zobaczyć szczegóły.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Wersja warstwy transportowej: %1</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Wersja</translation>
</message>
@@ -2411,6 +2490,21 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP
<translation type="unfinished">Pobieranie adresu wychodzącego: krótkotrwałe, do pozyskiwania adresów</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">Wykrywanie: węzeł może używać v1 lub v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: nieszyfrowany, tekstowy protokół transportowy</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: Szyfrowany protokół transportowy BIP324</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">wybraliśmy peera dla przekaźnika o dużej przepustowości</translation>
</message>
@@ -2909,10 +3003,6 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za
<translation type="unfinished">Tworzy częściowo podpisaną transakcję (ang. PSBT) używaną np. offline z portfelem %1 lub z innym portfelem zgodnym z PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">z portfela '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 do '%2'8f0451c0-ec7d-4357-a370-eff72fb0685f</translation>
</message>
@@ -2970,6 +3060,10 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za
<translation type="unfinished">Proszę przejrzeć propozycję transakcji. Zostanie utworzona częściowo podpisana transakcja (ang. PSBT), którą można skopiować, a następnie podpisać np. offline z portfelem %1 lub z innym portfelem zgodnym z PSBT.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 z portfela '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Czy chcesz utworzyć tę transakcję?</translation>
@@ -3429,8 +3523,8 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw
<translation type="unfinished">Indeks wyjściowy</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certyfikat nie został zweryfikowany)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Certyfikat nie został zweryfikowany)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4371,10 +4465,6 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Indeks wyjścia reszty z transakcji poza zakresem</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transakcja posiada zbyt długi łańcuch pamięci</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transakcja wymaga co najmniej jednego odbiorcy</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pt.ts b/src/qt/locale/bitcoin_pt.ts
index 252916494e..7de05fc230 100644
--- a/src/qt/locale/bitcoin_pt.ts
+++ b/src/qt/locale/bitcoin_pt.ts
@@ -39,7 +39,7 @@
</message>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;Exportar</translation>
+ <translation type="unfinished">e exportar</translation>
</message>
<message>
<source>&amp;Delete</source>
@@ -303,6 +303,18 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">desconhecido</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Embutido "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fonte padrão do sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizado...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Quantia</translation>
</message>
@@ -1095,12 +1107,8 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">A carteira '%1' foi migrada com sucesso.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Os scripts watchonly foram migrados para uma nova carteira chamada '%1'.</translation>
- </message>
- <message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Os scripts solucionáveis, mas não monitorados, forammigrados para uma nova carteira chamada '%1'.</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Os guiões solucionáveis mas não observados foram migrados para uma nova pasta chamada '%1'.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1577,6 +1585,10 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Minimize em vez de sair da aplicação quando a janela é fechada. Quando esta opção é ativada, a aplicação apenas será encerrada quando escolher Sair no menu.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fonte no painel de visualização:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Opções configuradas nessa caixa de diálogo serão sobrescritas pela linhas de comando: </translation>
</message>
@@ -1797,18 +1809,6 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Use um proxy SOCKS5 separado para alcançar pares por meio dos serviços Tor onion:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fonte no painel de visualização:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">embutido "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">resultado mais aproximado "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Cancelar</translation>
</message>
@@ -2043,7 +2043,7 @@ ID transação: %1</translation>
<translation type="unfinished">PSBT salva no disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
+ <source>Sends %1 to %2</source>
<translation type="unfinished">Envia %1 para %2</translation>
</message>
<message>
@@ -2596,6 +2596,10 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<translation type="unfinished">A executar o comando sem qualquer carteira</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Janela do nó - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">A executar o comando utilizando a carteira "%1"</translation>
</message>
@@ -3052,10 +3056,6 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Cria uma transação de Bitcoin parcialmente assinada (PSBT)(sigla em inglês) para ser usada por exemplo com uma carteira %1 offline ou uma carteira de hardware compatível com PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">da carteira '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 a '%2'</translation>
</message>
@@ -3113,6 +3113,10 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Por favor, reveja sua proposta de transação. Isto irá produzir uma Transação de Bitcoin parcialmente assinada (PSBT, sigla em inglês) a qual você pode salvar ou copiar e então assinar com por exemplo uma carteira %1 offiline ou uma PSBT compatível com carteira de hardware.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 da pasta "%2</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Deseja criar esta transação?</translation>
@@ -3573,8 +3577,9 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Índex de saída</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished"> (O certificado não foi verificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">
+%1 (O certificado não foi verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3984,7 +3989,7 @@ Ir para o arquivo &gt; Abrir carteira para carregar a carteira
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;Exportar</translation>
+ <translation type="unfinished">e exportar</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
@@ -4312,6 +4317,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Arquivo de despejo %s não existe</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erro durante commiting db txn para a remoção das transações da carteira.</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Erro a criar %s</translation>
</message>
@@ -4356,12 +4365,8 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Erro ao ler o registo seguinte da base de dados da carteira</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Erro: impossível adicionar tx apenas-visualização para carteira apenas-visualização</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Erro: Impossível excluir transações apenas-visualização </translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erro durante o início db txn para a remoção das transações da carteira.</translation>
</message>
<message>
<source>Error: Disk space is low for %s</source>
@@ -4392,10 +4397,6 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Erro: Não existem %s endereços disponíveis.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Erro: Nem todos os txs apenas-visualização foram excluídos</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Erro: Essa carteira já utiliza o SQLite</translation>
</message>
@@ -4420,6 +4421,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Error: Não é possivel ler todos os registros no banco de dados</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Erro: Não foi possível ler o melhor registo de localização de bloqueio da pasta</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Erro: Impossível remover dados somente-visualização do Livro de Endereços </translation>
</message>
@@ -4428,6 +4433,22 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Erro: Não foi possível escrever registro para a nova carteira</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Erro: Não foi possível escrever o registo do melhor localizador de bloqueio da pasta solvível</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Erro: Não é possível escrever o registo do melhor localizador de blocos da pasta watchonly</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Erro: falha na cópia da agenda de endereços para a carteira %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Erro: a transação do banco de dados não pode ser executada para a carteira %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Falhou a escutar em qualquer porta. Use -listen=0 se quiser isto.</translation>
</message>
@@ -4444,6 +4465,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Falha ao verificar base de dados</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Falha ao remover a transação: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">A variação da taxa (%s) é menor que a mínima variação de taxa (%s) configurada.</translation>
</message>
@@ -4634,6 +4659,10 @@ A pasta de blocos especificados "%s" não existe.</translation>
<translation type="unfinished">Esta é a taxa de transação que irá pagar se enviar uma transação.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">A transação %s não pertence a esta carteira.</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Quantia da transação é muito baixa</translation>
</message>
@@ -4646,10 +4675,6 @@ A pasta de blocos especificados "%s" não existe.</translation>
<translation type="unfinished">Endereço de troco da transação fora da faixa</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">A transação é muito grande de uma cadeia do banco de memória</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">A transação dever pelo menos um destinatário</translation>
</message>
@@ -4730,10 +4755,26 @@ A pasta de blocos especificados "%s" não existe.</translation>
<translation type="unfinished">Nível de registo global não suportado %s=%s. Valores válidos: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">falha na criação do ficheiro da pasta: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates não é suportado na cadeia %s.</translation>
+ </message>
+ <message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Categoria de registos desconhecida %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Erro: Não foi possível adicionar tx %s de vigilância à pasta de vigilância</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Erro: Impossível excluir transações apenas-visualização.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Comentário no User Agent (%s) contém caracteres inseguros.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pt_BR.ts b/src/qt/locale/bitcoin_pt_BR.ts
index 994ea31ea1..33a9c23d75 100644
--- a/src/qt/locale/bitcoin_pt_BR.ts
+++ b/src/qt/locale/bitcoin_pt_BR.ts
@@ -43,7 +43,7 @@
</message>
<message>
<source>&amp;Delete</source>
- <translation type="unfinished">E&amp;xcluir</translation>
+ <translation type="unfinished">&amp;Excluir</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
@@ -59,7 +59,7 @@
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">Estes são seus endereços para enviar pagamentos. Sempre confira o valor e o endereço do destinatário antes de enviar moedas.</translation>
+ <translation type="unfinished">Estes são os seus endereços para enviar pagamentos. Sempre confira o valor e o endereço do destinatário antes de enviar bitcoins.</translation>
</message>
<message>
<source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
@@ -299,6 +299,18 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">desconhecido</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Embutido "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fonte padrão do sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizado...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Quantia</translation>
</message>
@@ -1054,12 +1066,8 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">A carteira '%1' foi migrada com sucesso.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Os scripts watchonly foram migrados para uma nova carteira chamada '%1'.</translation>
- </message>
- <message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Os scripts solucionáveis, mas não monitorados, forammigrados para uma nova carteira chamada '%1'.</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Os guiões solucionáveis mas não observados foram migrados para uma nova pasta chamada '%1'.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1523,6 +1531,10 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Minimizar em vez de fechar o programa quando a janela for fechada. Quando essa opção estiver ativa, o programa só será fechado somente pela opção Sair no menu Arquivo.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fonte no painel de visualização:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Opções configuradas nessa caixa de diálogo serão sobrescritas pela linhas de comando: </translation>
</message>
@@ -1715,10 +1727,6 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Use um proxy SOCKS&amp;5 separado para alcançar os nós via serviços Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fonte no painel de visualização:</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Cancelar</translation>
</message>
@@ -1938,8 +1946,8 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">PSBT salvo no disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Envia %1 para %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envia %1 para %2</translation>
</message>
<message>
<source>own address</source>
@@ -2439,6 +2447,10 @@ O processo de migração criará um backup da carteira antes da migração. Este
<translation type="unfinished">Control+P</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Janela do nó - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Executando comando usando a carteira "%1"</translation>
</message>
@@ -2850,7 +2862,7 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
</message>
<message>
<source>Copy change</source>
- <translation type="unfinished">Copiar alteração</translation>
+ <translation type="unfinished">Copiar troco</translation>
</message>
<message>
<source>%1 (%2 blocks)</source>
@@ -2865,10 +2877,6 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Cria uma Transação de Bitcoin Parcialmente Assinada (PSBT) para usar com, por exemplo, uma carteira %1 offline ou uma carteira física compatível com PSBTs.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">da carteira '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 para '%2'</translation>
</message>
@@ -2907,6 +2915,10 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Por favor, revise a transação. Será produzido uma Transação de Bitcoin Parcialmente Assinada (PSBT) que você pode copiar e assinar com, por exemplo, uma carteira %1 offline, ou uma carteira física compatível com PSBTs.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 da pasta "%2</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Deseja criar esta transação?</translation>
@@ -3363,8 +3375,9 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Index da saída</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(O certificado não foi verificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">
+%1 (O certificado não foi verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4088,6 +4101,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Carregamento terminado!</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erro durante commiting db txn para a remoção das transações da carteira.</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation type="unfinished">Erro ao inicializar banco de dados de blocos</translation>
</message>
@@ -4128,16 +4145,12 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Erro ao ler o banco de dados. Encerrando.</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Erro: não é possível extrair a destinação do scriptpubkey gerado</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Erro: impossível adicionar tx apenas-visualização para carteira apenas-visualização</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erro durante o início db txn para a remoção das transações da carteira.</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Erro: Impossível excluir transações apenas-visualização </translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Erro: não é possível extrair a destinação do scriptpubkey gerado</translation>
</message>
<message>
<source>Error: Disk space is low for %s</source>
@@ -4152,10 +4165,6 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Keypool exaurida, por gentileza execute keypoolrefill primeiro</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Erro: Nem todos os txs apenas-visualização foram excluídos</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Erro: Essa carteira já utiliza o SQLite</translation>
</message>
@@ -4180,10 +4189,30 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Erro: Impossível ler todos os registros no banco de dados</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Erro: Não foi possível ler o melhor registo de localização de blocos da carteira</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Erro: Impossível remover dados somente-visualização do Livro de Endereços </translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Erro: Não foi possível escrever o registo do melhor localizador de bloqueio da pasta solvível</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Erro: Não é possível escrever o registo do melhor localizador de blocos da pasta watchonly</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Erro: falha na cópia da agenda de endereços para a carteira %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Erro: a transação do banco de dados não pode ser executada para a carteira %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Falha ao escutar em qualquer porta. Use -listen=0 se você quiser isso.</translation>
</message>
@@ -4200,6 +4229,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Falha ao verificar a base de dados</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Falha ao remover a transação: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Taxa de taxa (%s) é menor que a configuração da taxa de taxa (%s)</translation>
</message>
@@ -4412,6 +4445,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Esta é a taxa que você irá pagar se enviar uma transação.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">A transação %s não pertence a esta carteira.</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Quantidade da transação muito pequena</translation>
</message>
@@ -4424,10 +4461,6 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Endereço de troco da transação fora da faixa</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">A transação demorou muito na memória</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">A transação deve ter ao menos um destinatário</translation>
</message>
@@ -4500,10 +4533,26 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Nível de registo global não suportado %s=%s. Valores válidos: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">falha na criação do ficheiro da pasta: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates não é suportado na cadeia %s.</translation>
+ </message>
+ <message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Categoria de log desconhecida %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Erro: Não foi possível adicionar tx %s de vigilância à pasta de vigilância</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Erro: Impossível excluir transações apenas-visualização.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Comentário do Agente de Usuário (%s) contém caracteres inseguros.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ro.ts b/src/qt/locale/bitcoin_ro.ts
index ded10d751a..059436329d 100644
--- a/src/qt/locale/bitcoin_ro.ts
+++ b/src/qt/locale/bitcoin_ro.ts
@@ -2272,10 +2272,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">%1(%2 blocuri)</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">din portofelul '%1'</translation>
- </message>
- <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 la %2</translation>
</message>
@@ -2673,10 +2669,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Index debit</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certificatul nu a fost verificat)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Comerciant</translation>
</message>
@@ -3269,10 +3261,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Sumele tranzactionate nu pot fi negative</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Tranzacţia are o lungime prea mare in lantul mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Tranzactia trebuie sa aiba cel putin un destinatar</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ru.ts b/src/qt/locale/bitcoin_ru.ts
index d27439c00a..c7ac89b746 100644
--- a/src/qt/locale/bitcoin_ru.ts
+++ b/src/qt/locale/bitcoin_ru.ts
@@ -1148,12 +1148,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">Кошелек '%1' был успешно перенесён.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> Скрипты Watchonly были перенесены на новый кошелек под названием '%1'.</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Скрипты Watchonly были перенесены в новый кошелек под названием '%1'.</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> Решаемые, но не наблюдаемые сценарии были перенесены на новый кошелек под названием '%1'.</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Решаемые, но не наблюдаемые сценарии были перенесены в новый кошелек под названием '%1'.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1861,18 +1861,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">Использовать &amp;отдельный прокси SOCKS5 для соединения с узлами через скрытые сервисы Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Моноширинный шрифт на вкладке Обзор:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">встроенный "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">самый похожий системный "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;ОК</translation>
</message>
@@ -2109,10 +2097,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">PSBT сохранена на диск.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Отправляет %1 на %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">свой адрес</translation>
</message>
@@ -3172,10 +3156,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Создает частично подписанную биткоин-транзакцию (PSBT), чтобы использовать её, например, с офлайновым кошельком %1, или PSBT-совместимым аппаратным кошельком.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished"> с кошелька "%1"</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 на "%2"</translation>
</message>
@@ -3702,10 +3682,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Индекс выхода</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished"> (Сертификат не был проверен)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Продавец</translation>
</message>
@@ -4586,14 +4562,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Ошибка: не удалось извлечь получателя из сгенерированного scriptpubkey</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Ошибка: не удалось добавить транзакцию для наблюдения в кошелёк для наблюдения</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Ошибка: транзакции только для наблюдения не удаляются</translation>
- </message>
- <message>
<source>Error: Couldn't create cursor into database</source>
<translation type="unfinished">Ошибка: не удалось создать курсор в базе данных</translation>
</message>
@@ -4630,10 +4598,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Ошибка: нет %s доступных адресов.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Ошибка: не все наблюдаемые транзакции могут быть удалены</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Ошибка: этот кошелёк уже использует SQLite</translation>
</message>
@@ -4914,10 +4878,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Индекс получателя адреса сдачи вне диапазона</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">У транзакции слишком длинная цепочка в пуле в памяти</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Транзакция должна иметь хотя бы одного получателя</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ru_RU.ts b/src/qt/locale/bitcoin_ru_RU.ts
deleted file mode 100644
index e46fe34622..0000000000
--- a/src/qt/locale/bitcoin_ru_RU.ts
+++ /dev/null
@@ -1,4858 +0,0 @@
-<TS version="2.1" language="ru_RU">
-<context>
- <name>AddressBookPage</name>
- <message>
- <source>Right-click to edit address or label</source>
- <translation type="unfinished">Щелкните правой кнопкой мыши, чтобы отредактировать адрес или этикетку</translation>
- </message>
- <message>
- <source>Create a new address</source>
- <translation type="unfinished">Создать новый адрес</translation>
- </message>
- <message>
- <source>&amp;New</source>
- <translation type="unfinished">&amp;Новый</translation>
- </message>
- <message>
- <source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Копирование выбранного адреса в системный буфер обмена</translation>
- </message>
- <message>
- <source>&amp;Copy</source>
- <translation type="unfinished">&amp;Копировать</translation>
- </message>
- <message>
- <source>C&amp;lose</source>
- <translation type="unfinished">За&amp;крыть</translation>
- </message>
- <message>
- <source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Удаление текущего выбранного адреса из списка</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation type="unfinished">Введите адрес или метку для поиска</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Экспорт данных на текущей вкладке в файл</translation>
- </message>
- <message>
- <source>&amp;Export</source>
- <translation type="unfinished">&amp;Экспорт</translation>
- </message>
- <message>
- <source>&amp;Delete</source>
- <translation type="unfinished">&amp;Удалить</translation>
- </message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation type="unfinished">Выберите адрес, на который нужно отправить монеты</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation type="unfinished">Выберите адрес, по которому вы будете получать монеты</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation type="unfinished">Гусь</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">Это ваши Bitcoin-адреса для отправки платежей. Всегда проверяйте сумму и адрес получателя перед отправкой монет.</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
-Signing is only possible with addresses of the type 'legacy'.</source>
- <translation type="unfinished">Это ваши адреса Bitcoin для получения платежей. Для создания новых адресов используйте кнопку "Создать новый адрес получения" на вкладке "Получение".
-Подписание возможно только для адресов типа "legacy".</translation>
- </message>
- <message>
- <source>&amp;Copy Address</source>
- <translation type="unfinished">&amp;Копия адреса</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation type="unfinished">Копировать &amp;Label</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation type="unfinished">&amp;Редактировать</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation type="unfinished">Экспорт списка адресов</translation>
- </message>
- <message>
- <source>Comma separated file</source>
- <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">Файл, разделенный запятыми</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
- <translation type="unfinished">При попытке сохранить список адресов в %1 произошла ошибка. Пожалуйста, попробуйте еще раз.</translation>
- </message>
- <message>
- <source>Sending addresses - %1</source>
- <translation type="unfinished">Адреса отправки - %1</translation>
- </message>
- <message>
- <source>Receiving addresses - %1</source>
- <translation type="unfinished">Получение адресов - %1</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation type="unfinished">Ошибка экспорта</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation type="unfinished">Метка</translation>
- </message>
- <message>
- <source>Address</source>
- <translation type="unfinished">Адрес</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(без ярлыка)</translation>
- </message>
-</context>
-<context>
- <name>AskPassphraseDialog</name>
- <message>
- <source>Passphrase Dialog</source>
- <translation type="unfinished">Диалог парольной фразы</translation>
- </message>
- <message>
- <source>Enter passphrase</source>
- <translation type="unfinished">Введите парольную фразу</translation>
- </message>
- <message>
- <source>New passphrase</source>
- <translation type="unfinished">Новая парольная фраза</translation>
- </message>
- <message>
- <source>Repeat new passphrase</source>
- <translation type="unfinished">Повторите новую кодовую фразу</translation>
- </message>
- <message>
- <source>Show passphrase</source>
- <translation type="unfinished">Показать парольную фразу</translation>
- </message>
- <message>
- <source>Encrypt wallet</source>
- <translation type="unfinished">Зашифровать кошелек</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">Для разблокировки кошелька требуется парольная фраза вашего кошелька.</translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation type="unfinished">Разблокировать кошелек</translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation type="unfinished">Изменение парольной фразы</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation type="unfinished">Подтвердите шифрование кошелька</translation>
- </message>
- <message>
- <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">Предупреждение: Если вы зашифруете свой кошелек и потеряете кодовую фразу, вы &lt;b&gt;потеряете все свои биткоины&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation type="unfinished">Вы уверены, что хотите зашифровать свой кошелек?</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation type="unfinished">Кошелек зашифрован</translation>
- </message>
- <message>
- <source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
- <translation type="unfinished">Введите новую парольную фразу для кошелька.&lt;br/&gt;Пожалуйста, используйте парольную фразу из &lt;b&gt;десяти или более случайных символов&lt;/b&gt; или &lt;b&gt;восьми или более слов&lt;/b&gt;.</translation>
- </message>
- <message>
- <source>Enter the old passphrase and new passphrase for the wallet.</source>
- <translation type="unfinished">Введите старую и новую парольные фразы для кошелька.</translation>
- </message>
- <message>
- <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation type="unfinished">Помните, что шифрование кошелька не может полностью защитить ваши биткоины от кражи вредоносным ПО, заразившим ваш компьютер.</translation>
- </message>
- <message>
- <source>Wallet to be encrypted</source>
- <translation type="unfinished">Кошелек для шифрования</translation>
- </message>
- <message>
- <source>Your wallet is about to be encrypted. </source>
- <translation type="unfinished">Ваш кошелёк будет зашифрован. </translation>
- </message>
- <message>
- <source>Your wallet is now encrypted. </source>
- <translation type="unfinished">Сейчас ваш кошелёк зашифрован. </translation>
- </message>
- <message>
- <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
- <translation type="unfinished">ВАЖНО: Все предыдущие резервные копии файла кошелька должны быть заменены новым зашифрованным файлом кошелька. В целях безопасности предыдущие резервные копии незашифрованного файла кошелька станут бесполезными, как только вы начнете использовать новый, зашифрованный кошелек.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation type="unfinished">Шифрование кошелька не удалось</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation type="unfinished">Шифрование кошелька не удалось из-за внутренней ошибки. Ваш кошелек не был зашифрован.</translation>
- </message>
- <message>
- <source>The supplied passphrases do not match.</source>
- <translation type="unfinished">Введенные пароли не совпадают.</translation>
- </message>
- <message>
- <source>Wallet unlock failed</source>
- <translation type="unfinished">Не удалось разблокировать кошелек</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">Введена неверная парольная фраза для расшифровки кошелька.</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">Введенная для расшифровки кошелька парольная фраза неверна. Она содержит нулевой символ (то есть нулевой байт). Если парольная фраза была задана в версии программы до 25.0, попробуйте ввести только символы до первого нулевого символа, но не включая его. Если это удалось, задайте новую кодовую фразу, чтобы избежать этой проблемы в будущем.</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">Пароль кошелька успешно изменен.</translation>
- </message>
- <message>
- <source>Passphrase change failed</source>
- <translation type="unfinished">Не удалось изменить парольную фразу</translation>
- </message>
- <message>
- <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
- <translation type="unfinished">Старая парольная фраза, введенная для расшифровки кошелька, неверна. Она содержит нулевой символ (то есть нулевой байт). Если парольная фраза была задана в версии программы, предшествующей 25.0, повторите попытку, используя только символы до первого нулевого символа, но не включая его.</translation>
- </message>
- <message>
- <source>Warning: The Caps Lock key is on!</source>
- <translation type="unfinished">Внимание: Клавиша Caps Lock включена!</translation>
- </message>
-</context>
-<context>
- <name>BanTableModel</name>
- <message>
- <source>Banned Until</source>
- <translation type="unfinished">Запрещено до</translation>
- </message>
-</context>
-<context>
- <name>BitcoinApplication</name>
- <message>
- <source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">Файл настроек %1 может быть поврежден или недействителен.</translation>
- </message>
- <message>
- <source>Runaway exception</source>
- <translation type="unfinished">Исключение из правил</translation>
- </message>
- <message>
- <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
- <translation type="unfinished">Произошла критическая ошибка. %1 больше не может продолжать безопасную работу и будет закрыт.</translation>
- </message>
- <message>
- <source>Internal error</source>
- <translation type="unfinished">Неизвестная ошибка</translation>
- </message>
- <message>
- <source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
- <translation type="unfinished">Произошла внутренняя ошибка. %1 попытается продолжить работу в безопасном режиме. Это неожиданная ошибка, о которой можно сообщить, как описано ниже.</translation>
- </message>
-</context>
-<context>
- <name>QObject</name>
- <message>
- <source>Do you want to reset settings to default values, or to abort without making changes?</source>
- <extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
- <translation type="unfinished">Вы хотите сбросить настройки до значений по умолчанию или прервать процесс без внесения изменений?</translation>
- </message>
- <message>
- <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
- <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
- <translation type="unfinished">Произошла фатальная ошибка. Проверьте, что файл настроек доступен для записи, или попробуйте запустить его с параметром -nosettings.</translation>
- </message>
- <message>
- <source>Error: %1</source>
- <translation type="unfinished">Ошибка: %1</translation>
- </message>
- <message>
- <source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 dпока не удается выйти безопасно…</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation type="unfinished">неизвестно</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation type="unfinished">Сумма</translation>
- </message>
- <message>
- <source>Enter a Bitcoin address (e.g. %1)</source>
- <translation type="unfinished">Введите адрес Bitcoin (например, %1)</translation>
- </message>
- <message>
- <source>Unroutable</source>
- <translation type="unfinished">Непроходимый</translation>
- </message>
- <message>
- <source>Onion</source>
- <comment>network name</comment>
- <extracomment>Name of Tor network in peer info</extracomment>
- <translation type="unfinished">Лук</translation>
- </message>
- <message>
- <source>Inbound</source>
- <extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
- <translation type="unfinished">Входящие</translation>
- </message>
- <message>
- <source>Outbound</source>
- <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
- <translation type="unfinished">Исходящие</translation>
- </message>
- <message>
- <source>Full Relay</source>
- <extracomment>Peer connection type that relays all network information.</extracomment>
- <translation type="unfinished">Полная эстафета</translation>
- </message>
- <message>
- <source>Block Relay</source>
- <extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">Блочное реле</translation>
- </message>
- <message>
- <source>Manual</source>
- <extracomment>Peer connection type established manually through one of several methods.</extracomment>
- <translation type="unfinished">Руководство</translation>
- </message>
- <message>
- <source>Address Fetch</source>
- <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
- <translation type="unfinished">Выборка адреса</translation>
- </message>
- <message>
- <source>None</source>
- <translation type="unfinished">Нет</translation>
- </message>
- <message>
- <source>N/A</source>
- <translation type="unfinished">Н/Д</translation>
- </message>
- <message>
- <source>%1 ms</source>
- <translation type="unfinished">%1 мс</translation>
- </message>
- <message numerus="yes">
- <source>%n second(s)</source>
- <translation type="unfinished">
- <numerusform>%n секунда(ы)</numerusform>
- <numerusform>%n секунда(ы)</numerusform>
- <numerusform>%n секунда(ы)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n minute(s)</source>
- <translation type="unfinished">
- <numerusform>%n минута(ы)</numerusform>
- <numerusform>%n минута(ы)</numerusform>
- <numerusform>%n минута(ы)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation type="unfinished">
- <numerusform>%n час(ы)</numerusform>
- <numerusform>%n час(ы)</numerusform>
- <numerusform>%n час(ы)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation type="unfinished">
- <numerusform>%n день(ы)</numerusform>
- <numerusform>%n день(ы)</numerusform>
- <numerusform>%n день(ы)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation type="unfinished">
- <numerusform>%n неделя(ы)</numerusform>
- <numerusform>%n неделя(ы)</numerusform>
- <numerusform>%n неделя(ы)</numerusform>
- </translation>
- </message>
- <message>
- <source>%1 and %2</source>
- <translation type="unfinished">%1 и %2</translation>
- </message>
- <message numerus="yes">
- <source>%n year(s)</source>
- <translation type="unfinished">
- <numerusform>%n год(ы)</numerusform>
- <numerusform>%n год(ы)</numerusform>
- <numerusform>%n год(ы)</numerusform>
- </translation>
- </message>
- </context>
-<context>
- <name>BitcoinGUI</name>
- <message>
- <source>&amp;Overview</source>
- <translation type="unfinished">&amp;Обзор</translation>
- </message>
- <message>
- <source>Show general overview of wallet</source>
- <translation type="unfinished">Показать общий обзор кошелька</translation>
- </message>
- <message>
- <source>Browse transaction history</source>
- <translation type="unfinished">Просмотр истории транзакций</translation>
- </message>
- <message>
- <source>E&amp;xit</source>
- <translation type="unfinished">В&amp;ыход</translation>
- </message>
- <message>
- <source>Quit application</source>
- <translation type="unfinished">Выйти из приложения</translation>
- </message>
- <message>
- <source>&amp;About %1</source>
- <translation type="unfinished">&amp;О %1</translation>
- </message>
- <message>
- <source>Show information about %1</source>
- <translation type="unfinished">Показать информацию о %1</translation>
- </message>
- <message>
- <source>About &amp;Qt</source>
- <translation type="unfinished">О компании &amp;Qt</translation>
- </message>
- <message>
- <source>Show information about Qt</source>
- <translation type="unfinished">Показать информацию о Qt</translation>
- </message>
- <message>
- <source>Modify configuration options for %1</source>
- <translation type="unfinished">Изменение параметров конфигурации для %1</translation>
- </message>
- <message>
- <source>Create a new wallet</source>
- <translation type="unfinished">Создайте новый кошелек</translation>
- </message>
- <message>
- <source>Wallet:</source>
- <translation type="unfinished">Кошелек:</translation>
- </message>
- <message>
- <source>Network activity disabled.</source>
- <extracomment>A substring of the tooltip.</extracomment>
- <translation type="unfinished">Сетевая активность отключена.</translation>
- </message>
- <message>
- <source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
- <translation type="unfinished">Прокси &lt;b&gt;включен&lt;/b&gt;: %1</translation>
- </message>
- <message>
- <source>Send coins to a Bitcoin address</source>
- <translation type="unfinished">Отправляйте монеты на адрес Bitcoin</translation>
- </message>
- <message>
- <source>Backup wallet to another location</source>
- <translation type="unfinished">Резервное копирование кошелька в другое место</translation>
- </message>
- <message>
- <source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Измените парольную фразу, используемую для шифрования кошелька</translation>
- </message>
- <message>
- <source>&amp;Send</source>
- <translation type="unfinished">Отправить</translation>
- </message>
- <message>
- <source>&amp;Options…</source>
- <translation type="unfinished">&amp;Параметры…</translation>
- </message>
- <message>
- <source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;Зашифровать Кошелёк…</translation>
- </message>
- <message>
- <source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Шифруйте закрытые ключи, принадлежащие вашему кошельку</translation>
- </message>
- <message>
- <source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Создать резервную копию кошелька…</translation>
- </message>
- <message>
- <source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Изменить пароль…</translation>
- </message>
- <message>
- <source>Sign &amp;message…</source>
- <translation type="unfinished">Подписать &amp;сообщение…</translation>
- </message>
- <message>
- <source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Подписывайте сообщения своими адресами биткойнов, чтобы доказать, что они вам принадлежат</translation>
- </message>
- <message>
- <source>&amp;Verify message…</source>
- <translation type="unfinished">&amp;Проверить сообщение…</translation>
- </message>
- <message>
- <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Проверка сообщений на предмет того, что они были подписаны указанными адресами Bitcoin</translation>
- </message>
- <message>
- <source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Загрузить PSBT из файла…</translation>
- </message>
- <message>
- <source>Open &amp;URI…</source>
- <translation type="unfinished">Открыть &amp;URI…</translation>
- </message>
- <message>
- <source>Close Wallet…</source>
- <translation type="unfinished">Закрыть кошелёк…</translation>
- </message>
- <message>
- <source>Create Wallet…</source>
- <translation type="unfinished">Создать кошелёк…</translation>
- </message>
- <message>
- <source>Close All Wallets…</source>
- <translation type="unfinished">Закрыть все кошельки…</translation>
- </message>
- <message>
- <source>&amp;File</source>
- <translation type="unfinished">&amp;Файл</translation>
- </message>
- <message>
- <source>&amp;Settings</source>
- <translation type="unfinished">&amp;Настройки</translation>
- </message>
- <message>
- <source>&amp;Help</source>
- <translation type="unfinished">&amp;Помощь</translation>
- </message>
- <message>
- <source>Tabs toolbar</source>
- <translation type="unfinished">Панель инструментов "Вкладки</translation>
- </message>
- <message>
- <source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Синхронизация заголовков (%1%)…</translation>
- </message>
- <message>
- <source>Synchronizing with network…</source>
- <translation type="unfinished">Синхронизация с сетью…</translation>
- </message>
- <message>
- <source>Indexing blocks on disk…</source>
- <translation type="unfinished">Индексация блоков на диске…</translation>
- </message>
- <message>
- <source>Processing blocks on disk…</source>
- <translation type="unfinished">Обработка блоков на диске…</translation>
- </message>
- <message>
- <source>Connecting to peers…</source>
- <translation type="unfinished">Подключение к узлам…</translation>
- </message>
- <message>
- <source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Запрос платежей (генерирует QR-коды и bitcoin: URI)</translation>
- </message>
- <message>
- <source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Показать список используемых адресов отправки и этикеток</translation>
- </message>
- <message>
- <source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Показать список используемых адресов получения и этикеток</translation>
- </message>
- <message>
- <source>&amp;Command-line options</source>
- <translation type="unfinished">&amp;Опции командной строки</translation>
- </message>
- <message numerus="yes">
- <source>Processed %n block(s) of transaction history.</source>
- <translation type="unfinished">
- <numerusform>Обработано %n блок(ов) истории транзакций.</numerusform>
- <numerusform>Обработано %n блок(ов) истории транзакций.</numerusform>
- <numerusform>Обработано %n блок(ов) истории транзакций.</numerusform>
- </translation>
- </message>
- <message>
- <source>Catching up…</source>
- <translation type="unfinished">Синхронизация…</translation>
- </message>
- <message>
- <source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">Последний полученный блок был сгенерирован %1 назад.</translation>
- </message>
- <message>
- <source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Транзакции после этого еще не будут видны.</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">Ошибка</translation>
- </message>
- <message>
- <source>Warning</source>
- <translation type="unfinished">Предупреждение</translation>
- </message>
- <message>
- <source>Information</source>
- <translation type="unfinished">Информация</translation>
- </message>
- <message>
- <source>Up to date</source>
- <translation type="unfinished">Обновлено</translation>
- </message>
- <message>
- <source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">Загрузка частично подписанной транзакции биткойна</translation>
- </message>
- <message>
- <source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">Загрузить PSBT из &amp;буфера обмена…</translation>
- </message>
- <message>
- <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
- <translation type="unfinished">Загрузка частично подписанной транзакции Bitcoin из буфера обмена</translation>
- </message>
- <message>
- <source>Node window</source>
- <translation type="unfinished">Окно узла</translation>
- </message>
- <message>
- <source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">Откройте консоль отладки и диагностики узла</translation>
- </message>
- <message>
- <source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;Адреса отправки</translation>
- </message>
- <message>
- <source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Адреса приема</translation>
- </message>
- <message>
- <source>Open a bitcoin: URI</source>
- <translation type="unfinished">Открыть биткойн: URI</translation>
- </message>
- <message>
- <source>Open Wallet</source>
- <translation type="unfinished">Открытый кошелек</translation>
- </message>
- <message>
- <source>Open a wallet</source>
- <translation type="unfinished">Откройте кошелек</translation>
- </message>
- <message>
- <source>Close wallet</source>
- <translation type="unfinished">Закрыть кошелек</translation>
- </message>
- <message>
- <source>Restore Wallet…</source>
- <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
- <translation type="unfinished">Восстановить кошелек…</translation>
- </message>
- <message>
- <source>Restore a wallet from a backup file</source>
- <extracomment>Status tip for Restore Wallet menu item</extracomment>
- <translation type="unfinished">Восстановление кошелька из файла резервной копии</translation>
- </message>
- <message>
- <source>Close all wallets</source>
- <translation type="unfinished">Закройте все кошельки</translation>
- </message>
- <message>
- <source>Migrate Wallet</source>
- <translation type="unfinished">Перенести Кошелек</translation>
- </message>
- <message>
- <source>Migrate a wallet</source>
- <translation type="unfinished">Перенос кошелька</translation>
- </message>
- <message>
- <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">Покажите сообщение справки %1, чтобы получить список возможных опций командной строки Bitcoin</translation>
- </message>
- <message>
- <source>&amp;Mask values</source>
- <translation type="unfinished">значения &amp;Mask</translation>
- </message>
- <message>
- <source>Mask the values in the Overview tab</source>
- <translation type="unfinished">Замаскируйте значения на вкладке Обзор</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">основной кошелёк</translation>
- </message>
- <message>
- <source>No wallets available</source>
- <translation type="unfinished">Кошельки отсутствуют</translation>
- </message>
- <message>
- <source>Wallet Data</source>
- <extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">Данные кошелька</translation>
- </message>
- <message>
- <source>Load Wallet Backup</source>
- <extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">Загрузка резервной копии кошелька</translation>
- </message>
- <message>
- <source>Restore Wallet</source>
- <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
- <translation type="unfinished">Восстановить кошелек</translation>
- </message>
- <message>
- <source>Wallet Name</source>
- <extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">Имя кошелька</translation>
- </message>
- <message>
- <source>&amp;Window</source>
- <translation type="unfinished">&amp;Окно</translation>
- </message>
- <message>
- <source>Zoom</source>
- <translation type="unfinished">Увеличить</translation>
- </message>
- <message>
- <source>Main Window</source>
- <translation type="unfinished">Главное окно</translation>
- </message>
- <message>
- <source>&amp;Hide</source>
- <translation type="unfinished">Скрыть все группы</translation>
- </message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network.</source>
- <extracomment>A substring of the tooltip.</extracomment>
- <translation type="unfinished">
- <numerusform>%n активное соединение(я) с сетью Bitcoin.</numerusform>
- <numerusform>%n активное соединение(я) с сетью Bitcoin.</numerusform>
- <numerusform>%n активное соединение(я) с сетью Bitcoin.</numerusform>
- </translation>
- </message>
- <message>
- <source>Click for more actions.</source>
- <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">Нажмите, чтобы узнать о дальнейших действиях.</translation>
- </message>
- <message>
- <source>Show Peers tab</source>
- <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
- <translation type="unfinished">Вкладка "Показать коллег</translation>
- </message>
- <message>
- <source>Disable network activity</source>
- <extracomment>A context menu item.</extracomment>
- <translation type="unfinished">Отключить сетевую активность</translation>
- </message>
- <message>
- <source>Enable network activity</source>
- <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
- <translation type="unfinished">Включить сетевую активность</translation>
- </message>
- <message>
- <source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Предварительная синхронизация заголовков (%1%)…</translation>
- </message>
- <message>
- <source>Error creating wallet</source>
- <translation type="unfinished">Ошибка при создании кошелька</translation>
- </message>
- <message>
- <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Невозможно создать новый кошелек, программа была скомпилирована без поддержки sqlite (требуется для дескрипторных кошельков)</translation>
- </message>
- <message>
- <source>Error: %1</source>
- <translation type="unfinished">Ошибка: %1</translation>
- </message>
- <message>
- <source>Warning: %1</source>
- <translation type="unfinished">Предупреждение: %1</translation>
- </message>
- <message>
- <source>Date: %1
-</source>
- <translation type="unfinished">Дата: %1
-</translation>
- </message>
- <message>
- <source>Amount: %1
-</source>
- <translation type="unfinished">Сумма: %1
-</translation>
- </message>
- <message>
- <source>Wallet: %1
-</source>
- <translation type="unfinished">Кошелек: %1
-</translation>
- </message>
- <message>
- <source>Type: %1
-</source>
- <translation type="unfinished">Тип: %1
-</translation>
- </message>
- <message>
- <source>Label: %1
-</source>
- <translation type="unfinished">Ярлык: %1
-</translation>
- </message>
- <message>
- <source>Address: %1
-</source>
- <translation type="unfinished">Адрес: %1
-</translation>
- </message>
- <message>
- <source>Sent transaction</source>
- <translation type="unfinished">Отправленная транзакция</translation>
- </message>
- <message>
- <source>Incoming transaction</source>
- <translation type="unfinished">Входящая транзакция</translation>
- </message>
- <message>
- <source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <translation type="unfinished">Генерация ключей HD &lt;b&gt;включена&lt;/b&gt;</translation>
- </message>
- <message>
- <source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">Генерация ключей HD &lt;b&gt;отключена&lt;/b&gt;</translation>
- </message>
- <message>
- <source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">Закрытый ключ &lt;b&gt;отключен&lt;/b&gt;</translation>
- </message>
- <message>
- <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <translation type="unfinished">Кошелек &lt;b&gt;зашифрован&lt;/b&gt; и в настоящее время &lt;b&gt;разблокирован&lt;/b&gt;</translation>
- </message>
- <message>
- <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
- <translation type="unfinished">Кошелек &lt;b&gt;зашифрован&lt;/b&gt; и в настоящее время &lt;b&gt;заблокирован&lt;/b&gt;</translation>
- </message>
- <message>
- <source>Original message:</source>
- <translation type="unfinished">Оригинальное сообщение:</translation>
- </message>
-</context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
- <message>
- <source>Unit to show amounts in. Click to select another unit.</source>
- <translation type="unfinished">Единица измерения, в которой будут отображаться суммы. Нажмите, чтобы выбрать другую единицу измерения.</translation>
- </message>
-</context>
-<context>
- <name>CoinControlDialog</name>
- <message>
- <source>Coin Selection</source>
- <translation type="unfinished">Выбор монеты</translation>
- </message>
- <message>
- <source>Quantity:</source>
- <translation type="unfinished">Количество:</translation>
- </message>
- <message>
- <source>Bytes:</source>
- <translation type="unfinished">Байты:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Сумма:</translation>
- </message>
- <message>
- <source>Fee:</source>
- <translation type="unfinished">Стоимость:</translation>
- </message>
- <message>
- <source>After Fee:</source>
- <translation type="unfinished">После оплаты:</translation>
- </message>
- <message>
- <source>Change:</source>
- <translation type="unfinished">Изменить:</translation>
- </message>
- <message>
- <source>(un)select all</source>
- <translation type="unfinished">(Не)выбрать все</translation>
- </message>
- <message>
- <source>Tree mode</source>
- <translation type="unfinished">Режим дерева</translation>
- </message>
- <message>
- <source>List mode</source>
- <translation type="unfinished">Режим списка</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation type="unfinished">Сумма</translation>
- </message>
- <message>
- <source>Received with label</source>
- <translation type="unfinished">Получено с этикеткой</translation>
- </message>
- <message>
- <source>Received with address</source>
- <translation type="unfinished">Получено с адресом</translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished">Дата</translation>
- </message>
- <message>
- <source>Confirmations</source>
- <translation type="unfinished">Подтверждения</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">Подтверждено</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation type="unfinished">Количество копий</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <translation type="unfinished">&amp;Копировать адрес</translation>
- </message>
- <message>
- <source>Copy &amp;label</source>
- <translation type="unfinished">Копия и этикетка</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">Копия &amp;amount</translation>
- </message>
- <message>
- <source>Copy transaction &amp;ID and output index</source>
- <translation type="unfinished">Копирование &amp;ID транзакции и выходного индекса</translation>
- </message>
- <message>
- <source>L&amp;ock unspent</source>
- <translation type="unfinished">L&amp;ock неиспользованный</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation type="unfinished">Количество копий</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation type="unfinished">Плата за копирование</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation type="unfinished">Копия после оплаты</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation type="unfinished">Копирование байтов</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation type="unfinished">Копирование изменений</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation type="unfinished">(%1 заблокирован)</translation>
- </message>
- <message>
- <source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation type="unfinished">Может варьироваться +/- %1 sатоши(ы) на каждый вход.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(без ярлыка)</translation>
- </message>
- <message>
- <source>change from %1 (%2)</source>
- <translation type="unfinished">изменение с %1 (%2)</translation>
- </message>
- <message>
- <source>(change)</source>
- <translation type="unfinished">(изменение)</translation>
- </message>
-</context>
-<context>
- <name>CreateWalletActivity</name>
- <message>
- <source>Create Wallet</source>
- <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
- <translation type="unfinished">Создать кошелек</translation>
- </message>
- <message>
- <source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</extracomment>
- <translation type="unfinished">Создание кошелька &lt;b&gt;%1&lt;/b&gt;…</translation>
- </message>
- <message>
- <source>Create wallet failed</source>
- <translation type="unfinished">Не удалось создать кошелек</translation>
- </message>
- <message>
- <source>Create wallet warning</source>
- <translation type="unfinished">Создать предупреждение о кошельке</translation>
- </message>
- <message>
- <source>Can't list signers</source>
- <translation type="unfinished">Не могу перечислить подписавших</translation>
- </message>
- <message>
- <source>Too many external signers found</source>
- <translation type="unfinished">Найдено слишком много внешних подписчиков</translation>
- </message>
-</context>
-<context>
- <name>LoadWalletsActivity</name>
- <message>
- <source>Load Wallets</source>
- <extracomment>Title of progress window which is displayed when wallets are being loaded.</extracomment>
- <translation type="unfinished">Загрузить кошельки</translation>
- </message>
- <message>
- <source>Loading wallets…</source>
- <extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
- <translation type="unfinished">Загрузка кошельков…</translation>
- </message>
-</context>
-<context>
- <name>MigrateWalletActivity</name>
- <message>
- <source>Migrate wallet</source>
- <translation type="unfinished">Перенести кошелек</translation>
- </message>
- <message>
- <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">Вы уверены, что хотите перенести кошелек &lt;i&gt;%1&lt;/i&gt;?</translation>
- </message>
- <message>
- <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
-If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
-If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
-
-The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
- <translation type="unfinished">Миграция кошелька преобразует его в один или несколько дескрипторных кошельков. Необходимо будет создать резервную копию нового кошелька.
-Если этот кошелек содержит скрипты, за которыми можно следить, будет создан новый кошелек, содержащий эти скрипты, за которыми можно следить.
-Если этот кошелек содержит решаемые, но не наблюдаемые скрипты, будет создан другой, новый кошелек, содержащий эти скрипты.
-
-В процессе миграции будет создана резервная копия кошелька перед миграцией. Этот файл резервной копии будет иметь имя &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak и будет находиться в директории этого кошелька. В случае некорректной миграции резервная копия может быть восстановлена с помощью функции "Восстановить кошелек".</translation>
- </message>
- <message>
- <source>Migrate Wallet</source>
- <translation type="unfinished">Перенести Кошелек</translation>
- </message>
- <message>
- <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <translation type="unfinished">Перенос кошелька &lt;b&gt;%1&lt;/b&gt;…</translation>
- </message>
- <message>
- <source>The wallet '%1' was migrated successfully.</source>
- <translation type="unfinished">Кошелек '%1' был успешно перенесён.</translation>
- </message>
- <message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> Скрипты Watchonly были перенесены на новый кошелек под названием '%1'.</translation>
- </message>
- <message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> Решаемые, но не наблюдаемые сценарии были перенесены на новый кошелек под названием '%1'.</translation>
- </message>
- <message>
- <source>Migration failed</source>
- <translation type="unfinished">Перенос не удался</translation>
- </message>
- <message>
- <source>Migration Successful</source>
- <translation type="unfinished">Миграция успешно завершена</translation>
- </message>
-</context>
-<context>
- <name>OpenWalletActivity</name>
- <message>
- <source>Open wallet failed</source>
- <translation type="unfinished">Не удалось открыть кошелёк</translation>
- </message>
- <message>
- <source>Open wallet warning</source>
- <translation type="unfinished">Предупреждение об открытом кошельке</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">основной кошелёк</translation>
- </message>
- <message>
- <source>Open Wallet</source>
- <extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">Открытый кошелек</translation>
- </message>
- <message>
- <source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
- <translation type="unfinished">Открывается кошелёк &lt;b&gt;%1&lt;/b&gt;…</translation>
- </message>
-</context>
-<context>
- <name>RestoreWalletActivity</name>
- <message>
- <source>Restore Wallet</source>
- <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">Восстановить кошелек</translation>
- </message>
- <message>
- <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
- <translation type="unfinished">Восстановление кошелька &lt;b&gt;%1&lt;/b&gt;…</translation>
- </message>
- <message>
- <source>Restore wallet failed</source>
- <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
- <translation type="unfinished">Восстановление кошелька не удалось</translation>
- </message>
- <message>
- <source>Restore wallet warning</source>
- <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
- <translation type="unfinished">Предупреждение о восстановлении кошелька</translation>
- </message>
- <message>
- <source>Restore wallet message</source>
- <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
- <translation type="unfinished">Восстановить сообщение кошелька</translation>
- </message>
-</context>
-<context>
- <name>WalletController</name>
- <message>
- <source>Close wallet</source>
- <translation type="unfinished">Закрыть кошелек</translation>
- </message>
- <message>
- <source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">Вы уверены, что хотите закрыть кошелек &lt;i&gt;%1&lt;/i&gt;?</translation>
- </message>
- <message>
- <source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
- <translation type="unfinished">Слишком долгое закрытие кошелька может привести к необходимости повторной синхронизации всей цепочки, если обрезка включена.</translation>
- </message>
- <message>
- <source>Close all wallets</source>
- <translation type="unfinished">Закройте все кошельки</translation>
- </message>
- <message>
- <source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">Вы уверены, что хотите закрыть все кошельки?</translation>
- </message>
-</context>
-<context>
- <name>CreateWalletDialog</name>
- <message>
- <source>Create Wallet</source>
- <translation type="unfinished">Создать кошелек</translation>
- </message>
- <message>
- <source>You are one step away from creating your new wallet!</source>
- <translation type="unfinished">Вы в одном шаге от создания своего нового кошелька!</translation>
- </message>
- <message>
- <source>Please provide a name and, if desired, enable any advanced options</source>
- <translation type="unfinished">Укажите имя и, при желании, включите дополнительные опции</translation>
- </message>
- <message>
- <source>Wallet Name</source>
- <translation type="unfinished">Имя кошелька</translation>
- </message>
- <message>
- <source>Wallet</source>
- <translation type="unfinished">Кошелек</translation>
- </message>
- <message>
- <source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
- <translation type="unfinished">Зашифруйте кошелек. Кошелек будет зашифрован с помощью выбранной вами парольной фразы.</translation>
- </message>
- <message>
- <source>Encrypt Wallet</source>
- <translation type="unfinished">Шифрованный кошелек</translation>
- </message>
- <message>
- <source>Advanced Options</source>
- <translation type="unfinished">Расширенные опции</translation>
- </message>
- <message>
- <source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">Отключить приватные ключи для этого кошелька. Кошельки с отключенными приватными ключами не будут иметь приватных ключей и не смогут иметь HD seed или импортированные приватные ключи. Это идеальный вариант для кошельков, предназначенных только для часов.</translation>
- </message>
- <message>
- <source>Disable Private Keys</source>
- <translation type="unfinished">Отключить личные ключи</translation>
- </message>
- <message>
- <source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
- <translation type="unfinished">Создайте пустой кошелек. Пустые кошельки изначально не имеют приватных ключей или криптовалют. Приватные ключи и адреса можно импортировать или установить HD seed позже.</translation>
- </message>
- <message>
- <source>Make Blank Wallet</source>
- <translation type="unfinished">Сделайте пустой кошелек</translation>
- </message>
- <message>
- <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
- <translation type="unfinished">Используйте внешнее устройство подписи, например аппаратный кошелек. Сначала настройте скрипт внешнего подписывающего устройства в настройках кошелька.</translation>
- </message>
- <message>
- <source>External signer</source>
- <translation type="unfinished">Внешний подписант</translation>
- </message>
- <message>
- <source>Create</source>
- <translation type="unfinished">Создать</translation>
- </message>
- <message>
- <source>Compiled without external signing support (required for external signing)</source>
- <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Компилируется без поддержки внешней подписи (требуется для внешней подписи)</translation>
- </message>
-</context>
-<context>
- <name>EditAddressDialog</name>
- <message>
- <source>Edit Address</source>
- <translation type="unfinished">Изменить адрес</translation>
- </message>
- <message>
- <source>The label associated with this address list entry</source>
- <translation type="unfinished">Метка, связанная с этой записью списка адресов</translation>
- </message>
- <message>
- <source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation type="unfinished">Адрес, связанный с этой записью списка адресов. Этот параметр можно изменить только для адресов отправки.</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation type="unfinished">Новый адрес отправки</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation type="unfinished">Редактирование адреса получения</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation type="unfinished">Редактирование адреса отправки</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation type="unfinished">Введенный адрес "%1" не является действительным адресом Bitcoin.</translation>
- </message>
- <message>
- <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
- <translation type="unfinished">Адрес "%1" уже существует в качестве адреса получения с меткой "%2" и поэтому не может быть добавлен в качестве адреса отправки.</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book with label "%2".</source>
- <translation type="unfinished">Введенный адрес "%1" уже находится в адресной книге с меткой "%2".</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">Не удалось разблокировать кошелек.</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation type="unfinished">Генерация нового ключа не удалась.</translation>
- </message>
-</context>
-<context>
- <name>FreespaceChecker</name>
- <message>
- <source>A new data directory will be created.</source>
- <translation type="unfinished">Будет создан новый каталог данных.</translation>
- </message>
- <message>
- <source>name</source>
- <translation type="unfinished">имя</translation>
- </message>
- <message>
- <source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
- <translation type="unfinished">Каталог уже существует. Добавьте %1, если вы собираетесь создать здесь новый каталог.</translation>
- </message>
- <message>
- <source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">Путь уже существует и не является каталогом.</translation>
- </message>
- <message>
- <source>Cannot create data directory here.</source>
- <translation type="unfinished">Невозможно создать здесь каталог данных.</translation>
- </message>
-</context>
-<context>
- <name>Intro</name>
- <message>
- <source>Bitcoin</source>
- <translation type="unfinished">Биткоин</translation>
- </message>
- <message numerus="yes">
- <source>%n GB of space available</source>
- <translation type="unfinished">
- <numerusform>%n ГБ свободного места</numerusform>
- <numerusform>%n ГБ свободного места</numerusform>
- <numerusform>%n ГБ свободного места</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>(of %n GB needed)</source>
- <translation type="unfinished">
- <numerusform>(из %n ГБ необходимых)</numerusform>
- <numerusform>(из %n ГБ необходимых)</numerusform>
- <numerusform>(из %n ГБ необходимых)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>(%n GB needed for full chain)</source>
- <translation type="unfinished">
- <numerusform>(%n ГБ необходимо для полной цепочки)</numerusform>
- <numerusform>(%n ГБ необходимо для полной цепочки)</numerusform>
- <numerusform>(%n ГБ необходимо для полной цепочки)</numerusform>
- </translation>
- </message>
- <message>
- <source>Choose data directory</source>
- <translation type="unfinished">Выберите каталог данных</translation>
- </message>
- <message>
- <source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <translation type="unfinished">В этой директории будет храниться не менее %1 GБ данных, и со временем она будет увеличиваться.</translation>
- </message>
- <message>
- <source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">В этом каталоге будет храниться около %1 GБ данных.</translation>
- </message>
- <message numerus="yes">
- <source>(sufficient to restore backups %n day(s) old)</source>
- <extracomment>Explanatory text on the capability of the current prune target.</extracomment>
- <translation type="unfinished">
- <numerusform>(достаточно для восстановления резервных копий %n дня(ов) давности)</numerusform>
- <numerusform>(достаточно для восстановления резервных копий %n дня(ов) давности)</numerusform>
- <numerusform>(достаточно для восстановления резервных копий %n дня(ов) давности)</numerusform>
- </translation>
- </message>
- <message>
- <source>%1 will download and store a copy of the Bitcoin block chain.</source>
- <translation type="unfinished">%1будет скачано и сохранит копию цепи блоков Bitcoin.</translation>
- </message>
- <message>
- <source>The wallet will also be stored in this directory.</source>
- <translation type="unfinished">Кошелек также будет храниться в этой директории.</translation>
- </message>
- <message>
- <source>Error: Specified data directory "%1" cannot be created.</source>
- <translation type="unfinished">Ошибка: Указанный каталог данных "%1" не может быть создан.</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">Ошибка</translation>
- </message>
- <message>
- <source>Welcome</source>
- <translation type="unfinished">Добро пожаловать</translation>
- </message>
- <message>
- <source>Welcome to %1.</source>
- <translation type="unfinished">Добро пожаловать в %1.</translation>
- </message>
- <message>
- <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
- <translation type="unfinished">Поскольку программа запускается впервые, вы можете выбрать, где %1 будет хранить свои данные.</translation>
- </message>
- <message>
- <source>Limit block chain storage to</source>
- <translation type="unfinished">Ограничьте хранение цепочки блоков до</translation>
- </message>
- <message>
- <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
- <translation type="unfinished">Возврат этого параметра в прежнее положение потребует повторного скачивания всей цепочки блоков. Быстрее будет сначала скачать полную цепочку и обрезать позднее. Отключает некоторые расширенные функции.</translation>
- </message>
- <message>
- <source> GB</source>
- <translation type="unfinished"> ГБ</translation>
- </message>
- <message>
- <source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
- <translation type="unfinished">Эта начальная синхронизация очень требовательна и может выявить аппаратные проблемы вашего компьютера, которые раньше оставались незамеченными. Каждый раз, когда вы запускаете %1, он будет продолжать загрузку с того места, на котором остановился.</translation>
- </message>
- <message>
- <source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
- <translation type="unfinished">Когда вы нажмете OK, %1 начнет загружать и обрабатывать полную цепочку %4 bблокировок (%2 GB), начиная с самых ранних транзакций в %3 при первоначальном запуске %4.</translation>
- </message>
- <message>
- <source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
- <translation type="unfinished">Если вы решили ограничить хранение цепочки блоков (обрезка), исторические данные все равно должны быть загружены и обработаны, но после этого они будут удалены, чтобы не занимать много места на диске.</translation>
- </message>
- <message>
- <source>Use the default data directory</source>
- <translation type="unfinished">Используйте каталог данных по умолчанию</translation>
- </message>
- <message>
- <source>Use a custom data directory:</source>
- <translation type="unfinished">Используйте пользовательский каталог данных:</translation>
- </message>
-</context>
-<context>
- <name>HelpMessageDialog</name>
- <message>
- <source>version</source>
- <translation type="unfinished">версия</translation>
- </message>
- <message>
- <source>About %1</source>
- <translation type="unfinished">О компании %1</translation>
- </message>
- <message>
- <source>Command-line options</source>
- <translation type="unfinished">Параметры командной строки</translation>
- </message>
-</context>
-<context>
- <name>ShutdownWindow</name>
- <message>
- <source>%1 is shutting down…</source>
- <translation type="unfinished">%1 отключается…</translation>
- </message>
- <message>
- <source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">Не выключайте компьютер, пока это окно не исчезнет.</translation>
- </message>
-</context>
-<context>
- <name>ModalOverlay</name>
- <message>
- <source>Form</source>
- <translation type="unfinished">Форма</translation>
- </message>
- <message>
- <source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
- <translation type="unfinished">Последние транзакции могут быть еще не видны, и поэтому баланс вашего кошелька может быть неверным. Эта информация станет верной после того, как ваш кошелек завершит синхронизацию с сетью биткоина, как описано ниже.</translation>
- </message>
- <message>
- <source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
- <translation type="unfinished">Попытки потратить биткоины, затронутые еще не отображенными транзакциями, не будут приняты сетью.</translation>
- </message>
- <message>
- <source>Number of blocks left</source>
- <translation type="unfinished">Количество оставшихся блоков</translation>
- </message>
- <message>
- <source>Unknown…</source>
- <translation type="unfinished">Неизвестно…</translation>
- </message>
- <message>
- <source>calculating…</source>
- <translation type="unfinished">вычисляется…</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">Время последнего блока</translation>
- </message>
- <message>
- <source>Progress</source>
- <translation type="unfinished">Прогресс</translation>
- </message>
- <message>
- <source>Progress increase per hour</source>
- <translation type="unfinished">Увеличение прогресса в час</translation>
- </message>
- <message>
- <source>Estimated time left until synced</source>
- <translation type="unfinished">Предполагаемое время, оставшееся до синхронизации</translation>
- </message>
- <message>
- <source>Hide</source>
- <translation type="unfinished">Скрыть</translation>
- </message>
- <message>
- <source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
- <translation type="unfinished">в настоящее время происходит синхронизация %1. Он будет загружать заголовки и блоки от пиров и проверять их, пока не достигнет вершины цепочки блоков.</translation>
- </message>
- <message>
- <source>Unknown. Syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Неизвестно. Синхронизируются заголовки (%1, %2%)…</translation>
- </message>
- <message>
- <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Неизвестно. Предварительная синхронизация заголовков (%1, %2%)…</translation>
- </message>
-</context>
-<context>
- <name>OpenURIDialog</name>
- <message>
- <source>Open bitcoin URI</source>
- <translation type="unfinished">Открытый URI биткойна</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
- <translation type="unfinished">Вставить адрес из буфера обмена</translation>
- </message>
-</context>
-<context>
- <name>OptionsDialog</name>
- <message>
- <source>Options</source>
- <translation type="unfinished">Опции</translation>
- </message>
- <message>
- <source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">Автоматический запуск %1 после входа в систему.</translation>
- </message>
- <message>
- <source>&amp;Start %1 on system login</source>
- <translation type="unfinished">&amp;Start %1 on вход в систему</translation>
- </message>
- <message>
- <source>Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain.</source>
- <translation type="unfinished">Включение обрезки значительно сокращает дисковое пространство, необходимое для хранения транзакций. Все блоки по-прежнему полностью проверяются. Отмена этой настройки требует повторной загрузки всего блокчейна.</translation>
- </message>
- <message>
- <source>Size of &amp;database cache</source>
- <translation type="unfinished">Размер кэша базы данных &amp;database</translation>
- </message>
- <message>
- <source>Number of script &amp;verification threads</source>
- <translation type="unfinished">Количество потоков сценариев и проверок</translation>
- </message>
- <message>
- <source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
- <translation type="unfinished">Полный путь к %1 cсовместимому скрипту (например, C:\Downloads\hwi.exe или /Users/you/Downloads/hwi.py). Остерегайтесь: вредоносное ПО может украсть ваши монеты!</translation>
- </message>
- <message>
- <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
- <translation type="unfinished">IP-адрес прокси-сервера (например, IPv4: 127.0.0.1 / IPv6: ::1)</translation>
- </message>
- <message>
- <source>Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
- <translation type="unfinished">Показывает, используется ли поставляемый по умолчанию прокси-сервер SOCKS5 для связи с пирами через данный тип сети.</translation>
- </message>
- <message>
- <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</source>
- <translation type="unfinished">Минимизация вместо выхода из приложения при закрытии окна. Если эта опция включена, приложение будет закрыто только после выбора пункта Выход в меню.</translation>
- </message>
- <message>
- <source>Options set in this dialog are overridden by the command line:</source>
- <translation type="unfinished">Параметры, заданные в этом диалоге, отменяются командной строкой:</translation>
- </message>
- <message>
- <source>Open the %1 configuration file from the working directory.</source>
- <translation type="unfinished">Откройте файл %1 configuration из рабочей директории.</translation>
- </message>
- <message>
- <source>Open Configuration File</source>
- <translation type="unfinished">Открыть файл конфигурации</translation>
- </message>
- <message>
- <source>Reset all client options to default.</source>
- <translation type="unfinished">Сбросьте все параметры клиента на значения по умолчанию.</translation>
- </message>
- <message>
- <source>&amp;Network</source>
- <translation type="unfinished">&amp;Сеть</translation>
- </message>
- <message>
- <source>Prune &amp;block storage to</source>
- <translation type="unfinished">Обрезка и блокировка хранилища для</translation>
- </message>
- <message>
- <source>GB</source>
- <translation type="unfinished">Гб</translation>
- </message>
- <message>
- <source>Reverting this setting requires re-downloading the entire blockchain.</source>
- <translation type="unfinished">Для изменения этой настройки требуется повторная загрузка всего блокчейна.</translation>
- </message>
- <message>
- <source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
- <extracomment>Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</extracomment>
- <translation type="unfinished">Максимальный размер кэша базы данных. Увеличение размера кэша может способствовать более быстрой синхронизации, однако в большинстве случаев это преимущество не так заметно. Уменьшение размера кэша снизит потребление памяти. Неиспользуемая память mempool используется совместно с этим кэшем.</translation>
- </message>
- <message>
- <source>MiB</source>
- <translation type="unfinished">Мб</translation>
- </message>
- <message>
- <source>Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
- <extracomment>Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</extracomment>
- <translation type="unfinished">Задайте количество потоков проверки сценария. Отрицательные значения соответствуют количеству ядер, которые вы хотите оставить свободными для системы.</translation>
- </message>
- <message>
- <source>(0 = auto, &lt;0 = leave that many cores free)</source>
- <translation type="unfinished">(0 = авто, &lt;0 = оставить столько ядер свободными)</translation>
- </message>
- <message>
- <source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
- <extracomment>Tooltip text for Options window setting that enables the RPC server.</extracomment>
- <translation type="unfinished">Это позволит вам или стороннему инструменту взаимодействовать с узлом через команды командной строки и JSON-RPC.</translation>
- </message>
- <message>
- <source>Enable R&amp;PC server</source>
- <extracomment>An Options window setting to enable the RPC server.</extracomment>
- <translation type="unfinished">Включить сервер R&amp;PC</translation>
- </message>
- <message>
- <source>Whether to set subtract fee from amount as default or not.</source>
- <extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
- <translation type="unfinished">Устанавливать вычитание комиссии из суммы по умолчанию или нет.</translation>
- </message>
- <message>
- <source>Subtract &amp;fee from amount by default</source>
- <extracomment>An Options window setting to set subtracting the fee from a sending amount as default.</extracomment>
- <translation type="unfinished">По умолчанию вычитайте &amp;fee из суммы</translation>
- </message>
- <message>
- <source>Expert</source>
- <translation type="unfinished">Эксперт</translation>
- </message>
- <message>
- <source>Enable coin &amp;control features</source>
- <translation type="unfinished">Включите функции монет и управления</translation>
- </message>
- <message>
- <source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
- <translation type="unfinished">Если вы отключите расходование неподтвержденных изменений, изменения от операции не могут быть использованы до тех пор, пока эта операция не получит хотя бы одно подтверждение. Это также влияет на то, как рассчитывается ваш баланс.</translation>
- </message>
- <message>
- <source>&amp;Spend unconfirmed change</source>
- <translation type="unfinished">&amp;Spend неподтвержденное изменение</translation>
- </message>
- <message>
- <source>Enable &amp;PSBT controls</source>
- <extracomment>An options window setting to enable PSBT controls.</extracomment>
- <translation type="unfinished">Включить управление &amp;PSBT</translation>
- </message>
- <message>
- <source>Whether to show PSBT controls.</source>
- <extracomment>Tooltip text for options window setting that enables PSBT controls.</extracomment>
- <translation type="unfinished">Показывать ли элементы управления PSBT.</translation>
- </message>
- <message>
- <source>External Signer (e.g. hardware wallet)</source>
- <translation type="unfinished">Внешний подписывающий агент (например, аппаратный кошелек)</translation>
- </message>
- <message>
- <source>&amp;External signer script path</source>
- <translation type="unfinished">&amp;Путь к сценарию внешнего подписывающего устройства</translation>
- </message>
- <message>
- <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
- <translation type="unfinished">Автоматически откройте порт клиента Bitcoin на маршрутизаторе. Это работает, только если ваш маршрутизатор поддерживает UPnP и он включен.</translation>
- </message>
- <message>
- <source>Map port using &amp;UPnP</source>
- <translation type="unfinished">Сопоставление портов с помощью &amp;UPnP</translation>
- </message>
- <message>
- <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
- <translation type="unfinished">Автоматически откройте порт клиента Bitcoin на маршрутизаторе. Это работает только в том случае, если ваш маршрутизатор поддерживает NAT-PMP и он включен. Внешний порт может быть произвольным.</translation>
- </message>
- <message>
- <source>Map port using NA&amp;T-PMP</source>
- <translation type="unfinished">Порт карты с использованием NA&amp;T-PMP</translation>
- </message>
- <message>
- <source>Accept connections from outside.</source>
- <translation type="unfinished">Принимайте соединения извне.</translation>
- </message>
- <message>
- <source>Allow incomin&amp;g connections</source>
- <translation type="unfinished">Разрешить входящие соединения</translation>
- </message>
- <message>
- <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
- <translation type="unfinished">Подключитесь к сети Bitcoin через прокси-сервер SOCKS5.</translation>
- </message>
- <message>
- <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
- <translation type="unfinished">&amp;Подключение через прокси-сервер SOCKS5 (прокси-сервер по умолчанию):</translation>
- </message>
- <message>
- <source>Proxy &amp;IP:</source>
- <translation type="unfinished">Прокси &amp;IP:</translation>
- </message>
- <message>
- <source>&amp;Port:</source>
- <translation type="unfinished">&amp;Порт:</translation>
- </message>
- <message>
- <source>Port of the proxy (e.g. 9050)</source>
- <translation type="unfinished">Порт прокси-сервера (например, 9050)</translation>
- </message>
- <message>
- <source>Used for reaching peers via:</source>
- <translation type="unfinished">Используется для связи с коллегами по сети:</translation>
- </message>
- <message>
- <source>Tor</source>
- <translation type="unfinished">Тор</translation>
- </message>
- <message>
- <source>&amp;Window</source>
- <translation type="unfinished">&amp;Окно</translation>
- </message>
- <message>
- <source>Show the icon in the system tray.</source>
- <translation type="unfinished">Показывать значок в области уведомлений.</translation>
- </message>
- <message>
- <source>&amp;Show tray icon</source>
- <translation type="unfinished">&amp;Показать значок в трее</translation>
- </message>
- <message>
- <source>Show only a tray icon after minimizing the window.</source>
- <translation type="unfinished">Показывать только значок в трее после сворачивания окна.</translation>
- </message>
- <message>
- <source>&amp;Minimize to the tray instead of the taskbar</source>
- <translation type="unfinished">&amp;Minimize в трей вместо панели задач</translation>
- </message>
- <message>
- <source>&amp;Display</source>
- <translation type="unfinished">&amp;Отображение</translation>
- </message>
- <message>
- <source>User Interface &amp;language:</source>
- <translation type="unfinished">Пользовательский интерфейс и язык:</translation>
- </message>
- <message>
- <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
- <translation type="unfinished">Здесь можно установить язык пользовательского интерфейса. Эта настройка вступит в силу после перезапуска %1.</translation>
- </message>
- <message>
- <source>&amp;Unit to show amounts in:</source>
- <translation type="unfinished">&amp;Unit для отображения сумм в единицах измерения:</translation>
- </message>
- <message>
- <source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
- <translation type="unfinished">Выберите подразделение по умолчанию, которое будет отображаться в интерфейсе и при отправке монет.</translation>
- </message>
- <message>
- <source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
- <translation type="unfinished">Сторонние URL-адреса (например, в проводнике блоков), которые появляются на вкладке транзакций как пункты контекстного меню. %s в URL заменяется хэшем транзакции. Несколько URL-адресов разделяются вертикальной полосой |.</translation>
- </message>
- <message>
- <source>&amp;Third-party transaction URLs</source>
- <translation type="unfinished">uRL-адреса сторонних транзакций</translation>
- </message>
- <message>
- <source>Whether to show coin control features or not.</source>
- <translation type="unfinished">Показывать или нет функции управления монетами.</translation>
- </message>
- <message>
- <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
- <translation type="unfinished">Подключайтесь к сети Bitcoin через отдельный прокси-сервер SOCKS5 для луковых сервисов Tor.</translation>
- </message>
- <message>
- <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
- <translation type="unfinished">Используйте отдельный прокси-сервер SOCKS&amp;5 для доступа к пирам через луковые сервисы Tor:</translation>
- </message>
- <message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Шрифт с моноширинным начертанием на вкладке "Обзор":</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">ближайшее соответствие "%1"</translation>
- </message>
- <message>
- <source>&amp;OK</source>
- <translation type="unfinished">&amp;ОК</translation>
- </message>
- <message>
- <source>&amp;Cancel</source>
- <translation type="unfinished">&amp;Отмена</translation>
- </message>
- <message>
- <source>Compiled without external signing support (required for external signing)</source>
- <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Компилируется без поддержки внешней подписи (требуется для внешней подписи)</translation>
- </message>
- <message>
- <source>default</source>
- <translation type="unfinished">по умолчанию</translation>
- </message>
- <message>
- <source>none</source>
- <translation type="unfinished">нет</translation>
- </message>
- <message>
- <source>Confirm options reset</source>
- <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
- <translation type="unfinished">Подтвердите сброс настроек</translation>
- </message>
- <message>
- <source>Client restart required to activate changes.</source>
- <extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
- <translation type="unfinished">Для активации изменений требуется перезагрузка клиента.</translation>
- </message>
- <message>
- <source>Current settings will be backed up at "%1".</source>
- <extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
- <translation type="unfinished">Текущие настройки будут сохранены по адресу "%1".</translation>
- </message>
- <message>
- <source>Client will be shut down. Do you want to proceed?</source>
- <extracomment>Text asking the user to confirm if they would like to proceed with a client shutdown.</extracomment>
- <translation type="unfinished">Клиент будет закрыт. Вы хотите продолжить?</translation>
- </message>
- <message>
- <source>Configuration options</source>
- <extracomment>Window title text of pop-up box that allows opening up of configuration file.</extracomment>
- <translation type="unfinished">Параметры конфигурации</translation>
- </message>
- <message>
- <source>The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file.</source>
- <extracomment>Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings.</extracomment>
- <translation type="unfinished">Конфигурационный файл используется для указания расширенных пользовательских опций, которые отменяют настройки графического интерфейса. Кроме того, любые параметры командной строки будут переопределять этот файл конфигурации.</translation>
- </message>
- <message>
- <source>Continue</source>
- <translation type="unfinished">Продолжить</translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation type="unfinished">Отмена</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">Ошибка</translation>
- </message>
- <message>
- <source>The configuration file could not be opened.</source>
- <translation type="unfinished">Не удалось открыть файл конфигурации.</translation>
- </message>
- <message>
- <source>This change would require a client restart.</source>
- <translation type="unfinished">Это изменение потребует перезапуска клиента.</translation>
- </message>
- <message>
- <source>The supplied proxy address is invalid.</source>
- <translation type="unfinished">Указанный адрес прокси-сервера недействителен.</translation>
- </message>
-</context>
-<context>
- <name>OptionsModel</name>
- <message>
- <source>Could not read setting "%1", %2.</source>
- <translation type="unfinished">Не удалось прочитать настройку "%1", %2.</translation>
- </message>
-</context>
-<context>
- <name>OverviewPage</name>
- <message>
- <source>Form</source>
- <translation type="unfinished">Форма</translation>
- </message>
- <message>
- <source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source>
- <translation type="unfinished">Отображаемая информация может быть устаревшей. Ваш кошелек автоматически синхронизируется с сетью Биткойн после установления соединения, но этот процесс еще не завершен.</translation>
- </message>
- <message>
- <source>Watch-only:</source>
- <translation type="unfinished">Только для просмотра:</translation>
- </message>
- <message>
- <source>Available:</source>
- <translation type="unfinished">Доступно:</translation>
- </message>
- <message>
- <source>Your current spendable balance</source>
- <translation type="unfinished">Ваш текущий расходный баланс</translation>
- </message>
- <message>
- <source>Pending:</source>
- <translation type="unfinished">В ожидании:</translation>
- </message>
- <message>
- <source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
- <translation type="unfinished">Общее количество транзакций, которые еще не подтверждены и пока не учитываются при расходовании средств</translation>
- </message>
- <message>
- <source>Immature:</source>
- <translation type="unfinished">Незрелый:</translation>
- </message>
- <message>
- <source>Mined balance that has not yet matured</source>
- <translation type="unfinished">Добытый остаток, который еще не созрел</translation>
- </message>
- <message>
- <source>Balances</source>
- <translation type="unfinished">Балансы</translation>
- </message>
- <message>
- <source>Total:</source>
- <translation type="unfinished">Итого:</translation>
- </message>
- <message>
- <source>Your current total balance</source>
- <translation type="unfinished">Ваш текущий общий баланс</translation>
- </message>
- <message>
- <source>Your current balance in watch-only addresses</source>
- <translation type="unfinished">Ваш текущий баланс в адресах, доступных только через часы</translation>
- </message>
- <message>
- <source>Spendable:</source>
- <translation type="unfinished">Можно тратить:</translation>
- </message>
- <message>
- <source>Recent transactions</source>
- <translation type="unfinished">Последние сделки</translation>
- </message>
- <message>
- <source>Unconfirmed transactions to watch-only addresses</source>
- <translation type="unfinished">Неподтвержденные транзакции по адресам, доступным только для наблюдения</translation>
- </message>
- <message>
- <source>Mined balance in watch-only addresses that has not yet matured</source>
- <translation type="unfinished">Добытый баланс в адресах "только для просмотра", который еще не созрел</translation>
- </message>
- <message>
- <source>Current total balance in watch-only addresses</source>
- <translation type="unfinished">Текущий общий баланс в адресах, доступных только для просмотра</translation>
- </message>
- <message>
- <source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
- <translation type="unfinished">Для вкладки Обзор активирован режим конфиденциальности. Чтобы снять маскировку значений, снимите флажок Настройки-&gt;Маскировать значения.</translation>
- </message>
-</context>
-<context>
- <name>PSBTOperationsDialog</name>
- <message>
- <source>PSBT Operations</source>
- <translation type="unfinished">Операции PSBT</translation>
- </message>
- <message>
- <source>Sign Tx</source>
- <translation type="unfinished">Знак Tx</translation>
- </message>
- <message>
- <source>Broadcast Tx</source>
- <translation type="unfinished">Трансляция Tx</translation>
- </message>
- <message>
- <source>Copy to Clipboard</source>
- <translation type="unfinished">Копировать в буфер обмена</translation>
- </message>
- <message>
- <source>Save…</source>
- <translation type="unfinished">Спасти…</translation>
- </message>
- <message>
- <source>Close</source>
- <translation type="unfinished">Закрыть</translation>
- </message>
- <message>
- <source>Failed to load transaction: %1</source>
- <translation type="unfinished">Не удалось загрузить транзакцию: %1</translation>
- </message>
- <message>
- <source>Failed to sign transaction: %1</source>
- <translation type="unfinished">Не удалось подписать транзакцию: %1</translation>
- </message>
- <message>
- <source>Cannot sign inputs while wallet is locked.</source>
- <translation type="unfinished">Невозможно подписать входы пока кошелёк заблокирован.</translation>
- </message>
- <message>
- <source>Could not sign any more inputs.</source>
- <translation type="unfinished">Не мог подписать больше ни одного входа.</translation>
- </message>
- <message>
- <source>Signed %1 inputs, but more signatures are still required.</source>
- <translation type="unfinished">Подписан %1 входных данных, но требуется еще несколько подписей.</translation>
- </message>
- <message>
- <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
- <translation type="unfinished">Транзакция успешно подписана. Транзакция готова к трансляции.</translation>
- </message>
- <message>
- <source>Unknown error processing transaction.</source>
- <translation type="unfinished">Неизвестная ошибка при обработке транзакции.</translation>
- </message>
- <message>
- <source>Transaction broadcast successfully! Transaction ID: %1</source>
- <translation type="unfinished">Трансляция транзакции прошла успешно! Идентификатор транзакции: %1</translation>
- </message>
- <message>
- <source>Transaction broadcast failed: %1</source>
- <translation type="unfinished">Трансляция транзакции не удалась: %1</translation>
- </message>
- <message>
- <source>PSBT copied to clipboard.</source>
- <translation type="unfinished">PSBT скопирована в буфер обмена.</translation>
- </message>
- <message>
- <source>Save Transaction Data</source>
- <translation type="unfinished">Сохранить данные транзакции</translation>
- </message>
- <message>
- <source>Partially Signed Transaction (Binary)</source>
- <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">Частично подписанная транзакция (двоичная)</translation>
- </message>
- <message>
- <source>PSBT saved to disk.</source>
- <translation type="unfinished">PSBT сохраняется на диск.</translation>
- </message>
- <message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Отправляет %1 на %2</translation>
- </message>
- <message>
- <source>own address</source>
- <translation type="unfinished">собственный адрес</translation>
- </message>
- <message>
- <source>Unable to calculate transaction fee or total transaction amount.</source>
- <translation type="unfinished">Невозможно рассчитать комиссию за транзакцию или общую сумму транзакции.</translation>
- </message>
- <message>
- <source>Pays transaction fee: </source>
- <translation type="unfinished">Платит комиссию: </translation>
- </message>
- <message>
- <source>Total Amount</source>
- <translation type="unfinished">Общая сумма</translation>
- </message>
- <message>
- <source>or</source>
- <translation type="unfinished">или</translation>
- </message>
- <message>
- <source>Transaction has %1 unsigned inputs.</source>
- <translation type="unfinished">Транзакция имеет %1 uбеззнаковые входы.</translation>
- </message>
- <message>
- <source>Transaction is missing some information about inputs.</source>
- <translation type="unfinished">В транзакции отсутствует некоторая информация о входах.</translation>
- </message>
- <message>
- <source>Transaction still needs signature(s).</source>
- <translation type="unfinished">Транзакция все еще нуждается в подписи (подписях).</translation>
- </message>
- <message>
- <source>(But no wallet is loaded.)</source>
- <translation type="unfinished">(Но кошелек не загружен)</translation>
- </message>
- <message>
- <source>(But this wallet cannot sign transactions.)</source>
- <translation type="unfinished">(Но этот кошелек не может подписывать транзакции)</translation>
- </message>
- <message>
- <source>(But this wallet does not have the right keys.)</source>
- <translation type="unfinished">(Но в этом бумажнике нет нужных ключей)</translation>
- </message>
- <message>
- <source>Transaction is fully signed and ready for broadcast.</source>
- <translation type="unfinished">Сделка полностью подписана и готова к трансляции.</translation>
- </message>
- <message>
- <source>Transaction status is unknown.</source>
- <translation type="unfinished">Статус транзакции неизвестен.</translation>
- </message>
-</context>
-<context>
- <name>PaymentServer</name>
- <message>
- <source>Payment request error</source>
- <translation type="unfinished">Ошибка запроса на оплату</translation>
- </message>
- <message>
- <source>Cannot start bitcoin: click-to-pay handler</source>
- <translation type="unfinished">Не удаётся запустить обработчик click-to-pay для протокола bitcoin</translation>
- </message>
- <message>
- <source>URI handling</source>
- <translation type="unfinished">Работа с URI</translation>
- </message>
- <message>
- <source>'bitcoin://' is not a valid URI. Use 'bitcoin:' instead.</source>
- <translation type="unfinished">'bitcoin://' не является правильным URI. Вместо этого используйте 'bitcoin:'.</translation>
- </message>
- <message>
- <source>Cannot process payment request because BIP70 is not supported.
-Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
-If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
- <translation type="unfinished">Невозможно обработать запрос на платеж, поскольку BIP70 не поддерживается.
-Из-за широко распространенных недостатков безопасности в BIP70 настоятельно рекомендуется игнорировать любые инструкции продавцов по переключению кошельков.
-Если вы получаете эту ошибку, вам следует попросить продавца предоставить URI, совместимый с BIP21.</translation>
- </message>
- <message>
- <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation type="unfinished">URI не может быть разобран! Это может быть вызвано недействительным адресом Bitcoin или неправильно сформированными параметрами URI.</translation>
- </message>
- <message>
- <source>Payment request file handling</source>
- <translation type="unfinished">Обработка файлов платежных запросов</translation>
- </message>
-</context>
-<context>
- <name>PeerTableModel</name>
- <message>
- <source>User Agent</source>
- <extracomment>Title of Peers Table column which contains the peer's User Agent string.</extracomment>
- <translation type="unfinished">Агент пользователя</translation>
- </message>
- <message>
- <source>Ping</source>
- <extracomment>Title of Peers Table column which indicates the current latency of the connection with the peer.</extracomment>
- <translation type="unfinished">Пинг</translation>
- </message>
- <message>
- <source>Peer</source>
- <extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
- <translation type="unfinished">Сверстник</translation>
- </message>
- <message>
- <source>Age</source>
- <extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
- <translation type="unfinished">Возраст</translation>
- </message>
- <message>
- <source>Direction</source>
- <extracomment>Title of Peers Table column which indicates the direction the peer connection was initiated from.</extracomment>
- <translation type="unfinished">Направление</translation>
- </message>
- <message>
- <source>Sent</source>
- <extracomment>Title of Peers Table column which indicates the total amount of network information we have sent to the peer.</extracomment>
- <translation type="unfinished">Отправлено</translation>
- </message>
- <message>
- <source>Received</source>
- <extracomment>Title of Peers Table column which indicates the total amount of network information we have received from the peer.</extracomment>
- <translation type="unfinished">Получено</translation>
- </message>
- <message>
- <source>Address</source>
- <extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
- <translation type="unfinished">Адрес</translation>
- </message>
- <message>
- <source>Type</source>
- <extracomment>Title of Peers Table column which describes the type of peer connection. The "type" describes why the connection exists.</extracomment>
- <translation type="unfinished">Тип</translation>
- </message>
- <message>
- <source>Network</source>
- <extracomment>Title of Peers Table column which states the network the peer connected through.</extracomment>
- <translation type="unfinished">Сеть</translation>
- </message>
- <message>
- <source>Inbound</source>
- <extracomment>An Inbound Connection from a Peer.</extracomment>
- <translation type="unfinished">Входящие</translation>
- </message>
- <message>
- <source>Outbound</source>
- <extracomment>An Outbound Connection to a Peer.</extracomment>
- <translation type="unfinished">Исходящие</translation>
- </message>
-</context>
-<context>
- <name>QRImageWidget</name>
- <message>
- <source>&amp;Save Image…</source>
- <translation type="unfinished">&amp;Сохранить изображение…</translation>
- </message>
- <message>
- <source>&amp;Copy Image</source>
- <translation type="unfinished">&amp;Копировать изображение</translation>
- </message>
- <message>
- <source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation type="unfinished">Получаемый URI слишком длинный, попробуйте уменьшить текст для метки/сообщения.</translation>
- </message>
- <message>
- <source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">Ошибка при кодировании URI в QR-код.</translation>
- </message>
- <message>
- <source>QR code support not available.</source>
- <translation type="unfinished">Поддержка QR-кодов недоступна.</translation>
- </message>
- <message>
- <source>Save QR Code</source>
- <translation type="unfinished">Сохранить QR-код</translation>
- </message>
- <message>
- <source>PNG Image</source>
- <extracomment>Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</extracomment>
- <translation type="unfinished">PNG-изображение</translation>
- </message>
-</context>
-<context>
- <name>RPCConsole</name>
- <message>
- <source>N/A</source>
- <translation type="unfinished">Н/Д</translation>
- </message>
- <message>
- <source>Client version</source>
- <translation type="unfinished">Клиентская версия</translation>
- </message>
- <message>
- <source>General</source>
- <translation type="unfinished">Общие</translation>
- </message>
- <message>
- <source>To specify a non-default location of the data directory use the '%1' option.</source>
- <translation type="unfinished">Чтобы указать местоположение каталога данных, отличное от заданного по умолчанию, используйте опцию '%1'.</translation>
- </message>
- <message>
- <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
- <translation type="unfinished">Чтобы указать расположение каталога блоков, отличное от заданного по умолчанию, используйте опцию '%1'.</translation>
- </message>
- <message>
- <source>Startup time</source>
- <translation type="unfinished">Время запуска</translation>
- </message>
- <message>
- <source>Network</source>
- <translation type="unfinished">Сеть</translation>
- </message>
- <message>
- <source>Name</source>
- <translation type="unfinished">Имя</translation>
- </message>
- <message>
- <source>Number of connections</source>
- <translation type="unfinished">Количество соединений</translation>
- </message>
- <message>
- <source>Block chain</source>
- <translation type="unfinished">Цепочка блоков</translation>
- </message>
- <message>
- <source>Memory Pool</source>
- <translation type="unfinished">Пул памяти</translation>
- </message>
- <message>
- <source>Current number of transactions</source>
- <translation type="unfinished">Текущее количество транзакций</translation>
- </message>
- <message>
- <source>Memory usage</source>
- <translation type="unfinished">Использовано памяти</translation>
- </message>
- <message>
- <source>Wallet: </source>
- <translation type="unfinished">Кошелёк: </translation>
- </message>
- <message>
- <source>(none)</source>
- <translation type="unfinished">(никто)</translation>
- </message>
- <message>
- <source>&amp;Reset</source>
- <translation type="unfinished">&amp;Сброс</translation>
- </message>
- <message>
- <source>Received</source>
- <translation type="unfinished">Получено</translation>
- </message>
- <message>
- <source>Sent</source>
- <translation type="unfinished">Отправлено</translation>
- </message>
- <message>
- <source>Banned peers</source>
- <translation type="unfinished">Запрещенные сверстники</translation>
- </message>
- <message>
- <source>Select a peer to view detailed information.</source>
- <translation type="unfinished">Выберите одноранговую сеть, чтобы просмотреть подробную информацию.</translation>
- </message>
- <message>
- <source>The transport layer version: %1</source>
- <translation type="unfinished">Версия транспортного уровня: %1</translation>
- </message>
- <message>
- <source>Transport</source>
- <translation type="unfinished">Транспорт</translation>
- </message>
- <message>
- <source>The BIP324 session ID string in hex, if any.</source>
- <translation type="unfinished">Строка идентификатора сеанса BIP324 в шестнадцатеричном формате, если таковой имеется.</translation>
- </message>
- <message>
- <source>Session ID</source>
- <translation type="unfinished">Сессия ID</translation>
- </message>
- <message>
- <source>Version</source>
- <translation type="unfinished">Версия</translation>
- </message>
- <message>
- <source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">Передаем ли мы транзакции этому сверстнику.</translation>
- </message>
- <message>
- <source>Transaction Relay</source>
- <translation type="unfinished">Реле транзакций</translation>
- </message>
- <message>
- <source>Starting Block</source>
- <translation type="unfinished">Стартовый блок</translation>
- </message>
- <message>
- <source>Synced Headers</source>
- <translation type="unfinished">Синхронизированные заголовки</translation>
- </message>
- <message>
- <source>Synced Blocks</source>
- <translation type="unfinished">Синхронизированные блоки</translation>
- </message>
- <message>
- <source>Last Transaction</source>
- <translation type="unfinished">Последняя Тразакция</translation>
- </message>
- <message>
- <source>The mapped Autonomous System used for diversifying peer selection.</source>
- <translation type="unfinished">Сопоставленная автономная система, используемая для диверсификации выбора пиров.</translation>
- </message>
- <message>
- <source>Mapped AS</source>
- <translation type="unfinished">Сопоставление AS</translation>
- </message>
- <message>
- <source>Whether we relay addresses to this peer.</source>
- <extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">Будем ли мы передавать адреса этому пиру.</translation>
- </message>
- <message>
- <source>Address Relay</source>
- <extracomment>Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">Адресное реле</translation>
- </message>
- <message>
- <source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
- <extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">Общее количество адресов, полученных от этого пира, которые были обработаны (исключая адреса, которые были отброшены из-за ограничения скорости).</translation>
- </message>
- <message>
- <source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
- <extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">Общее количество адресов, полученных от данного пира, которые были отброшены (не обработаны) из-за ограничения скорости.</translation>
- </message>
- <message>
- <source>Addresses Processed</source>
- <extracomment>Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">Обработанные адреса</translation>
- </message>
- <message>
- <source>Addresses Rate-Limited</source>
- <extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">Адреса с ограничением скорости</translation>
- </message>
- <message>
- <source>User Agent</source>
- <translation type="unfinished">Агент пользователя</translation>
- </message>
- <message>
- <source>Node window</source>
- <translation type="unfinished">Окно узла</translation>
- </message>
- <message>
- <source>Current block height</source>
- <translation type="unfinished">Текущая высота блока</translation>
- </message>
- <message>
- <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation type="unfinished">Откройте файл журнала %1 debug из текущего каталога данных. Для больших файлов журнала это может занять несколько секунд.</translation>
- </message>
- <message>
- <source>Decrease font size</source>
- <translation type="unfinished">Уменьшить размер шрифта</translation>
- </message>
- <message>
- <source>Increase font size</source>
- <translation type="unfinished">Увеличить размер шрифта</translation>
- </message>
- <message>
- <source>Permissions</source>
- <translation type="unfinished">Разрешения</translation>
- </message>
- <message>
- <source>The direction and type of peer connection: %1</source>
- <translation type="unfinished">Направление и тип пирингового соединения: %1</translation>
- </message>
- <message>
- <source>Direction/Type</source>
- <translation type="unfinished">Направление/Тип</translation>
- </message>
- <message>
- <source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
- <translation type="unfinished">Сетевой протокол, по которому подключен данный пир: IPv4, IPv6, Onion, I2P или CJDNS.</translation>
- </message>
- <message>
- <source>Services</source>
- <translation type="unfinished">Услуги</translation>
- </message>
- <message>
- <source>High bandwidth BIP152 compact block relay: %1</source>
- <translation type="unfinished">Компактное блочное реле BIP152 с высокой пропускной способностью: %1</translation>
- </message>
- <message>
- <source>High Bandwidth</source>
- <translation type="unfinished">Высокая пропускная способность</translation>
- </message>
- <message>
- <source>Connection Time</source>
- <translation type="unfinished">Время соединения</translation>
- </message>
- <message>
- <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
- <translation type="unfinished">Время, прошедшее с момента получения от этого пира нового блока, прошедшего начальную проверку на валидность.</translation>
- </message>
- <message>
- <source>Last Block</source>
- <translation type="unfinished">Последний блок</translation>
- </message>
- <message>
- <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
- <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
- <translation type="unfinished">Время, прошедшее с момента получения от этого пира новой транзакции, принятой в наш mempool.</translation>
- </message>
- <message>
- <source>Last Send</source>
- <translation type="unfinished">Последняя отправка</translation>
- </message>
- <message>
- <source>Last Receive</source>
- <translation type="unfinished">Последнее получение</translation>
- </message>
- <message>
- <source>Ping Time</source>
- <translation type="unfinished">Время пинга</translation>
- </message>
- <message>
- <source>The duration of a currently outstanding ping.</source>
- <translation type="unfinished">Длительность текущего пинга.</translation>
- </message>
- <message>
- <source>Min Ping</source>
- <translation type="unfinished">Минь Пин</translation>
- </message>
- <message>
- <source>Time Offset</source>
- <translation type="unfinished">Смещение времени</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">Время последнего блока</translation>
- </message>
- <message>
- <source>&amp;Open</source>
- <translation type="unfinished">&amp;Открыть</translation>
- </message>
- <message>
- <source>&amp;Console</source>
- <translation type="unfinished">Консоль</translation>
- </message>
- <message>
- <source>&amp;Network Traffic</source>
- <translation type="unfinished">&amp;Сетевой трафик</translation>
- </message>
- <message>
- <source>Totals</source>
- <translation type="unfinished">Итого</translation>
- </message>
- <message>
- <source>Debug log file</source>
- <translation type="unfinished">Файл журнала отладки</translation>
- </message>
- <message>
- <source>Clear console</source>
- <translation type="unfinished">Прозрачная консоль</translation>
- </message>
- <message>
- <source>In:</source>
- <translation type="unfinished">В:</translation>
- </message>
- <message>
- <source>Out:</source>
- <translation type="unfinished">Вых. :</translation>
- </message>
- <message>
- <source>Inbound: initiated by peer</source>
- <extracomment>Explanatory text for an inbound peer connection.</extracomment>
- <translation type="unfinished">Входящие: инициируются сверстником</translation>
- </message>
- <message>
- <source>Outbound Full Relay: default</source>
- <extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
- <translation type="unfinished">Исходящая полная ретрансляция: по умолчанию</translation>
- </message>
- <message>
- <source>Outbound Block Relay: does not relay transactions or addresses</source>
- <extracomment>Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">Ретрансляция исходящих блоков: не ретранслирует транзакции или адреса</translation>
- </message>
- <message>
- <source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
- <extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
- <translation type="unfinished">Исходящее руководство: добавлено использование опций RPC %1 or %2/%3 configuration</translation>
- </message>
- <message>
- <source>Outbound Feeler: short-lived, for testing addresses</source>
- <extracomment>Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</extracomment>
- <translation type="unfinished">Исходящий Feeler: недолговечен, для тестирования адресов</translation>
- </message>
- <message>
- <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
- <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
- <translation type="unfinished">Выборка исходящих адресов: недолговечна, предназначена для получения адресов</translation>
- </message>
- <message>
- <source>detecting: peer could be v1 or v2</source>
- <extracomment>Explanatory text for "detecting" transport type.</extracomment>
- <translation type="unfinished">обнаружение: пир может быть v1 или v2</translation>
- </message>
- <message>
- <source>v1: unencrypted, plaintext transport protocol</source>
- <extracomment>Explanatory text for v1 transport type.</extracomment>
- <translation type="unfinished">v1: незашифрованный транспортный протокол с открытым текстом</translation>
- </message>
- <message>
- <source>v2: BIP324 encrypted transport protocol</source>
- <extracomment>Explanatory text for v2 transport type.</extracomment>
- <translation type="unfinished">v2: Зашифрованный транспортный протокол BIP324</translation>
- </message>
- <message>
- <source>we selected the peer for high bandwidth relay</source>
- <translation type="unfinished">мы выбрали пир для ретрансляции с высокой пропускной способностью</translation>
- </message>
- <message>
- <source>the peer selected us for high bandwidth relay</source>
- <translation type="unfinished">пир выбрал нас для ретрансляции с высокой пропускной способностью</translation>
- </message>
- <message>
- <source>no high bandwidth relay selected</source>
- <translation type="unfinished">не выбрано реле с высокой пропускной способностью</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <extracomment>Context menu action to copy the address of a peer.</extracomment>
- <translation type="unfinished">&amp;Копировать адрес</translation>
- </message>
- <message>
- <source>Network activity disabled</source>
- <translation type="unfinished">Сетевая активность отключена</translation>
- </message>
- <message>
- <source>Executing command without any wallet</source>
- <translation type="unfinished">Выполнение команды без кошелька</translation>
- </message>
- <message>
- <source>Executing command using "%1" wallet</source>
- <translation type="unfinished">Выполнение команды с использованием кошелька "%1"</translation>
- </message>
- <message>
- <source>Welcome to the %1 RPC console.
-Use up and down arrows to navigate history, and %2 to clear screen.
-Use %3 and %4 to increase or decrease the font size.
-Type %5 for an overview of available commands.
-For more information on using this console, type %6.
-
-%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
- <extracomment>RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</extracomment>
- <translation type="unfinished">Добро пожаловать в консоль %1 RPC.
-Используйте стрелки вверх и вниз для перемещения по истории, а %2 - для очистки экрана.
-Используйте %3 и %4 для увеличения или уменьшения размера шрифта.
-Введите %5 fили обзор доступных команд.
-Для получения дополнительной информации об использовании этой консоли введите %6.
-
-%7ПРЕДУПРЕЖДЕНИЕ: Мошенники активно действуют, предлагая пользователям ввести здесь команды и похищая содержимое их кошельков. Не используйте эту консоль, не понимая всех последствий той или иной команды.%8</translation>
- </message>
- <message>
- <source>Executing…</source>
- <extracomment>A console message indicating an entered command is currently being executed.</extracomment>
- <translation type="unfinished">Выполнение…</translation>
- </message>
- <message>
- <source>(peer: %1)</source>
- <translation type="unfinished">(аналог: %1)</translation>
- </message>
- <message>
- <source>via %1</source>
- <translation type="unfinished">через %1</translation>
- </message>
- <message>
- <source>Yes</source>
- <translation type="unfinished">Да</translation>
- </message>
- <message>
- <source>No</source>
- <translation type="unfinished">Нет</translation>
- </message>
- <message>
- <source>To</source>
- <translation type="unfinished">Кому</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">От</translation>
- </message>
- <message>
- <source>Ban for</source>
- <translation type="unfinished">Забанен на</translation>
- </message>
- <message>
- <source>Never</source>
- <translation type="unfinished">Никогда</translation>
- </message>
- <message>
- <source>Unknown</source>
- <translation type="unfinished">Неизвестно</translation>
- </message>
-</context>
-<context>
- <name>ReceiveCoinsDialog</name>
- <message>
- <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
- <translation type="unfinished">Необязательное сообщение для прикрепления к платежному запросу, которое будет отображаться при открытии запроса. Примечание: Сообщение не будет отправлено вместе с платежом через сеть Bitcoin.</translation>
- </message>
- <message>
- <source>An optional label to associate with the new receiving address.</source>
- <translation type="unfinished">Необязательная метка, которую нужно связать с новым адресом получения.</translation>
- </message>
- <message>
- <source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation type="unfinished">Используйте эту форму для запроса платежей. Все поля являются &lt;b&gt;необязательными&lt;/b&gt;.</translation>
- </message>
- <message>
- <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
- <translation type="unfinished">Необязательная сумма для запроса. Оставьте это значение пустым или нулевым, чтобы не запрашивать определенную сумму.</translation>
- </message>
- <message>
- <source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
- <translation type="unfinished">Необязательная метка, которую нужно связать с новым адресом получения (используется для идентификации счета-фактуры). Она также прикрепляется к запросу на оплату.</translation>
- </message>
- <message>
- <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
- <translation type="unfinished">Необязательное сообщение, которое прикрепляется к платежному запросу и может быть показано отправителю.</translation>
- </message>
- <message>
- <source>&amp;Create new receiving address</source>
- <translation type="unfinished">&amp;Создать новый адрес получения</translation>
- </message>
- <message>
- <source>Clear all fields of the form.</source>
- <translation type="unfinished">Очистите все поля формы.</translation>
- </message>
- <message>
- <source>Clear</source>
- <translation type="unfinished">Очистить</translation>
- </message>
- <message>
- <source>Requested payments history</source>
- <translation type="unfinished">История запрошенных платежей</translation>
- </message>
- <message>
- <source>Show the selected request (does the same as double clicking an entry)</source>
- <translation type="unfinished">Показать выбранный запрос (то же самое, что и двойной щелчок по записи)</translation>
- </message>
- <message>
- <source>Show</source>
- <translation type="unfinished">Показать</translation>
- </message>
- <message>
- <source>Remove the selected entries from the list</source>
- <translation type="unfinished">Удалить выбранные записи из списка</translation>
- </message>
- <message>
- <source>Remove</source>
- <translation type="unfinished">Удалить</translation>
- </message>
- <message>
- <source>Copy &amp;URI</source>
- <translation type="unfinished">Скопируйте &amp;URI</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <translation type="unfinished">&amp;Копировать адрес</translation>
- </message>
- <message>
- <source>Copy &amp;label</source>
- <translation type="unfinished">Копия и этикетка</translation>
- </message>
- <message>
- <source>Copy &amp;message</source>
- <translation type="unfinished">Скопируйте &amp;сообщение</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">Копия &amp;amount</translation>
- </message>
- <message>
- <source>Not recommended due to higher fees and less protection against typos.</source>
- <translation type="unfinished">Не рекомендуется из-за более высокой платы и меньшей защиты от опечаток.</translation>
- </message>
- <message>
- <source>Generates an address compatible with older wallets.</source>
- <translation type="unfinished">Генерирует адрес, совместимый со старыми кошельками.</translation>
- </message>
- <message>
- <source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
- <translation type="unfinished">Генерирует собственный сегвит-адрес (BIP-173). Некоторые старые кошельки его не поддерживают.</translation>
- </message>
- <message>
- <source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
- <translation type="unfinished">Bech32m (BIP-350) - это обновление Bech32, поддержка кошельков по-прежнему ограничена.</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">Не удалось разблокировать кошелек.</translation>
- </message>
- <message>
- <source>Could not generate new %1 address</source>
- <translation type="unfinished">Не удалось сгенерировать новый адрес %1</translation>
- </message>
-</context>
-<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Request payment to …</source>
- <translation type="unfinished">Запросите оплату …</translation>
- </message>
- <message>
- <source>Address:</source>
- <translation type="unfinished">Адрес:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Сумма:</translation>
- </message>
- <message>
- <source>Label:</source>
- <translation type="unfinished">Метка:</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">Сообщение:</translation>
- </message>
- <message>
- <source>Wallet:</source>
- <translation type="unfinished">Кошелек:</translation>
- </message>
- <message>
- <source>Copy &amp;URI</source>
- <translation type="unfinished">Скопируйте &amp;URI</translation>
- </message>
- <message>
- <source>Copy &amp;Address</source>
- <translation type="unfinished">Копия и адрес</translation>
- </message>
- <message>
- <source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">Проверьте этот адрес, например, на экране аппаратного кошелька</translation>
- </message>
- <message>
- <source>&amp;Save Image…</source>
- <translation type="unfinished">&amp;Сохранить изображение…</translation>
- </message>
- <message>
- <source>Payment information</source>
- <translation type="unfinished">Платежная информация</translation>
- </message>
- <message>
- <source>Request payment to %1</source>
- <translation type="unfinished">Запросите платеж на %1</translation>
- </message>
-</context>
-<context>
- <name>RecentRequestsTableModel</name>
- <message>
- <source>Date</source>
- <translation type="unfinished">Дата</translation>
- </message>
- <message>
- <source>Label</source>
- <translation type="unfinished">Метка</translation>
- </message>
- <message>
- <source>Message</source>
- <translation type="unfinished">Сообщение</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(без ярлыка)</translation>
- </message>
- <message>
- <source>(no message)</source>
- <translation type="unfinished">(нет сообщения)</translation>
- </message>
- <message>
- <source>(no amount requested)</source>
- <translation type="unfinished">(сумма не запрашивается)</translation>
- </message>
- <message>
- <source>Requested</source>
- <translation type="unfinished">Запрошенный</translation>
- </message>
-</context>
-<context>
- <name>SendCoinsDialog</name>
- <message>
- <source>Send Coins</source>
- <translation type="unfinished">Отправить монеты</translation>
- </message>
- <message>
- <source>Coin Control Features</source>
- <translation type="unfinished">Особенности управления монетами</translation>
- </message>
- <message>
- <source>automatically selected</source>
- <translation type="unfinished">выбрано автоматически</translation>
- </message>
- <message>
- <source>Insufficient funds!</source>
- <translation type="unfinished">Недостаточно средств!</translation>
- </message>
- <message>
- <source>Quantity:</source>
- <translation type="unfinished">Количество:</translation>
- </message>
- <message>
- <source>Bytes:</source>
- <translation type="unfinished">Байты:</translation>
- </message>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Сумма:</translation>
- </message>
- <message>
- <source>Fee:</source>
- <translation type="unfinished">Стоимость:</translation>
- </message>
- <message>
- <source>After Fee:</source>
- <translation type="unfinished">После оплаты:</translation>
- </message>
- <message>
- <source>Change:</source>
- <translation type="unfinished">Изменить:</translation>
- </message>
- <message>
- <source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
- <translation type="unfinished">Если эта функция активирована, но адрес изменения пуст или недействителен, изменения будут отправлены на вновь созданный адрес.</translation>
- </message>
- <message>
- <source>Custom change address</source>
- <translation type="unfinished">Пользовательское изменение адреса</translation>
- </message>
- <message>
- <source>Transaction Fee:</source>
- <translation type="unfinished">Плата за транзакцию:</translation>
- </message>
- <message>
- <source>Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
- <translation type="unfinished">Использование комиссии за откат может привести к отправке транзакции, подтверждение которой займет несколько часов или дней (или вообще никогда). Подумайте о том, чтобы выбрать комиссию вручную или подождать, пока вы не подтвердите всю цепочку.</translation>
- </message>
- <message>
- <source>Warning: Fee estimation is currently not possible.</source>
- <translation type="unfinished">Предупреждение: В настоящее время оценка гонорара невозможна.</translation>
- </message>
- <message>
- <source>per kilobyte</source>
- <translation type="unfinished">за килобайт</translation>
- </message>
- <message>
- <source>Hide</source>
- <translation type="unfinished">Скрыть</translation>
- </message>
- <message>
- <source>Recommended:</source>
- <translation type="unfinished">Рекомендуемые:</translation>
- </message>
- <message>
- <source>Custom:</source>
- <translation type="unfinished">Пользовательский:</translation>
- </message>
- <message>
- <source>Send to multiple recipients at once</source>
- <translation type="unfinished">Отправляйте сразу нескольким адресатам</translation>
- </message>
- <message>
- <source>Add &amp;Recipient</source>
- <translation type="unfinished">Добавить &amp;Получатель</translation>
- </message>
- <message>
- <source>Clear all fields of the form.</source>
- <translation type="unfinished">Очистите все поля формы.</translation>
- </message>
- <message>
- <source>Inputs…</source>
- <translation type="unfinished">Входы…</translation>
- </message>
- <message>
- <source>Choose…</source>
- <translation type="unfinished">Выбирайте…</translation>
- </message>
- <message>
- <source>Hide transaction fee settings</source>
- <translation type="unfinished">Скрыть настройки комиссии за транзакции</translation>
- </message>
- <message>
- <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
-
-Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">Укажите пользовательскую плату за кБ (1 000 байт) виртуального размера транзакции.
-
-Примечание: Поскольку плата рассчитывается на основе каждого байта, ставка платы "100 сатоши за кб" для транзакции размером 500 виртуальных байт (половина 1 кб) в конечном итоге даст плату всего в 50 сатоши.</translation>
- </message>
- <message>
- <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
- <translation type="unfinished">Когда объем транзакций меньше, чем место в блоках, майнеры, а также узлы ретрансляции могут установить минимальную плату. Платить только минимальную комиссию - это прекрасно, но имейте в виду, что это может привести к тому, что транзакция никогда не будет подтверждена, когда спрос на транзакции биткоина будет больше, чем может обработать сеть.</translation>
- </message>
- <message>
- <source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
- <translation type="unfinished">Слишком низкая комиссия может привести к тому, что транзакция не будет подтверждена (читайте всплывающую подсказку)</translation>
- </message>
- <message>
- <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
- <translation type="unfinished">(Смарт-плата еще не инициализирована. Обычно это занимает несколько блоков...)</translation>
- </message>
- <message>
- <source>Confirmation time target:</source>
- <translation type="unfinished">Цель по времени подтверждения:</translation>
- </message>
- <message>
- <source>Enable Replace-By-Fee</source>
- <translation type="unfinished">Разрешить замену по цене</translation>
- </message>
- <message>
- <source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
- <translation type="unfinished">С помощью функции Replace-By-Fee (BIP-125) вы можете увеличить комиссию за транзакцию после ее отправки. Без этого можно рекомендовать более высокую комиссию, чтобы компенсировать повышенный риск задержки транзакции.</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">Очистить &amp;всё</translation>
- </message>
- <message>
- <source>Balance:</source>
- <translation type="unfinished">Баланс:</translation>
- </message>
- <message>
- <source>Confirm the send action</source>
- <translation type="unfinished">Подтвердите действие отправки</translation>
- </message>
- <message>
- <source>Copy quantity</source>
- <translation type="unfinished">Количество копий</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation type="unfinished">Количество копий</translation>
- </message>
- <message>
- <source>Copy fee</source>
- <translation type="unfinished">Плата за копирование</translation>
- </message>
- <message>
- <source>Copy after fee</source>
- <translation type="unfinished">Копия после оплаты</translation>
- </message>
- <message>
- <source>Copy bytes</source>
- <translation type="unfinished">Копирование байтов</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation type="unfinished">Копирование изменений</translation>
- </message>
- <message>
- <source>%1 (%2 blocks)</source>
- <translation type="unfinished">%1 (%2 bзамки)</translation>
- </message>
- <message>
- <source>Sign on device</source>
- <extracomment>"device" usually means a hardware wallet.</extracomment>
- <translation type="unfinished">Вход на устройство</translation>
- </message>
- <message>
- <source>Connect your hardware wallet first.</source>
- <translation type="unfinished">Сначала подключите аппаратный кошелек.</translation>
- </message>
- <message>
- <source>Set external signer script path in Options -&gt; Wallet</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Установите путь к скрипту внешнего подписчика в меню Параметры -&gt; Кошелек</translation>
- </message>
- <message>
- <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">Создает частично подписанную транзакцию биткоина (PSBT) для использования, например, с офлайн-кошельком %1 или аппаратным кошельком, совместимым с PSBT.</translation>
- </message>
- <message>
- <source> from wallet '%1'</source>
- <translation type="unfinished"> с кошелька "%1"</translation>
- </message>
- <message>
- <source>%1 to '%2'</source>
- <translation type="unfinished">%1 - '%2'</translation>
- </message>
- <message>
- <source>%1 to %2</source>
- <translation type="unfinished">от %1 до %2</translation>
- </message>
- <message>
- <source>To review recipient list click "Show Details…"</source>
- <translation type="unfinished">Чтобы просмотреть список получателей, нажмите "Показать детали..."</translation>
- </message>
- <message>
- <source>Sign failed</source>
- <translation type="unfinished">Знак не удался</translation>
- </message>
- <message>
- <source>External signer not found</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Внешний подписант не найден</translation>
- </message>
- <message>
- <source>External signer failure</source>
- <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Отказ внешнего подписанта</translation>
- </message>
- <message>
- <source>Save Transaction Data</source>
- <translation type="unfinished">Сохранить данные транзакции</translation>
- </message>
- <message>
- <source>Partially Signed Transaction (Binary)</source>
- <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">Частично подписанная транзакция (двоичная)</translation>
- </message>
- <message>
- <source>PSBT saved</source>
- <extracomment>Popup message when a PSBT has been saved to a file</extracomment>
- <translation type="unfinished">PSBT сохранен</translation>
- </message>
- <message>
- <source>External balance:</source>
- <translation type="unfinished">Внешний баланс:</translation>
- </message>
- <message>
- <source>or</source>
- <translation type="unfinished">или</translation>
- </message>
- <message>
- <source>You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
- <translation type="unfinished">Вы можете увеличить плату позже (сигналы Replace-By-Fee, BIP-125).</translation>
- </message>
- <message>
- <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
- <translation type="unfinished">Пожалуйста, ознакомьтесь с вашим предложением по транзакции. В результате будет создана частично подписанная транзакция биткоина (PSBT), которую вы можете сохранить или скопировать, а затем подписать, например, с помощью офлайн-кошелька %1 или аппаратного кошелька, совместимого с PSBT.</translation>
- </message>
- <message>
- <source>Do you want to create this transaction?</source>
- <extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
- <translation type="unfinished">Хотите ли вы создать эту транзакцию?</translation>
- </message>
- <message>
- <source>Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</extracomment>
- <translation type="unfinished">Пожалуйста, просмотрите вашу транзакцию. Вы можете создать и отправить эту транзакцию или создать частично подписанную транзакцию Биткойна (PSBT), которую вы можете сохранить или скопировать, а затем подписать, например, с помощью офлайн-кошелька %1 или аппаратного кошелька, совместимого с PSBT.</translation>
- </message>
- <message>
- <source>Please, review your transaction.</source>
- <extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
- <translation type="unfinished">Пожалуйста, пересмотрите свою сделку.</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation type="unfinished">Плата за транзакцию</translation>
- </message>
- <message>
- <source>Not signalling Replace-By-Fee, BIP-125.</source>
- <translation type="unfinished">Не сигнализирует о замене, BIP-125.</translation>
- </message>
- <message>
- <source>Total Amount</source>
- <translation type="unfinished">Общая сумма</translation>
- </message>
- <message>
- <source>Unsigned Transaction</source>
- <comment>PSBT copied</comment>
- <extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
- <translation type="unfinished">Беззнаковая транзакция</translation>
- </message>
- <message>
- <source>The PSBT has been copied to the clipboard. You can also save it.</source>
- <translation type="unfinished">PSBT был скопирован в буфер обмена. Вы также можете сохранить его.</translation>
- </message>
- <message>
- <source>PSBT saved to disk</source>
- <translation type="unfinished">Сохранение PSBT на диск</translation>
- </message>
- <message>
- <source>Confirm send coins</source>
- <translation type="unfinished">Подтвердите отправку монет</translation>
- </message>
- <message>
- <source>Watch-only balance:</source>
- <translation type="unfinished">Баланс только для часов:</translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation type="unfinished">Адрес получателя недействителен. Пожалуйста, перепроверьте.</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">Сумма к оплате должна быть больше 0.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation type="unfinished">Сумма превышает ваш баланс.</translation>
- </message>
- <message>
- <source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation type="unfinished">Общая сумма превышает ваш баланс с учетом комиссии за транзакцию %1.</translation>
- </message>
- <message>
- <source>Duplicate address found: addresses should only be used once each.</source>
- <translation type="unfinished">Найден дубликат адреса: адреса должны использоваться только один раз.</translation>
- </message>
- <message>
- <source>Transaction creation failed!</source>
- <translation type="unfinished">Создание транзакции не удалось!</translation>
- </message>
- <message>
- <source>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation type="unfinished">Плата, превышающая %1, считается абсурдно высокой.</translation>
- </message>
- <message numerus="yes">
- <source>Estimated to begin confirmation within %n block(s).</source>
- <translation type="unfinished">
- <numerusform>Предполагается начать подтверждение в течение %n квартала(ов).</numerusform>
- <numerusform>Предполагается начать подтверждение в течение %n квартала(ов).</numerusform>
- <numerusform>Предполагается начать подтверждение в течение %n квартала(ов).</numerusform>
- </translation>
- </message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation type="unfinished">Предупреждение: Недействительный адрес Bitcoin</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation type="unfinished">Предупреждение: Неизвестный адрес изменения</translation>
- </message>
- <message>
- <source>Confirm custom change address</source>
- <translation type="unfinished">Подтверждение изменения пользовательского адреса</translation>
- </message>
- <message>
- <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
- <translation type="unfinished">Адрес, выбранный вами для изменения, не является частью этого кошелька. Все или все средства в вашем кошельке могут быть отправлены на этот адрес. Вы уверены?</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(без ярлыка)</translation>
- </message>
-</context>
-<context>
- <name>SendCoinsEntry</name>
- <message>
- <source>Pay &amp;To:</source>
- <translation type="unfinished">Оплатить и получить:</translation>
- </message>
- <message>
- <source>Choose previously used address</source>
- <translation type="unfinished">Выберите ранее использовавшийся адрес</translation>
- </message>
- <message>
- <source>The Bitcoin address to send the payment to</source>
- <translation type="unfinished">Адрес Bitcoin для отправки платежа</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">Вставить адрес из буфера обмена</translation>
- </message>
- <message>
- <source>Remove this entry</source>
- <translation type="unfinished">Удалить эту запись</translation>
- </message>
- <message>
- <source>The amount to send in the selected unit</source>
- <translation type="unfinished">Сумма для отправки в выбранных единицах измерения</translation>
- </message>
- <message>
- <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
- <translation type="unfinished">Комиссия будет вычтена из отправляемой суммы. Получатель получит меньше биткоинов, чем вы указали в поле "Сумма". Если выбрано несколько получателей, комиссия делится поровну.</translation>
- </message>
- <message>
- <source>S&amp;ubtract fee from amount</source>
- <translation type="unfinished">Вычесть комиссию из суммы</translation>
- </message>
- <message>
- <source>Use available balance</source>
- <translation type="unfinished">Использовать свободный остаток</translation>
- </message>
- <message>
- <source>Message:</source>
- <translation type="unfinished">Сообщение:</translation>
- </message>
- <message>
- <source>Enter a label for this address to add it to the list of used addresses</source>
- <translation type="unfinished">Введите метку для этого адреса, чтобы добавить его в список используемых адресов</translation>
- </message>
- <message>
- <source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
- <translation type="unfinished">Сообщение, прикрепленное к bitcoin: URI, которое будет сохранено вместе с транзакцией для справки. Примечание: Это сообщение не будет отправлено по сети Bitcoin.</translation>
- </message>
-</context>
-<context>
- <name>SendConfirmationDialog</name>
- <message>
- <source>Send</source>
- <translation type="unfinished">Отправить</translation>
- </message>
- <message>
- <source>Create Unsigned</source>
- <translation type="unfinished">Создать без знака</translation>
- </message>
-</context>
-<context>
- <name>SignVerifyMessageDialog</name>
- <message>
- <source>Signatures - Sign / Verify a Message</source>
- <translation type="unfinished">Подписи - Подписать/проверить сообщение</translation>
- </message>
- <message>
- <source>&amp;Sign Message</source>
- <translation type="unfinished">&amp;Подписать сообщение</translation>
- </message>
- <message>
- <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Вы можете подписывать сообщения/соглашения со своими адресами, чтобы подтвердить, что можете получать отправленные на них биткоины. Будьте осторожны и не подписывайте ничего расплывчатого или случайного, так как фишинговые атаки могут попытаться обмануть вас, чтобы вы передали им свои данные. Подписывайте только полностью подробные заявления, с которыми вы согласны.</translation>
- </message>
- <message>
- <source>The Bitcoin address to sign the message with</source>
- <translation type="unfinished">Адрес Bitcoin для подписи сообщения</translation>
- </message>
- <message>
- <source>Choose previously used address</source>
- <translation type="unfinished">Выберите ранее использовавшийся адрес</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">Вставить адрес из буфера обмена</translation>
- </message>
- <message>
- <source>Enter the message you want to sign here</source>
- <translation type="unfinished">Введите сообщение, которое вы хотите подписать</translation>
- </message>
- <message>
- <source>Signature</source>
- <translation type="unfinished">Подпись</translation>
- </message>
- <message>
- <source>Copy the current signature to the system clipboard</source>
- <translation type="unfinished">Копирование текущей подписи в системный буфер обмена</translation>
- </message>
- <message>
- <source>Sign the message to prove you own this Bitcoin address</source>
- <translation type="unfinished">Подпишите сообщение, чтобы доказать, что вы являетесь владельцем этого адреса Bitcoin</translation>
- </message>
- <message>
- <source>Sign &amp;Message</source>
- <translation type="unfinished">Подпись и сообщение</translation>
- </message>
- <message>
- <source>Reset all sign message fields</source>
- <translation type="unfinished">Сброс всех полей сообщения знака</translation>
- </message>
- <message>
- <source>Clear &amp;All</source>
- <translation type="unfinished">Очистить &amp;всё</translation>
- </message>
- <message>
- <source>&amp;Verify Message</source>
- <translation type="unfinished">&amp;Верьте сообщение</translation>
- </message>
- <message>
- <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
- <translation type="unfinished">Введите адрес получателя, сообщение (убедитесь, что вы точно скопировали переносы строк, пробелы, табуляции и т. д.) и подпись ниже, чтобы проверить сообщение. Будьте осторожны и не читайте в подписи больше, чем содержится в самом подписанном сообщении, чтобы избежать обмана при атаке "человек посередине". Обратите внимание, что подпись подтверждает только получение адреса стороной, подписавшей сообщение, и не может служить доказательством отправки какой-либо транзакции!</translation>
- </message>
- <message>
- <source>The Bitcoin address the message was signed with</source>
- <translation type="unfinished">Bitcoin-адрес, которым было подписано сообщение</translation>
- </message>
- <message>
- <source>The signed message to verify</source>
- <translation type="unfinished">Подписанное сообщение для проверки</translation>
- </message>
- <message>
- <source>The signature given when the message was signed</source>
- <translation type="unfinished">Подпись, поставленная при подписании сообщения</translation>
- </message>
- <message>
- <source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
- <translation type="unfinished">Проверьте сообщение, чтобы убедиться, что оно было подписано указанным Bitcoin-адресом</translation>
- </message>
- <message>
- <source>Verify &amp;Message</source>
- <translation type="unfinished">Проверить &amp;Сообщение</translation>
- </message>
- <message>
- <source>Reset all verify message fields</source>
- <translation type="unfinished">Сброс всех полей сообщения о проверке</translation>
- </message>
- <message>
- <source>Click "Sign Message" to generate signature</source>
- <translation type="unfinished">Нажмите "Подписать сообщение", чтобы создать подпись</translation>
- </message>
- <message>
- <source>The entered address is invalid.</source>
- <translation type="unfinished">Введенный адрес недействителен.</translation>
- </message>
- <message>
- <source>Please check the address and try again.</source>
- <translation type="unfinished">Пожалуйста, проверьте адрес и повторите попытку.</translation>
- </message>
- <message>
- <source>The entered address does not refer to a key.</source>
- <translation type="unfinished">Введенный адрес не относится к ключу.</translation>
- </message>
- <message>
- <source>Wallet unlock was cancelled.</source>
- <translation type="unfinished">Разблокировка кошелька была отменена.</translation>
- </message>
- <message>
- <source>No error</source>
- <translation type="unfinished">Нет ошибки</translation>
- </message>
- <message>
- <source>Private key for the entered address is not available.</source>
- <translation type="unfinished">Закрытый ключ для введенного адреса недоступен.</translation>
- </message>
- <message>
- <source>Message signing failed.</source>
- <translation type="unfinished">Не удалось подписать сообщение.</translation>
- </message>
- <message>
- <source>Message signed.</source>
- <translation type="unfinished">Сообщение подписано.</translation>
- </message>
- <message>
- <source>The signature could not be decoded.</source>
- <translation type="unfinished">Подпись не удалось расшифровать.</translation>
- </message>
- <message>
- <source>Please check the signature and try again.</source>
- <translation type="unfinished">Пожалуйста, проверьте подпись и повторите попытку.</translation>
- </message>
- <message>
- <source>The signature did not match the message digest.</source>
- <translation type="unfinished">Подпись не совпадает с дайджестом сообщения.</translation>
- </message>
- <message>
- <source>Message verification failed.</source>
- <translation type="unfinished">Проверка сообщения не удалась.</translation>
- </message>
- <message>
- <source>Message verified.</source>
- <translation type="unfinished">Сообщение проверено.</translation>
- </message>
-</context>
-<context>
- <name>SplashScreen</name>
- <message>
- <source>(press q to shutdown and continue later)</source>
- <translation type="unfinished">(нажмите q, чтобы выключить и продолжить позже)</translation>
- </message>
- <message>
- <source>press q to shutdown</source>
- <translation type="unfinished">нажмите q для выключения</translation>
- </message>
-</context>
-<context>
- <name>TrafficGraphWidget</name>
- <message>
- <source>kB/s</source>
- <translation type="unfinished">кБ/с</translation>
- </message>
-</context>
-<context>
- <name>TransactionDesc</name>
- <message>
- <source>conflicted with a transaction with %1 confirmations</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
- <translation type="unfinished">вступил в конфликт с транзакцией с %1 cонфармацией</translation>
- </message>
- <message>
- <source>0/unconfirmed, in memory pool</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
- <translation type="unfinished">0/не подтверждено, в пуле памяти</translation>
- </message>
- <message>
- <source>0/unconfirmed, not in memory pool</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
- <translation type="unfinished">0/не подтверждено, нет в пуле памяти</translation>
- </message>
- <message>
- <source>abandoned</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
- <translation type="unfinished">заброшенный</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
- <translation type="unfinished">%1/не подтверждено</translation>
- </message>
- <message>
- <source>Status</source>
- <translation type="unfinished">Статус</translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished">Дата</translation>
- </message>
- <message>
- <source>Source</source>
- <translation type="unfinished">Источник</translation>
- </message>
- <message>
- <source>Generated</source>
- <translation type="unfinished">Сформировано</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">От</translation>
- </message>
- <message>
- <source>unknown</source>
- <translation type="unfinished">неизвестно</translation>
- </message>
- <message>
- <source>To</source>
- <translation type="unfinished">Кому</translation>
- </message>
- <message>
- <source>own address</source>
- <translation type="unfinished">собственный адрес</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation type="unfinished">только для просмотра</translation>
- </message>
- <message>
- <source>label</source>
- <translation type="unfinished">метка</translation>
- </message>
- <message>
- <source>Credit</source>
- <translation type="unfinished">Кредит</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation type="unfinished">
- <numerusform>созревает в %n большем количестве блоков</numerusform>
- <numerusform>созревает в %n большем количестве блоков</numerusform>
- <numerusform>созревает в %n большем количестве блоков</numerusform>
- </translation>
- </message>
- <message>
- <source>not accepted</source>
- <translation type="unfinished">не принято</translation>
- </message>
- <message>
- <source>Debit</source>
- <translation type="unfinished">Дебет</translation>
- </message>
- <message>
- <source>Total debit</source>
- <translation type="unfinished">Итого по дебету</translation>
- </message>
- <message>
- <source>Total credit</source>
- <translation type="unfinished">Общий кредит</translation>
- </message>
- <message>
- <source>Transaction fee</source>
- <translation type="unfinished">Плата за транзакцию</translation>
- </message>
- <message>
- <source>Net amount</source>
- <translation type="unfinished">Чистая сумма</translation>
- </message>
- <message>
- <source>Message</source>
- <translation type="unfinished">Сообщение</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation type="unfinished">Комментарий</translation>
- </message>
- <message>
- <source>Transaction ID</source>
- <translation type="unfinished">ID транзакции</translation>
- </message>
- <message>
- <source>Transaction total size</source>
- <translation type="unfinished">Общий размер транзакции</translation>
- </message>
- <message>
- <source>Transaction virtual size</source>
- <translation type="unfinished">Виртуальный размер транзакции</translation>
- </message>
- <message>
- <source>Output index</source>
- <translation type="unfinished">Выходной индекс</translation>
- </message>
- <message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished"> (Сертификат не был проверен)</translation>
- </message>
- <message>
- <source>Merchant</source>
- <translation type="unfinished">Продавец</translation>
- </message>
- <message>
- <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
- <translation type="unfinished">Сгенерированные монеты должны созреть до %1 bзамков, прежде чем их можно будет потратить. Когда вы сгенерировали этот блок, он был передан в сеть для добавления в цепочку блоков. Если он не попадет в цепочку, его состояние изменится на "не принят", и его нельзя будет потратить. Это может иногда происходить, если другой узел генерирует блок в течение нескольких секунд после вашего.</translation>
- </message>
- <message>
- <source>Debug information</source>
- <translation type="unfinished">Информация для отладки</translation>
- </message>
- <message>
- <source>Transaction</source>
- <translation type="unfinished">Транзакция</translation>
- </message>
- <message>
- <source>Inputs</source>
- <translation type="unfinished">Входы</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation type="unfinished">Сумма</translation>
- </message>
- <message>
- <source>true</source>
- <translation type="unfinished">верно</translation>
- </message>
- <message>
- <source>false</source>
- <translation type="unfinished">ложный</translation>
- </message>
-</context>
-<context>
- <name>TransactionDescDialog</name>
- <message>
- <source>This pane shows a detailed description of the transaction</source>
- <translation type="unfinished">На этой панели отображается подробное описание транзакции</translation>
- </message>
- <message>
- <source>Details for %1</source>
- <translation type="unfinished">Подробности для %1</translation>
- </message>
-</context>
-<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Date</source>
- <translation type="unfinished">Дата</translation>
- </message>
- <message>
- <source>Type</source>
- <translation type="unfinished">Тип</translation>
- </message>
- <message>
- <source>Label</source>
- <translation type="unfinished">Метка</translation>
- </message>
- <message>
- <source>Unconfirmed</source>
- <translation type="unfinished">Не подтверждено</translation>
- </message>
- <message>
- <source>Abandoned</source>
- <translation type="unfinished">Заброшенный</translation>
- </message>
- <message>
- <source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation type="unfinished">Подтверждение (%1 of %2 рекомендуемых подтверждений)</translation>
- </message>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation type="unfinished">Подтверждено (%1 confirmations)</translation>
- </message>
- <message>
- <source>Conflicted</source>
- <translation type="unfinished">Противоречие</translation>
- </message>
- <message>
- <source>Immature (%1 confirmations, will be available after %2)</source>
- <translation type="unfinished">Незрелые (%1 cна подтверждения, будут доступны после %2)</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation type="unfinished">Сгенерировано, но не принято</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">Получено с</translation>
- </message>
- <message>
- <source>Received from</source>
- <translation type="unfinished">Получено от</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">Отправлен</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">Добыча</translation>
- </message>
- <message>
- <source>watch-only</source>
- <translation type="unfinished">только для просмотра</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(без ярлыка)</translation>
- </message>
- <message>
- <source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation type="unfinished">Статус транзакции. Наведите курсор на это поле, чтобы показать количество подтверждений.</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation type="unfinished">Дата и время получения транзакции.</translation>
- </message>
- <message>
- <source>Type of transaction.</source>
- <translation type="unfinished">Тип сделки.</translation>
- </message>
- <message>
- <source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation type="unfinished">Участвует ли в этой транзакции адрес только для часов.</translation>
- </message>
- <message>
- <source>User-defined intent/purpose of the transaction.</source>
- <translation type="unfinished">Определяемое пользователем намерение/цель транзакции.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation type="unfinished">Сумма, снятая с баланса или добавленная к нему.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>All</source>
- <translation type="unfinished">Все</translation>
- </message>
- <message>
- <source>Today</source>
- <translation type="unfinished">Сегодня</translation>
- </message>
- <message>
- <source>This week</source>
- <translation type="unfinished">Эта неделя</translation>
- </message>
- <message>
- <source>This month</source>
- <translation type="unfinished">Этот месяц</translation>
- </message>
- <message>
- <source>Last month</source>
- <translation type="unfinished">Прошлый месяц</translation>
- </message>
- <message>
- <source>This year</source>
- <translation type="unfinished">Этот год</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">Получено с</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">Отправлен</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">Добыча</translation>
- </message>
- <message>
- <source>Other</source>
- <translation type="unfinished">Другое</translation>
- </message>
- <message>
- <source>Enter address, transaction id, or label to search</source>
- <translation type="unfinished">Введите адрес, идентификатор транзакции или метку для поиска</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation type="unfinished">Минимальная сумма</translation>
- </message>
- <message>
- <source>Range…</source>
- <translation type="unfinished">Диапазон…</translation>
- </message>
- <message>
- <source>&amp;Copy address</source>
- <translation type="unfinished">&amp;Копировать адрес</translation>
- </message>
- <message>
- <source>Copy &amp;label</source>
- <translation type="unfinished">Копия и этикетка</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">Копия &amp;amount</translation>
- </message>
- <message>
- <source>Copy transaction &amp;ID</source>
- <translation type="unfinished">Копирование транзакции &amp;ID</translation>
- </message>
- <message>
- <source>Copy &amp;raw transaction</source>
- <translation type="unfinished">Копирование и вывод транзакции</translation>
- </message>
- <message>
- <source>Copy full transaction &amp;details</source>
- <translation type="unfinished">Копирование полной транзакции и подробностей</translation>
- </message>
- <message>
- <source>&amp;Show transaction details</source>
- <translation type="unfinished">показать детали транзакции</translation>
- </message>
- <message>
- <source>Increase transaction &amp;fee</source>
- <translation type="unfinished">Увеличение транзакционных сборов</translation>
- </message>
- <message>
- <source>&amp;Edit address label</source>
- <translation type="unfinished">&amp;Редактировать адресную этикетку</translation>
- </message>
- <message>
- <source>Show in %1</source>
- <extracomment>Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</extracomment>
- <translation type="unfinished">Показать в %1</translation>
- </message>
- <message>
- <source>Export Transaction History</source>
- <translation type="unfinished">Экспорт истории транзакций</translation>
- </message>
- <message>
- <source>Comma separated file</source>
- <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">Файл, разделенный запятыми</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">Подтверждено</translation>
- </message>
- <message>
- <source>Watch-only</source>
- <translation type="unfinished">Только для просмотра</translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished">Дата</translation>
- </message>
- <message>
- <source>Type</source>
- <translation type="unfinished">Тип</translation>
- </message>
- <message>
- <source>Label</source>
- <translation type="unfinished">Метка</translation>
- </message>
- <message>
- <source>Address</source>
- <translation type="unfinished">Адрес</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation type="unfinished">Ошибка экспорта</translation>
- </message>
- <message>
- <source>There was an error trying to save the transaction history to %1.</source>
- <translation type="unfinished">При попытке сохранить историю транзакций в %1 произошла ошибка.</translation>
- </message>
- <message>
- <source>Exporting Successful</source>
- <translation type="unfinished">Успешный экспорт</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation type="unfinished">История транзакций была успешно сохранена в %1.</translation>
- </message>
- <message>
- <source>Range:</source>
- <translation type="unfinished">Диапазон:</translation>
- </message>
- <message>
- <source>to</source>
- <translation type="unfinished">в</translation>
- </message>
-</context>
-<context>
- <name>WalletFrame</name>
- <message>
- <source>No wallet has been loaded.
-Go to File &gt; Open Wallet to load a wallet.
-- OR -</source>
- <translation type="unfinished">Не загружен ни один кошелек.
-Перейдите в меню Файл &gt; Открыть кошелек, чтобы загрузить кошелек.
-- ИЛИ -</translation>
- </message>
- <message>
- <source>Create a new wallet</source>
- <translation type="unfinished">Создайте новый кошелек</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">Ошибка</translation>
- </message>
- <message>
- <source>Unable to decode PSBT from clipboard (invalid base64)</source>
- <translation type="unfinished">Невозможно декодировать PSBT из буфера обмена (недопустимый base64)</translation>
- </message>
- <message>
- <source>Load Transaction Data</source>
- <translation type="unfinished">Загрузка данных о транзакциях</translation>
- </message>
- <message>
- <source>Partially Signed Transaction (*.psbt)</source>
- <translation type="unfinished">Частично подписанная транзакция (*.psbt)</translation>
- </message>
- <message>
- <source>PSBT file must be smaller than 100 MiB</source>
- <translation type="unfinished">Файл PSBT должен иметь размер менее 100 Мбайт</translation>
- </message>
- <message>
- <source>Unable to decode PSBT</source>
- <translation type="unfinished">Невозможно декодировать PSBT</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Send Coins</source>
- <translation type="unfinished">Отправить монеты</translation>
- </message>
- <message>
- <source>Fee bump error</source>
- <translation type="unfinished">Ошибка при взимании платы</translation>
- </message>
- <message>
- <source>Increasing transaction fee failed</source>
- <translation type="unfinished">Увеличение комиссии за транзакции не удалось</translation>
- </message>
- <message>
- <source>Do you want to increase the fee?</source>
- <extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
- <translation type="unfinished">Хотите ли вы увеличить плату?</translation>
- </message>
- <message>
- <source>Current fee:</source>
- <translation type="unfinished">Текущая плата:</translation>
- </message>
- <message>
- <source>Increase:</source>
- <translation type="unfinished">Увеличить:</translation>
- </message>
- <message>
- <source>New fee:</source>
- <translation type="unfinished">Новый сбор:</translation>
- </message>
- <message>
- <source>Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy.</source>
- <translation type="unfinished">Внимание: Это может оплатить дополнительную плату за счет сокращения выходов изменений или добавления входов, если это необходимо. Он может добавить новый выход изменений, если таковой еще не существует. Эти изменения потенциально могут привести к утечке конфиденциальной информации.</translation>
- </message>
- <message>
- <source>Confirm fee bump</source>
- <translation type="unfinished">Подтвердите увеличение платы</translation>
- </message>
- <message>
- <source>Can't draft transaction.</source>
- <translation type="unfinished">Невозможно составить проект сделки.</translation>
- </message>
- <message>
- <source>PSBT copied</source>
- <translation type="unfinished">PSBT скопирован</translation>
- </message>
- <message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Скопировано в буфер обмена</translation>
- </message>
- <message>
- <source>Can't sign transaction.</source>
- <translation type="unfinished">Невозможно подписать транзакцию.</translation>
- </message>
- <message>
- <source>Could not commit transaction</source>
- <translation type="unfinished">Не удалось зафиксировать транзакцию</translation>
- </message>
- <message>
- <source>Can't display address</source>
- <translation type="unfinished">Невозможно отобразить адрес</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">основной кошелёк</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>&amp;Export</source>
- <translation type="unfinished">&amp;Экспорт</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Экспорт данных на текущей вкладке в файл</translation>
- </message>
- <message>
- <source>Backup Wallet</source>
- <translation type="unfinished">Резервный кошелек</translation>
- </message>
- <message>
- <source>Wallet Data</source>
- <extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">Данные кошелька</translation>
- </message>
- <message>
- <source>Backup Failed</source>
- <translation type="unfinished">Сбой Резервного копирования</translation>
- </message>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation type="unfinished">При попытке сохранить данные кошелька в %1 произошла ошибка.</translation>
- </message>
- <message>
- <source>Backup Successful</source>
- <translation type="unfinished">Резервное копирование Выполнено</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation type="unfinished">Данные кошелька были успешно сохранены в %1.</translation>
- </message>
- <message>
- <source>Cancel</source>
- <translation type="unfinished">Отмена</translation>
- </message>
-</context>
-<context>
- <name>bitcoin-core</name>
- <message>
- <source>The %s developers</source>
- <translation type="unfinished">Разработчики %s</translation>
- </message>
- <message>
- <source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
- <translation type="unfinished">%s поврежден. Попробуйте использовать инструмент кошелька bitcoin-wallet для спасения или восстановить резервную копию.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s не удалось подтвердить состояние моментального снимка -assumeutxo. Это указывает на аппаратную проблему, или ошибку в программном обеспечении, или неудачную модификацию программного обеспечения, которая позволила загрузить недопустимый снимок. В результате этого узел выключится и перестанет использовать любое состояние, которое было построено на основе моментального снимка, сбросив высоту цепочки с %d на %d. При следующем перезапуске узел возобновит синхронизацию с %d без использования данных моментального снимка. Сообщите об этом инциденте по адресу %s, указав, как вы получили снимок. Состояние цепи недействительного снимка будет оставлено на диске, если оно поможет в диагностике проблемы, вызвавшей эту ошибку.</translation>
- </message>
- <message>
- <source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
- <translation type="unfinished">%s запрос на прослушивание порта %u. Этот порт считается "плохим", и поэтому маловероятно, что какой-либо пир подключится к нему. Подробности и полный список смотрите в doc/p2p-bad-ports.md.</translation>
- </message>
- <message>
- <source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
- <translation type="unfinished">Невозможно понизить версию кошелька с версии %i до версии %i. Версия кошелька не изменена.</translation>
- </message>
- <message>
- <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">Невозможно получить блокировку на каталог данных %s. %s, вероятно, уже запущен.</translation>
- </message>
- <message>
- <source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
- <translation type="unfinished">Невозможно обновить кошелек без HD-раздела с версии %i до версии %i без обновления для поддержки предварительного разделения пула ключей. Пожалуйста, используйте версию %i или не указывайте версию.</translation>
- </message>
- <message>
- <source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
- <translation type="unfinished">Дисковое пространство для %s может не вместить блочные файлы. В этом каталоге будет храниться около %u ГБ данных.</translation>
- </message>
- <message>
- <source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
- <translation type="unfinished">Распространяется под лицензией MIT, см. сопроводительный файл %s или %s</translation>
- </message>
- <message>
- <source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
- <translation type="unfinished">Ошибка при загрузке кошелька. Кошелек требует загрузки блоков, а программное обеспечение в настоящее время не поддерживает загрузку кошельков, когда блоки загружаются не по порядку при использовании снапшотов assumeutxo. Кошелек должен успешно загрузиться после того, как синхронизация узла достигнет высоты %s</translation>
- </message>
- <message>
- <source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
- <translation type="unfinished">Ошибка при считывании %s! Данные транзакции могут отсутствовать или быть неверными. Повторное сканирование кошелька.</translation>
- </message>
- <message>
- <source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
- <translation type="unfinished">Ошибка: Неверная запись формата дамп-файла. Получено "%s", ожидалось "format".</translation>
- </message>
- <message>
- <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">Ошибка: Неверная запись идентификатора дамп-файла. Получено "%s", ожидалось "%s".</translation>
- </message>
- <message>
- <source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
- <translation type="unfinished">Ошибка: Версия дампфайла не поддерживается. Эта версия bitcoin-кошелька поддерживает только дампфайлы версии 1. Получен дампфайл с версией %s</translation>
- </message>
- <message>
- <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
- <translation type="unfinished">Ошибка: устаревшие кошельки поддерживают только следующие типы адресов: "legacy", "p2sh-segwit", и "bech32"</translation>
- </message>
- <message>
- <source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
- <translation type="unfinished">Ошибка: Невозможно создать дескрипторы для этого устаревшего кошелька. Обязательно укажите кодовую фразу кошелька, если он зашифрован.</translation>
- </message>
- <message>
- <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
- <translation type="unfinished">Файл %s уже существует. Если вы уверены, что это именно то, что вам нужно, сначала переместите его в другое место.</translation>
- </message>
- <message>
- <source>Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start.</source>
- <translation type="unfinished">Неверный или поврежденный файл peers.dat (%s). Если вы считаете, что это ошибка, сообщите об этом по адресу %s. В качестве обходного пути вы можете переместить файл (%s) из пути (переименовать, переместить или удалить), чтобы при следующем запуске был создан новый.</translation>
- </message>
- <message>
- <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
- <translation type="unfinished">Предоставляется более одного адреса привязки onion. Используйте %s для автоматически созданного сервиса Tor onion.</translation>
- </message>
- <message>
- <source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">Не указан дамп-файл. Чтобы использовать createfromdump, необходимо указать -dumpfile=&lt;filename&gt;.</translation>
- </message>
- <message>
- <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">Не указан дамп-файл. Чтобы использовать dump, необходимо указать -dumpfile=&lt;filename&gt;.</translation>
- </message>
- <message>
- <source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
- <translation type="unfinished">Не указан формат файла кошелька. Чтобы использовать createfromdump, необходимо указать -format=&lt;format&gt;.</translation>
- </message>
- <message>
- <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">Убедитесь, что дата и время на вашем компьютере верны! Если часы неправильные, %s не будет работать должным образом.</translation>
- </message>
- <message>
- <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
- <translation type="unfinished">Пожалуйста, внесите свой вклад, если вы нашли %s полезным. Посетите %s для получения дополнительной информации о программном обеспечении.</translation>
- </message>
- <message>
- <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
- <translation type="unfinished">Обрезка конфигурации ниже минимального значения %d MiB. Пожалуйста, используйте большее число.</translation>
- </message>
- <message>
- <source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
- <translation type="unfinished">Режим Prune несовместим с -reindex-chainstate. Вместо этого используйте полный -reindex.</translation>
- </message>
- <message>
- <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
- <translation type="unfinished">Prune: последняя синхронизация кошелька выходит за пределы обрезанных данных. Вам необходимо -переиндексировать (загрузить весь блокчейн заново в случае обрезанного узла)</translation>
- </message>
- <message>
- <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
- <translation type="unfinished">Не удалось выполнить переименование '%s' -&gt; '%s'. Вы должны решить эту проблему, вручную переместив или удалив недействительный каталог моментальных снимков %s, иначе при следующем запуске вы снова столкнетесь с той же ошибкой.</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
- <translation type="unfinished">SQLiteDatabase: Неизвестная схема кошелька sqlite версии %d. Поддерживается только версия %d</translation>
- </message>
- <message>
- <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
- <translation type="unfinished">В базе данных блоков найден блок из будущего. Это может произойти из-за неверно установленных даты и времени на вашем компьютере. Перестраивайте базу данных блоков только если вы уверены, что дата и время установлены верно</translation>
- </message>
- <message>
- <source>The transaction amount is too small to send after the fee has been deducted</source>
- <translation type="unfinished">Сумма транзакции слишком мала для отправки после вычета комиссии</translation>
- </message>
- <message>
- <source>This error could occur if this wallet was not shutdown cleanly and was last loaded using a build with a newer version of Berkeley DB. If so, please use the software that last loaded this wallet</source>
- <translation type="unfinished">Эта ошибка может возникнуть, если этот кошелек не был выключен без ошибок и последний раз загружался с помощью сборки с более новой версией Berkeley DB. В этом случае используйте программное обеспечение, с помощью которого этот кошелек загружался в последний раз</translation>
- </message>
- <message>
- <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
- <translation type="unfinished">Это предварительная тестовая сборка - используйте на свой страх и риск - не используйте для майнинга или торговых приложений</translation>
- </message>
- <message>
- <source>This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
- <translation type="unfinished">Это максимальная комиссия за транзакцию, которую вы платите (в дополнение к обычной комиссии), чтобы отдать предпочтение частичному избеганию трат перед обычным выбором монет.</translation>
- </message>
- <message>
- <source>This is the transaction fee you may discard if change is smaller than dust at this level</source>
- <translation type="unfinished">Это плата за транзакцию, которую вы можете отбросить, если изменение меньше, чем пыль на этом уровне</translation>
- </message>
- <message>
- <source>This is the transaction fee you may pay when fee estimates are not available.</source>
- <translation type="unfinished">Это комиссия за транзакцию, которую вы можете заплатить, когда оценка комиссии недоступна.</translation>
- </message>
- <message>
- <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
- <translation type="unfinished">Общая длина строки версии сети (%i) превышает максимальную длину (%i). Сократите количество или размер uacomments.</translation>
- </message>
- <message>
- <source>Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate.</source>
- <translation type="unfinished">Невозможно воспроизвести блоки. Вам нужно перестроить базу данных с помощью -reindex-chainstate.</translation>
- </message>
- <message>
- <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
- <translation type="unfinished">Предоставлен неизвестный формат файла кошелька "%s". Пожалуйста, укажите один из "bdb" или "sqlite".</translation>
- </message>
- <message>
- <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
- <translation type="unfinished">Неподдерживаемый уровень регистрации по категориям %1$s=%2$s. Ожидается %1$s=&lt;category&gt;:&lt;loglevel&gt;. Допустимые категории: %3$s. Допустимые уровни регистрации: %4$s.</translation>
- </message>
- <message>
- <source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
- <translation type="unfinished">Обнаружен неподдерживаемый формат базы данных chainstate. Пожалуйста, перезапустите с параметром -reindex-chainstate. Это приведет к перестройке базы данных chainstate.</translation>
- </message>
- <message>
- <source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
- <translation type="unfinished">Кошелек успешно создан. Устаревший тип кошелька устаревает, и в будущем поддержка создания и открытия устаревших кошельков будет удалена.</translation>
- </message>
- <message>
- <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
- <translation type="unfinished">Кошелек успешно загружен. Устаревший тип кошелька, поддержка создания и открытия устаревших кошельков будет удалена в будущем. Устаревшие кошельки можно перенести на дескрипторный кошелек с помощью функции migratewallet.</translation>
- </message>
- <message>
- <source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
- <translation type="unfinished">Предупреждение: Формат кошелька дампфайла "%s" не соответствует формату "%s", указанному в командной строке.</translation>
- </message>
- <message>
- <source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
- <translation type="unfinished">Предупреждение: В кошельке {%s} обнаружены закрытые ключи с отключенными закрытыми ключами</translation>
- </message>
- <message>
- <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
- <translation type="unfinished">Внимание: Похоже, мы не полностью согласны с нашими коллегами! Вам может потребоваться обновление, или другим узлам может потребоваться обновление.</translation>
- </message>
- <message>
- <source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
- <translation type="unfinished">Данные свидетелей для блоков после высоты %d требуют проверки. Пожалуйста, перезапустите с параметром -reindex.</translation>
- </message>
- <message>
- <source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
- <translation type="unfinished">Чтобы вернуться к режиму unpruned, необходимо перестроить базу данных с помощью -reindex. Это приведет к повторной загрузке всего блокчейна</translation>
- </message>
- <message>
- <source>%s is set very high!</source>
- <translation type="unfinished">%s установлен очень высоко!</translation>
- </message>
- <message>
- <source>-maxmempool must be at least %d MB</source>
- <translation type="unfinished">-maxmempool должен быть не менее %d МБ</translation>
- </message>
- <message>
- <source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Произошла фатальная внутренняя ошибка, подробности см. в журнале debug.log</translation>
- </message>
- <message>
- <source>Cannot resolve -%s address: '%s'</source>
- <translation type="unfinished">Невозможно разрешить адрес -%s: '%s'</translation>
- </message>
- <message>
- <source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
- <translation type="unfinished">Невозможно установить значение -forcednsseed в true при установке значения -dnsseed в false.</translation>
- </message>
- <message>
- <source>Cannot set -peerblockfilters without -blockfilterindex.</source>
- <translation type="unfinished">Невозможно установить -peerblockfilters без -blockfilterindex.</translation>
- </message>
- <message>
- <source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">Невозможно записать в каталог данных '%s'; проверьте права доступа.</translation>
- </message>
- <message>
- <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
- <translation type="unfinished">%s установлена очень высокая! Такая большая комиссия может быть уплачена за одну транзакцию.</translation>
- </message>
- <message>
- <source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
- <translation type="unfinished">Невозможно одновременно предоставить определенные соединения и попросить addrman найти исходящие соединения.</translation>
- </message>
- <message>
- <source>Error loading %s: External signer wallet being loaded without external signer support compiled</source>
- <translation type="unfinished">Ошибка загрузки %s: Загружается кошелек внешнего подписчика без скомпилированной поддержки внешнего подписчика</translation>
- </message>
- <message>
- <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
- <translation type="unfinished">Ошибка при чтении %s! Все ключи прочитаны правильно, но данные транзакции или метаданные адреса могут отсутствовать или быть неверными.</translation>
- </message>
- <message>
- <source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Ошибка: Данные адресной книги в кошельке не могут быть идентифицированы как принадлежащие перенесенным кошелькам</translation>
- </message>
- <message>
- <source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
- <translation type="unfinished">Ошибка: Во время миграции были созданы дубликаты дескрипторов. Ваш кошелек может быть поврежден.</translation>
- </message>
- <message>
- <source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Ошибка: Транзакция %s в кошельке не может быть идентифицирована как принадлежащая перемещенному кошельку</translation>
- </message>
- <message>
- <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
- <translation type="unfinished">Не удалось рассчитать комиссионные за бамп, поскольку неподтвержденные UTXO зависят от огромного скопления неподтвержденных транзакций.</translation>
- </message>
- <message>
- <source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
- <translation type="unfinished">Не удалось переименовать недействительный файл peers.dat. Пожалуйста, переместите или удалите его и повторите попытку.</translation>
- </message>
- <message>
- <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
- <translation type="unfinished">Оценка вознаграждения не удалась. Fallbackfee отключен. Подождите несколько блоков или включите %s.</translation>
- </message>
- <message>
- <source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
- <translation type="unfinished">Несовместимые параметры: -dnsseed=1 был указан явно, но -onlynet запрещает соединения с IPv4/IPv6</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
- <translation type="unfinished">Неверная сумма для %s=&lt;amount&gt;: '%s' (должна быть не менее минимальной комиссии %s, чтобы предотвратить застревание транзакций)</translation>
- </message>
- <message>
- <source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
- <translation type="unfinished">Исходящие соединения ограничены CJDNS (-onlynet=cjdns), но не указано -cjdnsreachable</translation>
- </message>
- <message>
- <source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is explicitly forbidden: -onion=0</source>
- <translation type="unfinished">Исходящие соединения ограничены Tor (-onlynet=onion), но прокси для выхода в сеть Tor явно запрещен: -onion=0</translation>
- </message>
- <message>
- <source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is not provided: none of -proxy, -onion or -listenonion is given</source>
- <translation type="unfinished">Исходящие соединения ограничены Tor (-onlynet=onion), но прокси для выхода в сеть Tor не указан: не указано ни одно из значений -proxy, -onion или -listenonion</translation>
- </message>
- <message>
- <source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
- <translation type="unfinished">Исходящие соединения ограничены i2p (-onlynet=i2p), но -i2psam не предоставляется</translation>
- </message>
- <message>
- <source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
- <translation type="unfinished">Размер входов превысил максимальный вес. Пожалуйста, попробуйте отправить меньшую сумму или объедините UTXO в вашем кошельке вручную</translation>
- </message>
- <message>
- <source>The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
- <translation type="unfinished">Общая сумма предварительно выбранных монет не покрывает цель транзакции. Пожалуйста, разрешите автоматический выбор других входов или включите больше монет вручную</translation>
- </message>
- <message>
- <source>Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
- <translation type="unfinished">Для транзакции требуется одно место назначения с не-0 значением, не-0 feerate или предварительно выбранный вход</translation>
- </message>
- <message>
- <source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
- <translation type="unfinished">Снимок UTXO не прошел проверку. Перезапустите, чтобы возобновить нормальную загрузку начального блока, или попробуйте загрузить другой снимок.</translation>
- </message>
- <message>
- <source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">Неподтвержденные UTXO доступны, но их расходование создает цепочку транзакций, которые будут отклонены мемпулом</translation>
- </message>
- <message>
- <source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
-
-The wallet might have been tampered with or created with malicious intent.
-</source>
- <translation type="unfinished">Найдена неожиданная запись о наследии в дескрипторе кошелька. Загрузка кошелька %s
-
-Возможно, кошелек был подделан или создан со злым умыслом.
-</translation>
- </message>
- <message>
- <source>Unrecognized descriptor found. Loading wallet %s
-
-The wallet might had been created on a newer version.
-Please try running the latest software version.
-</source>
- <translation type="unfinished">Найден нераспознанный дескриптор. Загрузка кошелька %s
-
-Возможно, кошелек был создан на более новой версии.
-Пожалуйста, попробуйте запустить последнюю версию программного обеспечения.
-</translation>
- </message>
- <message>
- <source>
-Unable to cleanup failed migration</source>
- <translation type="unfinished">
-Невозможно очистить неудачную миграцию</translation>
- </message>
- <message>
- <source>
-Unable to restore backup of wallet.</source>
- <translation type="unfinished">
-Невозможно восстановить резервную копию кошелька.</translation>
- </message>
- <message>
- <source>Block verification was interrupted</source>
- <translation type="unfinished">Проверка блока была прервана</translation>
- </message>
- <message>
- <source>Config setting for %s only applied on %s network when in [%s] section.</source>
- <translation type="unfinished">Настройка конфигурации для %s применяется только для сети %s, если она находится в разделе [%s].</translation>
- </message>
- <message>
- <source>Copyright (C) %i-%i</source>
- <translation type="unfinished">Авторское право (C) %i-%i</translation>
- </message>
- <message>
- <source>Corrupted block database detected</source>
- <translation type="unfinished">Обнаружена поврежденная база данных блоков</translation>
- </message>
- <message>
- <source>Could not find asmap file %s</source>
- <translation type="unfinished">Не удалось найти файл asmap %s</translation>
- </message>
- <message>
- <source>Could not parse asmap file %s</source>
- <translation type="unfinished">Не удалось разобрать файл asmap %s</translation>
- </message>
- <message>
- <source>Disk space is too low!</source>
- <translation type="unfinished">На диске слишком мало места!</translation>
- </message>
- <message>
- <source>Do you want to rebuild the block database now?</source>
- <translation type="unfinished">Хотите ли вы перестроить базу данных блоков сейчас?</translation>
- </message>
- <message>
- <source>Done loading</source>
- <translation type="unfinished">Загрузка завершена</translation>
- </message>
- <message>
- <source>Dump file %s does not exist.</source>
- <translation type="unfinished">Файл дампа %s не существует.</translation>
- </message>
- <message>
- <source>Error creating %s</source>
- <translation type="unfinished">Ошибка при создании %s</translation>
- </message>
- <message>
- <source>Error initializing block database</source>
- <translation type="unfinished">Ошибка инициализации базы данных блоков</translation>
- </message>
- <message>
- <source>Error initializing wallet database environment %s!</source>
- <translation type="unfinished">Ошибка инициализации среды базы данных бумажника %s!</translation>
- </message>
- <message>
- <source>Error loading %s</source>
- <translation type="unfinished">Ошибка загрузки %s</translation>
- </message>
- <message>
- <source>Error loading %s: Private keys can only be disabled during creation</source>
- <translation type="unfinished">Ошибка загрузки %s: Закрытые ключи можно отключить только во время создания</translation>
- </message>
- <message>
- <source>Error loading %s: Wallet corrupted</source>
- <translation type="unfinished">Ошибка при загрузке %s: Кошелек поврежден</translation>
- </message>
- <message>
- <source>Error loading %s: Wallet requires newer version of %s</source>
- <translation type="unfinished">Ошибка при загрузке %s: Wallet requires newer version of %s</translation>
- </message>
- <message>
- <source>Error loading block database</source>
- <translation type="unfinished">Ошибка при загрузке базы данных блоков</translation>
- </message>
- <message>
- <source>Error opening block database</source>
- <translation type="unfinished">Ошибка при открытии базы данных блоков</translation>
- </message>
- <message>
- <source>Error reading configuration file: %s</source>
- <translation type="unfinished">Ошибка при чтении файла конфигурации: %s</translation>
- </message>
- <message>
- <source>Error reading from database, shutting down.</source>
- <translation type="unfinished">Ошибка чтения из базы данных, завершение работы.</translation>
- </message>
- <message>
- <source>Error reading next record from wallet database</source>
- <translation type="unfinished">Ошибка при чтении следующей записи из базы данных кошелька</translation>
- </message>
- <message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Ошибка: Невозможно извлечь пункт назначения из сгенерированного scriptpubkey</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Ошибка: Не удалось добавить watchonly tx в watchonly wallet</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Ошибка: Не удалось удалить транзакции с возможностью наблюдения</translation>
- </message>
- <message>
- <source>Error: Couldn't create cursor into database</source>
- <translation type="unfinished">Ошибка: Не удалось создать курсор в базе данных</translation>
- </message>
- <message>
- <source>Error: Disk space is low for %s</source>
- <translation type="unfinished">Ошибка: На диске мало места для %s</translation>
- </message>
- <message>
- <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
- <translation type="unfinished">Ошибка: контрольные суммы дамп-файла не совпадают. Вычислено %s, ожидалось %s</translation>
- </message>
- <message>
- <source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Ошибка: Не удалось создать новый кошелек watchonly</translation>
- </message>
- <message>
- <source>Error: Got key that was not hex: %s</source>
- <translation type="unfinished">Ошибка: Получен ключ, который не был шестнадцатеричным: %s</translation>
- </message>
- <message>
- <source>Error: Got value that was not hex: %s</source>
- <translation type="unfinished">Ошибка: Получено значение, не являющееся шестнадцатеричным: %s</translation>
- </message>
- <message>
- <source>Error: Keypool ran out, please call keypoolrefill first</source>
- <translation type="unfinished">Ошибка: Пул для ключей закончился, сначала позвоните в keypoolrefill</translation>
- </message>
- <message>
- <source>Error: Missing checksum</source>
- <translation type="unfinished">Ошибка: Отсутствует контрольная сумма</translation>
- </message>
- <message>
- <source>Error: No %s addresses available.</source>
- <translation type="unfinished">Ошибка: Нет доступных адресов %s.</translation>
- </message>
- <message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Ошибка: Удалены не все часовые тх</translation>
- </message>
- <message>
- <source>Error: This wallet already uses SQLite</source>
- <translation type="unfinished">Ошибка: Этот кошелек уже использует SQLite</translation>
- </message>
- <message>
- <source>Error: This wallet is already a descriptor wallet</source>
- <translation type="unfinished">Ошибка: Этот кошелек уже является дескрипторным кошельком</translation>
- </message>
- <message>
- <source>Error: Unable to begin reading all records in the database</source>
- <translation type="unfinished">Ошибка: Невозможно начать чтение всех записей в базе данных</translation>
- </message>
- <message>
- <source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">Ошибка: Невозможно создать резервную копию кошелька</translation>
- </message>
- <message>
- <source>Error: Unable to parse version %u as a uint32_t</source>
- <translation type="unfinished">Ошибка: Невозможно разобрать версию %u как uint32_t</translation>
- </message>
- <message>
- <source>Error: Unable to read all records in the database</source>
- <translation type="unfinished">Ошибка: Невозможно прочитать все записи в базе данных</translation>
- </message>
- <message>
- <source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">Ошибка: Невозможно удалить данные адресной книги с возможностью просмотра</translation>
- </message>
- <message>
- <source>Error: Unable to write record to new wallet</source>
- <translation type="unfinished">Ошибка: Невозможно записать запись в новый кошелек</translation>
- </message>
- <message>
- <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation type="unfinished">Не удалось прослушать ни один порт. Используйте -listen=0, если вам это нужно.</translation>
- </message>
- <message>
- <source>Failed to rescan the wallet during initialization</source>
- <translation type="unfinished">Не удалось выполнить повторное сканирование кошелька во время инициализации</translation>
- </message>
- <message>
- <source>Failed to start indexes, shutting down..</source>
- <translation type="unfinished">Не удалось запустить индексы, завершение работы...</translation>
- </message>
- <message>
- <source>Failed to verify database</source>
- <translation type="unfinished">Не удалось проверить базу данных</translation>
- </message>
- <message>
- <source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
- <translation type="unfinished">Ставка комиссии (%s) ниже минимальной ставки комиссии (%s)</translation>
- </message>
- <message>
- <source>Ignoring duplicate -wallet %s.</source>
- <translation type="unfinished">Игнорирование дубликата -wallet %s.</translation>
- </message>
- <message>
- <source>Importing…</source>
- <translation type="unfinished">Импортирование…</translation>
- </message>
- <message>
- <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation type="unfinished">Неверный или не найденный блок генезиса. Неправильный каталог данных для сети?</translation>
- </message>
- <message>
- <source>Initialization sanity check failed. %s is shutting down.</source>
- <translation type="unfinished">Проверка разумности инициализации не удалась. %s отключается.</translation>
- </message>
- <message>
- <source>Input not found or already spent</source>
- <translation type="unfinished">Входные данные не найдены или уже израсходованы</translation>
- </message>
- <message>
- <source>Insufficient dbcache for block verification</source>
- <translation type="unfinished">Недостаточно dbcache для проверки блоков</translation>
- </message>
- <message>
- <source>Insufficient funds</source>
- <translation type="unfinished">Недостаточно средств</translation>
- </message>
- <message>
- <source>Invalid -i2psam address or hostname: '%s'</source>
- <translation type="unfinished">Неверный адрес или имя хоста -i2psam: '%s'</translation>
- </message>
- <message>
- <source>Invalid -onion address or hostname: '%s'</source>
- <translation type="unfinished">Неверный адрес или имя хоста: '%s'</translation>
- </message>
- <message>
- <source>Invalid -proxy address or hostname: '%s'</source>
- <translation type="unfinished">Неверный -прокси-адрес или имя хоста: '%s'</translation>
- </message>
- <message>
- <source>Invalid P2P permission: '%s'</source>
- <translation type="unfinished">Неверное разрешение P2P: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
- <translation type="unfinished">Неверная сумма для %s=&lt;amount&gt;: '%s' (должно быть не менее %s)</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">Неверная сумма для %s=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">Неверная сумма для -%s=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid netmask specified in -whitelist: '%s'</source>
- <translation type="unfinished">Неверная сетевая маска, указанная в параметре -whitelist: '%s'</translation>
- </message>
- <message>
- <source>Invalid port specified in %s: '%s'</source>
- <translation type="unfinished">Неверный порт, указанный в %s: '%s'</translation>
- </message>
- <message>
- <source>Invalid pre-selected input %s</source>
- <translation type="unfinished">Недопустимый предварительно выбранный вход %s</translation>
- </message>
- <message>
- <source>Listening for incoming connections failed (listen returned error %s)</source>
- <translation type="unfinished">Прослушивание входящих соединений не удалось (прослушивание вернуло ошибку %s)</translation>
- </message>
- <message>
- <source>Loading P2P addresses…</source>
- <translation type="unfinished">Загрузка адресов P2P…</translation>
- </message>
- <message>
- <source>Loading banlist…</source>
- <translation type="unfinished">Загрузка банлиста…</translation>
- </message>
- <message>
- <source>Loading block index…</source>
- <translation type="unfinished">Загрузка индекса блока…</translation>
- </message>
- <message>
- <source>Loading wallet…</source>
- <translation type="unfinished">Загрузка кошелька…</translation>
- </message>
- <message>
- <source>Missing amount</source>
- <translation type="unfinished">Недостающая сумма</translation>
- </message>
- <message>
- <source>Missing solving data for estimating transaction size</source>
- <translation type="unfinished">Недостающие решающие данные для оценки размера транзакции</translation>
- </message>
- <message>
- <source>Need to specify a port with -whitebind: '%s'</source>
- <translation type="unfinished">Необходимо указать порт с помощью опции -whitebind: '%s'</translation>
- </message>
- <message>
- <source>No addresses available</source>
- <translation type="unfinished">Адреса отсутствуют</translation>
- </message>
- <message>
- <source>Not enough file descriptors available.</source>
- <translation type="unfinished">Недостаточно доступных дескрипторов файлов.</translation>
- </message>
- <message>
- <source>Not found pre-selected input %s</source>
- <translation type="unfinished">Не найден предварительно выбранный вход %s</translation>
- </message>
- <message>
- <source>Not solvable pre-selected input %s</source>
- <translation type="unfinished">Не решаемый предварительно выбранный вход %s</translation>
- </message>
- <message>
- <source>Prune cannot be configured with a negative value.</source>
- <translation type="unfinished">Prune не может быть настроена с отрицательным значением.</translation>
- </message>
- <message>
- <source>Prune mode is incompatible with -txindex.</source>
- <translation type="unfinished">Режим Prune несовместим с режимом -txindex.</translation>
- </message>
- <message>
- <source>Pruning blockstore…</source>
- <translation type="unfinished">Обрезка блочного дерева…</translation>
- </message>
- <message>
- <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
- <translation type="unfinished">Сокращение -maxconnections с %d до %d из-за ограничений системы.</translation>
- </message>
- <message>
- <source>Replaying blocks…</source>
- <translation type="unfinished">Воспроизведение блоков…</translation>
- </message>
- <message>
- <source>Rescanning…</source>
- <translation type="unfinished">Сканирование…</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Failed to execute statement to verify database: %s</source>
- <translation type="unfinished">SQLiteDatabase: Не удалось выполнить оператор для проверки базы данных: %s</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Failed to prepare statement to verify database: %s</source>
- <translation type="unfinished">SQLiteDatabase: Не удалось подготовить утверждение для проверки базы данных: %s</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Failed to read database verification error: %s</source>
- <translation type="unfinished">База данных SQLiteDatabase: Не удалось прочитать базу данных Ошибка проверки: %s</translation>
- </message>
- <message>
- <source>SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
- <translation type="unfinished">SQLiteDatabase: Неожиданный идентификатор приложения. Ожидалось %u, получено %u</translation>
- </message>
- <message>
- <source>Section [%s] is not recognized.</source>
- <translation type="unfinished">Секция [%s] не распознана.</translation>
- </message>
- <message>
- <source>Signing transaction failed</source>
- <translation type="unfinished">Не удалось выполнить операцию подписания</translation>
- </message>
- <message>
- <source>Specified -walletdir "%s" does not exist</source>
- <translation type="unfinished">Указанный -walletdir "%s" не существует</translation>
- </message>
- <message>
- <source>Specified -walletdir "%s" is a relative path</source>
- <translation type="unfinished">Указанный -walletdir "%s" является относительным путем</translation>
- </message>
- <message>
- <source>Specified -walletdir "%s" is not a directory</source>
- <translation type="unfinished">Указанный -walletdir "%s" не является каталогом</translation>
- </message>
- <message>
- <source>Specified blocks directory "%s" does not exist.</source>
- <translation type="unfinished">Указанный каталог блоков "%s" не существует.</translation>
- </message>
- <message>
- <source>Specified data directory "%s" does not exist.</source>
- <translation type="unfinished">Указанный каталог данных "%s" не существует.</translation>
- </message>
- <message>
- <source>Starting network threads…</source>
- <translation type="unfinished">Запуск сетевых потоков…</translation>
- </message>
- <message>
- <source>The source code is available from %s.</source>
- <translation type="unfinished">Исходный код доступен по адресу %s.</translation>
- </message>
- <message>
- <source>The specified config file %s does not exist</source>
- <translation type="unfinished">Указанный файл конфигурации %s не существует</translation>
- </message>
- <message>
- <source>The transaction amount is too small to pay the fee</source>
- <translation type="unfinished">Сумма транзакции слишком мала, чтобы оплатить комиссию</translation>
- </message>
- <message>
- <source>The wallet will avoid paying less than the minimum relay fee.</source>
- <translation type="unfinished">Кошелек позволит не платить меньше минимальной комиссии за ретрансляцию.</translation>
- </message>
- <message>
- <source>This is experimental software.</source>
- <translation type="unfinished">Это экспериментальное программное обеспечение.</translation>
- </message>
- <message>
- <source>This is the minimum transaction fee you pay on every transaction.</source>
- <translation type="unfinished">Это минимальная комиссия, которую вы платите для любой транзакции.</translation>
- </message>
- <message>
- <source>This is the transaction fee you will pay if you send a transaction.</source>
- <translation type="unfinished">Это размер комиссии, которую вы заплатите при отправке транзакции.</translation>
- </message>
- <message>
- <source>Transaction amount too small</source>
- <translation type="unfinished">Слишком маленькая сумма транзакции</translation>
- </message>
- <message>
- <source>Transaction amounts must not be negative</source>
- <translation type="unfinished">Суммы операций не должны быть отрицательными</translation>
- </message>
- <message>
- <source>Transaction change output index out of range</source>
- <translation type="unfinished">Выходной индекс изменения транзакции вне диапазона</translation>
- </message>
- <message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Транзакция имеет слишком длинную цепочку mempool</translation>
- </message>
- <message>
- <source>Transaction must have at least one recipient</source>
- <translation type="unfinished">Транзакция должна иметь хотя бы одного получателя</translation>
- </message>
- <message>
- <source>Transaction needs a change address, but we can't generate it.</source>
- <translation type="unfinished">Транзакция требует смены адреса, но мы не можем его сгенерировать.</translation>
- </message>
- <message>
- <source>Transaction too large</source>
- <translation type="unfinished">Слишком большая транзакция</translation>
- </message>
- <message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">Невозможно выделить память для -maxsigcachesize: '%s' MiB</translation>
- </message>
- <message>
- <source>Unable to bind to %s on this computer (bind returned error %s)</source>
- <translation type="unfinished">Невозможно привязаться к %s на этом компьютере (при привязке возникла ошибка %s)</translation>
- </message>
- <message>
- <source>Unable to bind to %s on this computer. %s is probably already running.</source>
- <translation type="unfinished">Невозможно установить связь с %s на этом компьютере. вероятно, %s уже запущен.</translation>
- </message>
- <message>
- <source>Unable to create the PID file '%s': %s</source>
- <translation type="unfinished">Невозможно создать PID-файл '%s': %s</translation>
- </message>
- <message>
- <source>Unable to find UTXO for external input</source>
- <translation type="unfinished">Невозможно найти UTXO для внешнего входа</translation>
- </message>
- <message>
- <source>Unable to generate initial keys</source>
- <translation type="unfinished">Невозможно сгенерировать начальные ключи</translation>
- </message>
- <message>
- <source>Unable to generate keys</source>
- <translation type="unfinished">Невозможно сгенерировать ключи</translation>
- </message>
- <message>
- <source>Unable to open %s for writing</source>
- <translation type="unfinished">Невозможно открыть %s для записи</translation>
- </message>
- <message>
- <source>Unable to parse -maxuploadtarget: '%s'</source>
- <translation type="unfinished">Невозможно разобрать -maxuploadtarget: '%s'</translation>
- </message>
- <message>
- <source>Unable to start HTTP server. See debug log for details.</source>
- <translation type="unfinished">Невозможно запустить HTTP-сервер. Подробности см. в журнале отладки.</translation>
- </message>
- <message>
- <source>Unable to unload the wallet before migrating</source>
- <translation type="unfinished">Невозможно разгрузить кошелек перед миграцией</translation>
- </message>
- <message>
- <source>Unknown -blockfilterindex value %s.</source>
- <translation type="unfinished">Неизвестное значение -blockfilterindex %s.</translation>
- </message>
- <message>
- <source>Unknown address type '%s'</source>
- <translation type="unfinished">Неизвестный тип адреса '%s'</translation>
- </message>
- <message>
- <source>Unknown change type '%s'</source>
- <translation type="unfinished">Неизвестный тип изменения '%s'</translation>
- </message>
- <message>
- <source>Unknown network specified in -onlynet: '%s'</source>
- <translation type="unfinished">Неизвестная сеть, указанная в параметре -onlynet: '%s'</translation>
- </message>
- <message>
- <source>Unknown new rules activated (versionbit %i)</source>
- <translation type="unfinished">Неизвестные новые правила активированы (versionbit %i)</translation>
- </message>
- <message>
- <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
- <translation type="unfinished">Неподдерживаемый уровень глобального протоколирования %s=%s. Допустимые значения: %s.</translation>
- </message>
- <message>
- <source>acceptstalefeeestimates is not supported on %s chain.</source>
- <translation type="unfinished">acceptstalefeeestimates не поддерживается в цепочке %s.</translation>
- </message>
- <message>
- <source>Unsupported logging category %s=%s.</source>
- <translation type="unfinished">Неподдерживаемая категория протоколирования %s=%s.</translation>
- </message>
- <message>
- <source>User Agent comment (%s) contains unsafe characters.</source>
- <translation type="unfinished">Комментарий агента пользователя (%s) содержит небезопасные символы.</translation>
- </message>
- <message>
- <source>Verifying blocks…</source>
- <translation type="unfinished">Проверка блоков…</translation>
- </message>
- <message>
- <source>Verifying wallet(s)…</source>
- <translation type="unfinished">Проверка кошелька(ов)…</translation>
- </message>
- <message>
- <source>Wallet needed to be rewritten: restart %s to complete</source>
- <translation type="unfinished">Необходимо переписать кошелек: перезапустите %s для завершения</translation>
- </message>
- <message>
- <source>Settings file could not be read</source>
- <translation type="unfinished">Файл настроек не может быть прочитан</translation>
- </message>
- <message>
- <source>Settings file could not be written</source>
- <translation type="unfinished">Не удалось записать файл настроек</translation>
- </message>
-</context>
-</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_si.ts b/src/qt/locale/bitcoin_si.ts
index 6877d44933..5206b23486 100644
--- a/src/qt/locale/bitcoin_si.ts
+++ b/src/qt/locale/bitcoin_si.ts
@@ -875,10 +875,6 @@
<translation type="unfinished">අතරු මුහුණතේ &amp;භාෂාව:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">එබ්බවූ "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;හරි</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sk.ts b/src/qt/locale/bitcoin_sk.ts
index 40621b0fa5..d0e8b11fe8 100644
--- a/src/qt/locale/bitcoin_sk.ts
+++ b/src/qt/locale/bitcoin_sk.ts
@@ -1684,18 +1684,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Použiť samostatný SOCKS&amp;5 proxy server na nadviazanie spojenia s peer-mi cez službu Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Písmo s pevnou šírkou na karte Prehľad:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">zabudovaný "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">najbližší zodpovedajúci "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Zrušiť</translation>
</message>
@@ -1917,10 +1905,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT bola uložená na disk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Pošle %1 do %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">vlastná adresa</translation>
</message>
@@ -2933,10 +2917,6 @@ Poznámka: Keďže poplatok je počítaný za bajt, poplatok pri sadzbe "100 sat
<translation type="unfinished">Vytvorí čiastočne podpísanú Bitcoin transakciu (Partially Signed Bitcoin Transaction - PSBT) na použitie napríklad s offline %1 peňaženkou alebo v hardvérovej peňaženke kompatibilnej s PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished"> z peňaženky '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 do '%2'</translation>
</message>
@@ -3432,10 +3412,6 @@ Poznámka: Keďže poplatok je počítaný za bajt, poplatok pri sadzbe "100 sat
<translation type="unfinished">Index výstupu</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certifikát nebol overený)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Kupec</translation>
</message>
@@ -4439,10 +4415,6 @@ S peňaženkou mohlo byť manipulované alebo mohla byť vytvorená s úmyselne
<translation type="unfinished">Výstupný index transakcie zmeny je mimo rozsahu</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transakcia má v transakčnom zásobníku príliš dlhý reťazec</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transakcia musí mať aspoň jedného príjemcu</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sl.ts b/src/qt/locale/bitcoin_sl.ts
index c74b3b13fb..ceae34b731 100644
--- a/src/qt/locale/bitcoin_sl.ts
+++ b/src/qt/locale/bitcoin_sl.ts
@@ -1668,18 +1668,6 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Uporabi ločen posredniški strežik SOCKS5 za povezavo s soležniki prek storitev onion (Tor):</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Pisava enakomerne širine v zavihku Pregled:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">vdelan "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">najboljše ujemanje "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;V redu</translation>
</message>
@@ -1921,10 +1909,6 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">DPBT shranjena na disk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Pošlje %1 na %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">lasten naslov</translation>
</message>
@@ -2957,10 +2941,6 @@ Opomba: Ker se provizija izračuna na bajt, bi provizija "100 satoshijev na kvB"
<translation type="unfinished">Ustvari delno podpisano bitcoin-transakcijo (DPBT, angl. PSBT), ki jo lahko kopirate in potem podpišete n.pr. z nepovezano (offline) %1 denarnico ali pa s hardversko denarnico, ki podpira DPBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished"> iz denarnice '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 v '%2'</translation>
</message>
@@ -3482,10 +3462,6 @@ Opomba: Ker se provizija izračuna na bajt, bi provizija "100 satoshijev na kvB"
<translation type="unfinished">Indeks izhoda</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certifikat ni bil preverjen)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Trgovec</translation>
</message>
@@ -4244,14 +4220,6 @@ Obnovitev varnostne kopije denarnice ni bila mogoča.</translation>
<translation type="unfinished">Napaka pri branju naslednjega zapisa v podatkovni bazi denarnice.</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Napaka: dodajanje opazovane transakcije v opazovano denarnico je spodletelo</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Napaka: brisanje opazovanih transakcij je spodletelo</translation>
- </message>
- <message>
<source>Error: Couldn't create cursor into database</source>
<translation type="unfinished">Napaka: ne morem ustvariti kurzorja v bazo</translation>
</message>
@@ -4288,10 +4256,6 @@ Obnovitev varnostne kopije denarnice ni bila mogoča.</translation>
<translation type="unfinished">Napaka: na voljo ni nobenega naslova '%s'</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Napaka: nekaterih opazovanih transakcij ni bilo mogoče izbrisati</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Napaka: ta denarnica že uporablja SQLite</translation>
</message>
@@ -4532,10 +4496,6 @@ Obnovitev varnostne kopije denarnice ni bila mogoča.</translation>
<translation type="unfinished">Indeks izhoda vračila je izven obsega.</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transakcija je del predolge verige nepotrjenih transakcij</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transakcija mora imeti vsaj enega prejemnika.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_so.ts b/src/qt/locale/bitcoin_so.ts
index 343e5aacbf..48c02c1fa2 100644
--- a/src/qt/locale/bitcoin_so.ts
+++ b/src/qt/locale/bitcoin_so.ts
@@ -187,6 +187,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Supplied passrases ma u dhigma.</translation>
</message>
<message>
+ <source>Wallet unlock failed</source>
+ <translation type="unfinished">Wallet Unlock failed</translation>
+ </message>
+ <message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
<translation type="unfinished">Passrase soo galay for decryption jeebka ahaa mid khaldan.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sr.ts b/src/qt/locale/bitcoin_sr.ts
index 4d1e05a7ab..5646cf7938 100644
--- a/src/qt/locale/bitcoin_sr.ts
+++ b/src/qt/locale/bitcoin_sr.ts
@@ -94,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Десила се грешка приликом покушаја да се листа адреса сачува на %1. Молимо покушајте поново.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Адресе за слање - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Адресе за примање - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Извоз Неуспешан</translation>
</message>
@@ -266,6 +274,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Da li želiš da poništiš podešavanja na početne vrednosti, ili da prekineš bez promena?</translation>
</message>
<message>
+ <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
+ <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
+ <translation type="unfinished">Догодила се фатална грешка. Проверите да ли је могуће уписивати у "settings" фајл или покушајте да покренете са "-nosettings".</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Грешка: %1</translation>
</message>
@@ -661,10 +674,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Затвори новчаник</translation>
</message>
<message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Поврати Новчаник...</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">Затвори све новчанике</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Пренеси Новчаник</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Пренеси новчаник</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Прикажи поруку помоћи %1 за листу са могућим опцијама Биткоин командне линије</translation>
</message>
@@ -685,6 +711,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Нема доступних новчаника</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Подаци Новчаника</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Поврати Новчаник</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">Име Новчаника</translation>
@@ -987,6 +1023,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Пренеси Новчаник</translation>
+ </message>
+ </context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1012,6 +1055,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Поврати Новчаник</translation>
+ </message>
+ </context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -1586,18 +1637,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Користите посебан СОЦКС&amp;5 прокси да бисте дошли до вршњака преко услуга Тор онион:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Једноразредни фонт на картици Преглед:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">уграђено ”%1”</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">Најближа сличност ”%1”</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Уреду</translation>
</message>
@@ -1819,10 +1858,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ПСБТ је сачуван на диску.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">*Шаље %1 до %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">сопствена адреса</translation>
</message>
@@ -2775,10 +2810,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Креира делимично потписану Биткоин трансакцију (PSBT) за коришћење са нпр. офлајн %1 новчаником, или PSBT компатибилним хардверским новчаником. </translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">из новчаника '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 до '%2'</translation>
</message>
@@ -3263,10 +3294,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Излазни индекс</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Сертификат још није проверен)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Трговац</translation>
</message>
@@ -3651,6 +3678,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Резервна копија новчаника</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Подаци Новчаника</translation>
+ </message>
+ <message>
<source>Backup Failed</source>
<translation type="unfinished">Резервна копија није успела</translation>
</message>
@@ -3946,10 +3978,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Износ трансакције не може бити негативан</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Трансакција има предугачак ланац у удруженој меморији</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Трансакција мора имати бар једног примаоца</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sr@ijekavianlatin.ts b/src/qt/locale/bitcoin_sr@ijekavianlatin.ts
index de4620da00..a10aa71c10 100644
--- a/src/qt/locale/bitcoin_sr@ijekavianlatin.ts
+++ b/src/qt/locale/bitcoin_sr@ijekavianlatin.ts
@@ -94,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Десила се грешка приликом покушаја да се листа адреса сачува на %1. Молимо покушајте поново.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Адреса пошиљаоца - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Адресе за примање - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Извоз Неуспешан</translation>
</message>
@@ -262,6 +270,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Da li želiš da poništiš podešavanja na početne vrednosti, ili da prekineš bez promena?</translation>
</message>
<message>
+ <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
+ <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
+ <translation type="unfinished">Догодила се фатална грешка. Проверите да ли је могуће уписивати у "settings" фајл или покушајте да покренете са "-nosettings".</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Greška: %1</translation>
</message>
@@ -657,10 +670,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Затвори новчаник</translation>
</message>
<message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Поврати новчаник...</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">Затвори све новчанике</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Пренеси Новчаник</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Пренеси новчаник</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Прикажи поруку помоћи %1 за листу са могућим опцијама Биткоин командне линије</translation>
</message>
@@ -681,6 +707,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Нема доступних новчаника</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Подаци Новчаника</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Поврати Новчаник</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">Име Новчаника</translation>
@@ -983,6 +1019,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Пренеси Новчаник</translation>
+ </message>
+ </context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1008,6 +1051,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Поврати Новчаник</translation>
+ </message>
+ </context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -1582,18 +1633,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Користите посебан СОЦКС&amp;5 прокси да бисте дошли до вршњака преко услуга Тор онион:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Једноразредни фонт на картици Преглед:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">уграђено ”%1”</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">Најближа сличност ”%1”</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Уреду</translation>
</message>
@@ -1815,10 +1854,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ПСБТ је сачуван на диску.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">*Шаље %1 до %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">сопствена адреса</translation>
</message>
@@ -2771,10 +2806,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Креира делимично потписану Биткоин трансакцију (PSBT) за коришћење са нпр. офлајн %1 новчаником, или PSBT компатибилним хардверским новчаником. </translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">из новчаника '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 до '%2'</translation>
</message>
@@ -3259,10 +3290,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Излазни индекс</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Сертификат још није проверен)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Trgovac</translation>
</message>
@@ -3647,6 +3674,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Резервна копија новчаника</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Подаци Новчаника</translation>
+ </message>
+ <message>
<source>Backup Failed</source>
<translation type="unfinished">Резервна копија није успела</translation>
</message>
@@ -3942,10 +3974,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Износ трансакције не може бити негативан</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Трансакција има предугачак ланац у удруженој меморији</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Трансакција мора имати бар једног примаоца</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sr@latin.ts b/src/qt/locale/bitcoin_sr@latin.ts
index 9385b01e9c..c7b80f3b02 100644
--- a/src/qt/locale/bitcoin_sr@latin.ts
+++ b/src/qt/locale/bitcoin_sr@latin.ts
@@ -94,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Desila se greška prilikom čuvanja liste adresa u %1. Molimo pokusajte ponovo.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Адреса пошиљаоца - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Адресе за примање - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Izvoz Neuspeo</translation>
</message>
@@ -262,6 +270,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Da li želiš da poništiš podešavanja na početne vrednosti, ili da prekineš bez promena?</translation>
</message>
<message>
+ <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
+ <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
+ <translation type="unfinished">Догодила се фатална грешка. Проверите да ли је могуће уписивати у "settings" фајл или покушајте да покренете са "-nosettings".</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Greška: %1</translation>
</message>
@@ -657,10 +670,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Затвори новчаник</translation>
</message>
<message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Поврати новчаник...</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">Затвори све новчанике</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Пренеси Новчаник</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Пренеси новчаник</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Прикажи поруку помоћи %1 за листу са могућим опцијама Биткоин командне линије</translation>
</message>
@@ -681,6 +707,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Нема доступних новчаника</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Подаци Новчаника</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Поврати Новчаник</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">Име Новчаника</translation>
@@ -983,6 +1019,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Пренеси Новчаник</translation>
+ </message>
+ </context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1008,6 +1051,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Поврати Новчаник</translation>
+ </message>
+ </context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -1578,18 +1629,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Користите посебан СОЦКС&amp;5 прокси да бисте дошли до вршњака преко услуга Тор онион:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Једноразредни фонт на картици Преглед:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">уграђено ”%1”</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">Најближа сличност ”%1”</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Уреду</translation>
</message>
@@ -1811,10 +1850,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ПСБТ је сачуван на диску.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">*Шаље %1 до %2</translation>
- </message>
- <message>
<source>own address</source>
<translation type="unfinished">sopstvena adresa</translation>
</message>
@@ -2767,10 +2802,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Креира делимично потписану Биткоин трансакцију (PSBT) за коришћење са нпр. офлајн %1 новчаником, или PSBT компатибилним хардверским новчаником. </translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">из новчаника '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 до '%2'</translation>
</message>
@@ -3255,10 +3286,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Излазни индекс</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Сертификат још није проверен)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Trgovac</translation>
</message>
@@ -3643,6 +3670,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Резервна копија новчаника</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Подаци Новчаника</translation>
+ </message>
+ <message>
<source>Backup Failed</source>
<translation type="unfinished">Резервна копија није успела</translation>
</message>
@@ -3938,10 +3970,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Износ трансакције не може бити негативан</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Трансакција има предугачак ланац у удруженој меморији</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Трансакција мора имати бар једног примаоца</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sv.ts b/src/qt/locale/bitcoin_sv.ts
index feb7c57e1f..19903798dd 100644
--- a/src/qt/locale/bitcoin_sv.ts
+++ b/src/qt/locale/bitcoin_sv.ts
@@ -15,7 +15,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Kopiera den markerade adressen till systemets Urklipp</translation>
+ <translation type="unfinished">Kopiera den tillfälligt markerade adressen till systemets urklippsfunktion</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -1079,10 +1079,6 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Migrering av plånboken ' %1 ' genomförd.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">Watchonly-skript har migrerats till en ny plånbok med namnet '%1'.</translation>
- </message>
- <message>
<source>Migration failed</source>
<translation type="unfinished">Migrering misslyckades</translation>
</message>
@@ -1138,7 +1134,12 @@ Om den här plånboken innehåller lösbara</translation>
<extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
<translation type="unfinished">Återställ plånboksvarning</translation>
</message>
- </context>
+ <message>
+ <source>Restore wallet message</source>
+ <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
+ <translation type="unfinished">Återskapa plånboksmeddelande</translation>
+ </message>
+</context>
<context>
<name>WalletController</name>
<message>
@@ -1532,6 +1533,10 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Minimera istället för att stänga programmet när fönstret stängs. När detta alternativ är aktiverat stängs programmet endast genom att välja Stäng i menyn.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Typsnitt på översiktsfliken:</translation>
+ </message>
+ <message>
<source>Open the %1 configuration file from the working directory.</source>
<translation type="unfinished">Öppna konfigurationsfilen %1 från arbetskatalogen.</translation>
</message>
@@ -1695,10 +1700,6 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Använd en fristående SOCKS&amp;5 proxy för att nå noder via Tor onion tjänster:</translation>
</message>
<message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">närmast träff " %1 "</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Avbryt</translation>
</message>
@@ -1895,8 +1896,8 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">PSBT sparad till disk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Skickar %1 till %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Skickar %1 till %2</translation>
</message>
<message>
<source>own address</source>
@@ -1931,6 +1932,10 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Transaktionen behöver signatur(er).</translation>
</message>
<message>
+ <source>(But no wallet is loaded.)</source>
+ <translation type="unfinished">&lt;br&gt;(</translation>
+ </message>
+ <message>
<source>(But this wallet cannot sign transactions.)</source>
<translation type="unfinished">(Den här plånboken kan inte signera transaktioner.)</translation>
</message>
@@ -2706,10 +2711,6 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Skapar en delvis signerad Bitcoin transaktion (PSBT) att använda vid t.ex. en offline %1 plånbok, eller en PSBT-kompatibel hårdvaruplånbok.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">från plånbok: '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 till '%2'</translation>
</message>
@@ -3163,10 +3164,6 @@ Om den här plånboken innehåller lösbara</translation>
<translation type="unfinished">Utmatningsindex</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certifikatet verifierades inte)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Handlare</translation>
</message>
@@ -3935,10 +3932,6 @@ Gå till Fil &gt; Öppna plånbok för att läsa in en plånbok.
<translation type="unfinished">Transaktionsbelopp får ej vara negativt</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transaktionen har för lång mempool-kedja</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transaktionen måste ha minst en mottagare</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sw.ts b/src/qt/locale/bitcoin_sw.ts
index d6c7106a32..499eb68538 100644
--- a/src/qt/locale/bitcoin_sw.ts
+++ b/src/qt/locale/bitcoin_sw.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Bonyeza kitufe cha kulia kufanya mabadiliko kwenye anuani au chapa</translation>
+ <translation type="unfinished">Bonyeza kulia ili kuhariri anwani au lebo</translation>
</message>
<message>
<source>Create a new address</source>
diff --git a/src/qt/locale/bitcoin_ta.ts b/src/qt/locale/bitcoin_ta.ts
index 0cd999db5d..6255126438 100644
--- a/src/qt/locale/bitcoin_ta.ts
+++ b/src/qt/locale/bitcoin_ta.ts
@@ -2108,10 +2108,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">%1 (%2 ப்ளாக்ஸ்)</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">வாலட்டில் இருந்து '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 இருந்து '%2'</translation>
</message>
@@ -2522,10 +2518,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">வெளியீட்டு அட்டவணை</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(சான்றிதழ் சரிபார்க்கப்படவில்லை)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">வணிகர்</translation>
</message>
diff --git a/src/qt/locale/bitcoin_te.ts b/src/qt/locale/bitcoin_te.ts
index dfbe5c17c7..e30f9bebf5 100644
--- a/src/qt/locale/bitcoin_te.ts
+++ b/src/qt/locale/bitcoin_te.ts
@@ -1617,18 +1617,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Tor onion సేవల ద్వారా సహచరులను చేరుకోవడానికి ప్రత్యేక SOCKS&amp;5 ప్రాక్సీని ఉపయోగించండి:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">ఓవర్‌వ్యూ ట్యాబ్‌లో మోనోస్పేస్డ్ ఫాంట్:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">పొందుపరిచారు "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">సన్నిహిత సరిపోలిక "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;అలాగే</translation>
</message>
@@ -1866,10 +1854,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT డిస్క్‌లో సేవ్ చేయబడింది.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* %1 ని %2 కి పంపుతుంది</translation>
- </message>
- <message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
<translation type="unfinished">లావాదేవీ రుసుము లేదా మొత్తం లావాదేవీ మొత్తాన్ని లెక్కించడం సాధ్యం కాలేదు.</translation>
</message>
@@ -2320,10 +2304,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">%1 (%2 బ్లాక్‌లు)</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">వాలెట్ నుండి '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 కు '%2'</translation>
</message>
@@ -2619,10 +2599,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">లావాదేవీ మార్పు అవుట్‌పుట్ సూచిక పరిధి వెలుపల ఉంది</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">లావాదేవీ మెంపూల్ చైన్‌లో చాలా పొడవుగా ఉంది</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">లావాదేవీకి కనీసం ఒక గ్రహీత ఉండాలి</translation>
</message>
diff --git a/src/qt/locale/bitcoin_th.ts b/src/qt/locale/bitcoin_th.ts
deleted file mode 100644
index 0bd4235ac5..0000000000
--- a/src/qt/locale/bitcoin_th.ts
+++ /dev/null
@@ -1,880 +0,0 @@
-<TS version="2.1" language="th">
-<context>
- <name>AddressBookPage</name>
- <message>
- <source>Create a new address</source>
- <translation type="unfinished">สร้างแอดเดรสใหม่</translation>
- </message>
- </context>
-<context>
- <name>BitcoinApplication</name>
- <message>
- <source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">ไฟล์ตั้งค่า%1 อาจเสียหายหรือไม่ถูกต้อง</translation>
- </message>
- </context>
-<context>
- <name>QObject</name>
- <message>
- <source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 ยังไม่ออกอย่างปลอดภัย...</translation>
- </message>
- <message>
- <source>Inbound</source>
- <extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
- <translation type="unfinished">ขาเข้า</translation>
- </message>
- <message>
- <source>Outbound</source>
- <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
- <translation type="unfinished">ขาออก</translation>
- </message>
- <message>
- <source>Manual</source>
- <extracomment>Peer connection type established manually through one of several methods.</extracomment>
- <translation type="unfinished">คู่มือ</translation>
- </message>
- <message numerus="yes">
- <source>%n second(s)</source>
- <translation type="unfinished">
- <numerusform>%n second(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n minute(s)</source>
- <translation type="unfinished">
- <numerusform>%n minute(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation type="unfinished">
- <numerusform>%n hour(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation type="unfinished">
- <numerusform>%n day(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation type="unfinished">
- <numerusform>%n week(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n year(s)</source>
- <translation type="unfinished">
- <numerusform>%n year(s)</numerusform>
- </translation>
- </message>
- <message>
- <source>%1 B</source>
- <translation type="unfinished">%1 ไบต์</translation>
- </message>
- <message>
- <source>%1 kB</source>
- <translation type="unfinished">%1 กิโลไบต์</translation>
- </message>
- <message>
- <source>%1 MB</source>
- <translation type="unfinished">%1 เมกะไบต์</translation>
- </message>
- <message>
- <source>%1 GB</source>
- <translation type="unfinished">%1 จิกะไบต์</translation>
- </message>
-</context>
-<context>
- <name>BitcoinGUI</name>
- <message>
- <source>Connecting to peers…</source>
- <translation type="unfinished">กำลังเชื่อมต่อไปยัง peers…</translation>
- </message>
- <message>
- <source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">ขอการชำระเงิน (สร้างรหัส QR และ bitcoin: URIs)</translation>
- </message>
- <message>
- <source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">แสดงรายการที่ใช้ในการส่งแอดเดรสและเลเบลที่ใช้แล้ว</translation>
- </message>
- <message>
- <source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">แสดงรายการที่ได้ใช้ในการรับแอดเดรสและเลเบล</translation>
- </message>
- <message numerus="yes">
- <source>Processed %n block(s) of transaction history.</source>
- <translation type="unfinished">
- <numerusform>Processed %n block(s) of transaction history.</numerusform>
- </translation>
- </message>
- <message>
- <source>%1 behind</source>
- <translation type="unfinished">%1 เบื้องหลัง</translation>
- </message>
- <message>
- <source>Catching up…</source>
- <translation type="unfinished">กำลังติดตามถึงรายการล่าสุด…</translation>
- </message>
- <message>
- <source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">บล็อกที่ได้รับล่าสุดถูกสร้างขึ้นเมื่อ %1 ที่แล้ว</translation>
- </message>
- <message>
- <source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">ธุรกรรมหลังจากนี้จะยังไม่ปรากฏให้เห็น</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">ข้อผิดพลาด</translation>
- </message>
- <message>
- <source>Warning</source>
- <translation type="unfinished">คำเตือน</translation>
- </message>
- <message>
- <source>Information</source>
- <translation type="unfinished">ข้อมูล</translation>
- </message>
- <message>
- <source>Up to date</source>
- <translation type="unfinished">ปัจจุบัน</translation>
- </message>
- <message>
- <source>Restore Wallet…</source>
- <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
- <translation type="unfinished">กู้คืนวอลเล็ต…</translation>
- </message>
- <message>
- <source>Restore a wallet from a backup file</source>
- <extracomment>Status tip for Restore Wallet menu item</extracomment>
- <translation type="unfinished">กู้คืนวอลเล็ตจากไฟล์สำรองข้อมูล</translation>
- </message>
- <message>
- <source>Close all wallets</source>
- <translation type="unfinished">ปิดกระเป๋าสตางค์ทั้งหมด</translation>
- </message>
- <message>
- <source>&amp;Mask values</source>
- <translation type="unfinished">&amp;ค่ามาสก์</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">วอลเล็ต เริ่มต้น</translation>
- </message>
- <message>
- <source>No wallets available</source>
- <translation type="unfinished">ไม่มี วอลเล็ต ที่พร้อมใช้งาน</translation>
- </message>
- <message>
- <source>Wallet Data</source>
- <extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">ข้อมูล วอลเล็ต</translation>
- </message>
- <message>
- <source>Load Wallet Backup</source>
- <extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">โหลดสำรองข้อมูลวอลเล็ต</translation>
- </message>
- <message>
- <source>Restore Wallet</source>
- <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
- <translation type="unfinished">กู้คืนวอลเล็ต</translation>
- </message>
- <message>
- <source>Wallet Name</source>
- <extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">ชื่อ วอลเล็ต</translation>
- </message>
- <message>
- <source>&amp;Window</source>
- <translation type="unfinished">&amp;วินโดว์</translation>
- </message>
- <message>
- <source>Zoom</source>
- <translation type="unfinished">ซูม</translation>
- </message>
- <message>
- <source>Main Window</source>
- <translation type="unfinished">วินโดว์ หลัก</translation>
- </message>
- <message>
- <source>%1 client</source>
- <translation type="unfinished">%1 ลูกค้า</translation>
- </message>
- <message>
- <source>&amp;Hide</source>
- <translation type="unfinished">&amp;ซ่อน</translation>
- </message>
- <message>
- <source>S&amp;how</source>
- <translation type="unfinished">&amp;แสดง</translation>
- </message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network.</source>
- <extracomment>A substring of the tooltip.</extracomment>
- <translation type="unfinished">
- <numerusform>%n เครือข่ายที่สามารถใช้เชื่อมต่อไปยังเครือข่ายบิตคอยน์ได้</numerusform>
- </translation>
- </message>
- <message>
- <source>Click for more actions.</source>
- <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">คลิกเพื่อดูการดำเนินการเพิ่มเติม</translation>
- </message>
- <message>
- <source>Show Peers tab</source>
- <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
- <translation type="unfinished">แสดง Peers แท็ป</translation>
- </message>
- <message>
- <source>Disable network activity</source>
- <extracomment>A context menu item.</extracomment>
- <translation type="unfinished">ปิดใช้งาน กิจกรรม เครือข่าย</translation>
- </message>
- <message>
- <source>Enable network activity</source>
- <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
- <translation type="unfinished">เปิดใช้งาน กิจกรรม เครือข่าย</translation>
- </message>
- </context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
- <message>
- <source>Unit to show amounts in. Click to select another unit.</source>
- <translation type="unfinished">หน่วยแสดงจำนวนเงิน คลิกเพื่อเลือกหน่วยอื่น</translation>
- </message>
-</context>
-<context>
- <name>CoinControlDialog</name>
- <message>
- <source>L&amp;ock unspent</source>
- <translation type="unfinished">L&amp;ock ที่ไม่ได้ใข้</translation>
- </message>
- <message>
- <source>&amp;Unlock unspent</source>
- <translation type="unfinished">&amp;ปลดล็อค ที่ไม่ไดใช้</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation type="unfinished">คัดลอก change</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation type="unfinished">(%1 ล็อคแล้ว)</translation>
- </message>
- </context>
-<context>
- <name>CreateWalletActivity</name>
- <message>
- <source>Create Wallet</source>
- <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
- <translation type="unfinished">สร้าง วอลเล็ต</translation>
- </message>
- </context>
-<context>
- <name>LoadWalletsActivity</name>
- <message>
- <source>Load Wallets</source>
- <extracomment>Title of progress window which is displayed when wallets are being loaded.</extracomment>
- <translation type="unfinished">โหลด วอลเล็ต</translation>
- </message>
- <message>
- <source>Loading wallets…</source>
- <extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
- <translation type="unfinished">กำลังโหลด วอลเล็ต...</translation>
- </message>
-</context>
-<context>
- <name>OpenWalletActivity</name>
- <message>
- <source>Open wallet failed</source>
- <translation type="unfinished">เปิด วอลเล็ต ล้มเหลว</translation>
- </message>
- <message>
- <source>Open wallet warning</source>
- <translation type="unfinished">คำเตือน การเปิด วอลเล็ต</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">กระเป๋าสตางค์เริ่มต้น</translation>
- </message>
- <message>
- <source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
- <translation type="unfinished">กำลังเปิด วอลเล็ต &lt;b&gt;%1&lt;/b&gt;…</translation>
- </message>
-</context>
-<context>
- <name>RestoreWalletActivity</name>
- <message>
- <source>Restore Wallet</source>
- <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">กู้คืนวอลเล็ต</translation>
- </message>
- <message>
- <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
- <translation type="unfinished">ทำการกู้คืนวอลเล็ต &lt;b&gt;%1&lt;/b&gt;…</translation>
- </message>
- <message>
- <source>Restore wallet failed</source>
- <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
- <translation type="unfinished">การกู้คืนวอลเล็ตล้มเหลว</translation>
- </message>
- <message>
- <source>Restore wallet warning</source>
- <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
- <translation type="unfinished">คำเตือนการกู้คืนวอลเล็ต</translation>
- </message>
- <message>
- <source>Restore wallet message</source>
- <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
- <translation type="unfinished">ข้อความการกู้คืนวอลเล็ต</translation>
- </message>
-</context>
-<context>
- <name>WalletController</name>
- <message>
- <source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">คุณ แน่ใจ หรือไม่ว่า ต้องการ ปิด วอลเล็ต &lt;i&gt;%1&lt;/i&gt;?</translation>
- </message>
- <message>
- <source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
- <translation type="unfinished">Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled</translation>
- </message>
- <message>
- <source>Close all wallets</source>
- <translation type="unfinished">ปิดกระเป๋าสตางค์ทั้งหมด</translation>
- </message>
- <message>
- <source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">คุณ แน่ใจ หรือไม่ว่า ต้องการ ปิด วอลเล็ต ทั้งหมด?</translation>
- </message>
-</context>
-<context>
- <name>CreateWalletDialog</name>
- <message>
- <source>Create Wallet</source>
- <translation type="unfinished">สร้าง วอลเล็ต</translation>
- </message>
- <message>
- <source>Wallet Name</source>
- <translation type="unfinished">ชื่อ วอลเล็ต</translation>
- </message>
- <message>
- <source>Wallet</source>
- <translation type="unfinished">วอลเล็ต</translation>
- </message>
- <message>
- <source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
- <translation type="unfinished">เข้ารหัส วอลเล็ต วอลเล็ต จะถูก เข้ารหัส ด้วย พาสเฟส ที่ คุณ เลือก</translation>
- </message>
- <message>
- <source>Encrypt Wallet</source>
- <translation type="unfinished">เข้ารหัส วอลเล็ต</translation>
- </message>
- <message>
- <source>Advanced Options</source>
- <translation type="unfinished">ตัวเลือก ขั้นสูง</translation>
- </message>
- <message>
- <source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets</translation>
- </message>
- <message>
- <source>Disable Private Keys</source>
- <translation type="unfinished">ปิดใช้งาน คีย์ ส่วนตัว</translation>
- </message>
- <message>
- <source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
- <translation type="unfinished">Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time</translation>
- </message>
- <message>
- <source>Make Blank Wallet</source>
- <translation type="unfinished">ทำ วอลเล็ต ให้ว่างเปล่า</translation>
- </message>
- <message>
- <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
- <translation type="unfinished">Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first</translation>
- </message>
- </context>
-<context>
- <name>EditAddressDialog</name>
- <message>
- <source>Edit Address</source>
- <translation type="unfinished">แก้ไข แอดเดรส</translation>
- </message>
- <message>
- <source>&amp;Label</source>
- <translation type="unfinished">&amp;เลเบล</translation>
- </message>
- <message>
- <source>The label associated with this address list entry</source>
- <translation type="unfinished">รายการ แสดง เลเบล ที่ เกี่ยวข้องกับ ที่เก็บ นี้</translation>
- </message>
- <message>
- <source>&amp;Address</source>
- <translation type="unfinished">&amp;แอดเดรส</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation type="unfinished">แอดเดรส การส่ง ใหม่</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation type="unfinished">แก้ไข แอดเดรส การรับ</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation type="unfinished">แก้ไข แอดเดรส การส่ง</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation type="unfinished">แอดเดรส ที่ป้อน "%1" เป็น Bitcoin แอดเดรส ที่ ไม่ ถูกต้อง</translation>
- </message>
- <message>
- <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
- <translation type="unfinished">Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book with label "%2".</source>
- <translation type="unfinished">The entered address "%1" is already in the address book with label "%2"</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">ไม่สามารถปลดล็อกวอลเล็ตได้</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation type="unfinished">การสร้างคีย์ใหม่ล้มเหลว</translation>
- </message>
-</context>
-<context>
- <name>FreespaceChecker</name>
- <message>
- <source>A new data directory will be created.</source>
- <translation type="unfinished">ไดเร็กทอรีข้อมูลใหม่จะถูกสร้างขึ้น</translation>
- </message>
- <message>
- <source>Cannot create data directory here.</source>
- <translation type="unfinished">ไม่สามารถสร้างไดเร็กทอรีข้อมูลที่นี่</translation>
- </message>
-</context>
-<context>
- <name>Intro</name>
- <message numerus="yes">
- <source>%n GB of space available</source>
- <translation type="unfinished">
- <numerusform>มีพื้นที่ว่าง %n GB ที่ใช้งานได้</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>(of %n GB needed)</source>
- <translation type="unfinished">
- <numerusform>(ต้องการพื้นที่ %n GB )</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>(%n GB needed for full chain)</source>
- <translation type="unfinished">
- <numerusform />
- </translation>
- </message>
- <message>
- <source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <translation type="unfinished">At least %1 GB of data will be stored in this directory, and it will grow over time</translation>
- </message>
- <message>
- <source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">ข้อมูลประมาณ %1 GB จะถูกเก็บไว้ในไดเร็กทอรีนี้</translation>
- </message>
- <message numerus="yes">
- <source>(sufficient to restore backups %n day(s) old)</source>
- <extracomment>Explanatory text on the capability of the current prune target.</extracomment>
- <translation type="unfinished">
- <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
- </translation>
- </message>
- <message>
- <source>%1 will download and store a copy of the Bitcoin block chain.</source>
- <translation type="unfinished">%1 จะดาวน์โหลดและจัดเก็บสำเนาของบล็อกเชน Bitcoin</translation>
- </message>
- <message>
- <source>The wallet will also be stored in this directory.</source>
- <translation type="unfinished"> วอลเล็ตจะถูกเก็บใว้ในไดเร็กทอรีนี้เช่นกัน</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">ข้อผิดพลาด</translation>
- </message>
- <message>
- <source>Welcome</source>
- <translation type="unfinished">ยินดีต้อนรับ</translation>
- </message>
- <message>
- <source>Welcome to %1.</source>
- <translation type="unfinished">ยินดีต้อนรับเข้าสู่ %1.</translation>
- </message>
- <message>
- <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
- <translation type="unfinished">เนื่องจากนี่เป็นครั้งแรกที่โปรแกรมเปิดตัว คุณสามารถเลือกได้ว่า %1 จะเก็บข้อมูลไว้ที่ใด</translation>
- </message>
- <message>
- <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
- <translation type="unfinished">Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features</translation>
- </message>
- <message>
- <source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
- <translation type="unfinished">This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off</translation>
- </message>
- <message>
- <source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
- <translation type="unfinished">If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low</translation>
- </message>
- <message>
- <source>Use the default data directory</source>
- <translation type="unfinished">ใช้ ไดเรกทอรี ข้อมูล เริ่มต้น</translation>
- </message>
- <message>
- <source>Use a custom data directory:</source>
- <translation type="unfinished">ใช้ ไดเรกทอรี ข้อมูล ที่กำหนดเอง:</translation>
- </message>
-</context>
-<context>
- <name>HelpMessageDialog</name>
- <message>
- <source>version</source>
- <translation type="unfinished">เวอร์ชัน</translation>
- </message>
- <message>
- <source>About %1</source>
- <translation type="unfinished">เกี่ยวกับ %1</translation>
- </message>
- <message>
- <source>Command-line options</source>
- <translation type="unfinished">ตัวเลือก Command-line </translation>
- </message>
-</context>
-<context>
- <name>ShutdownWindow</name>
- <message>
- <source>%1 is shutting down…</source>
- <translation type="unfinished">%1 กำลังถูกปิดลง…</translation>
- </message>
- <message>
- <source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">อย่าปิดเครื่องคอมพิวเตอร์จนกว่าหน้าต่างนี้จะหายไป</translation>
- </message>
-</context>
-<context>
- <name>ModalOverlay</name>
- <message>
- <source>Form</source>
- <translation type="unfinished">รูปแบบ</translation>
- </message>
- <message>
- <source>Number of blocks left</source>
- <translation type="unfinished">ตัวเลข ของ บล็อก ที่เหลือ</translation>
- </message>
- <message>
- <source>Unknown…</source>
- <translation type="unfinished">ไม่รู้จัก…</translation>
- </message>
- <message>
- <source>calculating…</source>
- <translation type="unfinished">กำลังคำนวณ…</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">บล็อกเวลาล่าสุด</translation>
- </message>
- <message>
- <source>Progress increase per hour</source>
- <translation type="unfinished">ความคืบหน้าเพิ่มขึ้นต่อชั่วโมง</translation>
- </message>
- <message>
- <source>Estimated time left until synced</source>
- <translation type="unfinished">เวลาโดยประมาณที่เหลือจนกว่าจะซิงค์</translation>
- </message>
- </context>
-<context>
- <name>OptionsDialog</name>
- <message>
- <source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
- <extracomment>Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</extracomment>
- <translation type="unfinished">ขนาดแคชฐานข้อมูลสูงสุด แคชที่ใหญ่ขึ้นสามารถนำไปสู่การซิงค์ได้เร็วยิ่งขึ้น หลังจากนั้นประโยชน์จะเด่นชัดน้อยลงสำหรับกรณีการใช้งานส่วนใหญ่ การลดขนาดแคชจะลดการใช้หน่วยความจำ มีการแชร์หน่วยความจำ mempool ที่ไม่ได้ใช้สำหรับแคชนี้</translation>
- </message>
- <message>
- <source>Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
- <extracomment>Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</extracomment>
- <translation type="unfinished">กำหนดจำนวนเธรดการตรวจสอบสคริปต์ ค่าลบสอดคล้องกับจำนวนคอร์ที่คุณต้องการปล่อยให้ระบบว่าง</translation>
- </message>
- <message>
- <source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
- <extracomment>Tooltip text for Options window setting that enables the RPC server.</extracomment>
- <translation type="unfinished">สิ่งนี้ช่วยให้คุณหรือเครื่องมือของบุคคลที่สามสามารถสื่อสารกับโหนดผ่านคำสั่งบรรทัดคำสั่งและ JSON-RPC</translation>
- </message>
- <message>
- <source>Enable R&amp;PC server</source>
- <extracomment>An Options window setting to enable the RPC server.</extracomment>
- <translation type="unfinished">เปิดใช้งานเซิร์ฟเวอร์ R&amp;PC</translation>
- </message>
- <message>
- <source>W&amp;allet</source>
- <translation type="unfinished">ว&amp;อลเล็ต</translation>
- </message>
- <message>
- <source>Enable &amp;PSBT controls</source>
- <extracomment>An options window setting to enable PSBT controls.</extracomment>
- <translation type="unfinished">เปิดใช้งานการควบคุม &amp;PSBT</translation>
- </message>
- <message>
- <source>External Signer (e.g. hardware wallet)</source>
- <translation type="unfinished">ผู้ลงนามภายนอก (เช่น ฮาร์ดแวร์วอลเล็ต)</translation>
- </message>
- <message>
- <source>&amp;Window</source>
- <translation type="unfinished">&amp;วินโดว์</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">ข้อผิดพลาด</translation>
- </message>
- </context>
-<context>
- <name>OverviewPage</name>
- <message>
- <source>Form</source>
- <translation type="unfinished">รูปแบบ</translation>
- </message>
- <message>
- <source>Available:</source>
- <translation type="unfinished">พร้อมใช้งาน:</translation>
- </message>
- </context>
-<context>
- <name>PSBTOperationsDialog</name>
- <message>
- <source>PSBT copied to clipboard.</source>
- <translation type="unfinished">PSBT คัดลอกไปยังคลิปบอร์ดแล้ว</translation>
- </message>
- <message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * ส่ง %1 ถึง %2</translation>
- </message>
- <message>
- <source>Transaction has %1 unsigned inputs.</source>
- <translation type="unfinished">ธุรกรรมมี %1 อินพุตที่ไม่ได้ลงนาม</translation>
- </message>
- </context>
-<context>
- <name>PeerTableModel</name>
- <message>
- <source>Peer</source>
- <extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
- <translation type="unfinished">เพียร์</translation>
- </message>
- <message>
- <source>Age</source>
- <extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
- <translation type="unfinished">อายุ</translation>
- </message>
- <message>
- <source>Inbound</source>
- <extracomment>An Inbound Connection from a Peer.</extracomment>
- <translation type="unfinished">ขาเข้า</translation>
- </message>
- <message>
- <source>Outbound</source>
- <extracomment>An Outbound Connection to a Peer.</extracomment>
- <translation type="unfinished">ขาออก</translation>
- </message>
-</context>
-<context>
- <name>RPCConsole</name>
- <message>
- <source>Memory Pool</source>
- <translation type="unfinished">พูลเมมโมรี่</translation>
- </message>
- <message>
- <source>Memory usage</source>
- <translation type="unfinished">การใช้เมมโมรี่</translation>
- </message>
- <message>
- <source>High Bandwidth</source>
- <translation type="unfinished">แบนด์วิดท์สูง</translation>
- </message>
- <message>
- <source>Connection Time</source>
- <translation type="unfinished">เวลาในการเชื่อมต่อ</translation>
- </message>
- <message>
- <source>Last Send</source>
- <translation type="unfinished">การส่งล่าสุด</translation>
- </message>
- <message>
- <source>Last Receive</source>
- <translation type="unfinished">การรับล่าสุด</translation>
- </message>
- <message>
- <source>Ping Time</source>
- <translation type="unfinished">เวลาในการ Ping</translation>
- </message>
- <message>
- <source>Ping Wait</source>
- <translation type="unfinished">คอยในการ Ping</translation>
- </message>
- <message>
- <source>Min Ping</source>
- <translation type="unfinished">วินาทีในการ Ping</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">บล็อกเวลาล่าสุด</translation>
- </message>
- <message>
- <source>Debug log file</source>
- <translation type="unfinished">ไฟล์บันทึกการดีบัก</translation>
- </message>
- <message>
- <source>Inbound: initiated by peer</source>
- <extracomment>Explanatory text for an inbound peer connection.</extracomment>
- <translation type="unfinished">ขาเข้า: เริ่มต้นด้วย peer</translation>
- </message>
- <message>
- <source>Outbound Full Relay: default</source>
- <extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
- <translation type="unfinished">ขาออก Full Relay: ค่าเริ่มต้น</translation>
- </message>
- </context>
-<context>
- <name>ReceiveCoinsDialog</name>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">ไม่สามารถปลดล็อกวอลเล็ตได้</translation>
- </message>
- </context>
-<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Payment information</source>
- <translation type="unfinished">ข้อมูการชำระเงิน</translation>
- </message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
- <message>
- <source>%1 (%2 blocks)</source>
- <translation type="unfinished">%1 (%2 บล็อก)</translation>
- </message>
- <message>
- <source>Sign on device</source>
- <extracomment>"device" usually means a hardware wallet.</extracomment>
- <translation type="unfinished">ลงชื่อบนอุปกรณ์</translation>
- </message>
- <message>
- <source>Please, review your transaction.</source>
- <extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
- <translation type="unfinished">โปรดตรวจสอบธุรกรรมของคุณ</translation>
- </message>
- <message numerus="yes">
- <source>Estimated to begin confirmation within %n block(s).</source>
- <translation type="unfinished">
- <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
- </translation>
- </message>
- <message>
- <source>Confirm custom change address</source>
- <translation type="unfinished">ยืนยันการเปลี่ยนแปลงแอดเดรสที่กำหนดเอง</translation>
- </message>
- </context>
-<context>
- <name>SignVerifyMessageDialog</name>
- <message>
- <source>Please check the signature and try again.</source>
- <translation type="unfinished">โปรดตรวจสอบลายเซ็นต์และลองใหม่อีกครั้ง</translation>
- </message>
- </context>
-<context>
- <name>TransactionDesc</name>
- <message>
- <source>conflicted with a transaction with %1 confirmations</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
- <translation type="unfinished">ขัดแย้งกับการทำธุรกรรมกับ %1 การยืนยัน</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation type="unfinished">
- <numerusform>matures in %n more block(s)</numerusform>
- </translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Exporting Successful</source>
- <translation type="unfinished">ส่งออกสำเร็จ</translation>
- </message>
- </context>
-<context>
- <name>WalletFrame</name>
- <message>
- <source>Error</source>
- <translation type="unfinished">ข้อผิดพลาด</translation>
- </message>
- <message>
- <source>Partially Signed Transaction (*.psbt)</source>
- <translation type="unfinished">ธุรกรรมที่ลงนามบางส่วน (*.psbt)</translation>
- </message>
- <message>
- <source>PSBT file must be smaller than 100 MiB</source>
- <translation type="unfinished">ไฟล์ PSBT ต้องมีขนาดเล็กกว่า 100 MiB</translation>
- </message>
- <message>
- <source>Unable to decode PSBT</source>
- <translation type="unfinished">ไม่สามารถถอดรหัส PSBT</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Confirm fee bump</source>
- <translation type="unfinished">ยืนยันค่าธรรมเนียมที่เพิ่มขึ้น</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">กระเป๋าสตางค์เริ่มต้น</translation>
- </message>
-</context>
-<context>
- <name>WalletView</name>
- <message>
- <source>Wallet Data</source>
- <extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">ข้อมูล วอลเล็ต</translation>
- </message>
- </context>
-<context>
- <name>bitcoin-core</name>
- <message>
- <source>%s is set very high!</source>
- <translation type="unfinished">%s ตั้งไว้สูงมาก</translation>
- </message>
- <message>
- <source>Error: This wallet already uses SQLite</source>
- <translation type="unfinished">ข้อผิดพลาด: วอลเล็ตนี้ใช้ SQLite อยู่แล้ว</translation>
- </message>
- <message>
- <source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">ข้อผิดพลาด: ไม่สามารถสำรองข้อมูลของวอลเล็ตได้</translation>
- </message>
- <message>
- <source>Error: Unable to read all records in the database</source>
- <translation type="unfinished">ข้อผิดพลาด: ไม่สามารถอ่านข้อมูลทั้งหมดในฐานข้อมูลได้</translation>
- </message>
- </context>
-</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_tk.ts b/src/qt/locale/bitcoin_tk.ts
index c1f6fe8520..0afd01fd71 100644
--- a/src/qt/locale/bitcoin_tk.ts
+++ b/src/qt/locale/bitcoin_tk.ts
@@ -1731,18 +1731,6 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Tor onion hyzmatlary arkaly düwünlere aralaşmak üçin SOCKS&amp;5 proksisini ulan:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Gözden geçir sahypasynda monoaralykly harp görnüşi:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">içine gurnalan "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">iň meňzeş gabat gelme "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Ýatyr</translation>
</message>
@@ -1980,10 +1968,6 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">PSBT diskde ýatda saklandy.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * %2-ä %1 iberilýär</translation>
- </message>
- <message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
<translation type="unfinished">Amal pajyny ýa-da jemi amal bahasyny hasaplap bolanok.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_tr.ts b/src/qt/locale/bitcoin_tr.ts
index 7c646e228c..ba3ecca680 100644
--- a/src/qt/locale/bitcoin_tr.ts
+++ b/src/qt/locale/bitcoin_tr.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Adresi veya etiketi düzenlemek için sağ tıklayın.</translation>
+ <translation type="unfinished">Adresi veya etiketi düzenlemek için sağ tıklayın</translation>
</message>
<message>
<source>Create a new address</source>
@@ -94,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Adres listesinin %1 konumuna kaydedilmesi sırasında bir hata meydana geldi. Lütfen tekrar deneyin.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Adresler gönderiliyor - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Adresler alınıyor - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Dışa Aktarım Başarısız Oldu</translation>
</message>
@@ -3071,10 +3079,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Çıktı indeksi</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Sertifika doğrulanmadı)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Tüccar</translation>
</message>
@@ -3775,10 +3779,6 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">İşlem değişikliği çıktı endeksi aralık dışında</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">İşlem çok uzun bir mempool zincirine sahip</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">İşlem en az bir adet alıcıya sahip olmalı.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ug.ts b/src/qt/locale/bitcoin_ug.ts
index 36676c7c7d..bdb97112e4 100644
--- a/src/qt/locale/bitcoin_ug.ts
+++ b/src/qt/locale/bitcoin_ug.ts
@@ -175,6 +175,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Wallet encrypted</source>
<translation type="unfinished">ھەميان شىفىرلاندى</translation>
</message>
+ <message>
+ <source>Wallet to be encrypted</source>
+ <translation type="unfinished">ھەميان شىفىرلىنىدۇ</translation>
+ </message>
+ <message>
+ <source>Your wallet is about to be encrypted. </source>
+ <translation type="unfinished">ھەميانىڭىز شىفىرلىنىدۇ.</translation>
+ </message>
</context>
<context>
<name>QObject</name>
diff --git a/src/qt/locale/bitcoin_uk.ts b/src/qt/locale/bitcoin_uk.ts
index 71c1f411d4..7679222848 100644
--- a/src/qt/locale/bitcoin_uk.ts
+++ b/src/qt/locale/bitcoin_uk.ts
@@ -303,6 +303,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">невідомо</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Вбудований "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Системний шрифт за замовчуванням "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Настроюваний…</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Кількість</translation>
</message>
@@ -547,7 +559,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Резервне копіювання гаманця</translation>
+ <translation type="unfinished">&amp;Резервне копіювання гаманця…</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
@@ -1131,7 +1143,7 @@ If this wallet contains any solvable but not watched scripts, a different and ne
The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
<translation type="unfinished">Під час перенесення гаманця він буде перетворено на один або кілька гаманців з підтримкою дескрипторів. Необхідно буде створити нову резервну копію гаманця.
Якщо цей гаманець містить будь-які скрипти "тільки для перегляду", буде створено новий гаманець, що містить такі скрипти.
-Якщо цей гаманець містить будь-які спроможні, але не спостережувані скрипти, буде створено інший новий гаманець, що містить такі скрипти.
+Якщо цей гаманець містить будь-які спроможні скрипти, але не "тільки для перегляду", буде створено інший новий гаманець, що містить такі скрипти.
Процес перенесення створить резервну копію гаманця перед початком. Цей файл резервної копії буде названий &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak і знаходитиметься в каталозі для цього гаманця. У випадку неправильного перенесення резервну копію можна відновити за допомогою функціоналу "Відновити гаманець".</translation>
</message>
<message>
@@ -1147,12 +1159,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">Гаманець '%1' був успішно перенесений.</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> Скрипти "тільки для перегляду" були перенесені в новий гаманець під назвою '%1'.</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Скрипти "тільки для перегляду" були перенесені в новий гаманець під назвою '%1'.</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> Спроможні, але не спостережувані скрипти були перенесені в новий гаманець під назвою '%1'.</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Спроможні скрипти, але не "тільки для перегляду", були перенесені в новий гаманець під назвою '%1'.</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1275,7 +1287,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">Вимкнути приватні ключі для цього гаманця. Гаманці з вимкнутими приватними ключами не матимуть приватних ключів і не можуть мати набір HD або імпортовані приватні ключі. Це ідеально підходить для гаманців "тільки для перегляду".</translation>
+ <translation type="unfinished">Вимкнути приватні ключі для цього гаманця. Гаманці з вимкнутими приватними ключами не матимуть приватних ключів і не можуть мати набір HD або імпортовані приватні ключі. Це ідеально підходить для гаманців для спостереження.</translation>
</message>
<message>
<source>Disable Private Keys</source>
@@ -1543,7 +1555,7 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<source>calculating…</source>
- <translation type="unfinished">рахування…</translation>
+ <translation type="unfinished">підраховується…</translation>
</message>
<message>
<source>Last block time</source>
@@ -1587,7 +1599,7 @@ The migration process will create a backup of the wallet before migrating. This
<message>
<source>Paste address from clipboard</source>
<extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
- <translation type="unfinished">Вставити адресу</translation>
+ <translation type="unfinished">Вставити адресу з буфера обміну</translation>
</message>
</context>
<context>
@@ -1637,6 +1649,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">Згортати замість закриття. Якщо ця опція включена, програма закриється лише після вибору відповідного пункту в меню.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Шрифт на вкладці Огляд:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Параметри, які задані в цьому вікні, змінені командним рядком:</translation>
</message>
@@ -1861,18 +1877,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">Використовувати окремий проксі-сервер SOCKS&amp;5, щоб дістатися до вузлів через сервіси Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Моноширинний шрифт на вкладці Огляд:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">вбудований "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">найбільш подібний "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Скасувати</translation>
</message>
@@ -2110,8 +2114,8 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">PSBT-транзакцію збережено на диск.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Надсилає від %1 до %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Відправляє %1 до %2</translation>
</message>
<message>
<source>own address</source>
@@ -2709,6 +2713,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Виконання команди без гаманця</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Вікно вузла - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Виконання команди з гаманцем "%1"</translation>
</message>
@@ -3177,10 +3185,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Створює частково підписану біткоїн-транзакцію (PSBT) для використання, наприклад, офлайн-гаманець %1 або гаманця, сумісного з PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished"> з гаманця '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 до '%2'</translation>
</message>
@@ -3238,6 +3242,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Перевірте запропоновану транзакцію. Буде сформована частково підписана біткоїн-транзакція (PSBT), яку можна зберегти або скопіювати, а потім підписати з використанням, наприклад, офлайн гаманця %1 або апаратного PSBT-сумісного гаманця.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 з гаманця '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Створити таку транзакцію?</translation>
@@ -3377,7 +3385,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">Вставити адресу</translation>
+ <translation type="unfinished">Вставити адресу з буфера обміну</translation>
</message>
<message>
<source>Remove this entry</source>
@@ -3447,7 +3455,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">Вставити адресу</translation>
+ <translation type="unfinished">Вставити адресу з буфера обміну</translation>
</message>
<message>
<source>Enter the message you want to sign here</source>
@@ -3717,8 +3725,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Вихідний індекс</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished"> (Сертифікат не підтверджено)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Сертифікат не підтверджено)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3939,7 +3947,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>&amp;Show transaction details</source>
- <translation type="unfinished">&amp;Показати деталі транзакції</translation>
+ <translation type="unfinished">&amp;Показати подробиці транзакції</translation>
</message>
<message>
<source>Increase transaction &amp;fee</source>
@@ -4549,6 +4557,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Файл дампа %s не існує.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Помилка при здійсненні транзакції БД для видалення транзакцій гаманця</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Помилка створення %s</translation>
</message>
@@ -4597,16 +4609,12 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Помилка зчитування наступного запису з бази даних гаманця</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Помилка: не вдається встановити призначення зі створеного сценарію scriptpubkey</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Помилка: Не вдалося додати транзакцію "тільки для перегляду" до гаманця-для-перегляду</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Помилка при початку транзакції БД для видалення транзакцій гаманця</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Помилка: Не вдалося видалити транзакції "тільки для перегляду"</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Помилка: не вдається встановити призначення зі створеного сценарію scriptpubkey</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4622,7 +4630,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Помилка: Не вдалося створити новий гаманець "тільки для перегляду"</translation>
+ <translation type="unfinished">Помилка: Не вдалося створити новий гаманець для спостереження</translation>
</message>
<message>
<source>Error: Got key that was not hex: %s</source>
@@ -4645,10 +4653,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Помилка: Немає доступних %s адрес.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Помилка: Не всі транзакції "тільки для перегляду" вдалося видалити</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Помилка; Цей гаманець вже використовує SQLite</translation>
</message>
@@ -4673,6 +4677,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Помилка: Не вдалося зчитати всі записи бази даних</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Помилка: Не вдалося прочитати запис гаманця про локатор найкращого блока</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Помилка: Не вдалося видалити дані "тільки для перегляду" з адресної книги</translation>
</message>
@@ -4681,6 +4689,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Помилка: Не вдалося додати запис до нового гаманця</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Помилка: Не вдалося записати запис спроможного гаманця про локатор найкращого блока</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Помилка: Не вдалося записати запис гаманця для спостереження про локатор найкращого блока</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Помилка: копіювання адресної книги не вдалося для гаманця %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Помилка: транзакцію бази даних не вдалося виконати для гаманця %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Не вдалося слухати на жодному порту. Використовуйте -listen=0, якщо ви хочете цього.</translation>
</message>
@@ -4697,6 +4721,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Не вдалося перевірити базу даних</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Помилка при видаленні транзакції: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Ставка комісії (%s) нижча за встановлену мінімальну ставку комісії (%s)</translation>
</message>
@@ -4917,6 +4945,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Це транзакційна комісія, яку ви сплатите, якщо будете надсилати транзакцію.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">Транзакція %s не належить до цього гаманця</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Сума транзакції занадто мала</translation>
</message>
@@ -4929,10 +4961,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">У транзакції індекс виходу решти поза діапазоном</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Транзакція має занадто довгий ланцюг у пулі транзакцій</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">У транзакції повинен бути щонайменше один одержувач</translation>
</message>
@@ -5013,6 +5041,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Непідтримуваний глобальний рівень журналювання %s=%s. Припустимі значення: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Помилка створення файлу гаманця: %s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">acceptstalefeeestimates не підтримується для %s блокчейну.</translation>
</message>
@@ -5021,6 +5053,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Непідтримувана категорія ведення журналу %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Помилка: Не вдалося додати транзакцію "тільки для перегляду" %s до гаманця для спостереження</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Помилка: Не вдалося видалити транзакції "тільки для перегляду".</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Коментар до Агента користувача (%s) містить небезпечні символи.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ur.ts b/src/qt/locale/bitcoin_ur.ts
index af155383d5..c0ff575864 100644
--- a/src/qt/locale/bitcoin_ur.ts
+++ b/src/qt/locale/bitcoin_ur.ts
@@ -2,10 +2,6 @@
<context>
<name>AddressBookPage</name>
<message>
- <source>Right-click to edit address or label</source>
- <translation type="unfinished">پتہ یا لیبل کی تصیح کیلیئے داہنا کلک</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation type="unfinished">نیا پتہ تخلیق کریں</translation>
</message>
diff --git a/src/qt/locale/bitcoin_uz.ts b/src/qt/locale/bitcoin_uz.ts
index 2e97e96d43..b7193d36b8 100644
--- a/src/qt/locale/bitcoin_uz.ts
+++ b/src/qt/locale/bitcoin_uz.ts
@@ -2078,7 +2078,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Copy change</source>
- <translation type="unfinished">Нусха қайтими</translation>
+ <translation type="unfinished">O'zgarishni nusxalash</translation>
</message>
<message>
<source>%1 to %2</source>
diff --git a/src/qt/locale/bitcoin_vi.ts b/src/qt/locale/bitcoin_vi.ts
index 4b68cca0b4..fe69b4c1f3 100644
--- a/src/qt/locale/bitcoin_vi.ts
+++ b/src/qt/locale/bitcoin_vi.ts
@@ -69,7 +69,15 @@
<source>Export Address List</source>
<translation type="unfinished">Xuất danh sách địa chỉ</translation>
</message>
- </context>
+ <message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Địa chỉ gửi%1</translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Quá trình xuất dữ liệu đã thất bại</translation>
+ </message>
+</context>
<context>
<name>AddressTableModel</name>
<message>
@@ -445,6 +453,22 @@
</translation>
</message>
<message>
+ <source>%1 behind</source>
+ <translation type="unfinished">%1 phía sau</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Lỗi</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation type="unfinished">Thông tin</translation>
+ </message>
+ <message>
+ <source>Up to date</source>
+ <translation type="unfinished">cập nhật</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction</source>
<translation type="unfinished">Tải một phần giao dịch Bitcoin đã ký</translation>
</message>
@@ -953,6 +977,10 @@
<source>Continue</source>
<translation type="unfinished">Tiếp tục</translation>
</message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Lỗi</translation>
+ </message>
</context>
<context>
<name>OptionsModel</name>
@@ -1210,6 +1238,10 @@
<source>Address</source>
<translation type="unfinished">Địa chỉ</translation>
</message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Quá trình xuất dữ liệu đã thất bại</translation>
+ </message>
</context>
<context>
<name>WalletFrame</name>
@@ -1217,6 +1249,10 @@
<source>Create a new wallet</source>
<translation type="unfinished">Tạo một ví mới</translation>
</message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Lỗi</translation>
+ </message>
</context>
<context>
<name>WalletModel</name>
@@ -1326,22 +1362,10 @@ Không thể khôi phục bản sao lưu của ví.</translation>
<translation type="unfinished">Lỗi: Không thể trích xuất điểm đến trong mã khóa công khai đã tạo</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Lỗi: Không thể thêm giao dịch chỉ xem vào ví chỉ xem</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Lỗi: Không thể xóa các giao dịch chỉ xem</translation>
- </message>
- <message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">Lỗi: Tạo ví chỉ xem mới thất bại</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Lỗi: Không phải giao dịch chỉ xem nào cũng xóa được</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Lỗi: Ví này đã dùng SQLite</translation>
</message>
diff --git a/src/qt/locale/bitcoin_yue.ts b/src/qt/locale/bitcoin_yue.ts
index 49d8e78609..1ed37d36ce 100644
--- a/src/qt/locale/bitcoin_yue.ts
+++ b/src/qt/locale/bitcoin_yue.ts
@@ -294,15 +294,45 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">请输入一个比特币地址 (例如 %1)</translation>
+ </message>
+ <message>
+ <source>Unroutable</source>
+ <translation type="unfinished">不可路由</translation>
+ </message>
+ <message>
<source>Inbound</source>
<extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
<message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
+ </message>
+ <message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
<translation type="unfinished">区块转发</translation>
@@ -313,6 +343,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手册</translation>
</message>
<message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation type="unfinished">%1 天</translation>
+ </message>
+ <message>
<source>%1 h</source>
<translation type="unfinished">%1 小时</translation>
</message>
@@ -321,6 +365,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">%1 分</translation>
</message>
<message>
+ <source>%1 s</source>
+ <translation type="unfinished">%1 秒</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
<source>N/A</source>
<translation type="unfinished">未知</translation>
</message>
@@ -560,6 +612,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Connecting to peers…</source>
<translation type="unfinished">连到同行...</translation>
</message>
+ <message>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation type="unfinished">请求支付 (生成二维码和 bitcoin: URI)</translation>
+ </message>
+ <message>
+ <source>Show the list of used sending addresses and labels</source>
+ <translation type="unfinished">显示用过的付款地址和标签的列表</translation>
+ </message>
+ <message>
+ <source>Show the list of used receiving addresses and labels</source>
+ <translation type="unfinished">顯示已使用過的接收地址和標籤清單</translation>
+ </message>
+ <message>
+ <source>&amp;Command-line options</source>
+ <translation type="unfinished">命令行选项(&amp;C)</translation>
+ </message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
@@ -567,10 +635,38 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>%1 behind</source>
+ <translation type="unfinished">落后 %1</translation>
+ </message>
+ <message>
<source>Catching up…</source>
<translation type="unfinished">赶上...</translation>
</message>
<message>
+ <source>Last received block was generated %1 ago.</source>
+ <translation type="unfinished">最新接收到的区块是在%1之前生成的。</translation>
+ </message>
+ <message>
+ <source>Transactions after this will not yet be visible.</source>
+ <translation type="unfinished">在此之后的交易尚不可见。</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">错误</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation type="unfinished">警告</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation type="unfinished">資訊</translation>
+ </message>
+ <message>
+ <source>Up to date</source>
+ <translation type="unfinished">已是最新</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction</source>
<translation type="unfinished">加载部分签名比特币交易(PSBT)</translation>
</message>
@@ -704,7 +800,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform />
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
</translation>
</message>
<message>
@@ -748,12 +844,24 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">警告: %1</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">日期: %1
+</translation>
+ </message>
+ <message>
<source>Amount: %1
</source>
<translation type="unfinished">金額: %1
</translation>
</message>
<message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">錢包: %1
+</translation>
+ </message>
+ <message>
<source>Type: %1
</source>
<translation type="unfinished">種類: %1
@@ -772,6 +880,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">送出交易</translation>
+ </message>
+ <message>
<source>Incoming transaction</source>
<translation type="unfinished">收款交易</translation>
</message>
@@ -792,6 +904,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;解鎖中&lt;/b&gt;</translation>
</message>
<message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
+ </message>
+ <message>
<source>Original message:</source>
<translation type="unfinished">原消息:</translation>
</message>
@@ -810,10 +926,34 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手动选币</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">总量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組數:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">全(不)选</translation>
+ </message>
+ <message>
<source>Tree mode</source>
<translation type="unfinished">树状模式</translation>
</message>
@@ -826,10 +966,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation type="unfinished">收款标签</translation>
+ </message>
+ <message>
<source>Received with address</source>
<translation type="unfinished">收款地址</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation type="unfinished">复制金额</translation>
</message>
@@ -854,6 +1006,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">锁定未花费(&amp;O)</translation>
</message>
<message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">解锁未花费(&amp;U)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -889,7 +1045,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- </context>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(找零)</translation>
+ </message>
+</context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -954,12 +1114,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">仅观察脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> 可解但又未被监视的脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1025,6 +1185,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">卸载钱包</translation>
</message>
<message>
+ <source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
+ <translation type="unfinished">启用修剪时,如果一个钱包被卸载太久,就必须重新同步整条区块链才能再次加载它。</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">关闭所有钱包</translation>
</message>
@@ -1056,10 +1220,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">加密錢包。 錢包將使用您選擇的密碼進行加密。</translation>
</message>
<message>
+ <source>Advanced Options</source>
+ <translation type="unfinished">进阶设定</translation>
+ </message>
+ <message>
<source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
<translation type="unfinished">禁用此錢包的私鑰。取消了私鑰的錢包將沒有私鑰,並且不能有HD種子或匯入的私鑰。這是只能看的錢包的理想選擇。</translation>
</message>
<message>
+ <source>Disable Private Keys</source>
+ <translation type="unfinished">禁用私鑰</translation>
+ </message>
+ <message>
<source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
<translation type="unfinished">製作一個空白的錢包。空白錢包最初沒有私鑰或腳本。以後可以匯入私鑰和地址,或者可以設定HD種子。</translation>
</message>
@@ -1071,10 +1243,26 @@ The migration process will create a backup of the wallet before migrating. This
<context>
<name>EditAddressDialog</name>
<message>
+ <source>Edit Address</source>
+ <translation type="unfinished">編輯地址</translation>
+ </message>
+ <message>
+ <source>&amp;Label</source>
+ <translation type="unfinished">标签(&amp;L)</translation>
+ </message>
+ <message>
+ <source>The label associated with this address list entry</source>
+ <translation type="unfinished">与此地址关联的标签</translation>
+ </message>
+ <message>
<source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
<translation type="unfinished">跟這個地址清單關聯的地址。只有發送地址能被修改。</translation>
</message>
<message>
+ <source>New sending address</source>
+ <translation type="unfinished">新建付款地址</translation>
+ </message>
+ <message>
<source>Edit receiving address</source>
<translation type="unfinished">編輯接收地址</translation>
</message>
@@ -1083,6 +1271,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">编辑付款地址</translation>
</message>
<message>
+ <source>The entered address "%1" is already in the address book with label "%2".</source>
+ <translation type="unfinished">輸入的地址 %1 已經在地址簿中了,標籤為 "%2"。</translation>
+ </message>
+ <message>
+ <source>Could not unlock wallet.</source>
+ <translation type="unfinished">无法解锁钱包。</translation>
+ </message>
+ <message>
<source>New key generation failed.</source>
<translation type="unfinished">產生新的密鑰失敗了。</translation>
</message>
@@ -1097,7 +1293,11 @@ The migration process will create a backup of the wallet before migrating. This
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
<translation type="unfinished">已經有這個目錄了。如果你要在裡面造出新的目錄的話,請加上 %1.</translation>
</message>
- </context>
+ <message>
+ <source>Cannot create data directory here.</source>
+ <translation type="unfinished">沒辦法在這裡造出資料目錄。</translation>
+ </message>
+</context>
<context>
<name>Intro</name>
<message numerus="yes">
@@ -1150,6 +1350,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">错误:无法创建指定的数据目录 "%1"</translation>
</message>
<message>
+ <source>Error</source>
+ <translation type="unfinished">错误</translation>
+ </message>
+ <message>
<source>Welcome</source>
<translation type="unfinished">欢迎</translation>
</message>
@@ -1162,6 +1366,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">由于这是第一次启动此程序,您可以选择%1存储数据的位置</translation>
</message>
<message>
+ <source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
+ <translation type="unfinished">初始化同步过程是非常吃力的,同时可能会暴露您之前没有注意到的电脑硬件问题。你每次启动%1时,它都会从之前中断的地方继续下载。</translation>
+ </message>
+ <message>
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
<translation type="unfinished">當你點擊「確認」,%1會開始下載,並從%3年最早的交易,處裡整個%4區塊鏈(大小:%2GB)</translation>
</message>
@@ -1269,7 +1477,12 @@ The migration process will create a backup of the wallet before migrating. This
<source>Open bitcoin URI</source>
<translation type="unfinished">打开比特币URI</translation>
</message>
- </context>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+</context>
<context>
<name>OptionsDialog</name>
<message>
@@ -1277,6 +1490,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">選項</translation>
</message>
<message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">主要(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">在登入系统后自动启动 %1</translation>
+ </message>
+ <message>
<source>&amp;Start %1 on system login</source>
<translation type="unfinished">系统登入时启动 %1 (&amp;S)</translation>
</message>
@@ -1285,6 +1506,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">启用区块修剪会显著减小存储交易对磁盘空间的需求。所有的区块仍然会被完整校验。取消这个设置需要重新下载整条区块链。</translation>
</message>
<message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">数据库缓存大小(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">脚本验证线程数(&amp;V)</translation>
+ </message>
+ <message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
<translation type="unfinished">与%1兼容的脚本文件路径(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:恶意软件可以偷币!</translation>
</message>
@@ -1301,6 +1530,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
@@ -1325,6 +1558,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">网络(&amp;N)</translation>
</message>
<message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">将区块存储修剪至(&amp;B)</translation>
+ </message>
+ <message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
<translation type="unfinished">警告:还原此设置需要重新下载整个区块链。</translation>
</message>
@@ -1353,6 +1590,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">启用R&amp;PC服务器</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">钱包(&amp;A)</translation>
+ </message>
+ <message>
<source>Whether to set subtract fee from amount as default or not.</source>
<extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
<translation type="unfinished">是否要默认从金额中减去手续费。</translation>
@@ -1363,10 +1604,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">默认从金额中减去交易手续费(&amp;F)</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation type="unfinished">专家</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">启用手动选币功能(&amp;C)</translation>
+ </message>
+ <message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished">如果您禁止动用尚未确认的找零资金,则一笔交易的找零资金至少需要有1个确认后才能动用。这同时也会影响账户余额的计算。</translation>
</message>
<message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">动用尚未确认的找零资金(&amp;S)</translation>
+ </message>
+ <message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
<translation type="unfinished">启用&amp;PSBT控件</translation>
@@ -1377,10 +1630,30 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">是否要显示PSBT控件</translation>
</message>
<message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">外接簽證設備 (e.g. 硬體錢包)</translation>
+ </message>
+ <message>
<source>&amp;External signer script path</source>
<translation type="unfinished">外部签名器脚本路径(&amp;E)</translation>
</message>
<message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">使用 &amp;UPnP 映射端口</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
<source>Accept connections from outside.</source>
<translation type="unfinished">接受外來連線</translation>
</message>
@@ -1397,6 +1670,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">通过 SO&amp;CKS5 代理连接(默认代理):</translation>
</message>
<message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">代理服务器 &amp;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">端口(&amp;P):</translation>
+ </message>
+ <message>
<source>Port of the proxy (e.g. 9050)</source>
<translation type="unfinished">代理伺服器的通訊埠(像是 9050)</translation>
</message>
@@ -1409,6 +1690,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗口(&amp;W)</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">視窗縮到最小後只在通知區顯示圖示。</translation>
</message>
@@ -1421,6 +1710,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">单击关闭按钮时最小化(&amp;I)</translation>
</message>
<message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">显示(&amp;D)</translation>
+ </message>
+ <message>
<source>User Interface &amp;language:</source>
<translation type="unfinished">使用界面語言(&amp;L):</translation>
</message>
@@ -1445,22 +1738,39 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">第三方交易网址(&amp;T)</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">是否显示手动选币功能。</translation>
+ </message>
+ <message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
<translation type="unfinished">连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
+ <source>&amp;OK</source>
+ <translation type="unfinished">确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">取消(&amp;C)</translation>
</message>
<message>
<source>default</source>
<translation type="unfinished">預設值</translation>
</message>
<message>
+ <source>none</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">确认恢复默认设置</translation>
+ </message>
+ <message>
<source>Client restart required to activate changes.</source>
<extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
<translation type="unfinished">需要重新開始客戶端軟體來讓改變生效。</translation>
@@ -1494,10 +1804,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">取消</translation>
</message>
<message>
+ <source>Error</source>
+ <translation type="unfinished">错误</translation>
+ </message>
+ <message>
<source>The configuration file could not be opened.</source>
<translation type="unfinished">无法打开配置文件。</translation>
</message>
- </context>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">此更改需要重启客户端。</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">提供的代理服务器地址无效。</translation>
+ </message>
+</context>
<context>
<name>OptionsModel</name>
<message>
@@ -1516,6 +1838,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">顯示的資訊可能是過期的。跟 Bitcoin 網路的連線建立後,你的錢包會自動和網路同步,但是這個步驟還沒完成。</translation>
</message>
<message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
<source>Available:</source>
<translation type="unfinished">可用金額:</translation>
</message>
@@ -1544,10 +1870,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">餘額</translation>
</message>
<message>
+ <source>Total:</source>
+ <translation type="unfinished">总额:</translation>
+ </message>
+ <message>
<source>Your current total balance</source>
<translation type="unfinished">您当前的总余额</translation>
</message>
<message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">您当前在仅观察观察地址中的余额</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">可动用:</translation>
+ </message>
+ <message>
<source>Recent transactions</source>
<translation type="unfinished">最近的交易</translation>
</message>
@@ -1556,6 +1894,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">仅观察地址的未确认交易</translation>
</message>
<message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">仅观察地址中尚未成熟的挖矿收入余额:</translation>
+ </message>
+ <message>
<source>Current total balance in watch-only addresses</source>
<translation type="unfinished">仅观察地址中的当前总余额</translation>
</message>
@@ -1591,6 +1933,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">關閉</translation>
</message>
<message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">加载交易失败: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">签名交易失败: %1</translation>
+ </message>
+ <message>
<source>Cannot sign inputs while wallet is locked.</source>
<translation type="unfinished">钱包已锁定,无法签名交易输入项。</translation>
</message>
@@ -1603,6 +1953,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">已签名 %1 个交易输入项,但是仍然还有余下的项目需要签名。</translation>
</message>
<message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">成功签名交易。交易已经可以广播。</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">处理交易时遇到未知错误。</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">已复制PSBT到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -1612,6 +1978,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">PSBT已保存到硬盘</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">无法计算交易费用或总交易金额。</translation>
+ </message>
+ <message>
<source>Pays transaction fee: </source>
<translation type="unfinished">支付交易费用:</translation>
</message>
@@ -1640,6 +2018,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">(但这个钱包不能签名交易)</translation>
</message>
<message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(但这个钱包没有正确的密钥)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">交易已经完全签名,可以广播。</translation>
+ </message>
+ <message>
<source>Transaction status is unknown.</source>
<translation type="unfinished">交易状态未知。</translation>
</message>
@@ -1651,6 +2037,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">支付请求出错</translation>
</message>
<message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">无法启动 bitcoin: 协议的“一键支付”处理程序</translation>
+ </message>
+ <message>
<source>URI handling</source>
<translation type="unfinished">URI 處理</translation>
</message>
@@ -1727,7 +2117,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<extracomment>An Inbound Connection from a Peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
- </context>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
@@ -1735,10 +2130,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">复制图像(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">URI 太長,請縮短標籤或訊息文字。</translation>
+ </message>
+ <message>
<source>Error encoding URI into QR Code.</source>
<translation type="unfinished">把 URI 编码成二维码时发生错误。</translation>
</message>
<message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">不支持二维码。</translation>
+ </message>
+ <message>
<source>Save QR Code</source>
<translation type="unfinished">儲存 QR 碼</translation>
</message>
@@ -1763,6 +2170,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">資訊(&amp;I)</translation>
</message>
<message>
+ <source>General</source>
+ <translation type="unfinished">常规</translation>
+ </message>
+ <message>
<source>Datadir</source>
<translation type="unfinished">数据目录</translation>
</message>
@@ -1775,6 +2186,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">区块存储目录</translation>
</message>
<message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">如果要自訂區塊儲存目錄的位置,請使用 '%1' 這個選項來指定新的位置。</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation type="unfinished">啓動時間</translation>
</message>
@@ -1783,6 +2198,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络</translation>
</message>
<message>
+ <source>Name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Number of connections</source>
<translation type="unfinished">連線數</translation>
</message>
@@ -1791,10 +2210,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">區塊鏈</translation>
</message>
<message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">内存池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">当前交易数量</translation>
+ </message>
+ <message>
<source>Memory usage</source>
<translation type="unfinished">内存使用</translation>
</message>
<message>
+ <source>Wallet: </source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
<source>(none)</source>
<translation type="unfinished">(无)</translation>
</message>
@@ -1839,6 +2270,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">会话ID</translation>
</message>
<message>
+ <source>Version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">是否要将交易转发给这个节点。</translation>
</message>
@@ -1847,10 +2282,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">交易转发</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation type="unfinished">起步区块</translation>
+ </message>
+ <message>
<source>Synced Headers</source>
<translation type="unfinished">已同步前導資料</translation>
</message>
<message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">已同步区块</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">最近交易</translation>
</message>
@@ -1905,6 +2348,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">当前区块高度</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">打开当前数据目录中的 %1 调试日志文件。日志文件大的话可能要等上几秒钟。</translation>
+ </message>
+ <message>
<source>Decrease font size</source>
<translation type="unfinished">缩小字体大小</translation>
</message>
@@ -1941,10 +2388,23 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">高带宽</translation>
</message>
<message>
+ <source>Connection Time</source>
+ <translation type="unfinished">连接时间</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">來自這個節點上次成功驗證新區塊已經過的時間</translation>
+ </message>
+ <message>
<source>Last Block</source>
<translation type="unfinished">上一个区块</translation>
</message>
<message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">來自這個節點上次成功驗證新交易進入內存池已經過的時間</translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation type="unfinished">最近送出</translation>
</message>
@@ -1953,6 +2413,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">上次接收</translation>
</message>
<message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping 延时</translation>
+ </message>
+ <message>
<source>The duration of a currently outstanding ping.</source>
<translation type="unfinished">目前这一次 ping 已经过去的时间。</translation>
</message>
@@ -1961,6 +2425,14 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Ping 等待</translation>
</message>
<message>
+ <source>Min Ping</source>
+ <translation type="unfinished">最小 Ping 值</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">时间偏移</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation type="unfinished">上一区块时间</translation>
</message>
@@ -1981,6 +2453,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">總計</translation>
</message>
<message>
+ <source>Debug log file</source>
+ <translation type="unfinished">调试日志文件</translation>
+ </message>
+ <message>
<source>Clear console</source>
<translation type="unfinished">清主控台</translation>
</message>
@@ -2018,6 +2494,11 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">出站触须: 短暂,用于测试地址</translation>
</message>
<message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">Outbound 地址取得: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
<source>detecting: peer could be v1 or v2</source>
<extracomment>Explanatory text for "detecting" transport type.</extracomment>
<translation type="unfinished">检测中: 节点可能是v1或是v2</translation>
@@ -2041,15 +2522,35 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">对端选择了我们用于高带宽转发</translation>
</message>
<message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">未選擇高頻寬轉發點</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">复制地址(&amp;C)</translation>
</message>
<message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">断开(&amp;D)</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
<translation type="unfinished">1 小时(&amp;H)</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 周(&amp;W)</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 年(&amp;Y)</translation>
+ </message>
+ <message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
<translation type="unfinished">复制IP/网络掩码(&amp;C)</translation>
@@ -2059,6 +2560,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">解封(&amp;U)</translation>
</message>
<message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">网络活动已禁用</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">不使用任何钱包执行命令</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">使用“%1”钱包执行命令</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2081,6 +2598,10 @@ For more information on using this console, type %6.
<translation type="unfinished">执行中……</translation>
</message>
<message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">經由 %1</translation>
</message>
@@ -2089,6 +2610,10 @@ For more information on using this console, type %6.
<translation type="unfinished">是</translation>
</message>
<message>
+ <source>No</source>
+ <translation type="unfinished">否</translation>
+ </message>
+ <message>
<source>To</source>
<translation type="unfinished">到</translation>
</message>
@@ -2116,6 +2641,10 @@ For more information on using this console, type %6.
<translation type="unfinished">金额(&amp;A):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
<source>&amp;Message:</source>
<translation type="unfinished">訊息(&amp;M):</translation>
</message>
@@ -2124,6 +2653,10 @@ For more information on using this console, type %6.
<translation type="unfinished">可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。</translation>
</message>
<message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">可为新建的收款地址添加一个标签。</translation>
+ </message>
+ <message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
<translation type="unfinished">使用此表单请求付款。所有字段都是&lt;b&gt;可选&lt;/b&gt;的。</translation>
</message>
@@ -2136,10 +2669,18 @@ For more information on using this console, type %6.
<translation type="unfinished">一个关联到新收款地址(被您用来识别发票)的可选标签。它也会被附加到付款请求中。</translation>
</message>
<message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">一条附加到付款请求中的可选消息,可以显示给付款方。</translation>
+ </message>
+ <message>
<source>&amp;Create new receiving address</source>
<translation type="unfinished">&amp;產生新的接收地址</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
<source>Clear</source>
<translation type="unfinished">清空</translation>
</message>
@@ -2160,6 +2701,10 @@ For more information on using this console, type %6.
<translation type="unfinished">从列表中移除选中的条目</translation>
</message>
<message>
+ <source>Remove</source>
+ <translation type="unfinished">移除</translation>
+ </message>
+ <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">複製 &amp;URI</translation>
</message>
@@ -2200,6 +2745,10 @@ For more information on using this console, type %6.
<translation type="unfinished">Bech32m (BIP-350) 是对 Bech32 的更新升级,支持它的钱包仍然比较有限。</translation>
</message>
<message>
+ <source>Could not unlock wallet.</source>
+ <translation type="unfinished">无法解锁钱包。</translation>
+ </message>
+ <message>
<source>Could not generate new %1 address</source>
<translation type="unfinished">无法生成新的%1地址</translation>
</message>
@@ -2211,6 +2760,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请求支付至...</translation>
</message>
<message>
+ <source>Address:</source>
+ <translation type="unfinished">地址:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
<source>Label:</source>
<translation type="unfinished">标签:</translation>
</message>
@@ -2231,10 +2788,22 @@ For more information on using this console, type %6.
<translation type="unfinished">複製 &amp;地址</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
<source>&amp;Save Image…</source>
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>Payment information</source>
+ <translation type="unfinished">付款信息</translation>
+ </message>
+ <message>
<source>Request payment to %1</source>
<translation type="unfinished">付款給 %1 的要求</translation>
</message>
@@ -2242,14 +2811,26 @@ For more information on using this console, type %6.
<context>
<name>RecentRequestsTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
<message>
+ <source>(no message)</source>
+ <translation type="unfinished">(无消息)</translation>
+ </message>
+ <message>
<source>(no amount requested)</source>
<translation type="unfinished">(無要求金額)</translation>
</message>
@@ -2277,14 +2858,38 @@ For more information on using this console, type %6.
<translation type="unfinished">金额不足!</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">數量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
<translation type="unfinished">如果這項有打開,但是找零地址是空的或無效,那麼找零會送到一個產生出來的地址去。</translation>
</message>
<message>
+ <source>Custom change address</source>
+ <translation type="unfinished">自定义找零地址</translation>
+ </message>
+ <message>
<source>Transaction Fee:</source>
<translation type="unfinished">交易手续费:</translation>
</message>
@@ -2297,6 +2902,10 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 目前无法进行手续费估计。</translation>
</message>
<message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">每KB</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">隐藏</translation>
</message>
@@ -2309,10 +2918,22 @@ For more information on using this console, type %6.
<translation type="unfinished">自訂:</translation>
</message>
<message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">一次发送给多个收款人</translation>
+ </message>
+ <message>
<source>Add &amp;Recipient</source>
<translation type="unfinished">增加收款人(&amp;R)</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
+ </message>
+ <message>
<source>Choose…</source>
<translation type="unfinished">选择...</translation>
</message>
@@ -2321,18 +2942,54 @@ For more information on using this console, type %6.
<translation type="unfinished">隱藏交易手續費設定</translation>
</message>
<message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">當交易量小於可用區塊空間時,礦工和節點可能會執行最低手續費率限制。 以這個最低費率來支付手續費也是可以的,但請注意,一旦交易需求超出比特幣網路能處理的限度,你的交易可能永遠無法確認。</translation>
+ </message>
+ <message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
<translation type="unfinished">手續費太低的話可能會造成永遠無法確認的交易(請參考提示)</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">确认时间目标:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">启用手续费追加</translation>
+ </message>
+ <message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
<translation type="unfinished">手续费追加(Replace-By-Fee,BIP-125)可以让你在送出交易后继续追加手续费。不用这个功能的话,建议付比较高的手续费来降低交易延迟的风险。</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>Balance:</source>
<translation type="unfinished">餘額:</translation>
</message>
<message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">确认发送操作</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">发送(&amp;E)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -2361,12 +3018,26 @@ For more information on using this console, type %6.
<translation type="unfinished">%1 (%2个块)</translation>
</message>
<message>
- <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">在設備上簽證</translation>
+ </message>
+ <message>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">請先連接硬體錢包</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">從錢包 %1</translation>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">在 選項 -&gt; 錢包 中設定外部簽名器腳本路徑 </translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">创建未签名交易(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2382,6 +3053,10 @@ For more information on using this console, type %6.
<translation type="unfinished">外部签名器失败</translation>
</message>
<message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -2395,6 +3070,10 @@ For more information on using this console, type %6.
<translation type="unfinished">你可以之後再提高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -2410,6 +3089,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请检查您的交易。</translation>
</message>
<message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">没有打上BIP-125手续费追加的标记。</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">總金額</translation>
</message>
@@ -2444,6 +3131,22 @@ For more information on using this console, type %6.
<translation type="unfinished">支付金额必须大于0。</translation>
</message>
<message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">金额超出您的余额。</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">计入 %1 手续费后,金额超出了您的余额。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">发现重复地址:每个地址应该只使用一次。</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">交易创建失败!</translation>
+ </message>
+ <message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">超过 %1 的手续费被视为高得离谱。</translation>
</message>
@@ -2458,10 +3161,18 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 比特币地址无效</translation>
</message>
<message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">警告:未知的找零地址</translation>
+ </message>
+ <message>
<source>Confirm custom change address</source>
<translation type="unfinished">确认自定义找零地址</translation>
</message>
<message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">你选择的找零地址未被包含在本钱包中,你钱包中的部分或全部金额将被发送至该地址。你确定要这样做吗?</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
@@ -2477,14 +3188,34 @@ For more information on using this console, type %6.
<translation type="unfinished">付給(&amp;T):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
<source>The Bitcoin address to send the payment to</source>
<translation type="unfinished">將支付發送到的比特幣地址給</translation>
</message>
<message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">移除此项</translation>
+ </message>
+ <message>
<source>The amount to send in the selected unit</source>
<translation type="unfinished">用被选单位表示的待发送金额</translation>
</message>
<message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">交易费将从发送金额中扣除。接收人收到的比特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。</translation>
+ </message>
+ <message>
<source>S&amp;ubtract fee from amount</source>
<translation type="unfinished">從付款金額減去手續費(&amp;U)</translation>
</message>
@@ -2531,6 +3262,22 @@ For more information on using this console, type %6.
<translation type="unfinished">您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的比特幣。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。</translation>
</message>
<message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">用来对消息签名的地址</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">在这里输入您想要签名的消息</translation>
+ </message>
+ <message>
<source>Signature</source>
<translation type="unfinished">簽章</translation>
</message>
@@ -2551,10 +3298,18 @@ For more information on using this console, type %6.
<translation type="unfinished">清空所有签名消息栏</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>&amp;Verify Message</source>
<translation type="unfinished">消息验证(&amp;V)</translation>
</message>
<message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">请在下面输入接收者地址、消息(确保换行符、空格符、制表符等完全相同)和签名以验证消息。请仔细核对签名信息,以提防中间人攻击。请注意,这只是证明接收方可以用这个地址签名,它不能证明任何交易的发送人身份!</translation>
+ </message>
+ <message>
<source>The Bitcoin address the message was signed with</source>
<translation type="unfinished">用来签名消息的地址</translation>
</message>
@@ -2571,6 +3326,14 @@ For more information on using this console, type %6.
<translation type="unfinished">驗證這個訊息來確定是用指定的比特幣地址簽名的</translation>
</message>
<message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">验证消息签名(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">清空所有验证消息栏</translation>
+ </message>
+ <message>
<source>Click "Sign Message" to generate signature</source>
<translation type="unfinished">請按一下「簽署訊息」來產生簽章</translation>
</message>
@@ -2587,6 +3350,10 @@ For more information on using this console, type %6.
<translation type="unfinished">找不到与输入地址相关的密钥。</translation>
</message>
<message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">已取消解锁钱包。</translation>
+ </message>
+ <message>
<source>No error</source>
<translation type="unfinished">沒有錯誤</translation>
</message>
@@ -2599,6 +3366,14 @@ For more information on using this console, type %6.
<translation type="unfinished">消息签名失败。</translation>
</message>
<message>
+ <source>Message signed.</source>
+ <translation type="unfinished">消息已签名。</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">签名无法解码。</translation>
+ </message>
+ <message>
<source>Please check the signature and try again.</source>
<translation type="unfinished">请检查签名后重试。</translation>
</message>
@@ -2607,6 +3382,10 @@ For more information on using this console, type %6.
<translation type="unfinished">這個簽章跟訊息的數位摘要不符。</translation>
</message>
<message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">消息验证失败。</translation>
+ </message>
+ <message>
<source>Message verified.</source>
<translation type="unfinished">消息验证成功。</translation>
</message>
@@ -2640,6 +3419,11 @@ For more information on using this console, type %6.
<translation type="unfinished">0/未确认,不在内存池中</translation>
</message>
<message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>%1/unconfirmed</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
<translation type="unfinished">%1 次/未確認</translation>
@@ -2654,10 +3438,18 @@ For more information on using this console, type %6.
<translation type="unfinished">状态</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Source</source>
<translation type="unfinished">來源</translation>
</message>
<message>
+ <source>Generated</source>
+ <translation type="unfinished">挖矿生成</translation>
+ </message>
+ <message>
<source>From</source>
<translation type="unfinished">來源</translation>
</message>
@@ -2670,6 +3462,10 @@ For more information on using this console, type %6.
<translation type="unfinished">到</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
<source>watch-only</source>
<translation type="unfinished">只能看</translation>
</message>
@@ -2677,6 +3473,10 @@ For more information on using this console, type %6.
<source>label</source>
<translation type="unfinished">标签</translation>
</message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">收入</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -2684,18 +3484,46 @@ For more information on using this console, type %6.
</translation>
</message>
<message>
+ <source>not accepted</source>
+ <translation type="unfinished">未被接受</translation>
+ </message>
+ <message>
+ <source>Debit</source>
+ <translation type="unfinished">支出</translation>
+ </message>
+ <message>
<source>Total debit</source>
<translation type="unfinished">总支出</translation>
</message>
<message>
+ <source>Total credit</source>
+ <translation type="unfinished">总收入</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
<source>Net amount</source>
<translation type="unfinished">淨額</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">备注</translation>
+ </message>
+ <message>
<source>Transaction ID</source>
<translation type="unfinished">交易 ID</translation>
</message>
<message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">交易总大小</translation>
+ </message>
+ <message>
<source>Transaction virtual size</source>
<translation type="unfinished">交易擬真大小</translation>
</message>
@@ -2704,14 +3532,26 @@ For more information on using this console, type %6.
<translation type="unfinished">输出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(證書未驗證)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
</message>
<message>
<source>Merchant</source>
<translation type="unfinished">商家</translation>
</message>
<message>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">新挖出的比特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">调试信息</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">交易</translation>
+ </message>
+ <message>
<source>Inputs</source>
<translation type="unfinished">輸入</translation>
</message>
@@ -2723,7 +3563,11 @@ For more information on using this console, type %6.
<source>true</source>
<translation type="unfinished">是</translation>
</message>
- </context>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">否</translation>
+ </message>
+</context>
<context>
<name>TransactionDescDialog</name>
<message>
@@ -2738,6 +3582,10 @@ For more information on using this console, type %6.
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2746,6 +3594,14 @@ For more information on using this console, type %6.
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">未确认</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>Confirming (%1 of %2 recommended confirmations)</source>
<translation type="unfinished">确认中 (推荐 %2个确认,已经有 %1个确认)</translation>
</message>
@@ -2754,6 +3610,18 @@ For more information on using this console, type %6.
<translation type="unfinished">已確認(%1 次)</translation>
</message>
<message>
+ <source>Conflicted</source>
+ <translation type="unfinished">有冲突</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">未成熟 (%1 个确认,将在 %2 个后可用)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">已生成但未被接受</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2790,6 +3658,10 @@ For more information on using this console, type %6.
<translation type="unfinished">收到交易的日期和時間。</translation>
</message>
<message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">交易类型。</translation>
+ </message>
+ <message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
<translation type="unfinished">该交易中是否涉及仅观察地址。</translation>
</message>
@@ -2805,6 +3677,10 @@ For more information on using this console, type %6.
<translation type="unfinished">全部</translation>
</message>
<message>
+ <source>Today</source>
+ <translation type="unfinished">今天</translation>
+ </message>
+ <message>
<source>This week</source>
<translation type="unfinished">這星期</translation>
</message>
@@ -2813,6 +3689,14 @@ For more information on using this console, type %6.
<translation type="unfinished">這個月</translation>
</message>
<message>
+ <source>Last month</source>
+ <translation type="unfinished">上个月</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">今年</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2833,6 +3717,10 @@ For more information on using this console, type %6.
<translation type="unfinished">输入地址、交易ID或标签进行搜索</translation>
</message>
<message>
+ <source>Min amount</source>
+ <translation type="unfinished">最小金额</translation>
+ </message>
+ <message>
<source>Range…</source>
<translation type="unfinished">范围...</translation>
</message>
@@ -2857,10 +3745,22 @@ For more information on using this console, type %6.
<translation type="unfinished">复制原始交易(&amp;R)</translation>
</message>
<message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">複製完整交易明細</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">顯示交易明細</translation>
+ </message>
+ <message>
<source>Increase transaction &amp;fee</source>
<translation type="unfinished">增加矿工费(&amp;F)</translation>
</message>
<message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">放棄交易(&amp;b)</translation>
+ </message>
+ <message>
<source>&amp;Edit address label</source>
<translation type="unfinished">编辑地址标签(&amp;E)</translation>
</message>
@@ -2870,15 +3770,27 @@ For more information on using this console, type %6.
<translation type="unfinished">在 %1中显示</translation>
</message>
<message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">导出交易历史</translation>
+ </message>
+ <message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">逗號分隔文件</translation>
</message>
<message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Watch-only</source>
<translation type="unfinished">只能觀看的</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2914,7 +3826,11 @@ For more information on using this console, type %6.
<source>Range:</source>
<translation type="unfinished">範圍:</translation>
</message>
- </context>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">到</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -2930,6 +3846,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">创建一个新的钱包</translation>
</message>
<message>
+ <source>Error</source>
+ <translation type="unfinished">错误</translation>
+ </message>
+ <message>
<source>Unable to decode PSBT from clipboard (invalid base64)</source>
<translation type="unfinished">无法从剪贴板解码PSBT(Base64值无效)</translation>
</message>
@@ -2941,7 +3861,15 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Partially Signed Transaction (*.psbt)</source>
<translation type="unfinished">部分签名交易 (*.psbt)</translation>
</message>
- </context>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">PSBT文件必须小于100MiB</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">无法解码PSBT</translation>
+ </message>
+</context>
<context>
<name>WalletModel</name>
<message>
@@ -2949,6 +3877,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">付款</translation>
</message>
<message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">追加手续费出错</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">追加交易手续费失败</translation>
+ </message>
+ <message>
<source>Do you want to increase the fee?</source>
<extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
<translation type="unfinished">想要提高手續費嗎?</translation>
@@ -2958,6 +3894,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">当前手续费:</translation>
</message>
<message>
+ <source>Increase:</source>
+ <translation type="unfinished">增加量:</translation>
+ </message>
+ <message>
<source>New fee:</source>
<translation type="unfinished">新的費用:</translation>
</message>
@@ -2974,6 +3914,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">無法草擬交易。</translation>
</message>
<message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">PSBT已複製</translation>
+ </message>
+ <message>
<source>Copied to clipboard</source>
<comment>Fee-bump PSBT saved</comment>
<translation type="unfinished">复制到剪贴板</translation>
@@ -2987,6 +3931,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">沒辦法提交交易</translation>
</message>
<message>
+ <source>Can't display address</source>
+ <translation type="unfinished">無法顯示地址</translation>
+ </message>
+ <message>
<source>default wallet</source>
<translation type="unfinished">默认钱包</translation>
</message>
@@ -3050,6 +3998,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">无法把钱包版本从%i降级到%i。钱包版本未改变。</translation>
</message>
<message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">无法锁定数据目录 %s。%s 可能已经在运行。</translation>
+ </message>
+ <message>
<source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
<translation type="unfinished">无法在不支持“拆分前的密钥池”(pre split keypool)的情况下把“非拆分HD钱包”(non HD split wallet)从版本%i升级到%i。请使用版本号%i,或者压根不要指定版本号。</translation>
</message>
@@ -3074,26 +4026,58 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误: 转储文件格式不正确。得到是"%s",而预期本应得到的是 "format"。</translation>
</message>
<message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ </message>
+ <message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
<translation type="unfinished">错误: 转储文件版本不被支持。这个版本的 bitcoin-wallet 只支持版本为 1 的转储文件。得到的转储文件版本却是%s</translation>
</message>
<message>
+ <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
+ <translation type="unfinished">錯誤: 舊式錢包只支援 "legacy", "p2sh-segwit", 和 "bech32" 這三種位址類型</translation>
+ </message>
+ <message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
<translation type="unfinished">错误: 无法为该旧式钱包生成描述符。如果钱包已被加密,请确保提供的钱包加密密码正确。</translation>
</message>
<message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">檔案%s已經存在。 如果你確定這就是你想做的,先把這份檔案移開。</translation>
+ </message>
+ <message>
<source>Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start.</source>
<translation type="unfinished">无效或损坏的peers.dat (%s)。如果你确信这是一个bug,请反馈到%s。作为变通办法,你可以把现有文件 (%s) 移开(重命名、移动或删除),这样就可以在下次启动时创建一个新文件了。</translation>
</message>
<message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">提供多數TOR路由綁定位址。 對自動建立的Tor服務用%s</translation>
+ </message>
+ <message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
<translation type="unfinished">没有提供转储文件。要使用 createfromdump ,必须提供 -dumpfile=&lt;filename&gt;。</translation>
</message>
<message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 dump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
<translation type="unfinished">没有提供钱包格式。要使用 createfromdump ,必须提供 -format=&lt;format&gt;</translation>
</message>
<message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">请检查电脑的日期时间设置是否正确!时间错误可能会导致 %s 运行异常。</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">如果你认为%s对你比较有用的话,请对我们进行一些自愿贡献。请访问%s网站来获取有关这个软件的更多信息。</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">修剪被设置得太小,已经低于最小值%d MiB,请使用更大的数值。</translation>
+ </message>
+ <message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<translation type="unfinished">修剪模式与 -reindex-chainstate 不兼容。请进行一次完整的 -reindex 。</translation>
</message>
@@ -3118,6 +4102,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">扣除手續費後的交易金額太少而不能傳送</translation>
</message>
<message>
+ <source>This error could occur if this wallet was not shutdown cleanly and was last loaded using a build with a newer version of Berkeley DB. If so, please use the software that last loaded this wallet</source>
+ <translation type="unfinished">如果这个钱包之前没有正确关闭,而且上一次是被新版的Berkeley DB加载过,就会发生这个错误。如果是这样,请使用上次加载过这个钱包的那个软件。</translation>
+ </message>
+ <message>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
<translation type="unfinished">這是個還沒發表的測試版本 - 使用請自負風險 - 請不要用來開採或做商業應用</translation>
</message>
@@ -3170,6 +4158,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">警告:在已经禁用私钥的钱包 {%s} 中仍然检测到私钥</translation>
</message>
<message>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">警告:我们和其他节点似乎没达成共识!您可能需要升级,或者就是其他节点可能需要升级。</translation>
+ </message>
+ <message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
<translation type="unfinished">需要验证高度在%d之后的区块见证数据。请使用 -reindex 重新启动。</translation>
</message>
@@ -3186,6 +4178,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">參數 -maxmempool 至少要給 %d 百萬位元組(MB)</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">发生了致命的内部错误,请在debug.log中查看详情</translation>
+ </message>
+ <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">沒辦法解析 -%s 參數指定的地址: '%s'</translation>
</message>
@@ -3328,6 +4324,26 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">对 %s 的配置设置只对 %s 网络生效,如果它位于配置的 [%s] 章节的话</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">版权所有 (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">检测到区块数据库损坏</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">找不到asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">無法解析asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">磁盘空间太低!</translation>
+ </message>
+ <message>
<source>Do you want to rebuild the block database now?</source>
<translation type="unfinished">你想现在就重建区块数据库吗?</translation>
</message>
@@ -3340,6 +4356,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">转储文件 %s 不存在</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">创建%s时出错</translation>
</message>
@@ -3348,6 +4368,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">初始化区块数据库时出错</translation>
</message>
<message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">初始化钱包数据库环境错误 %s!</translation>
+ </message>
+ <message>
<source>Error loading %s</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤</translation>
</message>
@@ -3364,6 +4388,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤: 這個錢包需要新版的 %s</translation>
</message>
<message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">加载区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">打开区块数据库时出错</translation>
+ </message>
+ <message>
<source>Error reading configuration file: %s</source>
<translation type="unfinished">读取配置文件失败: %s</translation>
</message>
@@ -3372,16 +4404,16 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">读取数据库出错,关闭中。</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">從錢包資料庫讀取下一筆記錄時出錯</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -3400,10 +4432,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">錯誤:keypool已用完,請先重新呼叫keypoolrefill</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已经在使用SQLite</translation>
</message>
@@ -3428,6 +4456,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
@@ -3436,6 +4468,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法写入记录到新钱包</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法启动索引,关闭中...</translation>
</message>
@@ -3444,6 +4492,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数据库失败</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手续费率 (%s) 低于最大手续费率设置 (%s)</translation>
</message>
@@ -3612,6 +4664,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">这是你每次交易付款时最少要付的手续费。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amounts must not be negative</source>
<translation type="unfinished">交易金额不不可为负数</translation>
</message>
@@ -3684,6 +4740,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">%s链上acceptstalefeeestimates 不受支持。</translation>
</message>
@@ -3692,6 +4752,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的日志分类 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">用户代理备注(%s)包含不安全的字符。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh-Hans.ts b/src/qt/locale/bitcoin_zh-Hans.ts
index 5327462760..4b2769a0c5 100644
--- a/src/qt/locale/bitcoin_zh-Hans.ts
+++ b/src/qt/locale/bitcoin_zh-Hans.ts
@@ -303,6 +303,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金额</translation>
</message>
@@ -1120,12 +1132,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> 仅观察脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> 可解但又未被监视的脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1602,6 +1614,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
@@ -1818,18 +1834,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">与 "%1" 最接近的匹配</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">确定(&amp;O)</translation>
</message>
@@ -2071,8 +2075,8 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">PSBT已保存到硬盘</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * 发送 %1 至 %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
</message>
<message>
<source>own address</source>
@@ -2665,6 +2669,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">不使用任何钱包执行命令</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">使用“%1”钱包执行命令</translation>
</message>
@@ -3133,10 +3141,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">从钱包%1</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 到 '%2'</translation>
</message>
@@ -3194,6 +3198,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">请务必仔细检查您的交易请求。这会产生一个部分签名比特币交易(PSBT),可以把保存下来或复制出去,然后就可以对它进行签名,比如用离线%1钱包,或是用兼容PSBT的硬件钱包。</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -3652,8 +3660,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">输出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(证书未被验证)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4480,6 +4488,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">转储文件 %s 不存在</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">创建%s时出错</translation>
</message>
@@ -4528,16 +4540,12 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">从钱包数据库读取下一条记录时出错</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4576,10 +4584,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 没有可用的%s地址。</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已经在使用SQLite</translation>
</message>
@@ -4604,6 +4608,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
@@ -4612,6 +4620,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法写入记录到新钱包</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">监听端口失败。如果你愿意的话,请使用 -listen=0 参数。</translation>
</message>
@@ -4628,6 +4652,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数据库失败</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">删除交易时失败: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手续费率 (%s) 低于最大手续费率设置 (%s)</translation>
</message>
@@ -4848,6 +4876,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">如果发送交易,这将是你要支付的手续费。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">交易金额太小</translation>
</message>
@@ -4860,10 +4892,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">交易找零输出项编号超出范围</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">此交易在内存池中的存在过长的链条</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">交易必须包含至少一个收款人</translation>
</message>
@@ -4944,6 +4972,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s 。</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:%s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">%s链上 acceptstalefeeestimates 不受支持。</translation>
</message>
@@ -4952,6 +4984,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的日志分类 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">用户代理备注(%s)包含不安全的字符。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh-Hant.ts b/src/qt/locale/bitcoin_zh-Hant.ts
index 3b2152cd0c..9fe760619b 100644
--- a/src/qt/locale/bitcoin_zh-Hant.ts
+++ b/src/qt/locale/bitcoin_zh-Hant.ts
@@ -294,15 +294,45 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">请输入一个比特币地址 (例如 %1)</translation>
+ </message>
+ <message>
+ <source>Unroutable</source>
+ <translation type="unfinished">不可路由</translation>
+ </message>
+ <message>
<source>Inbound</source>
<extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
<message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
+ </message>
+ <message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
<translation type="unfinished">区块转发</translation>
@@ -313,6 +343,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手册</translation>
</message>
<message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation type="unfinished">%1 天</translation>
+ </message>
+ <message>
<source>%1 h</source>
<translation type="unfinished">%1 小时</translation>
</message>
@@ -321,6 +365,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">%1 分</translation>
</message>
<message>
+ <source>%1 s</source>
+ <translation type="unfinished">%1 秒</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
<source>N/A</source>
<translation type="unfinished">未知</translation>
</message>
@@ -792,12 +844,24 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">警告: %1</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">日期: %1
+</translation>
+ </message>
+ <message>
<source>Amount: %1
</source>
<translation type="unfinished">金額: %1
</translation>
</message>
<message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">錢包: %1
+</translation>
+ </message>
+ <message>
<source>Type: %1
</source>
<translation type="unfinished">種類: %1
@@ -816,6 +880,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">送出交易</translation>
+ </message>
+ <message>
<source>Incoming transaction</source>
<translation type="unfinished">收款交易</translation>
</message>
@@ -836,6 +904,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;解鎖中&lt;/b&gt;</translation>
</message>
<message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
+ </message>
+ <message>
<source>Original message:</source>
<translation type="unfinished">原消息:</translation>
</message>
@@ -854,10 +926,34 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手动选币</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">总量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組數:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">全(不)选</translation>
+ </message>
+ <message>
<source>Tree mode</source>
<translation type="unfinished">树状模式</translation>
</message>
@@ -870,10 +966,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation type="unfinished">收款标签</translation>
+ </message>
+ <message>
<source>Received with address</source>
<translation type="unfinished">收款地址</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation type="unfinished">复制金额</translation>
</message>
@@ -898,6 +1006,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">锁定未花费(&amp;O)</translation>
</message>
<message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">解锁未花费(&amp;U)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -933,7 +1045,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- </context>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(找零)</translation>
+ </message>
+</context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -998,12 +1114,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">仅观察脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> 可解但又未被监视的脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1076,7 +1192,11 @@ The migration process will create a backup of the wallet before migrating. This
<source>Close all wallets</source>
<translation type="unfinished">关闭所有钱包</translation>
</message>
- </context>
+ <message>
+ <source>Are you sure you wish to close all wallets?</source>
+ <translation type="unfinished">您确定想要关闭所有钱包吗?</translation>
+ </message>
+</context>
<context>
<name>CreateWalletDialog</name>
<message>
@@ -1123,6 +1243,10 @@ The migration process will create a backup of the wallet before migrating. This
<source>Make Blank Wallet</source>
<translation type="unfinished">製作空白錢包</translation>
</message>
+ <message>
+ <source>Create</source>
+ <translation type="unfinished">创建</translation>
+ </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -1143,6 +1267,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">跟這個地址清單關聯的地址。只有發送地址能被修改。</translation>
</message>
<message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">地址(&amp;A)</translation>
+ </message>
+ <message>
<source>New sending address</source>
<translation type="unfinished">新建付款地址</translation>
</message>
@@ -1155,6 +1283,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">编辑付款地址</translation>
</message>
<message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">地址“%1”已经存在,它是一个收款地址,标签为“%2”,所以它不能作为一个付款地址被添加进来。</translation>
+ </message>
+ <message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
<translation type="unfinished">输入的地址“%1”已经存在于地址簿中,标签为“%2”。</translation>
</message>
@@ -1174,10 +1306,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">就要產生新的資料目錄。</translation>
</message>
<message>
+ <source>name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
<translation type="unfinished">已經有這個目錄了。如果你要在裡面造出新的目錄的話,請加上 %1.</translation>
</message>
<message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">路径已存在,并且不是一个目录。</translation>
+ </message>
+ <message>
<source>Cannot create data directory here.</source>
<translation type="unfinished">无法在此创建数据目录。</translation>
</message>
@@ -1210,6 +1350,10 @@ The migration process will create a backup of the wallet before migrating. This
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
<translation type="unfinished">此目录中至少会保存 %1 GB 的数据,并且大小还会随着时间增长。</translation>
</message>
+ <message>
+ <source>Approximately %1 GB of data will be stored in this directory.</source>
+ <translation type="unfinished">会在此目录中存储约 %1 GB 的数据。</translation>
+ </message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
@@ -1238,10 +1382,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">欢迎</translation>
</message>
<message>
+ <source>Welcome to %1.</source>
+ <translation type="unfinished">欢迎使用 %1</translation>
+ </message>
+ <message>
<source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
<translation type="unfinished">由于这是第一次启动此程序,您可以选择%1存储数据的位置</translation>
</message>
<message>
+ <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
+ <translation type="unfinished">取消此设置需要重新下载整个区块链。先完整下载整条链再进行修剪会更快。这会禁用一些高级功能。</translation>
+ </message>
+ <message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
<translation type="unfinished">初始化同步过程是非常吃力的,同时可能会暴露您之前没有注意到的电脑硬件问题。你每次启动%1时,它都会从之前中断的地方继续下载。</translation>
</message>
@@ -1265,6 +1417,10 @@ The migration process will create a backup of the wallet before migrating. This
<context>
<name>HelpMessageDialog</name>
<message>
+ <source>version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>About %1</source>
<translation type="unfinished">关于 %1</translation>
</message>
@@ -1279,7 +1435,11 @@ The migration process will create a backup of the wallet before migrating. This
<source>%1 is shutting down…</source>
<translation type="unfinished">%1正在关闭...</translation>
</message>
- </context>
+ <message>
+ <source>Do not shut down the computer until this window disappears.</source>
+ <translation type="unfinished">在此窗口消失前不要关闭计算机。</translation>
+ </message>
+</context>
<context>
<name>ModalOverlay</name>
<message>
@@ -1287,6 +1447,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗体</translation>
</message>
<message>
+ <source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
+ <translation type="unfinished">近期交易可能尚未显示,因此当前余额可能不准确。以上信息将在与比特币网络完全同步后更正。详情如下</translation>
+ </message>
+ <message>
+ <source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
+ <translation type="unfinished">尝试使用受未可见交易影响的余额将不被网络接受。</translation>
+ </message>
+ <message>
+ <source>Number of blocks left</source>
+ <translation type="unfinished">剩余区块数量</translation>
+ </message>
+ <message>
<source>Unknown…</source>
<translation type="unfinished">未知...</translation>
</message>
@@ -1295,6 +1467,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">计算中...</translation>
</message>
<message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
<source>Progress</source>
<translation type="unfinished">进度</translation>
</message>
@@ -1303,6 +1479,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">每小时进度增加</translation>
</message>
<message>
+ <source>Estimated time left until synced</source>
+ <translation type="unfinished">预计剩余同步时间</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">隐藏</translation>
</message>
@@ -1325,7 +1505,12 @@ The migration process will create a backup of the wallet before migrating. This
<source>Open bitcoin URI</source>
<translation type="unfinished">打开比特币URI</translation>
</message>
- </context>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+</context>
<context>
<name>OptionsDialog</name>
<message>
@@ -1333,6 +1518,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">選項</translation>
</message>
<message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">主要(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">在登入系统后自动启动 %1</translation>
+ </message>
+ <message>
<source>&amp;Start %1 on system login</source>
<translation type="unfinished">系统登入时启动 %1 (&amp;S)</translation>
</message>
@@ -1341,6 +1534,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">启用区块修剪会显著减小存储交易对磁盘空间的需求。所有的区块仍然会被完整校验。取消这个设置需要重新下载整条区块链。</translation>
</message>
<message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">数据库缓存大小(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">脚本验证线程数(&amp;V)</translation>
+ </message>
+ <message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
<translation type="unfinished">与%1兼容的脚本文件路径(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:恶意软件可以偷币!</translation>
</message>
@@ -1357,6 +1558,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
@@ -1381,6 +1586,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">网络(&amp;N)</translation>
</message>
<message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">将区块存储修剪至(&amp;B)</translation>
+ </message>
+ <message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
<translation type="unfinished">警告:还原此设置需要重新下载整个区块链。</translation>
</message>
@@ -1409,6 +1618,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">启用R&amp;PC服务器</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">钱包(&amp;A)</translation>
+ </message>
+ <message>
<source>Whether to set subtract fee from amount as default or not.</source>
<extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
<translation type="unfinished">是否要默认从金额中减去手续费。</translation>
@@ -1419,10 +1632,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">默认从金额中减去交易手续费(&amp;F)</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation type="unfinished">专家</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">启用手动选币功能(&amp;C)</translation>
+ </message>
+ <message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished">如果您禁止动用尚未确认的找零资金,则一笔交易的找零资金至少需要有1个确认后才能动用。这同时也会影响账户余额的计算。</translation>
</message>
<message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">动用尚未确认的找零资金(&amp;S)</translation>
+ </message>
+ <message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
<translation type="unfinished">启用&amp;PSBT控件</translation>
@@ -1433,10 +1658,30 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">是否要显示PSBT控件</translation>
</message>
<message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">外接簽證設備 (e.g. 硬體錢包)</translation>
+ </message>
+ <message>
<source>&amp;External signer script path</source>
<translation type="unfinished">外部签名器脚本路径(&amp;E)</translation>
</message>
<message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">使用 &amp;UPnP 映射端口</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
<source>Accept connections from outside.</source>
<translation type="unfinished">接受外來連線</translation>
</message>
@@ -1453,6 +1698,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">通过 SO&amp;CKS5 代理连接(默认代理):</translation>
</message>
<message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">代理服务器 &amp;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">端口(&amp;P):</translation>
+ </message>
+ <message>
<source>Port of the proxy (e.g. 9050)</source>
<translation type="unfinished">代理伺服器的通訊埠(像是 9050)</translation>
</message>
@@ -1465,6 +1718,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗口(&amp;W)</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">視窗縮到最小後只在通知區顯示圖示。</translation>
</message>
@@ -1477,6 +1738,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">单击关闭按钮时最小化(&amp;I)</translation>
</message>
<message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">显示(&amp;D)</translation>
+ </message>
+ <message>
<source>User Interface &amp;language:</source>
<translation type="unfinished">使用界面語言(&amp;L):</translation>
</message>
@@ -1501,22 +1766,39 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">第三方交易网址(&amp;T)</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">是否显示手动选币功能。</translation>
+ </message>
+ <message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
<translation type="unfinished">连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
+ <source>&amp;OK</source>
+ <translation type="unfinished">确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">取消(&amp;C)</translation>
</message>
<message>
<source>default</source>
<translation type="unfinished">預設值</translation>
</message>
<message>
+ <source>none</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">确认恢复默认设置</translation>
+ </message>
+ <message>
<source>Client restart required to activate changes.</source>
<extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
<translation type="unfinished">需要重新開始客戶端軟體來讓改變生效。</translation>
@@ -1557,7 +1839,15 @@ The migration process will create a backup of the wallet before migrating. This
<source>The configuration file could not be opened.</source>
<translation type="unfinished">无法打开配置文件。</translation>
</message>
- </context>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">此更改需要重启客户端。</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">提供的代理服务器地址无效。</translation>
+ </message>
+</context>
<context>
<name>OptionsModel</name>
<message>
@@ -1576,6 +1866,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">顯示的資訊可能是過期的。跟 Bitcoin 網路的連線建立後,你的錢包會自動和網路同步,但是這個步驟還沒完成。</translation>
</message>
<message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
<source>Available:</source>
<translation type="unfinished">可用金額:</translation>
</message>
@@ -1604,10 +1898,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">餘額</translation>
</message>
<message>
+ <source>Total:</source>
+ <translation type="unfinished">总额:</translation>
+ </message>
+ <message>
<source>Your current total balance</source>
<translation type="unfinished">您当前的总余额</translation>
</message>
<message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">您当前在仅观察观察地址中的余额</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">可动用:</translation>
+ </message>
+ <message>
<source>Recent transactions</source>
<translation type="unfinished">最近的交易</translation>
</message>
@@ -1616,6 +1922,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">仅观察地址的未确认交易</translation>
</message>
<message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">仅观察地址中尚未成熟的挖矿收入余额:</translation>
+ </message>
+ <message>
<source>Current total balance in watch-only addresses</source>
<translation type="unfinished">仅观察地址中的当前总余额</translation>
</message>
@@ -1651,6 +1961,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">關閉</translation>
</message>
<message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">加载交易失败: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">签名交易失败: %1</translation>
+ </message>
+ <message>
<source>Cannot sign inputs while wallet is locked.</source>
<translation type="unfinished">钱包已锁定,无法签名交易输入项。</translation>
</message>
@@ -1663,6 +1981,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">已签名 %1 个交易输入项,但是仍然还有余下的项目需要签名。</translation>
</message>
<message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">成功签名交易。交易已经可以广播。</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">处理交易时遇到未知错误。</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">已复制PSBT到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -1672,6 +2006,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">PSBT已保存到硬盘</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">无法计算交易费用或总交易金额。</translation>
+ </message>
+ <message>
<source>Pays transaction fee: </source>
<translation type="unfinished">支付交易费用:</translation>
</message>
@@ -1700,6 +2046,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">(但这个钱包不能签名交易)</translation>
</message>
<message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(但这个钱包没有正确的密钥)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">交易已经完全签名,可以广播。</translation>
+ </message>
+ <message>
<source>Transaction status is unknown.</source>
<translation type="unfinished">交易状态未知。</translation>
</message>
@@ -1711,6 +2065,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">支付请求出错</translation>
</message>
<message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">无法启动 bitcoin: 协议的“一键支付”处理程序</translation>
+ </message>
+ <message>
<source>URI handling</source>
<translation type="unfinished">URI 處理</translation>
</message>
@@ -1787,7 +2145,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<extracomment>An Inbound Connection from a Peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
- </context>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
@@ -1795,10 +2158,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">复制图像(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">URI 太長,請縮短標籤或訊息文字。</translation>
+ </message>
+ <message>
<source>Error encoding URI into QR Code.</source>
<translation type="unfinished">把 URI 编码成二维码时发生错误。</translation>
</message>
<message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">不支持二维码。</translation>
+ </message>
+ <message>
<source>Save QR Code</source>
<translation type="unfinished">儲存 QR 碼</translation>
</message>
@@ -1823,6 +2198,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">資訊(&amp;I)</translation>
</message>
<message>
+ <source>General</source>
+ <translation type="unfinished">常规</translation>
+ </message>
+ <message>
<source>Datadir</source>
<translation type="unfinished">数据目录</translation>
</message>
@@ -1835,6 +2214,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">区块存储目录</translation>
</message>
<message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">如果要自訂區塊儲存目錄的位置,請使用 '%1' 這個選項來指定新的位置。</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation type="unfinished">啓動時間</translation>
</message>
@@ -1843,6 +2226,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络</translation>
</message>
<message>
+ <source>Name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Number of connections</source>
<translation type="unfinished">連線數</translation>
</message>
@@ -1851,10 +2238,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">區塊鏈</translation>
</message>
<message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">内存池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">当前交易数量</translation>
+ </message>
+ <message>
<source>Memory usage</source>
<translation type="unfinished">内存使用</translation>
</message>
<message>
+ <source>Wallet: </source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
<source>(none)</source>
<translation type="unfinished">(无)</translation>
</message>
@@ -1899,6 +2298,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">会话ID</translation>
</message>
<message>
+ <source>Version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">是否要将交易转发给这个节点。</translation>
</message>
@@ -1907,10 +2310,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">交易转发</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation type="unfinished">起步区块</translation>
+ </message>
+ <message>
<source>Synced Headers</source>
<translation type="unfinished">已同步前導資料</translation>
</message>
<message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">已同步区块</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">最近交易</translation>
</message>
@@ -1965,6 +2376,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">当前区块高度</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">打开当前数据目录中的 %1 调试日志文件。日志文件大的话可能要等上几秒钟。</translation>
+ </message>
+ <message>
<source>Decrease font size</source>
<translation type="unfinished">缩小字体大小</translation>
</message>
@@ -2001,10 +2416,23 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">高带宽</translation>
</message>
<message>
+ <source>Connection Time</source>
+ <translation type="unfinished">连接时间</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">來自這個節點上次成功驗證新區塊已經過的時間</translation>
+ </message>
+ <message>
<source>Last Block</source>
<translation type="unfinished">上一个区块</translation>
</message>
<message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">來自這個節點上次成功驗證新交易進入內存池已經過的時間</translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation type="unfinished">最近送出</translation>
</message>
@@ -2013,6 +2441,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">上次接收</translation>
</message>
<message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping 延时</translation>
+ </message>
+ <message>
<source>The duration of a currently outstanding ping.</source>
<translation type="unfinished">目前这一次 ping 已经过去的时间。</translation>
</message>
@@ -2021,6 +2453,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Ping 等待</translation>
</message>
<message>
+ <source>Min Ping</source>
+ <translation type="unfinished">最小 Ping 值</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">时间偏移</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
<source>&amp;Open</source>
<translation type="unfinished">打开(&amp;O)</translation>
</message>
@@ -2037,6 +2481,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">總計</translation>
</message>
<message>
+ <source>Debug log file</source>
+ <translation type="unfinished">调试日志文件</translation>
+ </message>
+ <message>
<source>Clear console</source>
<translation type="unfinished">清主控台</translation>
</message>
@@ -2074,6 +2522,11 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">出站触须: 短暂,用于测试地址</translation>
</message>
<message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">Outbound 地址取得: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
<source>detecting: peer could be v1 or v2</source>
<extracomment>Explanatory text for "detecting" transport type.</extracomment>
<translation type="unfinished">检测中: 节点可能是v1或是v2</translation>
@@ -2097,15 +2550,35 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">对端选择了我们用于高带宽转发</translation>
</message>
<message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">未選擇高頻寬轉發點</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">复制地址(&amp;C)</translation>
</message>
<message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">断开(&amp;D)</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
<translation type="unfinished">1 小时(&amp;H)</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 周(&amp;W)</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 年(&amp;Y)</translation>
+ </message>
+ <message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
<translation type="unfinished">复制IP/网络掩码(&amp;C)</translation>
@@ -2115,6 +2588,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">解封(&amp;U)</translation>
</message>
<message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">网络活动已禁用</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">不使用任何钱包执行命令</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">使用“%1”钱包执行命令</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2137,6 +2626,10 @@ For more information on using this console, type %6.
<translation type="unfinished">执行中……</translation>
</message>
<message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">經由 %1</translation>
</message>
@@ -2145,6 +2638,10 @@ For more information on using this console, type %6.
<translation type="unfinished">是</translation>
</message>
<message>
+ <source>No</source>
+ <translation type="unfinished">否</translation>
+ </message>
+ <message>
<source>To</source>
<translation type="unfinished">到</translation>
</message>
@@ -2172,6 +2669,10 @@ For more information on using this console, type %6.
<translation type="unfinished">金额(&amp;A):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
<source>&amp;Message:</source>
<translation type="unfinished">訊息(&amp;M):</translation>
</message>
@@ -2180,6 +2681,10 @@ For more information on using this console, type %6.
<translation type="unfinished">可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。</translation>
</message>
<message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">可为新建的收款地址添加一个标签。</translation>
+ </message>
+ <message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
<translation type="unfinished">使用此表单请求付款。所有字段都是&lt;b&gt;可选&lt;/b&gt;的。</translation>
</message>
@@ -2192,10 +2697,18 @@ For more information on using this console, type %6.
<translation type="unfinished">一个关联到新收款地址(被您用来识别发票)的可选标签。它也会被附加到付款请求中。</translation>
</message>
<message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">一条附加到付款请求中的可选消息,可以显示给付款方。</translation>
+ </message>
+ <message>
<source>&amp;Create new receiving address</source>
<translation type="unfinished">&amp;產生新的接收地址</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
<source>Clear</source>
<translation type="unfinished">清空</translation>
</message>
@@ -2216,6 +2729,10 @@ For more information on using this console, type %6.
<translation type="unfinished">从列表中移除选中的条目</translation>
</message>
<message>
+ <source>Remove</source>
+ <translation type="unfinished">移除</translation>
+ </message>
+ <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">複製 &amp;URI</translation>
</message>
@@ -2271,6 +2788,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请求支付至...</translation>
</message>
<message>
+ <source>Address:</source>
+ <translation type="unfinished">地址:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
<source>Label:</source>
<translation type="unfinished">标签:</translation>
</message>
@@ -2291,10 +2816,22 @@ For more information on using this console, type %6.
<translation type="unfinished">複製 &amp;地址</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
<source>&amp;Save Image…</source>
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>Payment information</source>
+ <translation type="unfinished">付款信息</translation>
+ </message>
+ <message>
<source>Request payment to %1</source>
<translation type="unfinished">付款給 %1 的要求</translation>
</message>
@@ -2302,14 +2839,26 @@ For more information on using this console, type %6.
<context>
<name>RecentRequestsTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
<message>
+ <source>(no message)</source>
+ <translation type="unfinished">(无消息)</translation>
+ </message>
+ <message>
<source>(no amount requested)</source>
<translation type="unfinished">(無要求金額)</translation>
</message>
@@ -2337,14 +2886,38 @@ For more information on using this console, type %6.
<translation type="unfinished">金额不足!</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">數量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
<translation type="unfinished">如果這項有打開,但是找零地址是空的或無效,那麼找零會送到一個產生出來的地址去。</translation>
</message>
<message>
+ <source>Custom change address</source>
+ <translation type="unfinished">自定义找零地址</translation>
+ </message>
+ <message>
<source>Transaction Fee:</source>
<translation type="unfinished">交易手续费:</translation>
</message>
@@ -2357,6 +2930,10 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 目前无法进行手续费估计。</translation>
</message>
<message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">每KB</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">隐藏</translation>
</message>
@@ -2369,10 +2946,22 @@ For more information on using this console, type %6.
<translation type="unfinished">自訂:</translation>
</message>
<message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">一次发送给多个收款人</translation>
+ </message>
+ <message>
<source>Add &amp;Recipient</source>
<translation type="unfinished">增加收款人(&amp;R)</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
+ </message>
+ <message>
<source>Choose…</source>
<translation type="unfinished">选择...</translation>
</message>
@@ -2381,18 +2970,54 @@ For more information on using this console, type %6.
<translation type="unfinished">隱藏交易手續費設定</translation>
</message>
<message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">當交易量小於可用區塊空間時,礦工和節點可能會執行最低手續費率限制。 以這個最低費率來支付手續費也是可以的,但請注意,一旦交易需求超出比特幣網路能處理的限度,你的交易可能永遠無法確認。</translation>
+ </message>
+ <message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
<translation type="unfinished">手續費太低的話可能會造成永遠無法確認的交易(請參考提示)</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">确认时间目标:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">启用手续费追加</translation>
+ </message>
+ <message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
<translation type="unfinished">手续费追加(Replace-By-Fee,BIP-125)可以让你在送出交易后继续追加手续费。不用这个功能的话,建议付比较高的手续费来降低交易延迟的风险。</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>Balance:</source>
<translation type="unfinished">餘額:</translation>
</message>
<message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">确认发送操作</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">发送(&amp;E)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -2421,12 +3046,26 @@ For more information on using this console, type %6.
<translation type="unfinished">%1 (%2个块)</translation>
</message>
<message>
- <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">在設備上簽證</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">從錢包 %1</translation>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">請先連接硬體錢包</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">在 選項 -&gt; 錢包 中設定外部簽名器腳本路徑 </translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">创建未签名交易(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2442,6 +3081,10 @@ For more information on using this console, type %6.
<translation type="unfinished">外部签名器失败</translation>
</message>
<message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -2455,6 +3098,10 @@ For more information on using this console, type %6.
<translation type="unfinished">你可以之後再提高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -2470,6 +3117,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请检查您的交易。</translation>
</message>
<message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">没有打上BIP-125手续费追加的标记。</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">總金額</translation>
</message>
@@ -2504,6 +3159,22 @@ For more information on using this console, type %6.
<translation type="unfinished">支付金额必须大于0。</translation>
</message>
<message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">金额超出您的余额。</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">计入 %1 手续费后,金额超出了您的余额。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">发现重复地址:每个地址应该只使用一次。</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">交易创建失败!</translation>
+ </message>
+ <message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">超过 %1 的手续费被视为高得离谱。</translation>
</message>
@@ -2518,10 +3189,18 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 比特币地址无效</translation>
</message>
<message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">警告:未知的找零地址</translation>
+ </message>
+ <message>
<source>Confirm custom change address</source>
<translation type="unfinished">确认自定义找零地址</translation>
</message>
<message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">你选择的找零地址未被包含在本钱包中,你钱包中的部分或全部金额将被发送至该地址。你确定要这样做吗?</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
@@ -2537,14 +3216,34 @@ For more information on using this console, type %6.
<translation type="unfinished">付給(&amp;T):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
<source>The Bitcoin address to send the payment to</source>
<translation type="unfinished">將支付發送到的比特幣地址給</translation>
</message>
<message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">移除此项</translation>
+ </message>
+ <message>
<source>The amount to send in the selected unit</source>
<translation type="unfinished">用被选单位表示的待发送金额</translation>
</message>
<message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">交易费将从发送金额中扣除。接收人收到的比特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。</translation>
+ </message>
+ <message>
<source>S&amp;ubtract fee from amount</source>
<translation type="unfinished">從付款金額減去手續費(&amp;U)</translation>
</message>
@@ -2591,6 +3290,22 @@ For more information on using this console, type %6.
<translation type="unfinished">您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的比特幣。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。</translation>
</message>
<message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">用来对消息签名的地址</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">在这里输入您想要签名的消息</translation>
+ </message>
+ <message>
<source>Signature</source>
<translation type="unfinished">簽章</translation>
</message>
@@ -2611,10 +3326,18 @@ For more information on using this console, type %6.
<translation type="unfinished">清空所有签名消息栏</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>&amp;Verify Message</source>
<translation type="unfinished">消息验证(&amp;V)</translation>
</message>
<message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">请在下面输入接收者地址、消息(确保换行符、空格符、制表符等完全相同)和签名以验证消息。请仔细核对签名信息,以提防中间人攻击。请注意,这只是证明接收方可以用这个地址签名,它不能证明任何交易的发送人身份!</translation>
+ </message>
+ <message>
<source>The Bitcoin address the message was signed with</source>
<translation type="unfinished">用来签名消息的地址</translation>
</message>
@@ -2631,6 +3354,14 @@ For more information on using this console, type %6.
<translation type="unfinished">驗證這個訊息來確定是用指定的比特幣地址簽名的</translation>
</message>
<message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">验证消息签名(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">清空所有验证消息栏</translation>
+ </message>
+ <message>
<source>Click "Sign Message" to generate signature</source>
<translation type="unfinished">請按一下「簽署訊息」來產生簽章</translation>
</message>
@@ -2647,6 +3378,10 @@ For more information on using this console, type %6.
<translation type="unfinished">找不到与输入地址相关的密钥。</translation>
</message>
<message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">已取消解锁钱包。</translation>
+ </message>
+ <message>
<source>No error</source>
<translation type="unfinished">沒有錯誤</translation>
</message>
@@ -2659,6 +3394,14 @@ For more information on using this console, type %6.
<translation type="unfinished">消息签名失败。</translation>
</message>
<message>
+ <source>Message signed.</source>
+ <translation type="unfinished">消息已签名。</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">签名无法解码。</translation>
+ </message>
+ <message>
<source>Please check the signature and try again.</source>
<translation type="unfinished">请检查签名后重试。</translation>
</message>
@@ -2667,6 +3410,10 @@ For more information on using this console, type %6.
<translation type="unfinished">這個簽章跟訊息的數位摘要不符。</translation>
</message>
<message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">消息验证失败。</translation>
+ </message>
+ <message>
<source>Message verified.</source>
<translation type="unfinished">消息验证成功。</translation>
</message>
@@ -2700,6 +3447,11 @@ For more information on using this console, type %6.
<translation type="unfinished">0/未确认,不在内存池中</translation>
</message>
<message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>%1/unconfirmed</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
<translation type="unfinished">%1 次/未確認</translation>
@@ -2714,10 +3466,18 @@ For more information on using this console, type %6.
<translation type="unfinished">状态</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Source</source>
<translation type="unfinished">來源</translation>
</message>
<message>
+ <source>Generated</source>
+ <translation type="unfinished">挖矿生成</translation>
+ </message>
+ <message>
<source>From</source>
<translation type="unfinished">來源</translation>
</message>
@@ -2730,6 +3490,10 @@ For more information on using this console, type %6.
<translation type="unfinished">到</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
<source>watch-only</source>
<translation type="unfinished">只能看</translation>
</message>
@@ -2737,6 +3501,10 @@ For more information on using this console, type %6.
<source>label</source>
<translation type="unfinished">标签</translation>
</message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">收入</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -2744,18 +3512,46 @@ For more information on using this console, type %6.
</translation>
</message>
<message>
+ <source>not accepted</source>
+ <translation type="unfinished">未被接受</translation>
+ </message>
+ <message>
+ <source>Debit</source>
+ <translation type="unfinished">支出</translation>
+ </message>
+ <message>
<source>Total debit</source>
<translation type="unfinished">总支出</translation>
</message>
<message>
+ <source>Total credit</source>
+ <translation type="unfinished">总收入</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
<source>Net amount</source>
<translation type="unfinished">淨額</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">备注</translation>
+ </message>
+ <message>
<source>Transaction ID</source>
<translation type="unfinished">交易 ID</translation>
</message>
<message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">交易总大小</translation>
+ </message>
+ <message>
<source>Transaction virtual size</source>
<translation type="unfinished">交易擬真大小</translation>
</message>
@@ -2764,14 +3560,26 @@ For more information on using this console, type %6.
<translation type="unfinished">输出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(證書未驗證)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
</message>
<message>
<source>Merchant</source>
<translation type="unfinished">商家</translation>
</message>
<message>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">新挖出的比特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">调试信息</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">交易</translation>
+ </message>
+ <message>
<source>Inputs</source>
<translation type="unfinished">輸入</translation>
</message>
@@ -2783,7 +3591,11 @@ For more information on using this console, type %6.
<source>true</source>
<translation type="unfinished">是</translation>
</message>
- </context>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">否</translation>
+ </message>
+</context>
<context>
<name>TransactionDescDialog</name>
<message>
@@ -2798,6 +3610,10 @@ For more information on using this console, type %6.
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2806,6 +3622,14 @@ For more information on using this console, type %6.
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">未确认</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>Confirming (%1 of %2 recommended confirmations)</source>
<translation type="unfinished">确认中 (推荐 %2个确认,已经有 %1个确认)</translation>
</message>
@@ -2814,6 +3638,18 @@ For more information on using this console, type %6.
<translation type="unfinished">已確認(%1 次)</translation>
</message>
<message>
+ <source>Conflicted</source>
+ <translation type="unfinished">有冲突</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">未成熟 (%1 个确认,将在 %2 个后可用)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">已生成但未被接受</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2850,6 +3686,10 @@ For more information on using this console, type %6.
<translation type="unfinished">收到交易的日期和時間。</translation>
</message>
<message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">交易类型。</translation>
+ </message>
+ <message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
<translation type="unfinished">该交易中是否涉及仅观察地址。</translation>
</message>
@@ -2865,6 +3705,10 @@ For more information on using this console, type %6.
<translation type="unfinished">全部</translation>
</message>
<message>
+ <source>Today</source>
+ <translation type="unfinished">今天</translation>
+ </message>
+ <message>
<source>This week</source>
<translation type="unfinished">這星期</translation>
</message>
@@ -2873,6 +3717,14 @@ For more information on using this console, type %6.
<translation type="unfinished">這個月</translation>
</message>
<message>
+ <source>Last month</source>
+ <translation type="unfinished">上个月</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">今年</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2893,6 +3745,10 @@ For more information on using this console, type %6.
<translation type="unfinished">输入地址、交易ID或标签进行搜索</translation>
</message>
<message>
+ <source>Min amount</source>
+ <translation type="unfinished">最小金额</translation>
+ </message>
+ <message>
<source>Range…</source>
<translation type="unfinished">范围...</translation>
</message>
@@ -2917,10 +3773,22 @@ For more information on using this console, type %6.
<translation type="unfinished">复制原始交易(&amp;R)</translation>
</message>
<message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">複製完整交易明細</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">顯示交易明細</translation>
+ </message>
+ <message>
<source>Increase transaction &amp;fee</source>
<translation type="unfinished">增加矿工费(&amp;F)</translation>
</message>
<message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">放棄交易(&amp;b)</translation>
+ </message>
+ <message>
<source>&amp;Edit address label</source>
<translation type="unfinished">编辑地址标签(&amp;E)</translation>
</message>
@@ -2930,15 +3798,27 @@ For more information on using this console, type %6.
<translation type="unfinished">在 %1中显示</translation>
</message>
<message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">导出交易历史</translation>
+ </message>
+ <message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">逗號分隔文件</translation>
</message>
<message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Watch-only</source>
<translation type="unfinished">只能觀看的</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2974,7 +3854,11 @@ For more information on using this console, type %6.
<source>Range:</source>
<translation type="unfinished">範圍:</translation>
</message>
- </context>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">到</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -3005,7 +3889,15 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Partially Signed Transaction (*.psbt)</source>
<translation type="unfinished">部分签名交易 (*.psbt)</translation>
</message>
- </context>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">PSBT文件必须小于100MiB</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">无法解码PSBT</translation>
+ </message>
+</context>
<context>
<name>WalletModel</name>
<message>
@@ -3013,6 +3905,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">付款</translation>
</message>
<message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">追加手续费出错</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">追加交易手续费失败</translation>
+ </message>
+ <message>
<source>Do you want to increase the fee?</source>
<extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
<translation type="unfinished">想要提高手續費嗎?</translation>
@@ -3022,6 +3922,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">当前手续费:</translation>
</message>
<message>
+ <source>Increase:</source>
+ <translation type="unfinished">增加量:</translation>
+ </message>
+ <message>
<source>New fee:</source>
<translation type="unfinished">新的費用:</translation>
</message>
@@ -3038,6 +3942,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">無法草擬交易。</translation>
</message>
<message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">PSBT已複製</translation>
+ </message>
+ <message>
<source>Copied to clipboard</source>
<comment>Fee-bump PSBT saved</comment>
<translation type="unfinished">复制到剪贴板</translation>
@@ -3051,6 +3959,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">沒辦法提交交易</translation>
</message>
<message>
+ <source>Can't display address</source>
+ <translation type="unfinished">無法顯示地址</translation>
+ </message>
+ <message>
<source>default wallet</source>
<translation type="unfinished">默认钱包</translation>
</message>
@@ -3114,6 +4026,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">无法把钱包版本从%i降级到%i。钱包版本未改变。</translation>
</message>
<message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">无法锁定数据目录 %s。%s 可能已经在运行。</translation>
+ </message>
+ <message>
<source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
<translation type="unfinished">无法在不支持“拆分前的密钥池”(pre split keypool)的情况下把“非拆分HD钱包”(non HD split wallet)从版本%i升级到%i。请使用版本号%i,或者压根不要指定版本号。</translation>
</message>
@@ -3138,6 +4054,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误: 转储文件格式不正确。得到是"%s",而预期本应得到的是 "format"。</translation>
</message>
<message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ </message>
+ <message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
<translation type="unfinished">错误: 转储文件版本不被支持。这个版本的 bitcoin-wallet 只支持版本为 1 的转储文件。得到的转储文件版本却是%s</translation>
</message>
@@ -3150,18 +4070,42 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误: 无法为该旧式钱包生成描述符。如果钱包已被加密,请确保提供的钱包加密密码正确。</translation>
</message>
<message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">檔案%s已經存在。 如果你確定這就是你想做的,先把這份檔案移開。</translation>
+ </message>
+ <message>
<source>Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start.</source>
<translation type="unfinished">无效或损坏的peers.dat (%s)。如果你确信这是一个bug,请反馈到%s。作为变通办法,你可以把现有文件 (%s) 移开(重命名、移动或删除),这样就可以在下次启动时创建一个新文件了。</translation>
</message>
<message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">提供多數TOR路由綁定位址。 對自動建立的Tor服務用%s</translation>
+ </message>
+ <message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
<translation type="unfinished">没有提供转储文件。要使用 createfromdump ,必须提供 -dumpfile=&lt;filename&gt;。</translation>
</message>
<message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 dump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
<translation type="unfinished">没有提供钱包格式。要使用 createfromdump ,必须提供 -format=&lt;format&gt;</translation>
</message>
<message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">请检查电脑的日期时间设置是否正确!时间错误可能会导致 %s 运行异常。</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">如果你认为%s对你比较有用的话,请对我们进行一些自愿贡献。请访问%s网站来获取有关这个软件的更多信息。</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">修剪被设置得太小,已经低于最小值%d MiB,请使用更大的数值。</translation>
+ </message>
+ <message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<translation type="unfinished">修剪模式与 -reindex-chainstate 不兼容。请进行一次完整的 -reindex 。</translation>
</message>
@@ -3186,6 +4130,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">扣除手續費後的交易金額太少而不能傳送</translation>
</message>
<message>
+ <source>This error could occur if this wallet was not shutdown cleanly and was last loaded using a build with a newer version of Berkeley DB. If so, please use the software that last loaded this wallet</source>
+ <translation type="unfinished">如果这个钱包之前没有正确关闭,而且上一次是被新版的Berkeley DB加载过,就会发生这个错误。如果是这样,请使用上次加载过这个钱包的那个软件。</translation>
+ </message>
+ <message>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
<translation type="unfinished">這是個還沒發表的測試版本 - 使用請自負風險 - 請不要用來開採或做商業應用</translation>
</message>
@@ -3238,6 +4186,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">警告:在已经禁用私钥的钱包 {%s} 中仍然检测到私钥</translation>
</message>
<message>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">警告:我们和其他节点似乎没达成共识!您可能需要升级,或者就是其他节点可能需要升级。</translation>
+ </message>
+ <message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
<translation type="unfinished">需要验证高度在%d之后的区块见证数据。请使用 -reindex 重新启动。</translation>
</message>
@@ -3254,6 +4206,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">參數 -maxmempool 至少要給 %d 百萬位元組(MB)</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">发生了致命的内部错误,请在debug.log中查看详情</translation>
+ </message>
+ <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">沒辦法解析 -%s 參數指定的地址: '%s'</translation>
</message>
@@ -3396,6 +4352,26 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">对 %s 的配置设置只对 %s 网络生效,如果它位于配置的 [%s] 章节的话</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">版权所有 (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">检测到区块数据库损坏</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">找不到asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">無法解析asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">磁盘空间太低!</translation>
+ </message>
+ <message>
<source>Do you want to rebuild the block database now?</source>
<translation type="unfinished">你想现在就重建区块数据库吗?</translation>
</message>
@@ -3408,6 +4384,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">转储文件 %s 不存在</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">创建%s时出错</translation>
</message>
@@ -3416,6 +4396,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">初始化区块数据库时出错</translation>
</message>
<message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">初始化钱包数据库环境错误 %s!</translation>
+ </message>
+ <message>
<source>Error loading %s</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤</translation>
</message>
@@ -3432,6 +4416,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤: 這個錢包需要新版的 %s</translation>
</message>
<message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">加载区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">打开区块数据库时出错</translation>
+ </message>
+ <message>
<source>Error reading configuration file: %s</source>
<translation type="unfinished">读取配置文件失败: %s</translation>
</message>
@@ -3440,16 +4432,16 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">读取数据库出错,关闭中。</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">從錢包資料庫讀取下一筆記錄時出錯</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -3468,10 +4460,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">錯誤:keypool已用完,請先重新呼叫keypoolrefill</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已经在使用SQLite</translation>
</message>
@@ -3496,6 +4484,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
@@ -3504,6 +4496,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法写入记录到新钱包</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法启动索引,关闭中...</translation>
</message>
@@ -3512,6 +4520,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数据库失败</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手续费率 (%s) 低于最大手续费率设置 (%s)</translation>
</message>
@@ -3680,6 +4692,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">这是你每次交易付款时最少要付的手续费。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amounts must not be negative</source>
<translation type="unfinished">交易金额不不可为负数</translation>
</message>
@@ -3752,6 +4768,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">%s链上acceptstalefeeestimates 不受支持。</translation>
</message>
@@ -3760,6 +4780,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的日志分类 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">用户代理备注(%s)包含不安全的字符。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh.ts b/src/qt/locale/bitcoin_zh.ts
index f966ccccc1..0b2297d0b7 100644
--- a/src/qt/locale/bitcoin_zh.ts
+++ b/src/qt/locale/bitcoin_zh.ts
@@ -298,6 +298,97 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 didn't yet exit safely…</source>
<translation type="unfinished">%1尚未安全退出…</translation>
</message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished">未知</translation>
+ </message>
+ <message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">金额</translation>
+ </message>
+ <message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">请输入一个比特币地址 (例如 %1)</translation>
+ </message>
+ <message>
+ <source>Unroutable</source>
+ <translation type="unfinished">不可路由</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
+ <translation type="unfinished">傳入</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
+ </message>
+ <message>
+ <source>Block Relay</source>
+ <extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
+ <translation type="unfinished">區塊轉發</translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <extracomment>Peer connection type established manually through one of several methods.</extracomment>
+ <translation type="unfinished">手冊</translation>
+ </message>
+ <message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation type="unfinished">%1 天</translation>
+ </message>
+ <message>
+ <source>%1 h</source>
+ <translation type="unfinished">%1 小时</translation>
+ </message>
+ <message>
+ <source>%1 m</source>
+ <translation type="unfinished">%1 分钟</translation>
+ </message>
+ <message>
+ <source>%1 s</source>
+ <translation type="unfinished">%1 秒</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>N/A</source>
+ <translation type="unfinished">不可用</translation>
+ </message>
+ <message>
+ <source>%1 ms</source>
+ <translation type="unfinished">%1 毫秒</translation>
+ </message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
@@ -328,16 +419,36 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n 周</numerusform>
</translation>
</message>
+ <message>
+ <source>%1 and %2</source>
+ <translation type="unfinished">%1 和 %2</translation>
+ </message>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
<numerusform>%n年</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>%1 B</source>
+ <translation type="unfinished">%1 字节</translation>
+ </message>
+ <message>
+ <source>%1 MB</source>
+ <translation type="unfinished">%1 MB (百萬位元組)</translation>
+ </message>
+ <message>
+ <source>%1 GB</source>
+ <translation type="unfinished">%1 GB (十億位元組)</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">關於%1(&amp;A)</translation>
+ </message>
+ <message>
<source>&amp;Minimize</source>
<translation type="unfinished">最小化</translation>
</message>
@@ -358,6 +469,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">标签工具栏</translation>
</message>
<message>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">正在跟其他節點連線中...</translation>
+ </message>
+ <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation type="unfinished">请求支付 (生成二维码和 bitcoin: URI)</translation>
</message>
@@ -384,6 +499,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">落后 %1</translation>
</message>
<message>
+ <source>Catching up…</source>
+ <translation type="unfinished">追上中...</translation>
+ </message>
+ <message>
<source>Last received block was generated %1 ago.</source>
<translation type="unfinished">最新接收到的区块是在%1之前生成的。</translation>
</message>
@@ -454,6 +573,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">從備份檔案中恢復錢包</translation>
</message>
<message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">关闭所有钱包</translation>
+ </message>
+ <message>
<source>Migrate Wallet</source>
<translation type="unfinished">迁移钱包</translation>
</message>
@@ -531,12 +654,24 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">警告: %1</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">日期: %1
+</translation>
+ </message>
+ <message>
<source>Amount: %1
</source>
<translation type="unfinished">金額: %1
</translation>
</message>
<message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">錢包: %1
+</translation>
+ </message>
+ <message>
<source>Type: %1
</source>
<translation type="unfinished">種類: %1
@@ -555,6 +690,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">送出交易</translation>
+ </message>
+ <message>
<source>Incoming transaction</source>
<translation type="unfinished">收款交易</translation>
</message>
@@ -575,6 +714,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;解鎖中&lt;/b&gt;</translation>
</message>
<message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
+ </message>
+ <message>
<source>Original message:</source>
<translation type="unfinished">原消息:</translation>
</message>
@@ -593,30 +736,151 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手动选币</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">总量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組數:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">加上交易费用后:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">全(不)选</translation>
+ </message>
+ <message>
+ <source>Tree mode</source>
+ <translation type="unfinished">树状模式</translation>
+ </message>
+ <message>
+ <source>List mode</source>
+ <translation type="unfinished">列表模式</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">金额</translation>
+ </message>
+ <message>
+ <source>Received with label</source>
+ <translation type="unfinished">收款标签</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation type="unfinished">收款地址</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Confirmations</source>
+ <translation type="unfinished">确认</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation type="unfinished">复制金额</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;複製地址</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">複製 &amp;label</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">複製 &amp;amount</translation>
+ </message>
+ <message>
<source>Copy transaction &amp;ID and output index</source>
<translation type="unfinished">複製交易&amp;ID與輸出序號</translation>
</message>
<message>
+ <source>L&amp;ock unspent</source>
+ <translation type="unfinished">锁定未花费(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">解锁未花费(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation type="unfinished">复制数目</translation>
+ </message>
+ <message>
<source>Copy fee</source>
<translation type="unfinished">复制手续费</translation>
</message>
<message>
+ <source>Copy after fee</source>
+ <translation type="unfinished">复制含交易费的金额</translation>
+ </message>
+ <message>
+ <source>Copy bytes</source>
+ <translation type="unfinished">复制字节数</translation>
+ </message>
+ <message>
+ <source>Can vary +/- %1 satoshi(s) per input.</source>
+ <translation type="unfinished">每个输入可能有 +/- %1 聪 (satoshi) 的误差。</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
- </context>
+ <message>
+ <source>change from %1 (%2)</source>
+ <translation type="unfinished">来自 %1 的找零 (%2)</translation>
+ </message>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(找零)</translation>
+ </message>
+</context>
<context>
<name>CreateWalletActivity</name>
<message>
+ <source>Create Wallet</source>
+ <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
+ <translation type="unfinished">创建钱包</translation>
+ </message>
+ <message>
<source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</extracomment>
<translation type="unfinished">正在创建钱包&lt;b&gt;%1&lt;/b&gt;...</translation>
</message>
<message>
+ <source>Create wallet failed</source>
+ <translation type="unfinished">创建钱包失败</translation>
+ </message>
+ <message>
+ <source>Create wallet warning</source>
+ <translation type="unfinished">创建钱包警告</translation>
+ </message>
+ <message>
+ <source>Can't list signers</source>
+ <translation type="unfinished">无法列出签名器</translation>
+ </message>
+ <message>
<source>Too many external signers found</source>
<translation type="unfinished">偵測到的外接簽名器過多</translation>
</message>
@@ -656,12 +920,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">仅观察脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> 可解但又未被监视的脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
</message>
<message>
<source>Migration failed</source>
@@ -675,6 +939,14 @@ The migration process will create a backup of the wallet before migrating. This
<context>
<name>OpenWalletActivity</name>
<message>
+ <source>Open wallet failed</source>
+ <translation type="unfinished">打开钱包失败</translation>
+ </message>
+ <message>
+ <source>Open wallet warning</source>
+ <translation type="unfinished">打开钱包警告</translation>
+ </message>
+ <message>
<source>default wallet</source>
<translation type="unfinished">默认钱包</translation>
</message>
@@ -683,7 +955,12 @@ The migration process will create a backup of the wallet before migrating. This
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">打开钱包</translation>
</message>
- </context>
+ <message>
+ <source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
+ <translation type="unfinished">打开钱包&lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+</context>
<context>
<name>RestoreWalletActivity</name>
<message>
@@ -719,13 +996,29 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">关闭钱包</translation>
</message>
<message>
+ <source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">您确定想要关闭钱包&lt;i&gt;%1&lt;/i&gt;吗?</translation>
+ </message>
+ <message>
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
<translation type="unfinished">启用修剪时,如果一个钱包被卸载太久,就必须重新同步整条区块链才能再次加载它。</translation>
</message>
- </context>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">关闭所有钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to close all wallets?</source>
+ <translation type="unfinished">您确定想要关闭所有钱包吗?</translation>
+ </message>
+</context>
<context>
<name>CreateWalletDialog</name>
<message>
+ <source>Create Wallet</source>
+ <translation type="unfinished">创建钱包</translation>
+ </message>
+ <message>
<source>You are one step away from creating your new wallet!</source>
<translation type="unfinished">距离创建您的新钱包只有一步之遥了!</translation>
</message>
@@ -734,14 +1027,59 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">请指定一个名字,如果需要的话还可以启用高级选项</translation>
</message>
<message>
+ <source>Wallet Name</source>
+ <translation type="unfinished">錢包名稱</translation>
+ </message>
+ <message>
+ <source>Wallet</source>
+ <translation type="unfinished">钱包</translation>
+ </message>
+ <message>
+ <source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
+ <translation type="unfinished">加密钱包。将会使用您指定的密码将钱包加密。</translation>
+ </message>
+ <message>
+ <source>Encrypt Wallet</source>
+ <translation type="unfinished">加密钱包</translation>
+ </message>
+ <message>
<source>Advanced Options</source>
<translation type="unfinished">进阶设定</translation>
</message>
<message>
+ <source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
+ <translation type="unfinished">禁用此钱包的私钥。被禁用私钥的钱包将不会含有任何私钥,而且也不能含有HD种子或导入的私钥。作为仅观察钱包,这是比较理想的。</translation>
+ </message>
+ <message>
<source>Disable Private Keys</source>
<translation type="unfinished">禁用私钥</translation>
</message>
- </context>
+ <message>
+ <source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
+ <translation type="unfinished">创建一个空白的钱包。空白钱包最初不含有任何私钥或脚本。可以以后再导入私钥和地址,或设置HD种子。</translation>
+ </message>
+ <message>
+ <source>Make Blank Wallet</source>
+ <translation type="unfinished">创建空白钱包</translation>
+ </message>
+ <message>
+ <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
+ <translation type="unfinished">使用像是硬件钱包这样的外部签名设备。请在钱包偏好设置中先配置号外部签名器脚本。</translation>
+ </message>
+ <message>
+ <source>External signer</source>
+ <translation type="unfinished">外部签名器</translation>
+ </message>
+ <message>
+ <source>Create</source>
+ <translation type="unfinished">创建</translation>
+ </message>
+ <message>
+ <source>Compiled without external signing support (required for external signing)</source>
+ <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">编译时未启用外部签名支持 (外部签名需要这个功能)</translation>
+ </message>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -757,14 +1095,34 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">与此地址关联的标签</translation>
</message>
<message>
+ <source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
+ <translation type="unfinished">跟這個地址清單關聯的地址。只有發送地址能被修改。</translation>
+ </message>
+ <message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">地址(&amp;A)</translation>
+ </message>
+ <message>
<source>New sending address</source>
<translation type="unfinished">新建付款地址</translation>
</message>
<message>
+ <source>Edit receiving address</source>
+ <translation type="unfinished">编辑收款地址</translation>
+ </message>
+ <message>
<source>Edit sending address</source>
<translation type="unfinished">编辑付款地址</translation>
</message>
<message>
+ <source>The entered address "%1" is not a valid Bitcoin address.</source>
+ <translation type="unfinished">输入的地址 %1 并不是有效的比特币地址。</translation>
+ </message>
+ <message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">地址“%1”已经存在,它是一个收款地址,标签为“%2”,所以它不能作为一个付款地址被添加进来。</translation>
+ </message>
+ <message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
<translation type="unfinished">输入的地址“%1”已经存在于地址簿中,标签为“%2”。</translation>
</message>
@@ -772,16 +1130,40 @@ The migration process will create a backup of the wallet before migrating. This
<source>Could not unlock wallet.</source>
<translation type="unfinished">无法解锁钱包。</translation>
</message>
- </context>
+ <message>
+ <source>New key generation failed.</source>
+ <translation type="unfinished">生成新密钥失败。</translation>
+ </message>
+</context>
<context>
<name>FreespaceChecker</name>
<message>
+ <source>A new data directory will be created.</source>
+ <translation type="unfinished">一个新的数据目录将被创建。</translation>
+ </message>
+ <message>
+ <source>name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
+ <source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
+ <translation type="unfinished">目录已存在。如果您打算在这里创建一个新目录,请添加 %1。</translation>
+ </message>
+ <message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">路径已存在,并且不是一个目录。</translation>
+ </message>
+ <message>
<source>Cannot create data directory here.</source>
<translation type="unfinished">无法在此创建数据目录。</translation>
</message>
</context>
<context>
<name>Intro</name>
+ <message>
+ <source>Bitcoin</source>
+ <translation type="unfinished">比特币</translation>
+ </message>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
@@ -804,18 +1186,58 @@ The migration process will create a backup of the wallet before migrating. This
<source>Choose data directory</source>
<translation type="unfinished">选择数据目录</translation>
</message>
+ <message>
+ <source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
+ <translation type="unfinished">此目录中至少会保存 %1 GB 的数据,并且大小还会随着时间增长。</translation>
+ </message>
+ <message>
+ <source>Approximately %1 GB of data will be stored in this directory.</source>
+ <translation type="unfinished">会在此目录中存储约 %1 GB 的数据。</translation>
+ </message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
<translation type="unfinished">
- <numerusform />
+ <numerusform>(足以恢复 %n 天之内的备份)</numerusform>
</translation>
</message>
<message>
+ <source>%1 will download and store a copy of the Bitcoin block chain.</source>
+ <translation type="unfinished">%1 将会下载并存储比特币区块链。</translation>
+ </message>
+ <message>
+ <source>The wallet will also be stored in this directory.</source>
+ <translation type="unfinished">钱包也会被保存在这个目录中。</translation>
+ </message>
+ <message>
+ <source>Error: Specified data directory "%1" cannot be created.</source>
+ <translation type="unfinished">错误:无法创建指定的数据目录 "%1"</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">错误</translation>
</message>
<message>
+ <source>Welcome</source>
+ <translation type="unfinished">欢迎</translation>
+ </message>
+ <message>
+ <source>Welcome to %1.</source>
+ <translation type="unfinished">欢迎使用 %1</translation>
+ </message>
+ <message>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation type="unfinished">由于这是第一次启动此程序,您可以选择%1存储数据的位置</translation>
+ </message>
+ <message>
+ <source>Limit block chain storage to</source>
+ <translation type="unfinished">將區塊鏈儲存限制為</translation>
+ </message>
+ <message>
+ <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
+ <translation type="unfinished">取消此设置需要重新下载整个区块链。先完整下载整条链再进行修剪会更快。这会禁用一些高级功能。</translation>
+ </message>
+ <message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
<translation type="unfinished">初始化同步过程是非常吃力的,同时可能会暴露您之前没有注意到的电脑硬件问题。你每次启动%1时,它都会从之前中断的地方继续下载。</translation>
</message>
@@ -823,25 +1245,199 @@ The migration process will create a backup of the wallet before migrating. This
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
<translation type="unfinished">當你點擊「確認」,%1會開始下載,並從%3年最早的交易,處裡整個%4區塊鏈(大小:%2GB)</translation>
</message>
- </context>
+ <message>
+ <source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
+ <translation type="unfinished">如果你选择限制区块链存储大小(区块链裁剪模式),程序依然会下载并处理全部历史数据,只是不必须的部分会在使用后被删除,以占用最少的存储空间。</translation>
+ </message>
+ <message>
+ <source>Use the default data directory</source>
+ <translation type="unfinished">使用默认的数据目录</translation>
+ </message>
+ <message>
+ <source>Use a custom data directory:</source>
+ <translation type="unfinished">使用自定义的数据目录:</translation>
+ </message>
+</context>
+<context>
+ <name>HelpMessageDialog</name>
+ <message>
+ <source>version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
+ <source>About %1</source>
+ <translation type="unfinished">关于 %1</translation>
+ </message>
+ <message>
+ <source>Command-line options</source>
+ <translation type="unfinished">命令行选项</translation>
+ </message>
+</context>
+<context>
+ <name>ShutdownWindow</name>
+ <message>
+ <source>%1 is shutting down…</source>
+ <translation type="unfinished">%1正在關閉..</translation>
+ </message>
+ <message>
+ <source>Do not shut down the computer until this window disappears.</source>
+ <translation type="unfinished">在此窗口消失前不要关闭计算机。</translation>
+ </message>
+</context>
<context>
<name>ModalOverlay</name>
<message>
+ <source>Form</source>
+ <translation type="unfinished">窗体</translation>
+ </message>
+ <message>
+ <source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
+ <translation type="unfinished">近期交易可能尚未显示,因此当前余额可能不准确。以上信息将在与比特币网络完全同步后更正。详情如下</translation>
+ </message>
+ <message>
+ <source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
+ <translation type="unfinished">尝试使用受未可见交易影响的余额将不被网络接受。</translation>
+ </message>
+ <message>
+ <source>Number of blocks left</source>
+ <translation type="unfinished">剩余区块数量</translation>
+ </message>
+ <message>
+ <source>Unknown…</source>
+ <translation type="unfinished">未知...</translation>
+ </message>
+ <message>
+ <source>calculating…</source>
+ <translation type="unfinished">計算...</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
+ <source>Progress</source>
+ <translation type="unfinished">进度</translation>
+ </message>
+ <message>
+ <source>Progress increase per hour</source>
+ <translation type="unfinished">每小时进度增加</translation>
+ </message>
+ <message>
+ <source>Estimated time left until synced</source>
+ <translation type="unfinished">预计剩余同步时间</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">隐藏</translation>
+ </message>
+ <message>
+ <source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
+ <translation type="unfinished">%1目前正在同步中。它会从其他节点下载区块头和区块数据并进行验证,直到抵达区块链尖端。</translation>
+ </message>
+ <message>
+ <source>Unknown. Syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">未知。同步區塊標頭(%1, %2%)中...</translation>
+ </message>
+ <message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
<translation type="unfinished">不明。正在預先同步標頭(%1, %2%)...</translation>
</message>
</context>
<context>
+ <name>OpenURIDialog</name>
+ <message>
+ <source>Open bitcoin URI</source>
+ <translation type="unfinished">打开比特币URI</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+</context>
+<context>
<name>OptionsDialog</name>
<message>
+ <source>Options</source>
+ <translation type="unfinished">选项</translation>
+ </message>
+ <message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">主要(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">在登入系统后自动启动 %1</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation type="unfinished">系统登入时启动 %1 (&amp;S)</translation>
+ </message>
+ <message>
+ <source>Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain.</source>
+ <translation type="unfinished">啟用區塊修剪(pruning)會顯著減少儲存交易對儲存空間的需求。 所有的區塊仍然會被完整校驗。 取消這個設定需要再重新下載整個區塊鏈。</translation>
+ </message>
+ <message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">数据库缓存大小(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">脚本验证线程数(&amp;V)</translation>
+ </message>
+ <message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
<translation type="unfinished">与%1兼容的脚本文件路径(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:恶意软件可以偷币!</translation>
</message>
<message>
+ <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
+ <translation type="unfinished">代理服务器 IP 地址 (例如 IPv4: 127.0.0.1 / IPv6: ::1)</translation>
+ </message>
+ <message>
+ <source>Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation type="unfinished">显示默认的SOCKS5代理是否被用于在该类型的网络下连接同伴。</translation>
+ </message>
+ <message>
+ <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</source>
+ <translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
+ </message>
+ <message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
<message>
+ <source>Open the %1 configuration file from the working directory.</source>
+ <translation type="unfinished">从工作目录下打开配置文件 %1。</translation>
+ </message>
+ <message>
+ <source>Open Configuration File</source>
+ <translation type="unfinished">打开配置文件</translation>
+ </message>
+ <message>
+ <source>Reset all client options to default.</source>
+ <translation type="unfinished">恢复客户端的缺省设置</translation>
+ </message>
+ <message>
+ <source>&amp;Reset Options</source>
+ <translation type="unfinished">恢复缺省设置(&amp;R)</translation>
+ </message>
+ <message>
+ <source>&amp;Network</source>
+ <translation type="unfinished">网络(&amp;N)</translation>
+ </message>
+ <message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">将区块存储修剪至(&amp;B)</translation>
+ </message>
+ <message>
+ <source>Reverting this setting requires re-downloading the entire blockchain.</source>
+ <translation type="unfinished">警告:还原此设置需要重新下载整个区块链。</translation>
+ </message>
+ <message>
<source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
<extracomment>Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</extracomment>
<translation type="unfinished">数据库缓存的最大大小。加大缓存有助于加快同步,但对于大多数使用场景来说,继续加大后收效会越来越不明显。降低缓存大小将会减小内存使用量。内存池中尚未被使用的那部分内存也会被共享用于这里的数据库缓存。</translation>
@@ -852,6 +1448,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">设置脚本验证线程的数量。负值则表示你想要保留给系统的核心数量。</translation>
</message>
<message>
+ <source>(0 = auto, &lt;0 = leave that many cores free)</source>
+ <translation type="unfinished">(0 = 自动, &lt;0 = 保持指定数量的CPU核心空闲)</translation>
+ </message>
+ <message>
<source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
<extracomment>Tooltip text for Options window setting that enables the RPC server.</extracomment>
<translation type="unfinished">这允许作为用户的你或第三方工具通过命令行和JSON-RPC命令行与节点通信。</translation>
@@ -862,6 +1462,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">启用R&amp;PC服务器</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">钱包(&amp;A)</translation>
+ </message>
+ <message>
<source>Whether to set subtract fee from amount as default or not.</source>
<extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
<translation type="unfinished">是否要默认从金额中减去手续费。</translation>
@@ -872,6 +1476,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">默认从金额中减去交易手续费(&amp;F)</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation type="unfinished">专家</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">启用手动选币功能(&amp;C)</translation>
+ </message>
+ <message>
+ <source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
+ <translation type="unfinished">如果您禁止动用尚未确认的找零资金,则一笔交易的找零资金至少需要有1个确认后才能动用。这同时也会影响账户余额的计算。</translation>
+ </message>
+ <message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">动用尚未确认的找零资金(&amp;S)</translation>
+ </message>
+ <message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
<translation type="unfinished">启用&amp;PSBT控件</translation>
@@ -882,10 +1502,106 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">是否要显示PSBT控件</translation>
</message>
<message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">外接簽證設備 (e.g. 硬體錢包)</translation>
+ </message>
+ <message>
+ <source>&amp;External signer script path</source>
+ <translation type="unfinished">外接簽證設備執行檔路徑(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">使用 &amp;UPnP 映射端口</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
+ <source>Accept connections from outside.</source>
+ <translation type="unfinished">接受外部连接。</translation>
+ </message>
+ <message>
+ <source>Allow incomin&amp;g connections</source>
+ <translation type="unfinished">允许传入连接(&amp;G)</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation type="unfinished">通过 SOCKS5 代理连接比特币网络。</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation type="unfinished">通过 SO&amp;CKS5 代理连接(默认代理):</translation>
+ </message>
+ <message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">代理服务器 &amp;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">端口(&amp;P):</translation>
+ </message>
+ <message>
+ <source>Port of the proxy (e.g. 9050)</source>
+ <translation type="unfinished">代理服务器端口(例如 9050)</translation>
+ </message>
+ <message>
+ <source>Used for reaching peers via:</source>
+ <translation type="unfinished">在走这些途径连接到节点的时候启用:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation type="unfinished">&amp;窗口</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
+ <source>Show only a tray icon after minimizing the window.</source>
+ <translation type="unfinished">最小化窗口后仅显示托盘图标</translation>
+ </message>
+ <message>
+ <source>&amp;Minimize to the tray instead of the taskbar</source>
+ <translation type="unfinished">最小化到托盘(&amp;M)</translation>
+ </message>
+ <message>
+ <source>M&amp;inimize on close</source>
+ <translation type="unfinished">单击关闭按钮时最小化(&amp;I)</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">显示(&amp;D)</translation>
+ </message>
+ <message>
+ <source>User Interface &amp;language:</source>
+ <translation type="unfinished">用户界面语言(&amp;L):</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
+ <translation type="unfinished">可以在这里设定用户界面的语言。这个设定在重启 %1 后才会生效。</translation>
+ </message>
+ <message>
+ <source>&amp;Unit to show amounts in:</source>
+ <translation type="unfinished">比特币金额单位(&amp;U):</translation>
+ </message>
+ <message>
+ <source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
+ <translation type="unfinished">选择显示及发送比特币时使用的最小单位。</translation>
+ </message>
+ <message>
<source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
<translation type="unfinished">这个第三方网址(比如区块浏览器)会出现在交易选项卡的右键菜单中。 网址中的%s代表交易哈希。多个网址需要用竖线 | 相互分隔。</translation>
</message>
@@ -894,19 +1610,93 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">第三方交易网址(&amp;T)</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">是否显示手动选币功能。</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
+ <translation type="unfinished">连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">取消(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Compiled without external signing support (required for external signing)</source>
+ <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">軟體未編譯外接簽證功能所需的軟體庫(外接簽證必須有此功能)</translation>
+ </message>
+ <message>
+ <source>default</source>
+ <translation type="unfinished">默认</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">确认恢复默认设置</translation>
+ </message>
+ <message>
+ <source>Client restart required to activate changes.</source>
+ <extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
+ <translation type="unfinished">需要重启客户端才能使更改生效。</translation>
+ </message>
+ <message>
<source>Current settings will be backed up at "%1".</source>
<extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
<translation type="unfinished">当前设置将会被备份到 "%1"。</translation>
</message>
<message>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <extracomment>Text asking the user to confirm if they would like to proceed with a client shutdown.</extracomment>
+ <translation type="unfinished">客户端即将关闭,您想继续吗?</translation>
+ </message>
+ <message>
+ <source>Configuration options</source>
+ <extracomment>Window title text of pop-up box that allows opening up of configuration file.</extracomment>
+ <translation type="unfinished">配置选项</translation>
+ </message>
+ <message>
+ <source>The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file.</source>
+ <extracomment>Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings.</extracomment>
+ <translation type="unfinished">配置文件可以用来设置高级选项。配置文件会覆盖设置界面窗口中的选项。此外,命令行会覆盖配置文件指定的选项。</translation>
+ </message>
+ <message>
<source>Continue</source>
<translation type="unfinished">继续</translation>
</message>
<message>
+ <source>Cancel</source>
+ <translation type="unfinished">取消</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">错误</translation>
</message>
- </context>
+ <message>
+ <source>The configuration file could not be opened.</source>
+ <translation type="unfinished">无法打开配置文件。</translation>
+ </message>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">此更改需要重启客户端。</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">提供的代理服务器地址无效。</translation>
+ </message>
+</context>
<context>
<name>OptionsModel</name>
<message>
@@ -915,23 +1705,268 @@ The migration process will create a backup of the wallet before migrating. This
</message>
</context>
<context>
+ <name>OverviewPage</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">窗体</translation>
+ </message>
+ <message>
+ <source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source>
+ <translation type="unfinished">现在显示的消息可能是过期的。在连接上比特币网络节点后,您的钱包将自动与网络同步,但是这个过程还没有完成。</translation>
+ </message>
+ <message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
+ <source>Available:</source>
+ <translation type="unfinished">可使用的余额:</translation>
+ </message>
+ <message>
+ <source>Your current spendable balance</source>
+ <translation type="unfinished">您当前可使用的余额</translation>
+ </message>
+ <message>
+ <source>Pending:</source>
+ <translation type="unfinished">等待中的余额:</translation>
+ </message>
+ <message>
+ <source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
+ <translation type="unfinished">尚未确认的交易总额,未计入当前余额</translation>
+ </message>
+ <message>
+ <source>Immature:</source>
+ <translation type="unfinished">未成熟的:</translation>
+ </message>
+ <message>
+ <source>Mined balance that has not yet matured</source>
+ <translation type="unfinished">尚未成熟的挖矿收入余额</translation>
+ </message>
+ <message>
+ <source>Balances</source>
+ <translation type="unfinished">余额</translation>
+ </message>
+ <message>
+ <source>Total:</source>
+ <translation type="unfinished">总额:</translation>
+ </message>
+ <message>
+ <source>Your current total balance</source>
+ <translation type="unfinished">您当前的总余额</translation>
+ </message>
+ <message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">您当前在仅观察观察地址中的余额</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">可动用:</translation>
+ </message>
+ <message>
+ <source>Recent transactions</source>
+ <translation type="unfinished">最近交易</translation>
+ </message>
+ <message>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation type="unfinished">仅观察地址的未确认交易</translation>
+ </message>
+ <message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">仅观察地址中尚未成熟的挖矿收入余额:</translation>
+ </message>
+ <message>
+ <source>Current total balance in watch-only addresses</source>
+ <translation type="unfinished">仅观察地址中的当前总余额</translation>
+ </message>
+ <message>
+ <source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
+ <translation type="unfinished">“概况”标签页已启用隐私模式。要明文显示数值,请在设置中取消勾选“不明文显示数值”。</translation>
+ </message>
+</context>
+<context>
<name>PSBTOperationsDialog</name>
<message>
<source>PSBT Operations</source>
<translation type="unfinished">PSBT操作</translation>
</message>
<message>
+ <source>Sign Tx</source>
+ <translation type="unfinished">签名交易</translation>
+ </message>
+ <message>
+ <source>Broadcast Tx</source>
+ <translation type="unfinished">广播交易</translation>
+ </message>
+ <message>
+ <source>Copy to Clipboard</source>
+ <translation type="unfinished">复制到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save…</source>
+ <translation type="unfinished">儲存...</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished">关闭</translation>
+ </message>
+ <message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">加载交易失败: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">签名交易失败: %1</translation>
+ </message>
+ <message>
<source>Cannot sign inputs while wallet is locked.</source>
<translation type="unfinished">钱包已锁定,无法签名交易输入项。</translation>
</message>
<message>
+ <source>Could not sign any more inputs.</source>
+ <translation type="unfinished">没有交易输入项可供签名了。</translation>
+ </message>
+ <message>
+ <source>Signed %1 inputs, but more signatures are still required.</source>
+ <translation type="unfinished">已签名 %1 个交易输入项,但是仍然还有余下的项目需要签名。</translation>
+ </message>
+ <message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">成功签名交易。交易已经可以广播。</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">处理交易时遇到未知错误。</translation>
+ </message>
+ <message>
+ <source>Transaction broadcast successfully! Transaction ID: %1</source>
+ <translation type="unfinished">已成功广播交易!交易ID: %1</translation>
+ </message>
+ <message>
+ <source>Transaction broadcast failed: %1</source>
+ <translation type="unfinished">交易广播失败: %1</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">已复制PSBT到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (Binary)</source>
+ <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
+ <translation type="unfinished">部分簽名交易(二進位)</translation>
+ </message>
+ <message>
+ <source>PSBT saved to disk.</source>
+ <translation type="unfinished">PSBT已保存到硬盘</translation>
+ </message>
+ <message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">无法计算交易费用或总交易金额。</translation>
+ </message>
+ <message>
+ <source>Pays transaction fee: </source>
+ <translation type="unfinished">支付交易费用:</translation>
+ </message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">总额</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">或</translation>
+ </message>
+ <message>
+ <source>Transaction has %1 unsigned inputs.</source>
+ <translation type="unfinished">交易中含有%1个未签名输入项。</translation>
+ </message>
+ <message>
+ <source>Transaction is missing some information about inputs.</source>
+ <translation type="unfinished">交易中有输入项缺失某些信息。</translation>
+ </message>
+ <message>
+ <source>Transaction still needs signature(s).</source>
+ <translation type="unfinished">交易仍然需要签名。</translation>
+ </message>
+ <message>
<source>(But no wallet is loaded.)</source>
<translation type="unfinished">(但没有加载钱包。)</translation>
</message>
- </context>
+ <message>
+ <source>(But this wallet cannot sign transactions.)</source>
+ <translation type="unfinished">(但这个钱包不能签名交易)</translation>
+ </message>
+ <message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(但这个钱包没有正确的密钥)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">交易已经完全签名,可以广播。</translation>
+ </message>
+ <message>
+ <source>Transaction status is unknown.</source>
+ <translation type="unfinished">交易状态未知。</translation>
+ </message>
+</context>
+<context>
+ <name>PaymentServer</name>
+ <message>
+ <source>Payment request error</source>
+ <translation type="unfinished">支付请求出错</translation>
+ </message>
+ <message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">无法启动 bitcoin: 协议的“一键支付”处理程序</translation>
+ </message>
+ <message>
+ <source>URI handling</source>
+ <translation type="unfinished">URI 处理</translation>
+ </message>
+ <message>
+ <source>'bitcoin://' is not a valid URI. Use 'bitcoin:' instead.</source>
+ <translation type="unfinished">‘bitcoin://’不是合法的URI。请改用'bitcoin:'。</translation>
+ </message>
+ <message>
+ <source>Cannot process payment request because BIP70 is not supported.
+Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
+If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
+ <translation type="unfinished">因為不支援BIP70,無法處理付款請求。
+由於BIP70具有廣泛的安全缺陷,無論哪個商家指引要求更換錢包,強烈建議不要更換。
+如果您看到了這個錯誤,您應該要求商家提供與BIP21相容的URI。</translation>
+ </message>
+ <message>
+ <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
+ <translation type="unfinished">无法解析 URI 地址!可能是因为比特币地址无效,或是 URI 参数格式错误。</translation>
+ </message>
+ <message>
+ <source>Payment request file handling</source>
+ <translation type="unfinished">支付请求文件处理</translation>
+ </message>
+</context>
<context>
<name>PeerTableModel</name>
<message>
+ <source>User Agent</source>
+ <extracomment>Title of Peers Table column which contains the peer's User Agent string.</extracomment>
+ <translation type="unfinished">用户代理</translation>
+ </message>
+ <message>
+ <source>Peer</source>
+ <extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
+ <translation type="unfinished">節點</translation>
+ </message>
+ <message>
<source>Age</source>
<extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
<translation type="unfinished">连接时间</translation>
@@ -942,14 +1977,172 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">方向</translation>
</message>
<message>
+ <source>Sent</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have sent to the peer.</extracomment>
+ <translation type="unfinished">已发送</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have received from the peer.</extracomment>
+ <translation type="unfinished">已接收</translation>
+ </message>
+ <message>
<source>Address</source>
<extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
<translation type="unfinished">地址</translation>
</message>
- </context>
+ <message>
+ <source>Type</source>
+ <extracomment>Title of Peers Table column which describes the type of peer connection. The "type" describes why the connection exists.</extracomment>
+ <translation type="unfinished">类型</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <extracomment>Title of Peers Table column which states the network the peer connected through.</extracomment>
+ <translation type="unfinished">网络</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An Inbound Connection from a Peer.</extracomment>
+ <translation type="unfinished">傳入</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+</context>
+<context>
+ <name>QRImageWidget</name>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">儲存圖片(&amp;S)...</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">复制图像(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">URI 太長,請縮短標籤或訊息文字。</translation>
+ </message>
+ <message>
+ <source>Error encoding URI into QR Code.</source>
+ <translation type="unfinished">把 URI 编码成二维码时发生错误。</translation>
+ </message>
+ <message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">不支持二维码。</translation>
+ </message>
+ <message>
+ <source>Save QR Code</source>
+ <translation type="unfinished">保存二维码</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <extracomment>Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</extracomment>
+ <translation type="unfinished">PNG 圖</translation>
+ </message>
+</context>
<context>
<name>RPCConsole</name>
<message>
+ <source>N/A</source>
+ <translation type="unfinished">不可用</translation>
+ </message>
+ <message>
+ <source>Client version</source>
+ <translation type="unfinished">客户端版本</translation>
+ </message>
+ <message>
+ <source>&amp;Information</source>
+ <translation type="unfinished">信息(&amp;I)</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation type="unfinished">常规</translation>
+ </message>
+ <message>
+ <source>Datadir</source>
+ <translation type="unfinished">数据目录</translation>
+ </message>
+ <message>
+ <source>To specify a non-default location of the data directory use the '%1' option.</source>
+ <translation type="unfinished">如果不想用預設的資料目錄位置,請使用'%1' 這個選項來指定新的位置。</translation>
+ </message>
+ <message>
+ <source>Blocksdir</source>
+ <translation type="unfinished">區塊儲存目錄</translation>
+ </message>
+ <message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">如果要自訂區塊儲存目錄的位置,請使用 '%1' 這個選項來指定新的位置。</translation>
+ </message>
+ <message>
+ <source>Startup time</source>
+ <translation type="unfinished">启动时间</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">网络</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
+ <source>Number of connections</source>
+ <translation type="unfinished">连接数</translation>
+ </message>
+ <message>
+ <source>Block chain</source>
+ <translation type="unfinished">区块链</translation>
+ </message>
+ <message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">内存池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">当前交易数量</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished">内存使用</translation>
+ </message>
+ <message>
+ <source>Wallet: </source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
+ <source>(none)</source>
+ <translation type="unfinished">(无)</translation>
+ </message>
+ <message>
+ <source>&amp;Reset</source>
+ <translation type="unfinished">重置(&amp;R)</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <translation type="unfinished">已接收</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation type="unfinished">已发送</translation>
+ </message>
+ <message>
+ <source>&amp;Peers</source>
+ <translation type="unfinished">节点(&amp;P)</translation>
+ </message>
+ <message>
+ <source>Banned peers</source>
+ <translation type="unfinished">已封禁节点</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation type="unfinished">选择节点查看详细信息。</translation>
+ </message>
+ <message>
<source>The transport layer version: %1</source>
<translation type="unfinished">传输层版本: %1</translation>
</message>
@@ -966,6 +2159,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">会话ID</translation>
</message>
<message>
+ <source>Version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">是否要将交易转发给这个节点。</translation>
</message>
@@ -974,10 +2171,30 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">交易转发</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation type="unfinished">起步区块</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation type="unfinished">已同步區塊頭標</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">已同步区块</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">最近交易</translation>
</message>
<message>
+ <source>The mapped Autonomous System used for diversifying peer selection.</source>
+ <translation type="unfinished">映射到的自治系统,被用来多样化选择节点</translation>
+ </message>
+ <message>
+ <source>Mapped AS</source>
+ <translation type="unfinished">映射到的AS</translation>
+ </message>
+ <message>
<source>Whether we relay addresses to this peer.</source>
<extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
<translation type="unfinished">是否把地址转发给这个节点。</translation>
@@ -1008,10 +2225,169 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">被频率限制丢弃的地址</translation>
</message>
<message>
+ <source>User Agent</source>
+ <translation type="unfinished">用户代理</translation>
+ </message>
+ <message>
<source>Node window</source>
<translation type="unfinished">结点窗口</translation>
</message>
<message>
+ <source>Current block height</source>
+ <translation type="unfinished">当前区块高度</translation>
+ </message>
+ <message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">打开当前数据目录中的 %1 调试日志文件。日志文件大的话可能要等上几秒钟。</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation type="unfinished">缩小字体大小</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation type="unfinished">放大字体大小</translation>
+ </message>
+ <message>
+ <source>Permissions</source>
+ <translation type="unfinished">权限</translation>
+ </message>
+ <message>
+ <source>The direction and type of peer connection: %1</source>
+ <translation type="unfinished">節點連接的方向和類型: %1</translation>
+ </message>
+ <message>
+ <source>Direction/Type</source>
+ <translation type="unfinished">方向/類型</translation>
+ </message>
+ <message>
+ <source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
+ <translation type="unfinished">這個節點是透過這種網路協定連接到的: IPv4, IPv6, Onion, I2P, 或 CJDNS.</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation type="unfinished">服务</translation>
+ </message>
+ <message>
+ <source>High bandwidth BIP152 compact block relay: %1</source>
+ <translation type="unfinished">高頻寬BIP152密集區塊轉發: %1</translation>
+ </message>
+ <message>
+ <source>High Bandwidth</source>
+ <translation type="unfinished">高頻寬</translation>
+ </message>
+ <message>
+ <source>Connection Time</source>
+ <translation type="unfinished">连接时间</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">來自這個節點上次成功驗證新區塊已經過的時間</translation>
+ </message>
+ <message>
+ <source>Last Block</source>
+ <translation type="unfinished">上一個區塊</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">來自這個節點上次成功驗證新交易進入內存池已經過的時間</translation>
+ </message>
+ <message>
+ <source>Last Send</source>
+ <translation type="unfinished">上次发送</translation>
+ </message>
+ <message>
+ <source>Last Receive</source>
+ <translation type="unfinished">上次接收</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping 延时</translation>
+ </message>
+ <message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation type="unfinished">目前这一次 ping 已经过去的时间。</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation type="unfinished">Ping 等待</translation>
+ </message>
+ <message>
+ <source>Min Ping</source>
+ <translation type="unfinished">最小 Ping 值</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">时间偏移</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation type="unfinished">打开(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Console</source>
+ <translation type="unfinished">控制台(&amp;C)</translation>
+ </message>
+ <message>
+ <source>&amp;Network Traffic</source>
+ <translation type="unfinished">网络流量(&amp;N)</translation>
+ </message>
+ <message>
+ <source>Totals</source>
+ <translation type="unfinished">总数</translation>
+ </message>
+ <message>
+ <source>Debug log file</source>
+ <translation type="unfinished">调试日志文件</translation>
+ </message>
+ <message>
+ <source>Clear console</source>
+ <translation type="unfinished">清空控制台</translation>
+ </message>
+ <message>
+ <source>In:</source>
+ <translation type="unfinished">傳入:</translation>
+ </message>
+ <message>
+ <source>Out:</source>
+ <translation type="unfinished">傳出:</translation>
+ </message>
+ <message>
+ <source>Inbound: initiated by peer</source>
+ <extracomment>Explanatory text for an inbound peer connection.</extracomment>
+ <translation type="unfinished">Inbound: 由對端節點發起</translation>
+ </message>
+ <message>
+ <source>Outbound Full Relay: default</source>
+ <extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
+ <translation type="unfinished">完整轉發: 預設</translation>
+ </message>
+ <message>
+ <source>Outbound Block Relay: does not relay transactions or addresses</source>
+ <extracomment>Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</extracomment>
+ <translation type="unfinished">出站區塊轉送: 不轉送交易和地址</translation>
+ </message>
+ <message>
+ <source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
+ <extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
+ <translation type="unfinished">手動Outbound: 加入使用RPC %1 或 %2/%3 配置選項</translation>
+ </message>
+ <message>
+ <source>Outbound Feeler: short-lived, for testing addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">Outbound Feeler: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">Outbound 地址取得: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
<source>detecting: peer could be v1 or v2</source>
<extracomment>Explanatory text for "detecting" transport type.</extracomment>
<translation type="unfinished">检测中: 节点可能是v1或是v2</translation>
@@ -1027,11 +2403,68 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">v2: BIP324加密传输协议</translation>
</message>
<message>
+ <source>we selected the peer for high bandwidth relay</source>
+ <translation type="unfinished">我們選擇了用於高頻寬轉送的節點</translation>
+ </message>
+ <message>
+ <source>the peer selected us for high bandwidth relay</source>
+ <translation type="unfinished">對端選擇了我們用於高頻寬轉發</translation>
+ </message>
+ <message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">未選擇高頻寬轉發點</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <extracomment>Context menu action to copy the address of a peer.</extracomment>
+ <translation type="unfinished">&amp;複製地址</translation>
+ </message>
+ <message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">断开(&amp;D)</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation type="unfinished">1 小时(&amp;H)</translation>
+ </message>
+ <message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 周(&amp;W)</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 年(&amp;Y)</translation>
+ </message>
+ <message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
<translation type="unfinished">复制IP/网络掩码(&amp;C)</translation>
</message>
<message>
+ <source>&amp;Unban</source>
+ <translation type="unfinished">解封(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">网络活动已禁用</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">不使用任何钱包执行命令</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">使用“%1”钱包执行命令</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -1048,10 +2481,139 @@ For more information on using this console, type %6.
%7 警告:骗子们很活跃,他们会让用户在这里输入命令以便偷走用户钱包中的内容。所以请您不要在不完全了解一个命令的后果的情况下使用此控制台。%8</translation>
</message>
- </context>
+ <message>
+ <source>Executing…</source>
+ <extracomment>A console message indicating an entered command is currently being executed.</extracomment>
+ <translation type="unfinished">執行中……</translation>
+ </message>
+ <message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
+ </message>
+ <message>
+ <source>via %1</source>
+ <translation type="unfinished">通过 %1</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation type="unfinished">是</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation type="unfinished">否</translation>
+ </message>
+ <message>
+ <source>To</source>
+ <translation type="unfinished">到</translation>
+ </message>
+ <message>
+ <source>From</source>
+ <translation type="unfinished">来自</translation>
+ </message>
+ <message>
+ <source>Ban for</source>
+ <translation type="unfinished">封禁时长</translation>
+ </message>
+ <message>
+ <source>Never</source>
+ <translation type="unfinished">永不</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation type="unfinished">未知</translation>
+ </message>
+</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
+ <source>&amp;Amount:</source>
+ <translation type="unfinished">金额(&amp;A):</translation>
+ </message>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>&amp;Message:</source>
+ <translation type="unfinished">消息(&amp;M):</translation>
+ </message>
+ <message>
+ <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
+ <translation type="unfinished">可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。</translation>
+ </message>
+ <message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">可为新建的收款地址添加一个标签。</translation>
+ </message>
+ <message>
+ <source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
+ <translation type="unfinished">使用此表单请求付款。所有字段都是&lt;b&gt;可选&lt;/b&gt;的。</translation>
+ </message>
+ <message>
+ <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
+ <translation type="unfinished">可选的请求金额。留空或填零为不要求具体金额。</translation>
+ </message>
+ <message>
+ <source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
+ <translation type="unfinished">一个关联到新收款地址(被您用来识别发票)的可选标签。它也会被附加到付款请求中。</translation>
+ </message>
+ <message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">一条附加到付款请求中的可选消息,可以显示给付款方。</translation>
+ </message>
+ <message>
+ <source>&amp;Create new receiving address</source>
+ <translation type="unfinished">新建收款地址(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished">清除</translation>
+ </message>
+ <message>
+ <source>Requested payments history</source>
+ <translation type="unfinished">付款请求历史</translation>
+ </message>
+ <message>
+ <source>Show the selected request (does the same as double clicking an entry)</source>
+ <translation type="unfinished">显示选中的请求 (直接双击项目也可以显示)</translation>
+ </message>
+ <message>
+ <source>Show</source>
+ <translation type="unfinished">显示</translation>
+ </message>
+ <message>
+ <source>Remove the selected entries from the list</source>
+ <translation type="unfinished">从列表中移除选中的条目</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished">移除</translation>
+ </message>
+ <message>
+ <source>Copy &amp;URI</source>
+ <translation type="unfinished">复制 &amp;URI</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;複製地址</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">複製 &amp;label</translation>
+ </message>
+ <message>
+ <source>Copy &amp;message</source>
+ <translation type="unfinished">複製訊息(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">複製金額 &amp;amount</translation>
+ </message>
+ <message>
<source>Base58 (Legacy)</source>
<translation type="unfinished">Base58 (旧式)</translation>
</message>
@@ -1075,21 +2637,252 @@ For more information on using this console, type %6.
<source>Could not unlock wallet.</source>
<translation type="unfinished">无法解锁钱包。</translation>
</message>
- </context>
+ <message>
+ <source>Could not generate new %1 address</source>
+ <translation type="unfinished">无法生成新的%1地址</translation>
+ </message>
+</context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ <message>
+ <source>Request payment to …</source>
+ <translation type="unfinished">請求支付至...</translation>
+ </message>
+ <message>
+ <source>Address:</source>
+ <translation type="unfinished">地址:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Label:</source>
+ <translation type="unfinished">标签:</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation type="unfinished">消息:</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
+ <source>Copy &amp;URI</source>
+ <translation type="unfinished">复制 &amp;URI</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Address</source>
+ <translation type="unfinished">复制地址(&amp;A)</translation>
+ </message>
+ <message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">儲存圖片(&amp;S)...</translation>
+ </message>
+ <message>
+ <source>Payment information</source>
+ <translation type="unfinished">付款信息</translation>
+ </message>
+ <message>
+ <source>Request payment to %1</source>
+ <translation type="unfinished">请求付款到 %1</translation>
+ </message>
+</context>
<context>
<name>RecentRequestsTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
- </context>
+ <message>
+ <source>(no message)</source>
+ <translation type="unfinished">(无消息)</translation>
+ </message>
+ <message>
+ <source>(no amount requested)</source>
+ <translation type="unfinished">(未填写请求金额)</translation>
+ </message>
+ <message>
+ <source>Requested</source>
+ <translation type="unfinished">请求金额</translation>
+ </message>
+</context>
<context>
<name>SendCoinsDialog</name>
<message>
+ <source>Send Coins</source>
+ <translation type="unfinished">发币</translation>
+ </message>
+ <message>
+ <source>Coin Control Features</source>
+ <translation type="unfinished">手动选币功能</translation>
+ </message>
+ <message>
+ <source>automatically selected</source>
+ <translation type="unfinished">自动选择</translation>
+ </message>
+ <message>
+ <source>Insufficient funds!</source>
+ <translation type="unfinished">金额不足!</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">數量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">加上交易费用后:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
+ <translation type="unfinished">在激活该选项后,如果填写了无效的找零地址,或者干脆没填找零地址,找零资金将会被转入新生成的地址。</translation>
+ </message>
+ <message>
+ <source>Custom change address</source>
+ <translation type="unfinished">自定义找零地址</translation>
+ </message>
+ <message>
+ <source>Transaction Fee:</source>
+ <translation type="unfinished">交易手续费:</translation>
+ </message>
+ <message>
+ <source>Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
+ <translation type="unfinished">如果使用备用手续费设置,有可能会导致交易经过几个小时、几天(甚至永远)无法被确认。请考虑手动选择手续费,或等待整个链完成验证。</translation>
+ </message>
+ <message>
+ <source>Warning: Fee estimation is currently not possible.</source>
+ <translation type="unfinished">警告: 目前无法进行手续费估计。</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">每KB</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">隐藏</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation type="unfinished">推荐:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation type="unfinished">自定义:</translation>
+ </message>
+ <message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">一次发送给多个收款人</translation>
+ </message>
+ <message>
+ <source>Add &amp;Recipient</source>
+ <translation type="unfinished">添加收款人(&amp;R)</translation>
+ </message>
+ <message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
+ </message>
+ <message>
+ <source>Choose…</source>
+ <translation type="unfinished">選擇...</translation>
+ </message>
+ <message>
+ <source>Hide transaction fee settings</source>
+ <translation type="unfinished">隐藏交易手续费设置</translation>
+ </message>
+ <message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">當交易量小於可用區塊空間時,礦工和節點可能會執行最低手續費率限制。 以這個最低費率來支付手續費也是可以的,但請注意,一旦交易需求超出比特幣網路能處理的限度,你的交易可能永遠無法確認。</translation>
+ </message>
+ <message>
+ <source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
+ <translation type="unfinished">过低的手续费率可能导致交易永远无法确认(请阅读工具提示)</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">确认时间目标:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">启用手续费追加</translation>
+ </message>
+ <message>
+ <source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
+ <translation type="unfinished">手续费追加(Replace-By-Fee,BIP-125)可以让你在送出交易后继续追加手续费。不用这个功能的话,建议付比较高的手续费来降低交易延迟的风险。</translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
+ <source>Balance:</source>
+ <translation type="unfinished">余额:</translation>
+ </message>
+ <message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">确认发送操作</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">发送(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation type="unfinished">复制数目</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation type="unfinished">复制金额</translation>
</message>
@@ -1098,6 +2891,57 @@ For more information on using this console, type %6.
<translation type="unfinished">复制手续费</translation>
</message>
<message>
+ <source>Copy after fee</source>
+ <translation type="unfinished">复制含交易费的金额</translation>
+ </message>
+ <message>
+ <source>Copy bytes</source>
+ <translation type="unfinished">复制字节数</translation>
+ </message>
+ <message>
+ <source>%1 (%2 blocks)</source>
+ <translation type="unfinished">%1 (%2个块)</translation>
+ </message>
+ <message>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">在設備上簽證</translation>
+ </message>
+ <message>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">請先連接硬體錢包</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">在 選項 -&gt; 錢包 中設定外部簽名器腳本路徑 </translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">创建未签名交易(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (Binary)</source>
+ <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
+ <translation type="unfinished">部分簽名交易(二進位)</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">或</translation>
+ </message>
+ <message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -1108,6 +2952,23 @@ For more information on using this console, type %6.
<translation type="unfinished">请务必仔细检查您的交易。你可以创建并发送这笔交易;也可以创建一个“部分签名比特币交易(PSBT)”,它可以被保存下来或被复制出去,然后就可以对它进行签名,比如用离线%1钱包,或是用兼容PSBT的硬件钱包。</translation>
</message>
<message>
+ <source>Please, review your transaction.</source>
+ <extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
+ <translation type="unfinished">请检查您的交易。</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">没有打上BIP-125手续费追加的标记。</translation>
+ </message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">总额</translation>
+ </message>
+ <message>
<source>Unsigned Transaction</source>
<comment>PSBT copied</comment>
<extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
@@ -1121,6 +2982,42 @@ For more information on using this console, type %6.
<source>PSBT saved to disk</source>
<translation type="unfinished">PSBT已保存到磁盘</translation>
</message>
+ <message>
+ <source>Confirm send coins</source>
+ <translation type="unfinished">确认发币</translation>
+ </message>
+ <message>
+ <source>Watch-only balance:</source>
+ <translation type="unfinished">仅观察余额:</translation>
+ </message>
+ <message>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation type="unfinished">接收人地址无效。请重新检查。</translation>
+ </message>
+ <message>
+ <source>The amount to pay must be larger than 0.</source>
+ <translation type="unfinished">支付金额必须大于0。</translation>
+ </message>
+ <message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">金额超出您的余额。</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">计入 %1 手续费后,金额超出了您的余额。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">发现重复地址:每个地址应该只使用一次。</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">交易创建失败!</translation>
+ </message>
+ <message>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation type="unfinished">超过 %1 的手续费被视为高得离谱。</translation>
+ </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -1128,17 +3025,239 @@ For more information on using this console, type %6.
</translation>
</message>
<message>
+ <source>Warning: Invalid Bitcoin address</source>
+ <translation type="unfinished">警告: 比特币地址无效</translation>
+ </message>
+ <message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">警告:未知的找零地址</translation>
+ </message>
+ <message>
+ <source>Confirm custom change address</source>
+ <translation type="unfinished">确认自定义找零地址</translation>
+ </message>
+ <message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">你选择的找零地址未被包含在本钱包中,你钱包中的部分或全部金额将被发送至该地址。你确定要这样做吗?</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
</context>
<context>
+ <name>SendCoinsEntry</name>
+ <message>
+ <source>A&amp;mount:</source>
+ <translation type="unfinished">金额(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Pay &amp;To:</source>
+ <translation type="unfinished">付给(&amp;T):</translation>
+ </message>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to send the payment to</source>
+ <translation type="unfinished">付款目的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">移除此项</translation>
+ </message>
+ <message>
+ <source>The amount to send in the selected unit</source>
+ <translation type="unfinished">用被选单位表示的待发送金额</translation>
+ </message>
+ <message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">交易费将从发送金额中扣除。接收人收到的比特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation type="unfinished">从金额中减去交易费(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Use available balance</source>
+ <translation type="unfinished">使用全部可用余额</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation type="unfinished">消息:</translation>
+ </message>
+ <message>
+ <source>Enter a label for this address to add it to the list of used addresses</source>
+ <translation type="unfinished">请为此地址输入一个标签以将它加入已用地址列表</translation>
+ </message>
+ <message>
+ <source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
+ <translation type="unfinished">bitcoin: URI 附带的备注信息,将会和交易一起存储,备查。 注意:该消息不会通过比特币网络传输。</translation>
+ </message>
+</context>
+<context>
<name>SendConfirmationDialog</name>
<message>
<source>Send</source>
<translation type="unfinished">发送</translation>
</message>
- </context>
+ <message>
+ <source>Create Unsigned</source>
+ <translation type="unfinished">创建未签名交易</translation>
+ </message>
+</context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>Signatures - Sign / Verify a Message</source>
+ <translation type="unfinished">签名 - 为消息签名/验证签名消息</translation>
+ </message>
+ <message>
+ <source>&amp;Sign Message</source>
+ <translation type="unfinished">消息签名(&amp;S)</translation>
+ </message>
+ <message>
+ <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">您可以用你的地址对消息/协议进行签名,以证明您可以接收发送到该地址的比特币。注意不要对任何模棱两可或者随机的消息进行签名,以免遭受钓鱼式攻击。请确保消息内容准确的表达了您的真实意愿。</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">用来对消息签名的地址</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">在这里输入您想要签名的消息</translation>
+ </message>
+ <message>
+ <source>Signature</source>
+ <translation type="unfinished">签名</translation>
+ </message>
+ <message>
+ <source>Copy the current signature to the system clipboard</source>
+ <translation type="unfinished">复制当前签名至剪贴板</translation>
+ </message>
+ <message>
+ <source>Sign the message to prove you own this Bitcoin address</source>
+ <translation type="unfinished">签名消息,以证明这个地址属于您</translation>
+ </message>
+ <message>
+ <source>Sign &amp;Message</source>
+ <translation type="unfinished">签名消息(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all sign message fields</source>
+ <translation type="unfinished">清空所有签名消息栏</translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
+ <source>&amp;Verify Message</source>
+ <translation type="unfinished">消息验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">请在下面输入接收者地址、消息(确保换行符、空格符、制表符等完全相同)和签名以验证消息。请仔细核对签名信息,以提防中间人攻击。请注意,这只是证明接收方可以用这个地址签名,它不能证明任何交易的发送人身份!</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address the message was signed with</source>
+ <translation type="unfinished">用来签名消息的地址</translation>
+ </message>
+ <message>
+ <source>The signed message to verify</source>
+ <translation type="unfinished">待验证的已签名消息</translation>
+ </message>
+ <message>
+ <source>The signature given when the message was signed</source>
+ <translation type="unfinished">对消息进行签署得到的签名数据</translation>
+ </message>
+ <message>
+ <source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
+ <translation type="unfinished">验证消息,确保消息是由指定的比特币地址签名过的。</translation>
+ </message>
+ <message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">验证消息签名(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">清空所有验证消息栏</translation>
+ </message>
+ <message>
+ <source>Click "Sign Message" to generate signature</source>
+ <translation type="unfinished">单击“签名消息“产生签名。</translation>
+ </message>
+ <message>
+ <source>The entered address is invalid.</source>
+ <translation type="unfinished">输入的地址无效。</translation>
+ </message>
+ <message>
+ <source>Please check the address and try again.</source>
+ <translation type="unfinished">请检查地址后重试。</translation>
+ </message>
+ <message>
+ <source>The entered address does not refer to a key.</source>
+ <translation type="unfinished">找不到与输入地址相关的密钥。</translation>
+ </message>
+ <message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">已取消解锁钱包。</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation type="unfinished">没有错误</translation>
+ </message>
+ <message>
+ <source>Private key for the entered address is not available.</source>
+ <translation type="unfinished">找不到输入地址关联的私钥。</translation>
+ </message>
+ <message>
+ <source>Message signing failed.</source>
+ <translation type="unfinished">消息签名失败。</translation>
+ </message>
+ <message>
+ <source>Message signed.</source>
+ <translation type="unfinished">消息已签名。</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">签名无法解码。</translation>
+ </message>
+ <message>
+ <source>Please check the signature and try again.</source>
+ <translation type="unfinished">请检查签名后重试。</translation>
+ </message>
+ <message>
+ <source>The signature did not match the message digest.</source>
+ <translation type="unfinished">签名与消息摘要不匹配。</translation>
+ </message>
+ <message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">消息验证失败。</translation>
+ </message>
+ <message>
+ <source>Message verified.</source>
+ <translation type="unfinished">消息验证成功。</translation>
+ </message>
+</context>
<context>
<name>SplashScreen</name>
<message>
@@ -1153,6 +3272,11 @@ For more information on using this console, type %6.
<context>
<name>TransactionDesc</name>
<message>
+ <source>conflicted with a transaction with %1 confirmations</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
+ <translation type="unfinished">与一个有 %1 个确认的交易冲突</translation>
+ </message>
+ <message>
<source>0/unconfirmed, in memory pool</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
<translation type="unfinished">0/未确认,在内存池中</translation>
@@ -1162,37 +3286,387 @@ For more information on using this console, type %6.
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
<translation type="unfinished">0/未确认,不在内存池中</translation>
</message>
+ <message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
+ <source>%1/unconfirmed</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
+ <translation type="unfinished">%1/未确认</translation>
+ </message>
+ <message>
+ <source>%1 confirmations</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in 6 or more blocks.</extracomment>
+ <translation type="unfinished">%1 个确认</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation type="unfinished">状态</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Source</source>
+ <translation type="unfinished">来源</translation>
+ </message>
+ <message>
+ <source>Generated</source>
+ <translation type="unfinished">挖矿生成</translation>
+ </message>
+ <message>
+ <source>From</source>
+ <translation type="unfinished">来自</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished">未知</translation>
+ </message>
+ <message>
+ <source>To</source>
+ <translation type="unfinished">到</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
+ <source>label</source>
+ <translation type="unfinished">标签</translation>
+ </message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">收入</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
<numerusform>在%n个区块内成熟</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>not accepted</source>
+ <translation type="unfinished">未被接受</translation>
+ </message>
+ <message>
+ <source>Debit</source>
+ <translation type="unfinished">支出</translation>
+ </message>
+ <message>
+ <source>Total debit</source>
+ <translation type="unfinished">总支出</translation>
+ </message>
+ <message>
+ <source>Total credit</source>
+ <translation type="unfinished">总收入</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Net amount</source>
+ <translation type="unfinished">净额</translation>
+ </message>
+ <message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">备注</translation>
+ </message>
+ <message>
+ <source>Transaction ID</source>
+ <translation type="unfinished">交易 ID</translation>
+ </message>
+ <message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">交易总大小</translation>
+ </message>
+ <message>
+ <source>Transaction virtual size</source>
+ <translation type="unfinished">交易虚拟大小</translation>
+ </message>
+ <message>
+ <source>Output index</source>
+ <translation type="unfinished">输出索引</translation>
+ </message>
+ <message>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
+ </message>
+ <message>
+ <source>Merchant</source>
+ <translation type="unfinished">商家</translation>
+ </message>
+ <message>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">新挖出的比特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">调试信息</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">交易</translation>
+ </message>
+ <message>
+ <source>Inputs</source>
+ <translation type="unfinished">输入</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">金额</translation>
+ </message>
+ <message>
+ <source>true</source>
+ <translation type="unfinished">是</translation>
+ </message>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">否</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionDescDialog</name>
+ <message>
+ <source>This pane shows a detailed description of the transaction</source>
+ <translation type="unfinished">当前面板显示了交易的详细信息</translation>
+ </message>
+ <message>
+ <source>Details for %1</source>
+ <translation type="unfinished">%1 详情</translation>
+ </message>
+</context>
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">类型</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">未确认</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
+ <source>Confirming (%1 of %2 recommended confirmations)</source>
+ <translation type="unfinished">确认中 (推荐 %2个确认,已经有 %1个确认)</translation>
+ </message>
+ <message>
+ <source>Confirmed (%1 confirmations)</source>
+ <translation type="unfinished">已确认 (%1 个确认)</translation>
+ </message>
+ <message>
+ <source>Conflicted</source>
+ <translation type="unfinished">有冲突</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">未成熟 (%1 个确认,将在 %2 个后可用)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">已生成但未被接受</translation>
+ </message>
+ <message>
+ <source>Received with</source>
+ <translation type="unfinished">接收到</translation>
+ </message>
+ <message>
+ <source>Received from</source>
+ <translation type="unfinished">接收自</translation>
+ </message>
+ <message>
+ <source>Sent to</source>
+ <translation type="unfinished">发送到</translation>
+ </message>
+ <message>
+ <source>Mined</source>
+ <translation type="unfinished">挖矿所得</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
+ <source>(n/a)</source>
+ <translation type="unfinished">(不可用)</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
- </context>
+ <message>
+ <source>Transaction status. Hover over this field to show number of confirmations.</source>
+ <translation type="unfinished">交易状态。 鼠标移到此区域可显示确认数。</translation>
+ </message>
+ <message>
+ <source>Date and time that the transaction was received.</source>
+ <translation type="unfinished">交易被接收的时间和日期。</translation>
+ </message>
+ <message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">交易类型。</translation>
+ </message>
+ <message>
+ <source>Whether or not a watch-only address is involved in this transaction.</source>
+ <translation type="unfinished">该交易中是否涉及仅观察地址。</translation>
+ </message>
+ <message>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation type="unfinished">用户自定义的该交易的意图/目的。</translation>
+ </message>
+ <message>
+ <source>Amount removed from or added to balance.</source>
+ <translation type="unfinished">从余额增加或移除的金额。</translation>
+ </message>
+</context>
<context>
<name>TransactionView</name>
<message>
+ <source>All</source>
+ <translation type="unfinished">全部</translation>
+ </message>
+ <message>
+ <source>Today</source>
+ <translation type="unfinished">今天</translation>
+ </message>
+ <message>
+ <source>This week</source>
+ <translation type="unfinished">本周</translation>
+ </message>
+ <message>
+ <source>This month</source>
+ <translation type="unfinished">本月</translation>
+ </message>
+ <message>
+ <source>Last month</source>
+ <translation type="unfinished">上个月</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">今年</translation>
+ </message>
+ <message>
+ <source>Received with</source>
+ <translation type="unfinished">接收到</translation>
+ </message>
+ <message>
+ <source>Sent to</source>
+ <translation type="unfinished">发送到</translation>
+ </message>
+ <message>
+ <source>Mined</source>
+ <translation type="unfinished">挖矿所得</translation>
+ </message>
+ <message>
+ <source>Other</source>
+ <translation type="unfinished">其它</translation>
+ </message>
+ <message>
+ <source>Enter address, transaction id, or label to search</source>
+ <translation type="unfinished">输入地址、交易ID或标签进行搜索</translation>
+ </message>
+ <message>
+ <source>Min amount</source>
+ <translation type="unfinished">最小金额</translation>
+ </message>
+ <message>
+ <source>Range…</source>
+ <translation type="unfinished">范围...</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;複製地址</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">複製 &amp;label</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">複製金額 &amp;amount</translation>
+ </message>
+ <message>
+ <source>Copy transaction &amp;ID</source>
+ <translation type="unfinished">复制交易 &amp;ID</translation>
+ </message>
+ <message>
+ <source>Copy &amp;raw transaction</source>
+ <translation type="unfinished">複製交易(原始)</translation>
+ </message>
+ <message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">複製完整交易明細</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">顯示交易明細</translation>
+ </message>
+ <message>
+ <source>Increase transaction &amp;fee</source>
+ <translation type="unfinished">增加礦工費(&amp;fee)</translation>
+ </message>
+ <message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">放棄交易(&amp;b)</translation>
+ </message>
+ <message>
+ <source>&amp;Edit address label</source>
+ <translation type="unfinished">編輯地址標籤(&amp;E)</translation>
+ </message>
+ <message>
<source>Show in %1</source>
<extracomment>Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</extracomment>
<translation type="unfinished">在 %1中显示</translation>
</message>
<message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">导出交易历史</translation>
+ </message>
+ <message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">逗号分隔文件</translation>
</message>
<message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
+ <source>Watch-only</source>
+ <translation type="unfinished">仅观察</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">类型</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
@@ -1201,25 +3675,134 @@ For more information on using this console, type %6.
<translation type="unfinished">地址</translation>
</message>
<message>
+ <source>ID</source>
+ <translation type="unfinished">識別碼</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">导出失败</translation>
</message>
- </context>
+ <message>
+ <source>There was an error trying to save the transaction history to %1.</source>
+ <translation type="unfinished">尝试把交易历史保存到 %1 时发生了错误。</translation>
+ </message>
+ <message>
+ <source>Exporting Successful</source>
+ <translation type="unfinished">导出成功</translation>
+ </message>
+ <message>
+ <source>The transaction history was successfully saved to %1.</source>
+ <translation type="unfinished">已成功将交易历史保存到 %1。</translation>
+ </message>
+ <message>
+ <source>Range:</source>
+ <translation type="unfinished">范围:</translation>
+ </message>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">到</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
+ <source>No wallet has been loaded.
+Go to File &gt; Open Wallet to load a wallet.
+- OR -</source>
+ <translation type="unfinished">未加载钱包。
+请转到“文件”菜单 &gt; “打开钱包”来加载一个钱包。
+- 或者 -</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">错误</translation>
</message>
- </context>
+ <message>
+ <source>Unable to decode PSBT from clipboard (invalid base64)</source>
+ <translation type="unfinished">无法从剪贴板解码PSBT(Base64值无效)</translation>
+ </message>
+ <message>
+ <source>Load Transaction Data</source>
+ <translation type="unfinished">加载交易数据</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (*.psbt)</source>
+ <translation type="unfinished">部分签名交易 (*.psbt)</translation>
+ </message>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">PSBT文件必须小于100MiB</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">无法解码PSBT</translation>
+ </message>
+</context>
<context>
<name>WalletModel</name>
<message>
+ <source>Send Coins</source>
+ <translation type="unfinished">发币</translation>
+ </message>
+ <message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">追加手续费出错</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">追加交易手续费失败</translation>
+ </message>
+ <message>
+ <source>Do you want to increase the fee?</source>
+ <extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
+ <translation type="unfinished">您想追加手续费吗?</translation>
+ </message>
+ <message>
+ <source>Current fee:</source>
+ <translation type="unfinished">当前手续费:</translation>
+ </message>
+ <message>
+ <source>Increase:</source>
+ <translation type="unfinished">增加量:</translation>
+ </message>
+ <message>
+ <source>New fee:</source>
+ <translation type="unfinished">新交易费:</translation>
+ </message>
+ <message>
+ <source>Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy.</source>
+ <translation type="unfinished">警告: 因為在必要的時候會減少找零輸出個數或增加輸入個數,這可能要付出額外的費用。 在沒有找零輸出的情況下可能會新增一個。 這些變更可能會導致潛在的隱私洩漏。</translation>
+ </message>
+ <message>
+ <source>Confirm fee bump</source>
+ <translation type="unfinished">确认手续费追加</translation>
+ </message>
+ <message>
+ <source>Can't draft transaction.</source>
+ <translation type="unfinished">无法起草交易。</translation>
+ </message>
+ <message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">PSBT已複製</translation>
+ </message>
+ <message>
<source>Copied to clipboard</source>
<comment>Fee-bump PSBT saved</comment>
<translation type="unfinished">复制到剪贴板</translation>
</message>
<message>
+ <source>Can't sign transaction.</source>
+ <translation type="unfinished">无法签名交易</translation>
+ </message>
+ <message>
+ <source>Could not commit transaction</source>
+ <translation type="unfinished">无法提交交易</translation>
+ </message>
+ <message>
+ <source>Can't display address</source>
+ <translation type="unfinished">無法顯示地址</translation>
+ </message>
+ <message>
<source>default wallet</source>
<translation type="unfinished">默认钱包</translation>
</message>
@@ -1234,10 +3817,42 @@ For more information on using this console, type %6.
<source>Export the data in the current tab to a file</source>
<translation type="unfinished">将当前选项卡中的数据导出到文件</translation>
</message>
- </context>
+ <message>
+ <source>Backup Wallet</source>
+ <translation type="unfinished">备份钱包</translation>
+ </message>
+ <message>
+ <source>Backup Failed</source>
+ <translation type="unfinished">备份失败</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the wallet data to %1.</source>
+ <translation type="unfinished">尝试保存钱包数据至 %1 时发生了错误。</translation>
+ </message>
+ <message>
+ <source>Backup Successful</source>
+ <translation type="unfinished">备份成功</translation>
+ </message>
+ <message>
+ <source>The wallet data was successfully saved to %1.</source>
+ <translation type="unfinished">已成功保存钱包数据至 %1。</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">取消</translation>
+ </message>
+</context>
<context>
<name>bitcoin-core</name>
<message>
+ <source>The %s developers</source>
+ <translation type="unfinished">%s 开发者</translation>
+ </message>
+ <message>
+ <source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
+ <translation type="unfinished">%s损坏。请尝试用bitcoin-wallet钱包工具来对其进行急救。或者用一个备份进行还原。</translation>
+ </message>
+ <message>
<source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
<translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上,以供诊断问题的原因。</translation>
</message>
@@ -1246,10 +3861,26 @@ For more information on using this console, type %6.
<translation type="unfinished">%s请求监听端口%u。此端口被认为是“坏的”,所以不太可能有其他节点会连接过来。详情以及完整的端口列表请参见 doc/p2p-bad-ports.md 。</translation>
</message>
<message>
+ <source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
+ <translation type="unfinished">無法把皮夾版本從%i降級到%i。錢包版本未改變。</translation>
+ </message>
+ <message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">无法锁定数据目录 %s。%s 可能已经在运行。</translation>
+ </message>
+ <message>
+ <source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
+ <translation type="unfinished">無法在不支援「分割前的金鑰池」(pre split keypool)的情況下把「非分割HD錢包」(non HD split wallet)從版本%i升级到%i。請使用版本號%i,或壓根不要指定版本號。</translation>
+ </message>
+ <message>
<source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
<translation type="unfinished">%s的磁盘空间可能无法容纳区块文件。大约要在这个目录中储存 %uGB 的数据。</translation>
</message>
<message>
+ <source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
+ <translation type="unfinished">在MIT协议下分发,参见附带的 %s 或 %s 文件</translation>
+ </message>
+ <message>
<source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
<translation type="unfinished">加载钱包时出错。需要下载区块才能加载钱包,而且在使用assumeutxo快照时,下载区块是不按顺序的,这个时候软件不支持加载钱包。在节点同步至高度%s之后就应该可以加载钱包了。</translation>
</message>
@@ -1258,6 +3889,18 @@ For more information on using this console, type %6.
<translation type="unfinished">读取%s出错!交易数据可能丢失或有误。重新扫描钱包中。</translation>
</message>
<message>
+ <source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
+ <translation type="unfinished">錯誤: 轉儲文件格式不正確。 得到是"%s",而預期本應得到的是 "format"。</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
+ <translation type="unfinished">錯誤: 轉儲文件版本不支援。 這個版本的 bitcoin-wallet 只支援版本為 1 的轉儲檔案。 得到的轉儲文件版本是%s</translation>
+ </message>
+ <message>
<source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
<translation type="unfinished">错误: 旧式钱包只支持 "legacy", "p2sh-segwit", 和 "bech32" 这三种地址类型</translation>
</message>
@@ -1266,18 +3909,98 @@ For more information on using this console, type %6.
<translation type="unfinished">错误: 无法为该旧式钱包生成描述符。如果钱包已被加密,请确保提供的钱包加密密码正确。</translation>
</message>
<message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">檔案%s已經存在。 如果你確定這就是你想做的,先把這份檔案移開。</translation>
+ </message>
+ <message>
<source>Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start.</source>
<translation type="unfinished">无效或损坏的peers.dat (%s)。如果你确信这是一个bug,请反馈到%s。作为变通办法,你可以把现有文件 (%s) 移开(重命名、移动或删除),这样就可以在下次启动时创建一个新文件了。</translation>
</message>
<message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">提供多數TOR路由綁定位址。 對自動建立的Tor服務用%s</translation>
+ </message>
+ <message>
+ <source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 createfromdump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 dump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
+ <source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供錢包格式。 要使用 createfromdump ,必須提供 -format=&lt;format&gt;</translation>
+ </message>
+ <message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">请检查电脑的日期时间设置是否正确!时间错误可能会导致 %s 运行异常。</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">如果你认为%s对你比较有用的话,请对我们进行一些自愿贡献。请访问%s网站来获取有关这个软件的更多信息。</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">修剪被设置得太小,已经低于最小值%d MiB,请使用更大的数值。</translation>
+ </message>
+ <message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<translation type="unfinished">修剪模式与 -reindex-chainstate 不兼容。请进行一次完整的 -reindex 。</translation>
</message>
<message>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation type="unfinished">修剪:上次同步钱包的位置已经超出(落后于)现有修剪后数据的范围。你需要进行-reindex(对于已经启用修剪节点,就需要重新下载整个区块链)</translation>
+ </message>
+ <message>
<source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
<translation type="unfinished">重命名 '%s' -&gt; '%s' 失败。您需要手动移走或删除无效的快照目录 %s来解决这个问题,不然的话您就会在下一次启动时遇到相同的错误。</translation>
</message>
<message>
+ <source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
+ <translation type="unfinished">SQLiteDatabase: SQLite錢包schema版本%d未知。 只支持%d版本</translation>
+ </message>
+ <message>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation type="unfinished">区块数据库包含未来的交易,这可能是由本机的日期时间错误引起。若确认本机日期时间正确,请重新建立区块数据库。</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation type="unfinished">这笔交易在扣除手续费后的金额太小,以至于无法送出</translation>
+ </message>
+ <message>
+ <source>This error could occur if this wallet was not shutdown cleanly and was last loaded using a build with a newer version of Berkeley DB. If so, please use the software that last loaded this wallet</source>
+ <translation type="unfinished">如果这个钱包之前没有正确关闭,而且上一次是被新版的Berkeley DB加载过,就会发生这个错误。如果是这样,请使用上次加载过这个钱包的那个软件。</translation>
+ </message>
+ <message>
+ <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
+ <translation type="unfinished">这是测试用的预发布版本 - 请谨慎使用 - 不要用来挖矿,或者在正式商用环境下使用</translation>
+ </message>
+ <message>
+ <source>This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
+ <translation type="unfinished">为了在常规选币过程中优先考虑避免“只花出一个地址上的一部分币”(partial spend)这种情况,您最多还需要(在常规手续费之外)付出的交易手续费。</translation>
+ </message>
+ <message>
+ <source>This is the transaction fee you may discard if change is smaller than dust at this level</source>
+ <translation type="unfinished">找零低于当前粉尘阈值时会被舍弃,并计入手续费,这些交易手续费就是在这种情况下产生的。</translation>
+ </message>
+ <message>
+ <source>This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation type="unfinished">不能估计手续费时,你会付出这个手续费金额。</translation>
+ </message>
+ <message>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation type="unfinished">网络版本字符串的总长度 (%i) 超过最大长度 (%i) 了。请减少 uacomment 参数的数目或长度。</translation>
+ </message>
+ <message>
+ <source>Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate.</source>
+ <translation type="unfinished">无法重放区块。你需要先用-reindex-chainstate参数来重建数据库。</translation>
+ </message>
+ <message>
+ <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
+ <translation type="unfinished">提供了未知的錢包格式 "%s" 。請使用 "bdb" 或 "sqlite" 中的一種。</translation>
+ </message>
+ <message>
<source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
<translation type="unfinished">不支持的类别限定日志等级 %1$s=%2$s 。 预期参数 %1$s=&lt;category&gt;:&lt;loglevel&gt;。 有效的类别: %3$s 。有效的日志等级: %4$s 。</translation>
</message>
@@ -1294,10 +4017,54 @@ For more information on using this console, type %6.
<translation type="unfinished">钱包加载成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。可以使用 migratewallet 命令将旧式钱包迁移至输出描述符钱包。</translation>
</message>
<message>
+ <source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
+ <translation type="unfinished">警告: 轉儲文件的錢包格式 "%s" 與命令列指定的格式 "%s" 不符。</translation>
+ </message>
+ <message>
+ <source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
+ <translation type="unfinished">警告:在已经禁用私钥的钱包 {%s} 中仍然检测到私钥</translation>
+ </message>
+ <message>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">警告:我们和其他节点似乎没达成共识!您可能需要升级,或者就是其他节点可能需要升级。</translation>
+ </message>
+ <message>
+ <source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
+ <translation type="unfinished">需要驗證高度在%d之後的區塊見證數據。 請使用 -reindex 重新啟動。</translation>
+ </message>
+ <message>
+ <source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
+ <translation type="unfinished">您需要使用 -reindex 重新构建数据库以回到未修剪模式。这将重新下载整个区块链</translation>
+ </message>
+ <message>
+ <source>%s is set very high!</source>
+ <translation type="unfinished">%s非常高!</translation>
+ </message>
+ <message>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation type="unfinished">-maxmempool 最小为%d MB</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">发生了致命的内部错误,请在debug.log中查看详情</translation>
+ </message>
+ <message>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation type="unfinished">无法解析 - %s 地址: '%s'</translation>
+ </message>
+ <message>
<source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
<translation type="unfinished">在 -dnsseed 被设为 false 时无法将 -forcednsseed 设为 true 。</translation>
</message>
<message>
+ <source>Cannot set -peerblockfilters without -blockfilterindex.</source>
+ <translation type="unfinished">没有启用-blockfilterindex,就不能启用-peerblockfilters。</translation>
+ </message>
+ <message>
+ <source>Cannot write to data directory '%s'; check permissions.</source>
+ <translation type="unfinished">不能写入到数据目录'%s';请检查文件权限。</translation>
+ </message>
+ <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s被设置得很高! 这可是一次交易就有可能付出的手续费。</translation>
</message>
@@ -1420,28 +4187,104 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">区块验证已中断</translation>
</message>
<message>
+ <source>Config setting for %s only applied on %s network when in [%s] section.</source>
+ <translation type="unfinished">對 %s 的配置設定只對 %s 網路生效,如果它位於配置的 [%s] 章節的話</translation>
+ </message>
+ <message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">版权所有 (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">检测到区块数据库损坏</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">找不到asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">無法解析asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">磁盘空间太低!</translation>
+ </message>
+ <message>
+ <source>Do you want to rebuild the block database now?</source>
+ <translation type="unfinished">你想现在就重建区块数据库吗?</translation>
+ </message>
+ <message>
+ <source>Done loading</source>
+ <translation type="unfinished">加载完成</translation>
+ </message>
+ <message>
+ <source>Dump file %s does not exist.</source>
+ <translation type="unfinished">轉儲文件 %s 不存在</translation>
+ </message>
+ <message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
+ <source>Error creating %s</source>
+ <translation type="unfinished">創建%s時出錯</translation>
+ </message>
+ <message>
+ <source>Error initializing block database</source>
+ <translation type="unfinished">初始化区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">初始化钱包数据库环境错误 %s!</translation>
+ </message>
+ <message>
+ <source>Error loading %s</source>
+ <translation type="unfinished">载入 %s 时发生错误</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Private keys can only be disabled during creation</source>
+ <translation type="unfinished">加载 %s 时出错:只能在创建钱包时禁用私钥。</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation type="unfinished">%s 加载出错:钱包损坏</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation type="unfinished">%s 加载错误:请升级到最新版 %s</translation>
+ </message>
+ <message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">加载区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">打开区块数据库时出错</translation>
+ </message>
+ <message>
<source>Error reading configuration file: %s</source>
<translation type="unfinished">读取配置文件失败: %s</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
+ <source>Error reading from database, shutting down.</source>
+ <translation type="unfinished">读取数据库出错,关闭中。</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">從錢包資料庫讀取下一筆記錄時出錯</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">错误:创建新仅观察钱包失败</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
+ <source>Error: Failed to create new watchonly wallet</source>
+ <translation type="unfinished">错误:创建新仅观察钱包失败</translation>
</message>
<message>
<source>Error: This wallet already uses SQLite</source>
@@ -1464,14 +4307,42 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
<message>
+ <source>Error: Unable to write record to new wallet</source>
+ <translation type="unfinished">錯誤: 無法寫入記錄到新錢包</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法启动索引,关闭中...</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Input not found or already spent</source>
<translation type="unfinished">找不到交易項,或可能已經花掉了</translation>
</message>
@@ -1524,6 +4395,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">指定的数据目录 "%s" 不存在。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction change output index out of range</source>
<translation type="unfinished">交易尋找零輸出項超出範圍</translation>
</message>
@@ -1552,10 +4427,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">%s链上acceptstalefeeestimates 不受支持。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>Settings file could not be read</source>
<translation type="unfinished">无法读取设置文件</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh_CN.ts b/src/qt/locale/bitcoin_zh_CN.ts
index 94f9cab777..21f57a8f6d 100644
--- a/src/qt/locale/bitcoin_zh_CN.ts
+++ b/src/qt/locale/bitcoin_zh_CN.ts
@@ -303,6 +303,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金额</translation>
</message>
@@ -1120,12 +1132,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> 仅观察脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> 可解但又未被监视的脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1602,6 +1614,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
@@ -1818,18 +1834,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">与 "%1" 最接近的匹配</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">确定(&amp;O)</translation>
</message>
@@ -2071,8 +2075,8 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">PSBT已保存到硬盘</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * 发送 %1 至 %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
</message>
<message>
<source>own address</source>
@@ -2665,6 +2669,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">不使用任何钱包执行命令</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">使用“%1”钱包执行命令</translation>
</message>
@@ -3133,10 +3141,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">从钱包%1</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 到 '%2'</translation>
</message>
@@ -3194,6 +3198,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">请务必仔细检查您的交易请求。这会产生一个部分签名比特币交易(PSBT),可以把保存下来或复制出去,然后就可以对它进行签名,比如用离线%1钱包,或是用兼容PSBT的硬件钱包。</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -3652,8 +3660,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">输出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(证书未被验证)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
</message>
<message>
<source>Merchant</source>
@@ -4480,6 +4488,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">转储文件 %s 不存在</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">创建%s时出错</translation>
</message>
@@ -4528,16 +4540,12 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">从钱包数据库读取下一条记录时出错</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4576,10 +4584,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 没有可用的%s地址。</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已经在使用SQLite</translation>
</message>
@@ -4604,6 +4608,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
@@ -4612,6 +4620,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法写入记录到新钱包</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">监听端口失败。如果你愿意的话,请使用 -listen=0 参数。</translation>
</message>
@@ -4628,6 +4652,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数据库失败</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手续费率 (%s) 低于最大手续费率设置 (%s)</translation>
</message>
@@ -4848,6 +4876,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">如果发送交易,这将是你要支付的手续费。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">交易金额太小</translation>
</message>
@@ -4860,10 +4892,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">交易找零输出项编号超出范围</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">此交易在内存池中的存在过长的链条</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">交易必须包含至少一个收款人</translation>
</message>
@@ -4944,6 +4972,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s 。</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">%s链上 acceptstalefeeestimates 不受支持。</translation>
</message>
@@ -4952,6 +4984,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的日志分类 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">用户代理备注(%s)包含不安全的字符。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh_HK.ts b/src/qt/locale/bitcoin_zh_HK.ts
index c43300fbcd..55551bfe71 100644
--- a/src/qt/locale/bitcoin_zh_HK.ts
+++ b/src/qt/locale/bitcoin_zh_HK.ts
@@ -298,6 +298,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金额</translation>
</message>
@@ -306,11 +318,25 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">輸入一個 Bitcoin 位址 (例如 %1)</translation>
</message>
<message>
+ <source>Unroutable</source>
+ <translation type="unfinished">不可路由</translation>
+ </message>
+ <message>
<source>Inbound</source>
<extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
<message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
+ </message>
+ <message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
<translation type="unfinished">区块转发</translation>
@@ -321,6 +347,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手册</translation>
</message>
<message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
+ </message>
+ <message>
<source>%1 d</source>
<translation type="unfinished">%1 日</translation>
</message>
@@ -844,6 +880,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">送出交易</translation>
+ </message>
+ <message>
<source>Incoming transaction</source>
<translation type="unfinished">收款交易</translation>
</message>
@@ -864,6 +904,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;解鎖中&lt;/b&gt;</translation>
</message>
<message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
+ </message>
+ <message>
<source>Original message:</source>
<translation type="unfinished">原消息:</translation>
</message>
@@ -882,10 +926,34 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手动选币</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">总量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組數:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">全(不)选</translation>
+ </message>
+ <message>
<source>Tree mode</source>
<translation type="unfinished">树状模式</translation>
</message>
@@ -898,10 +966,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation type="unfinished">收款标签</translation>
+ </message>
+ <message>
<source>Received with address</source>
<translation type="unfinished">收款地址</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Confirmed</source>
<translation type="unfinished">已確認</translation>
</message>
@@ -930,6 +1006,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">锁定未花费(&amp;O)</translation>
</message>
<message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">解锁未花费(&amp;U)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -965,7 +1045,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- </context>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(找零)</translation>
+ </message>
+</context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -1030,12 +1114,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">仅观察脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished"> 可解但又未被监视的脚本已被迁移至名为 '%1' 的新钱包中。</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1108,7 +1192,11 @@ The migration process will create a backup of the wallet before migrating. This
<source>Close all wallets</source>
<translation type="unfinished">关闭所有钱包</translation>
</message>
- </context>
+ <message>
+ <source>Are you sure you wish to close all wallets?</source>
+ <translation type="unfinished">您确定想要关闭所有钱包吗?</translation>
+ </message>
+</context>
<context>
<name>CreateWalletDialog</name>
<message>
@@ -1155,6 +1243,10 @@ The migration process will create a backup of the wallet before migrating. This
<source>Make Blank Wallet</source>
<translation type="unfinished">製作空白錢包</translation>
</message>
+ <message>
+ <source>Create</source>
+ <translation type="unfinished">创建</translation>
+ </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -1175,6 +1267,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">跟這個地址清單關聯的地址。只有發送地址能被修改。</translation>
</message>
<message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">地址(&amp;A)</translation>
+ </message>
+ <message>
<source>New sending address</source>
<translation type="unfinished">新建付款地址</translation>
</message>
@@ -1187,6 +1283,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">编辑付款地址</translation>
</message>
<message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">地址“%1”已经存在,它是一个收款地址,标签为“%2”,所以它不能作为一个付款地址被添加进来。</translation>
+ </message>
+ <message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
<translation type="unfinished">输入的地址“%1”已经存在于地址簿中,标签为“%2”。</translation>
</message>
@@ -1206,10 +1306,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">就要產生新的資料目錄。</translation>
</message>
<message>
+ <source>name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
<translation type="unfinished">已經有這個目錄了。如果你要在裡面造出新的目錄的話,請加上 %1.</translation>
</message>
<message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">路径已存在,并且不是一个目录。</translation>
+ </message>
+ <message>
<source>Cannot create data directory here.</source>
<translation type="unfinished">无法在此创建数据目录。</translation>
</message>
@@ -1231,7 +1339,7 @@ The migration process will create a backup of the wallet before migrating. This
<message numerus="yes">
<source>(%n GB needed for full chain)</source>
<translation type="unfinished">
- <numerusform>(完整區塊鏈需要%n GB)</numerusform>
+ <numerusform>(完整區塊鏈需要%n GB)</numerusform>
</translation>
</message>
<message>
@@ -1242,6 +1350,10 @@ The migration process will create a backup of the wallet before migrating. This
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
<translation type="unfinished">此目录中至少会保存 %1 GB 的数据,并且大小还会随着时间增长。</translation>
</message>
+ <message>
+ <source>Approximately %1 GB of data will be stored in this directory.</source>
+ <translation type="unfinished">会在此目录中存储约 %1 GB 的数据。</translation>
+ </message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
@@ -1270,10 +1382,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">欢迎</translation>
</message>
<message>
+ <source>Welcome to %1.</source>
+ <translation type="unfinished">欢迎使用 %1</translation>
+ </message>
+ <message>
<source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
<translation type="unfinished">由于这是第一次启动此程序,您可以选择%1存储数据的位置</translation>
</message>
<message>
+ <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
+ <translation type="unfinished">取消此设置需要重新下载整个区块链。先完整下载整条链再进行修剪会更快。这会禁用一些高级功能。</translation>
+ </message>
+ <message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
<translation type="unfinished">初始化同步过程是非常吃力的,同时可能会暴露您之前没有注意到的电脑硬件问题。你每次启动%1时,它都会从之前中断的地方继续下载。</translation>
</message>
@@ -1297,6 +1417,10 @@ The migration process will create a backup of the wallet before migrating. This
<context>
<name>HelpMessageDialog</name>
<message>
+ <source>version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>About %1</source>
<translation type="unfinished">关于 %1</translation>
</message>
@@ -1311,7 +1435,11 @@ The migration process will create a backup of the wallet before migrating. This
<source>%1 is shutting down…</source>
<translation type="unfinished">%1正在关闭...</translation>
</message>
- </context>
+ <message>
+ <source>Do not shut down the computer until this window disappears.</source>
+ <translation type="unfinished">在此窗口消失前不要关闭计算机。</translation>
+ </message>
+</context>
<context>
<name>ModalOverlay</name>
<message>
@@ -1319,6 +1447,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗体</translation>
</message>
<message>
+ <source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
+ <translation type="unfinished">近期交易可能尚未显示,因此当前余额可能不准确。以上信息将在与比特币网络完全同步后更正。详情如下</translation>
+ </message>
+ <message>
+ <source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
+ <translation type="unfinished">尝试使用受未可见交易影响的余额将不被网络接受。</translation>
+ </message>
+ <message>
+ <source>Number of blocks left</source>
+ <translation type="unfinished">剩余区块数量</translation>
+ </message>
+ <message>
<source>Unknown…</source>
<translation type="unfinished">未知...</translation>
</message>
@@ -1327,6 +1467,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">计算中...</translation>
</message>
<message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
<source>Progress</source>
<translation type="unfinished">进度</translation>
</message>
@@ -1335,6 +1479,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">每小时进度增加</translation>
</message>
<message>
+ <source>Estimated time left until synced</source>
+ <translation type="unfinished">预计剩余同步时间</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">隐藏</translation>
</message>
@@ -1357,7 +1505,12 @@ The migration process will create a backup of the wallet before migrating. This
<source>Open bitcoin URI</source>
<translation type="unfinished">打开比特币URI</translation>
</message>
- </context>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+</context>
<context>
<name>OptionsDialog</name>
<message>
@@ -1365,6 +1518,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">選項</translation>
</message>
<message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">主要(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">在登入系统后自动启动 %1</translation>
+ </message>
+ <message>
<source>&amp;Start %1 on system login</source>
<translation type="unfinished">系统登入时启动 %1 (&amp;S)</translation>
</message>
@@ -1373,6 +1534,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">启用区块修剪会显著减小存储交易对磁盘空间的需求。所有的区块仍然会被完整校验。取消这个设置需要重新下载整条区块链。</translation>
</message>
<message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">数据库缓存大小(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">脚本验证线程数(&amp;V)</translation>
+ </message>
+ <message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
<translation type="unfinished">与%1兼容的脚本文件路径(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:恶意软件可以偷币!</translation>
</message>
@@ -1389,6 +1558,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
@@ -1413,6 +1586,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">网络(&amp;N)</translation>
</message>
<message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">将区块存储修剪至(&amp;B)</translation>
+ </message>
+ <message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
<translation type="unfinished">警告:还原此设置需要重新下载整个区块链。</translation>
</message>
@@ -1441,6 +1618,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">启用R&amp;PC服务器</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">钱包(&amp;A)</translation>
+ </message>
+ <message>
<source>Whether to set subtract fee from amount as default or not.</source>
<extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
<translation type="unfinished">是否要默认从金额中减去手续费。</translation>
@@ -1451,10 +1632,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">默认从金额中减去交易手续费(&amp;F)</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation type="unfinished">专家</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">启用手动选币功能(&amp;C)</translation>
+ </message>
+ <message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished">如果您禁止动用尚未确认的找零资金,则一笔交易的找零资金至少需要有1个确认后才能动用。这同时也会影响账户余额的计算。</translation>
</message>
<message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">动用尚未确认的找零资金(&amp;S)</translation>
+ </message>
+ <message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
<translation type="unfinished">启用&amp;PSBT控件</translation>
@@ -1465,10 +1658,30 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">是否要显示PSBT控件</translation>
</message>
<message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">外接簽證設備 (e.g. 硬體錢包)</translation>
+ </message>
+ <message>
<source>&amp;External signer script path</source>
<translation type="unfinished">外部签名器脚本路径(&amp;E)</translation>
</message>
<message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">使用 &amp;UPnP 映射端口</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
<source>Accept connections from outside.</source>
<translation type="unfinished">接受外來連線</translation>
</message>
@@ -1485,6 +1698,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">通过 SO&amp;CKS5 代理连接(默认代理):</translation>
</message>
<message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">代理服务器 &amp;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">端口(&amp;P):</translation>
+ </message>
+ <message>
<source>Port of the proxy (e.g. 9050)</source>
<translation type="unfinished">代理伺服器的通訊埠(像是 9050)</translation>
</message>
@@ -1497,6 +1718,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">窗口(&amp;W)</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">視窗縮到最小後只在通知區顯示圖示。</translation>
</message>
@@ -1509,6 +1738,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">单击关闭按钮时最小化(&amp;I)</translation>
</message>
<message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">显示(&amp;D)</translation>
+ </message>
+ <message>
<source>User Interface &amp;language:</source>
<translation type="unfinished">使用界面語言(&amp;L):</translation>
</message>
@@ -1533,22 +1766,39 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">第三方交易网址(&amp;T)</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">是否显示手动选币功能。</translation>
+ </message>
+ <message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
<translation type="unfinished">连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
+ <source>&amp;OK</source>
+ <translation type="unfinished">确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">取消(&amp;C)</translation>
</message>
<message>
<source>default</source>
<translation type="unfinished">預設值</translation>
</message>
<message>
+ <source>none</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">确认恢复默认设置</translation>
+ </message>
+ <message>
<source>Client restart required to activate changes.</source>
<extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
<translation type="unfinished">需要重新開始客戶端軟體來讓改變生效。</translation>
@@ -1589,7 +1839,15 @@ The migration process will create a backup of the wallet before migrating. This
<source>The configuration file could not be opened.</source>
<translation type="unfinished">无法打开配置文件。</translation>
</message>
- </context>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">此更改需要重启客户端。</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">提供的代理服务器地址无效。</translation>
+ </message>
+</context>
<context>
<name>OptionsModel</name>
<message>
@@ -1608,6 +1866,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">顯示的資訊可能是過期的。跟 Bitcoin 網路的連線建立後,你的錢包會自動和網路同步,但是這個步驟還沒完成。</translation>
</message>
<message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
<source>Available:</source>
<translation type="unfinished">可用金額:</translation>
</message>
@@ -1636,10 +1898,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">餘額</translation>
</message>
<message>
+ <source>Total:</source>
+ <translation type="unfinished">总额:</translation>
+ </message>
+ <message>
<source>Your current total balance</source>
<translation type="unfinished">您当前的总余额</translation>
</message>
<message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">您当前在仅观察观察地址中的余额</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">可动用:</translation>
+ </message>
+ <message>
<source>Recent transactions</source>
<translation type="unfinished">最近的交易</translation>
</message>
@@ -1648,6 +1922,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">仅观察地址的未确认交易</translation>
</message>
<message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">仅观察地址中尚未成熟的挖矿收入余额:</translation>
+ </message>
+ <message>
<source>Current total balance in watch-only addresses</source>
<translation type="unfinished">仅观察地址中的当前总余额</translation>
</message>
@@ -1683,6 +1961,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">關閉</translation>
</message>
<message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">加载交易失败: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">签名交易失败: %1</translation>
+ </message>
+ <message>
<source>Cannot sign inputs while wallet is locked.</source>
<translation type="unfinished">钱包已锁定,无法签名交易输入项。</translation>
</message>
@@ -1695,6 +1981,22 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">已签名 %1 个交易输入项,但是仍然还有余下的项目需要签名。</translation>
</message>
<message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">成功签名交易。交易已经可以广播。</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">处理交易时遇到未知错误。</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">已复制PSBT到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -1704,6 +2006,18 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">PSBT已保存到硬盘</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">无法计算交易费用或总交易金额。</translation>
+ </message>
+ <message>
<source>Pays transaction fee: </source>
<translation type="unfinished">支付交易费用:</translation>
</message>
@@ -1732,6 +2046,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">(但这个钱包不能签名交易)</translation>
</message>
<message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(但这个钱包没有正确的密钥)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">交易已经完全签名,可以广播。</translation>
+ </message>
+ <message>
<source>Transaction status is unknown.</source>
<translation type="unfinished">交易状态未知。</translation>
</message>
@@ -1743,6 +2065,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">支付请求出错</translation>
</message>
<message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">无法启动 bitcoin: 协议的“一键支付”处理程序</translation>
+ </message>
+ <message>
<source>URI handling</source>
<translation type="unfinished">URI 處理</translation>
</message>
@@ -1819,7 +2145,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<extracomment>An Inbound Connection from a Peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
- </context>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
@@ -1827,10 +2158,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">复制图像(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">URI 太長,請縮短標籤或訊息文字。</translation>
+ </message>
+ <message>
<source>Error encoding URI into QR Code.</source>
<translation type="unfinished">把 URI 编码成二维码时发生错误。</translation>
</message>
<message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">不支持二维码。</translation>
+ </message>
+ <message>
<source>Save QR Code</source>
<translation type="unfinished">儲存 QR 碼</translation>
</message>
@@ -1867,6 +2210,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">区块存储目录</translation>
</message>
<message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">如果要自訂區塊儲存目錄的位置,請使用 '%1' 這個選項來指定新的位置。</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation type="unfinished">啓動時間</translation>
</message>
@@ -1875,6 +2222,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络</translation>
</message>
<message>
+ <source>Name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Number of connections</source>
<translation type="unfinished">連線數</translation>
</message>
@@ -1883,10 +2234,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">區塊鏈</translation>
</message>
<message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">内存池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">当前交易数量</translation>
+ </message>
+ <message>
<source>Memory usage</source>
<translation type="unfinished">内存使用</translation>
</message>
<message>
+ <source>Wallet: </source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
<source>(none)</source>
<translation type="unfinished">(无)</translation>
</message>
@@ -1943,10 +2306,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">交易转发</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation type="unfinished">起步区块</translation>
+ </message>
+ <message>
<source>Synced Headers</source>
<translation type="unfinished">已同步前導資料</translation>
</message>
<message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">已同步区块</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">最近交易</translation>
</message>
@@ -2001,6 +2372,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">当前区块高度</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">打开当前数据目录中的 %1 调试日志文件。日志文件大的话可能要等上几秒钟。</translation>
+ </message>
+ <message>
<source>Decrease font size</source>
<translation type="unfinished">缩小字体大小</translation>
</message>
@@ -2037,10 +2412,23 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">高带宽</translation>
</message>
<message>
+ <source>Connection Time</source>
+ <translation type="unfinished">连接时间</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">來自這個節點上次成功驗證新區塊已經過的時間</translation>
+ </message>
+ <message>
<source>Last Block</source>
<translation type="unfinished">上一个区块</translation>
</message>
<message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">來自這個節點上次成功驗證新交易進入內存池已經過的時間</translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation type="unfinished">最近送出</translation>
</message>
@@ -2049,6 +2437,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">上次接收</translation>
</message>
<message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping 延时</translation>
+ </message>
+ <message>
<source>The duration of a currently outstanding ping.</source>
<translation type="unfinished">目前这一次 ping 已经过去的时间。</translation>
</message>
@@ -2057,6 +2449,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Ping 等待</translation>
</message>
<message>
+ <source>Min Ping</source>
+ <translation type="unfinished">最小 Ping 值</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">时间偏移</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
<source>&amp;Open</source>
<translation type="unfinished">打开(&amp;O)</translation>
</message>
@@ -2073,6 +2477,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">總計</translation>
</message>
<message>
+ <source>Debug log file</source>
+ <translation type="unfinished">调试日志文件</translation>
+ </message>
+ <message>
<source>Clear console</source>
<translation type="unfinished">清主控台</translation>
</message>
@@ -2110,6 +2518,11 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">出站触须: 短暂,用于测试地址</translation>
</message>
<message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">Outbound 地址取得: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
<source>detecting: peer could be v1 or v2</source>
<extracomment>Explanatory text for "detecting" transport type.</extracomment>
<translation type="unfinished">检测中: 节点可能是v1或是v2</translation>
@@ -2133,15 +2546,35 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">对端选择了我们用于高带宽转发</translation>
</message>
<message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">未選擇高頻寬轉發點</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">复制地址(&amp;C)</translation>
</message>
<message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">断开(&amp;D)</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
<translation type="unfinished">1 小时(&amp;H)</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 周(&amp;W)</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 年(&amp;Y)</translation>
+ </message>
+ <message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
<translation type="unfinished">复制IP/网络掩码(&amp;C)</translation>
@@ -2151,6 +2584,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">解封(&amp;U)</translation>
</message>
<message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">网络活动已禁用</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">不使用任何钱包执行命令</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">使用“%1”钱包执行命令</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2173,6 +2622,10 @@ For more information on using this console, type %6.
<translation type="unfinished">执行中……</translation>
</message>
<message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">經由 %1</translation>
</message>
@@ -2181,6 +2634,10 @@ For more information on using this console, type %6.
<translation type="unfinished">是</translation>
</message>
<message>
+ <source>No</source>
+ <translation type="unfinished">否</translation>
+ </message>
+ <message>
<source>To</source>
<translation type="unfinished">到</translation>
</message>
@@ -2208,6 +2665,10 @@ For more information on using this console, type %6.
<translation type="unfinished">金额(&amp;A):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
<source>&amp;Message:</source>
<translation type="unfinished">訊息(&amp;M):</translation>
</message>
@@ -2216,6 +2677,10 @@ For more information on using this console, type %6.
<translation type="unfinished">可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。</translation>
</message>
<message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">可为新建的收款地址添加一个标签。</translation>
+ </message>
+ <message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
<translation type="unfinished">使用此表单请求付款。所有字段都是&lt;b&gt;可选&lt;/b&gt;的。</translation>
</message>
@@ -2228,10 +2693,18 @@ For more information on using this console, type %6.
<translation type="unfinished">一个关联到新收款地址(被您用来识别发票)的可选标签。它也会被附加到付款请求中。</translation>
</message>
<message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">一条附加到付款请求中的可选消息,可以显示给付款方。</translation>
+ </message>
+ <message>
<source>&amp;Create new receiving address</source>
<translation type="unfinished">&amp;產生新的接收地址</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
<source>Clear</source>
<translation type="unfinished">清空</translation>
</message>
@@ -2252,6 +2725,10 @@ For more information on using this console, type %6.
<translation type="unfinished">从列表中移除选中的条目</translation>
</message>
<message>
+ <source>Remove</source>
+ <translation type="unfinished">移除</translation>
+ </message>
+ <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">複製 &amp;URI</translation>
</message>
@@ -2307,6 +2784,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请求支付至...</translation>
</message>
<message>
+ <source>Address:</source>
+ <translation type="unfinished">地址:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
<source>Label:</source>
<translation type="unfinished">标签:</translation>
</message>
@@ -2327,10 +2812,22 @@ For more information on using this console, type %6.
<translation type="unfinished">複製 &amp;地址</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
<source>&amp;Save Image…</source>
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>Payment information</source>
+ <translation type="unfinished">付款信息</translation>
+ </message>
+ <message>
<source>Request payment to %1</source>
<translation type="unfinished">付款給 %1 的要求</translation>
</message>
@@ -2338,14 +2835,26 @@ For more information on using this console, type %6.
<context>
<name>RecentRequestsTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">標記</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(無標記)</translation>
</message>
<message>
+ <source>(no message)</source>
+ <translation type="unfinished">(无消息)</translation>
+ </message>
+ <message>
<source>(no amount requested)</source>
<translation type="unfinished">(無要求金額)</translation>
</message>
@@ -2373,14 +2882,38 @@ For more information on using this console, type %6.
<translation type="unfinished">金额不足!</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">數量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">費用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
<translation type="unfinished">如果這項有打開,但是找零地址是空的或無效,那麼找零會送到一個產生出來的地址去。</translation>
</message>
<message>
+ <source>Custom change address</source>
+ <translation type="unfinished">自定义找零地址</translation>
+ </message>
+ <message>
<source>Transaction Fee:</source>
<translation type="unfinished">交易手续费:</translation>
</message>
@@ -2393,6 +2926,10 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 目前无法进行手续费估计。</translation>
</message>
<message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">每KB</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">隐藏</translation>
</message>
@@ -2405,10 +2942,22 @@ For more information on using this console, type %6.
<translation type="unfinished">自訂:</translation>
</message>
<message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">一次发送给多个收款人</translation>
+ </message>
+ <message>
<source>Add &amp;Recipient</source>
<translation type="unfinished">增加收款人(&amp;R)</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
+ </message>
+ <message>
<source>Choose…</source>
<translation type="unfinished">选择...</translation>
</message>
@@ -2417,18 +2966,54 @@ For more information on using this console, type %6.
<translation type="unfinished">隱藏交易手續費設定</translation>
</message>
<message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">當交易量小於可用區塊空間時,礦工和節點可能會執行最低手續費率限制。 以這個最低費率來支付手續費也是可以的,但請注意,一旦交易需求超出比特幣網路能處理的限度,你的交易可能永遠無法確認。</translation>
+ </message>
+ <message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
<translation type="unfinished">手續費太低的話可能會造成永遠無法確認的交易(請參考提示)</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">确认时间目标:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">启用手续费追加</translation>
+ </message>
+ <message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
<translation type="unfinished">手续费追加(Replace-By-Fee,BIP-125)可以让你在送出交易后继续追加手续费。不用这个功能的话,建议付比较高的手续费来降低交易延迟的风险。</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>Balance:</source>
<translation type="unfinished">餘額:</translation>
</message>
<message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">确认发送操作</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">发送(&amp;E)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -2457,12 +3042,26 @@ For more information on using this console, type %6.
<translation type="unfinished">%1 (%2个块)</translation>
</message>
<message>
- <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">在設備上簽證</translation>
+ </message>
+ <message>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">請先連接硬體錢包</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">在 選項 -&gt; 錢包 中設定外部簽名器腳本路徑 </translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">從錢包 %1</translation>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">创建未签名交易(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2478,6 +3077,10 @@ For more information on using this console, type %6.
<translation type="unfinished">外部签名器失败</translation>
</message>
<message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -2491,6 +3094,10 @@ For more information on using this console, type %6.
<translation type="unfinished">你可以之後再提高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -2506,6 +3113,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请检查您的交易。</translation>
</message>
<message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">没有打上BIP-125手续费追加的标记。</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">總金額</translation>
</message>
@@ -2540,6 +3155,22 @@ For more information on using this console, type %6.
<translation type="unfinished">支付金额必须大于0。</translation>
</message>
<message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">金额超出您的余额。</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">计入 %1 手续费后,金额超出了您的余额。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">发现重复地址:每个地址应该只使用一次。</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">交易创建失败!</translation>
+ </message>
+ <message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">超过 %1 的手续费被视为高得离谱。</translation>
</message>
@@ -2554,10 +3185,18 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 比特币地址无效</translation>
</message>
<message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">警告:未知的找零地址</translation>
+ </message>
+ <message>
<source>Confirm custom change address</source>
<translation type="unfinished">确认自定义找零地址</translation>
</message>
<message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">你选择的找零地址未被包含在本钱包中,你钱包中的部分或全部金额将被发送至该地址。你确定要这样做吗?</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(無標記)</translation>
</message>
@@ -2573,14 +3212,34 @@ For more information on using this console, type %6.
<translation type="unfinished">付給(&amp;T):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
<source>The Bitcoin address to send the payment to</source>
<translation type="unfinished">將支付發送到的比特幣地址給</translation>
</message>
<message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">移除此项</translation>
+ </message>
+ <message>
<source>The amount to send in the selected unit</source>
<translation type="unfinished">用被选单位表示的待发送金额</translation>
</message>
<message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">交易费将从发送金额中扣除。接收人收到的比特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。</translation>
+ </message>
+ <message>
<source>S&amp;ubtract fee from amount</source>
<translation type="unfinished">從付款金額減去手續費(&amp;U)</translation>
</message>
@@ -2627,6 +3286,22 @@ For more information on using this console, type %6.
<translation type="unfinished">您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的比特幣。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。</translation>
</message>
<message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">用来对消息签名的地址</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">在这里输入您想要签名的消息</translation>
+ </message>
+ <message>
<source>Signature</source>
<translation type="unfinished">簽章</translation>
</message>
@@ -2647,10 +3322,18 @@ For more information on using this console, type %6.
<translation type="unfinished">清空所有签名消息栏</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>&amp;Verify Message</source>
<translation type="unfinished">消息验证(&amp;V)</translation>
</message>
<message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">请在下面输入接收者地址、消息(确保换行符、空格符、制表符等完全相同)和签名以验证消息。请仔细核对签名信息,以提防中间人攻击。请注意,这只是证明接收方可以用这个地址签名,它不能证明任何交易的发送人身份!</translation>
+ </message>
+ <message>
<source>The Bitcoin address the message was signed with</source>
<translation type="unfinished">用来签名消息的地址</translation>
</message>
@@ -2667,6 +3350,14 @@ For more information on using this console, type %6.
<translation type="unfinished">驗證這個訊息來確定是用指定的比特幣地址簽名的</translation>
</message>
<message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">验证消息签名(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">清空所有验证消息栏</translation>
+ </message>
+ <message>
<source>Click "Sign Message" to generate signature</source>
<translation type="unfinished">請按一下「簽署訊息」來產生簽章</translation>
</message>
@@ -2683,6 +3374,10 @@ For more information on using this console, type %6.
<translation type="unfinished">找不到与输入地址相关的密钥。</translation>
</message>
<message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">已取消解锁钱包。</translation>
+ </message>
+ <message>
<source>No error</source>
<translation type="unfinished">沒有錯誤</translation>
</message>
@@ -2695,6 +3390,14 @@ For more information on using this console, type %6.
<translation type="unfinished">消息签名失败。</translation>
</message>
<message>
+ <source>Message signed.</source>
+ <translation type="unfinished">消息已签名。</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">签名无法解码。</translation>
+ </message>
+ <message>
<source>Please check the signature and try again.</source>
<translation type="unfinished">请检查签名后重试。</translation>
</message>
@@ -2703,6 +3406,10 @@ For more information on using this console, type %6.
<translation type="unfinished">這個簽章跟訊息的數位摘要不符。</translation>
</message>
<message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">消息验证失败。</translation>
+ </message>
+ <message>
<source>Message verified.</source>
<translation type="unfinished">消息验证成功。</translation>
</message>
@@ -2736,6 +3443,11 @@ For more information on using this console, type %6.
<translation type="unfinished">0/未确认,不在内存池中</translation>
</message>
<message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>%1/unconfirmed</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
<translation type="unfinished">%1 次/未確認</translation>
@@ -2750,10 +3462,18 @@ For more information on using this console, type %6.
<translation type="unfinished">状态</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Source</source>
<translation type="unfinished">來源</translation>
</message>
<message>
+ <source>Generated</source>
+ <translation type="unfinished">挖矿生成</translation>
+ </message>
+ <message>
<source>From</source>
<translation type="unfinished">來源</translation>
</message>
@@ -2766,6 +3486,10 @@ For more information on using this console, type %6.
<translation type="unfinished">到</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
<source>watch-only</source>
<translation type="unfinished">只能看</translation>
</message>
@@ -2773,6 +3497,10 @@ For more information on using this console, type %6.
<source>label</source>
<translation type="unfinished">标签</translation>
</message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">收入</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -2780,18 +3508,46 @@ For more information on using this console, type %6.
</translation>
</message>
<message>
+ <source>not accepted</source>
+ <translation type="unfinished">未被接受</translation>
+ </message>
+ <message>
+ <source>Debit</source>
+ <translation type="unfinished">支出</translation>
+ </message>
+ <message>
<source>Total debit</source>
<translation type="unfinished">总支出</translation>
</message>
<message>
+ <source>Total credit</source>
+ <translation type="unfinished">总收入</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
<source>Net amount</source>
<translation type="unfinished">淨額</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">备注</translation>
+ </message>
+ <message>
<source>Transaction ID</source>
<translation type="unfinished">交易 ID</translation>
</message>
<message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">交易总大小</translation>
+ </message>
+ <message>
<source>Transaction virtual size</source>
<translation type="unfinished">交易擬真大小</translation>
</message>
@@ -2800,14 +3556,26 @@ For more information on using this console, type %6.
<translation type="unfinished">输出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(證書未驗證)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
</message>
<message>
<source>Merchant</source>
<translation type="unfinished">商家</translation>
</message>
<message>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">新挖出的比特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">调试信息</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">交易</translation>
+ </message>
+ <message>
<source>Inputs</source>
<translation type="unfinished">輸入</translation>
</message>
@@ -2819,7 +3587,11 @@ For more information on using this console, type %6.
<source>true</source>
<translation type="unfinished">是</translation>
</message>
- </context>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">否</translation>
+ </message>
+</context>
<context>
<name>TransactionDescDialog</name>
<message>
@@ -2834,6 +3606,10 @@ For more information on using this console, type %6.
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2842,6 +3618,14 @@ For more information on using this console, type %6.
<translation type="unfinished">標記</translation>
</message>
<message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">未确认</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>Confirming (%1 of %2 recommended confirmations)</source>
<translation type="unfinished">确认中 (推荐 %2个确认,已经有 %1个确认)</translation>
</message>
@@ -2850,6 +3634,18 @@ For more information on using this console, type %6.
<translation type="unfinished">已確認(%1 次)</translation>
</message>
<message>
+ <source>Conflicted</source>
+ <translation type="unfinished">有冲突</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">未成熟 (%1 个确认,将在 %2 个后可用)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">已生成但未被接受</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2886,6 +3682,10 @@ For more information on using this console, type %6.
<translation type="unfinished">收到交易的日期和時間。</translation>
</message>
<message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">交易类型。</translation>
+ </message>
+ <message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
<translation type="unfinished">该交易中是否涉及仅观察地址。</translation>
</message>
@@ -2901,6 +3701,10 @@ For more information on using this console, type %6.
<translation type="unfinished">全部</translation>
</message>
<message>
+ <source>Today</source>
+ <translation type="unfinished">今天</translation>
+ </message>
+ <message>
<source>This week</source>
<translation type="unfinished">這星期</translation>
</message>
@@ -2909,6 +3713,14 @@ For more information on using this console, type %6.
<translation type="unfinished">這個月</translation>
</message>
<message>
+ <source>Last month</source>
+ <translation type="unfinished">上个月</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">今年</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2929,6 +3741,10 @@ For more information on using this console, type %6.
<translation type="unfinished">输入地址、交易ID或标签进行搜索</translation>
</message>
<message>
+ <source>Min amount</source>
+ <translation type="unfinished">最小金额</translation>
+ </message>
+ <message>
<source>Range…</source>
<translation type="unfinished">范围...</translation>
</message>
@@ -2953,10 +3769,22 @@ For more information on using this console, type %6.
<translation type="unfinished">复制原始交易(&amp;R)</translation>
</message>
<message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">複製完整交易明細</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">顯示交易明細</translation>
+ </message>
+ <message>
<source>Increase transaction &amp;fee</source>
<translation type="unfinished">增加矿工费(&amp;F)</translation>
</message>
<message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">放棄交易(&amp;b)</translation>
+ </message>
+ <message>
<source>&amp;Edit address label</source>
<translation type="unfinished">编辑地址标签(&amp;E)</translation>
</message>
@@ -2966,6 +3794,10 @@ For more information on using this console, type %6.
<translation type="unfinished">在 %1中显示</translation>
</message>
<message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">导出交易历史</translation>
+ </message>
+ <message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">逗號分隔文件</translation>
@@ -2979,6 +3811,10 @@ For more information on using this console, type %6.
<translation type="unfinished">只能觀看的</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -3014,7 +3850,11 @@ For more information on using this console, type %6.
<source>Range:</source>
<translation type="unfinished">範圍:</translation>
</message>
- </context>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">到</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -3045,7 +3885,15 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Partially Signed Transaction (*.psbt)</source>
<translation type="unfinished">部分签名交易 (*.psbt)</translation>
</message>
- </context>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">PSBT文件必须小于100MiB</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">无法解码PSBT</translation>
+ </message>
+</context>
<context>
<name>WalletModel</name>
<message>
@@ -3053,6 +3901,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">付款</translation>
</message>
<message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">追加手续费出错</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">追加交易手续费失败</translation>
+ </message>
+ <message>
<source>Do you want to increase the fee?</source>
<extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
<translation type="unfinished">想要提高手續費嗎?</translation>
@@ -3062,6 +3918,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">当前手续费:</translation>
</message>
<message>
+ <source>Increase:</source>
+ <translation type="unfinished">增加量:</translation>
+ </message>
+ <message>
<source>New fee:</source>
<translation type="unfinished">新的費用:</translation>
</message>
@@ -3078,6 +3938,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">無法草擬交易。</translation>
</message>
<message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">PSBT已複製</translation>
+ </message>
+ <message>
<source>Copied to clipboard</source>
<comment>Fee-bump PSBT saved</comment>
<translation type="unfinished">复制到剪贴板</translation>
@@ -3091,6 +3955,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">沒辦法提交交易</translation>
</message>
<message>
+ <source>Can't display address</source>
+ <translation type="unfinished">無法顯示地址</translation>
+ </message>
+ <message>
<source>default wallet</source>
<translation type="unfinished">預設錢包</translation>
</message>
@@ -3154,6 +4022,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">无法把钱包版本从%i降级到%i。钱包版本未改变。</translation>
</message>
<message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">无法锁定数据目录 %s。%s 可能已经在运行。</translation>
+ </message>
+ <message>
<source>Cannot upgrade a non HD split wallet from version %i to version %i without upgrading to support pre-split keypool. Please use version %i or no version specified.</source>
<translation type="unfinished">无法在不支持“拆分前的密钥池”(pre split keypool)的情况下把“非拆分HD钱包”(non HD split wallet)从版本%i升级到%i。请使用版本号%i,或者压根不要指定版本号。</translation>
</message>
@@ -3178,6 +4050,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误: 转储文件格式不正确。得到是"%s",而预期本应得到的是 "format"。</translation>
</message>
<message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ </message>
+ <message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
<translation type="unfinished">错误: 转储文件版本不被支持。这个版本的 bitcoin-wallet 只支持版本为 1 的转储文件。得到的转储文件版本却是%s</translation>
</message>
@@ -3190,18 +4066,42 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误: 无法为该旧式钱包生成描述符。如果钱包已被加密,请确保提供的钱包加密密码正确。</translation>
</message>
<message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">檔案%s已經存在。 如果你確定這就是你想做的,先把這份檔案移開。</translation>
+ </message>
+ <message>
<source>Invalid or corrupt peers.dat (%s). If you believe this is a bug, please report it to %s. As a workaround, you can move the file (%s) out of the way (rename, move, or delete) to have a new one created on the next start.</source>
<translation type="unfinished">无效或损坏的peers.dat (%s)。如果你确信这是一个bug,请反馈到%s。作为变通办法,你可以把现有文件 (%s) 移开(重命名、移动或删除),这样就可以在下次启动时创建一个新文件了。</translation>
</message>
<message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">提供多數TOR路由綁定位址。 對自動建立的Tor服務用%s</translation>
+ </message>
+ <message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
<translation type="unfinished">没有提供转储文件。要使用 createfromdump ,必须提供 -dumpfile=&lt;filename&gt;。</translation>
</message>
<message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 dump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
<translation type="unfinished">没有提供钱包格式。要使用 createfromdump ,必须提供 -format=&lt;format&gt;</translation>
</message>
<message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">请检查电脑的日期时间设置是否正确!时间错误可能会导致 %s 运行异常。</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">如果你认为%s对你比较有用的话,请对我们进行一些自愿贡献。请访问%s网站来获取有关这个软件的更多信息。</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">修剪被设置得太小,已经低于最小值%d MiB,请使用更大的数值。</translation>
+ </message>
+ <message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<translation type="unfinished">修剪模式与 -reindex-chainstate 不兼容。请进行一次完整的 -reindex 。</translation>
</message>
@@ -3226,6 +4126,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">扣除手續費後的交易金額太少而不能傳送</translation>
</message>
<message>
+ <source>This error could occur if this wallet was not shutdown cleanly and was last loaded using a build with a newer version of Berkeley DB. If so, please use the software that last loaded this wallet</source>
+ <translation type="unfinished">如果这个钱包之前没有正确关闭,而且上一次是被新版的Berkeley DB加载过,就会发生这个错误。如果是这样,请使用上次加载过这个钱包的那个软件。</translation>
+ </message>
+ <message>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
<translation type="unfinished">這是個還沒發表的測試版本 - 使用請自負風險 - 請不要用來開採或做商業應用</translation>
</message>
@@ -3278,6 +4182,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">警告:在已经禁用私钥的钱包 {%s} 中仍然检测到私钥</translation>
</message>
<message>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">警告:我们和其他节点似乎没达成共识!您可能需要升级,或者就是其他节点可能需要升级。</translation>
+ </message>
+ <message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
<translation type="unfinished">需要验证高度在%d之后的区块见证数据。请使用 -reindex 重新启动。</translation>
</message>
@@ -3294,6 +4202,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">參數 -maxmempool 至少要給 %d 百萬位元組(MB)</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">发生了致命的内部错误,请在debug.log中查看详情</translation>
+ </message>
+ <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">沒辦法解析 -%s 參數指定的地址: '%s'</translation>
</message>
@@ -3436,6 +4348,26 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">对 %s 的配置设置只对 %s 网络生效,如果它位于配置的 [%s] 章节的话</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">版权所有 (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">检测到区块数据库损坏</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">找不到asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">無法解析asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">磁盘空间太低!</translation>
+ </message>
+ <message>
<source>Do you want to rebuild the block database now?</source>
<translation type="unfinished">你想现在就重建区块数据库吗?</translation>
</message>
@@ -3448,6 +4380,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">转储文件 %s 不存在</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">创建%s时出错</translation>
</message>
@@ -3456,6 +4392,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">初始化区块数据库时出错</translation>
</message>
<message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">初始化钱包数据库环境错误 %s!</translation>
+ </message>
+ <message>
<source>Error loading %s</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤</translation>
</message>
@@ -3472,6 +4412,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤: 這個錢包需要新版的 %s</translation>
</message>
<message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">加载区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">打开区块数据库时出错</translation>
+ </message>
+ <message>
<source>Error reading configuration file: %s</source>
<translation type="unfinished">读取配置文件失败: %s</translation>
</message>
@@ -3480,16 +4428,16 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">读取数据库出错,关闭中。</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">從錢包資料庫讀取下一筆記錄時出錯</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -3508,10 +4456,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">錯誤:keypool已用完,請先重新呼叫keypoolrefill</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已经在使用SQLite</translation>
</message>
@@ -3536,6 +4480,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
@@ -3544,6 +4492,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法写入记录到新钱包</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
<source>Failed to start indexes, shutting down..</source>
<translation type="unfinished">无法启动索引,关闭中...</translation>
</message>
@@ -3552,6 +4516,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">校验数据库失败</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手续费率 (%s) 低于最大手续费率设置 (%s)</translation>
</message>
@@ -3720,6 +4688,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">这是你每次交易付款时最少要付的手续费。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amounts must not be negative</source>
<translation type="unfinished">交易金额不不可为负数</translation>
</message>
@@ -3792,6 +4764,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">%s链上acceptstalefeeestimates 不受支持。</translation>
</message>
@@ -3800,6 +4776,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的日志分类 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">用户代理备注(%s)包含不安全的字符。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh_TW.ts b/src/qt/locale/bitcoin_zh_TW.ts
index 1c5db2757a..17332db7b1 100644
--- a/src/qt/locale/bitcoin_zh_TW.ts
+++ b/src/qt/locale/bitcoin_zh_TW.ts
@@ -298,6 +298,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金額</translation>
</message>
@@ -320,6 +332,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">傳出</translation>
</message>
<message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
+ </message>
+ <message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
<translation type="unfinished">區塊轉發</translation>
@@ -330,6 +347,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手冊</translation>
</message>
<message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
+ </message>
+ <message>
<source>%1 d</source>
<translation type="unfinished">%1 天</translation>
</message>
@@ -1092,12 +1119,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">已成功遷移錢包 '%1' 。</translation>
</message>
<message>
- <source> Watchonly scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">僅觀察腳本(watch-only)已被移轉到名為 '%1' 的新錢包中。</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
</message>
<message>
- <source> Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
- <translation type="unfinished">可解但又未被監視的腳本已被遷移至名為 '%1' 的新錢包中。</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
</message>
<message>
<source>Migration failed</source>
@@ -1544,6 +1571,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">當視窗關閉時,把應用程式縮到最小,而不是結束。當勾選這個選項時,只能夠用選單中的結束來關掉應用程式。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">這個窗面中的設定已被如下命令列選項覆蓋:</translation>
</message>
@@ -1660,6 +1691,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">用 &amp;UPnP 設定通訊埠對應</translation>
</message>
<message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
<source>Accept connections from outside.</source>
<translation type="unfinished">接受外來連線</translation>
</message>
@@ -1696,6 +1735,14 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">&amp;視窗</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">視窗縮到最小後只在通知區顯示圖示。</translation>
</message>
@@ -1748,14 +1795,6 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">使用個別的SOCKS&5代理介由Tor onion服務到達peers:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">好(&amp;O)</translation>
</message>
@@ -1977,6 +2016,10 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished">PSBT已儲存到磁碟。</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
<source>own address</source>
<translation type="unfinished">自己的地址</translation>
</message>
@@ -2115,19 +2158,19 @@ If you are receiving this error you should request the merchant provide a BIP21
<message>
<source>Inbound</source>
<extracomment>An Inbound Connection from a Peer.</extracomment>
- <translation type="unfinished">進來</translation>
+ <translation type="unfinished">傳入</translation>
</message>
<message>
<source>Outbound</source>
<extracomment>An Outbound Connection to a Peer.</extracomment>
- <translation type="unfinished">出去</translation>
+ <translation type="unfinished">傳出</translation>
</message>
</context>
<context>
<name>QRImageWidget</name>
<message>
<source>&amp;Save Image…</source>
- <translation type="unfinished">保存圖片(&amp;S)...</translation>
+ <translation type="unfinished">儲存圖片(&amp;S)...</translation>
</message>
<message>
<source>&amp;Copy Image</source>
@@ -2535,6 +2578,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">1 小時(&amp;H)</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
<source>1 &amp;week</source>
<translation type="unfinished">1 星期(&amp;W)</translation>
</message>
@@ -2560,6 +2607,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">不使用任何錢包來執行指令</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">使用 %1 錢包來執行指令</translation>
</message>
@@ -2586,6 +2637,10 @@ For more information on using this console, type %6.
<translation type="unfinished">執行中……</translation>
</message>
<message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">經由 %1</translation>
</message>
@@ -2694,11 +2749,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Copy address</source>
- <translation type="unfinished">&amp;复制地址</translation>
+ <translation type="unfinished">&amp;複製地址</translation>
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">複製和標籤</translation>
+ <translation type="unfinished">複製 &amp;label</translation>
</message>
<message>
<source>Copy &amp;message</source>
@@ -2768,6 +2823,14 @@ For more information on using this console, type %6.
<translation type="unfinished">複製 &amp;地址</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
<source>&amp;Save Image…</source>
<translation type="unfinished">儲存圖片(&amp;S)...</translation>
</message>
@@ -2902,6 +2965,10 @@ For more information on using this console, type %6.
<translation type="unfinished">把表單中的所有欄位清空。</translation>
</message>
<message>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
+ </message>
+ <message>
<source>Choose…</source>
<translation type="unfinished">選擇...</translation>
</message>
@@ -2910,6 +2977,14 @@ For more information on using this console, type %6.
<translation type="unfinished">隱藏交易手續費設定</translation>
</message>
<message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
<source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
<translation type="unfinished">當交易量小於可用區塊空間時,礦工和節點可能會執行最低手續費率限制。 以這個最低費率來支付手續費也是可以的,但請注意,一旦交易需求超出比特幣網路能處理的限度,你的交易可能永遠無法確認。</translation>
</message>
@@ -2996,10 +3071,6 @@ For more information on using this console, type %6.
<translation type="unfinished">Cr&eate未簽名</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">從錢包 %1</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 到 '%2'</translation>
</message>
@@ -3048,6 +3119,10 @@ For more information on using this console, type %6.
<translation type="unfinished">你可以之後再提高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要創建這筆交易嗎?</translation>
@@ -3506,8 +3581,8 @@ For more information on using this console, type %6.
<translation type="unfinished">輸出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(證書未驗證)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3921,7 +3996,7 @@ Go to File &gt; Open Wallet to load a wallet.
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">匯出 &amp;E</translation>
+ <translation type="unfinished">&amp;匯出</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
@@ -4004,6 +4079,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">錯誤: 轉儲文件格式不正確。 得到是"%s",而預期本應得到的是 "format"。</translation>
</message>
<message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ </message>
+ <message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
<translation type="unfinished">錯誤: 轉儲文件版本不支援。 這個版本的 bitcoin-wallet 只支援版本為 1 的轉儲檔案。 得到的轉儲文件版本是%s</translation>
</message>
@@ -4326,6 +4405,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">轉儲文件 %s 不存在</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">創建%s時出錯</translation>
</message>
@@ -4374,16 +4457,12 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">從錢包資料庫讀取下一筆記錄時出錯</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">錯誤: 無法從產生的scriptpubkey提取目標</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">錯誤:無法新增僅觀察交易至僅觀察錢包</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">錯誤:無法刪除僅觀察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">錯誤: 無法從產生的scriptpubkey提取目標</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4402,10 +4481,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">錯誤:keypool已用完,請先重新呼叫keypoolrefill</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">錯誤:有些僅觀察交易無法刪除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">錯誤:此錢包已經在使用SQLite</translation>
</message>
@@ -4430,6 +4505,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">錯誤:無法讀取這個資料庫中的所有記錄</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">錯誤:無法移除僅觀察地址簿數據</translation>
</message>
@@ -4438,6 +4517,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">錯誤: 無法寫入記錄到新錢包</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">在任意的通訊埠聽候失敗。如果你希望這樣的話,可以設定 -listen=0.</translation>
</message>
@@ -4454,6 +4549,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">無法驗證資料庫</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手續費費率(%s) 低於最低費率設置(%s)</translation>
</message>
@@ -4654,6 +4753,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">這是你交易付款時所要付的手續費。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">交易金額太小</translation>
</message>
@@ -4666,10 +4769,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">交易尋找零輸出項超出範圍</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">交易造成記憶池中的交易鏈太長</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">交易必須至少有一個收款人</translation>
</message>
@@ -4750,6 +4849,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s.</translation>
</message>
<message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished">%s链上acceptstalefeeestimates 不受支持。</translation>
</message>
@@ -4758,6 +4861,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不支援的紀錄類別 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">使用者代理註解(%s)中含有不安全的字元。</translation>
</message>
diff --git a/src/qt/main.cpp b/src/qt/main.cpp
index c84dd78b44..ded057dbfa 100644
--- a/src/qt/main.cpp
+++ b/src/qt/main.cpp
@@ -19,6 +19,8 @@ extern const std::function<std::string(const char*)> G_TRANSLATION_FUN = [](cons
};
UrlDecodeFn* const URL_DECODE = urlDecode;
+const std::function<std::string()> G_TEST_GET_FULL_NAME{};
+
MAIN_FUNCTION
{
return GuiMain(argc, argv);
diff --git a/src/qt/modaloverlay.cpp b/src/qt/modaloverlay.cpp
index b09e230bce..667db06574 100644
--- a/src/qt/modaloverlay.cpp
+++ b/src/qt/modaloverlay.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <qt/modaloverlay.h>
#include <qt/forms/ui_modaloverlay.h>
diff --git a/src/qt/notificator.cpp b/src/qt/notificator.cpp
index 88bc33098a..2021e5f9dc 100644
--- a/src/qt/notificator.cpp
+++ b/src/qt/notificator.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <qt/notificator.h>
#include <QApplication>
diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp
index a87bef796c..dd654a7abe 100644
--- a/src/qt/optionsdialog.cpp
+++ b/src/qt/optionsdialog.cpp
@@ -454,20 +454,24 @@ void OptionsDialog::updateProxyValidationState()
void OptionsDialog::updateDefaultProxyNets()
{
- const std::optional<CNetAddr> ui_proxy_netaddr{LookupHost(ui->proxyIp->text().toStdString(), /*fAllowLookup=*/false)};
- const CService ui_proxy{ui_proxy_netaddr.value_or(CNetAddr{}), ui->proxyPort->text().toUShort()};
+ std::string proxyIpText{ui->proxyIp->text().toStdString()};
+ if (!IsUnixSocketPath(proxyIpText)) {
+ const std::optional<CNetAddr> ui_proxy_netaddr{LookupHost(proxyIpText, /*fAllowLookup=*/false)};
+ const CService ui_proxy{ui_proxy_netaddr.value_or(CNetAddr{}), ui->proxyPort->text().toUShort()};
+ proxyIpText = ui_proxy.ToStringAddrPort();
+ }
Proxy proxy;
bool has_proxy;
has_proxy = model->node().getProxy(NET_IPV4, proxy);
- ui->proxyReachIPv4->setChecked(has_proxy && proxy.proxy == ui_proxy);
+ ui->proxyReachIPv4->setChecked(has_proxy && proxy.ToString() == proxyIpText);
has_proxy = model->node().getProxy(NET_IPV6, proxy);
- ui->proxyReachIPv6->setChecked(has_proxy && proxy.proxy == ui_proxy);
+ ui->proxyReachIPv6->setChecked(has_proxy && proxy.ToString() == proxyIpText);
has_proxy = model->node().getProxy(NET_ONION, proxy);
- ui->proxyReachTor->setChecked(has_proxy && proxy.proxy == ui_proxy);
+ ui->proxyReachTor->setChecked(has_proxy && proxy.ToString() == proxyIpText);
}
ProxyAddressValidator::ProxyAddressValidator(QObject *parent) :
diff --git a/src/qt/paymentserver.cpp b/src/qt/paymentserver.cpp
index 592e591edb..d4c325b7b1 100644
--- a/src/qt/paymentserver.cpp
+++ b/src/qt/paymentserver.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/paymentserver.h>
#include <qt/bitcoinunits.h>
diff --git a/src/qt/paymentserver.h b/src/qt/paymentserver.h
index f73aa1e61e..b9ea97d5ec 100644
--- a/src/qt/paymentserver.h
+++ b/src/qt/paymentserver.h
@@ -32,10 +32,6 @@
// sends them to the server.
//
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/sendcoinsrecipient.h>
#include <QObject>
diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp
index ceaa3ac46b..d2b184ebdf 100644
--- a/src/qt/rpcconsole.cpp
+++ b/src/qt/rpcconsole.cpp
@@ -581,6 +581,8 @@ RPCConsole::RPCConsole(interfaces::Node& node, const PlatformStyle *_platformSty
clear();
GUIUtil::handleCloseWindowShortcut(this);
+
+ updateWindowTitle();
}
RPCConsole::~RPCConsole()
@@ -964,6 +966,7 @@ void RPCConsole::message(int category, const QString &message, bool html)
void RPCConsole::updateNetworkState()
{
+ if (!clientModel) return;
QString connections = QString::number(clientModel->getNumConnections()) + " (";
connections += tr("In:") + " " + QString::number(clientModel->getNumConnections(CONNECTIONS_IN)) + " / ";
connections += tr("Out:") + " " + QString::number(clientModel->getNumConnections(CONNECTIONS_OUT)) + ")";
@@ -1387,3 +1390,13 @@ void RPCConsole::updateAlerts(const QString& warnings)
this->ui->label_alerts->setVisible(!warnings.isEmpty());
this->ui->label_alerts->setText(warnings);
}
+
+void RPCConsole::updateWindowTitle()
+{
+ const ChainType chain = Params().GetChainType();
+ if (chain == ChainType::MAIN) return;
+
+ const QString chainType = QString::fromStdString(Params().GetChainTypeString());
+ const QString title = tr("Node window - [%1]").arg(chainType);
+ this->setWindowTitle(title);
+} \ No newline at end of file
diff --git a/src/qt/rpcconsole.h b/src/qt/rpcconsole.h
index 65eef7fbba..358f68c3c8 100644
--- a/src/qt/rpcconsole.h
+++ b/src/qt/rpcconsole.h
@@ -189,6 +189,8 @@ private:
return time_at_event.count() ? GUIUtil::formatDurationStr(time_now - time_at_event) : tr("Never");
}
+ void updateWindowTitle();
+
private Q_SLOTS:
void updateAlerts(const QString& warnings);
};
diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp
index 3c331c70ef..89bd35eb1b 100644
--- a/src/qt/sendcoinsdialog.cpp
+++ b/src/qt/sendcoinsdialog.cpp
@@ -406,6 +406,7 @@ void SendCoinsDialog::presentPSBT(PartiallySignedTransaction& psbtx)
msgBox.setInformativeText(tr("The PSBT has been copied to the clipboard. You can also save it."));
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard);
msgBox.setDefaultButton(QMessageBox::Discard);
+ msgBox.setObjectName("psbt_copied_message");
switch (msgBox.exec()) {
case QMessageBox::Save: {
QString selectedFilter;
diff --git a/src/qt/sendcoinsentry.cpp b/src/qt/sendcoinsentry.cpp
index 0536635c84..d8102c1dca 100644
--- a/src/qt/sendcoinsentry.cpp
+++ b/src/qt/sendcoinsentry.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/sendcoinsentry.h>
#include <qt/forms/ui_sendcoinsentry.h>
diff --git a/src/qt/sendcoinsrecipient.h b/src/qt/sendcoinsrecipient.h
index 787a52b8b3..aa2ea0498e 100644
--- a/src/qt/sendcoinsrecipient.h
+++ b/src/qt/sendcoinsrecipient.h
@@ -5,10 +5,6 @@
#ifndef BITCOIN_QT_SENDCOINSRECIPIENT_H
#define BITCOIN_QT_SENDCOINSRECIPIENT_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <consensus/amount.h>
#include <serialize.h>
diff --git a/src/qt/test/apptests.cpp b/src/qt/test/apptests.cpp
index 9007b183aa..10abcb00eb 100644
--- a/src/qt/test/apptests.cpp
+++ b/src/qt/test/apptests.cpp
@@ -14,10 +14,6 @@
#include <test/util/setup_common.h>
#include <validation.h>
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <QAction>
#include <QLineEdit>
#include <QRegularExpression>
diff --git a/src/qt/test/optiontests.cpp b/src/qt/test/optiontests.cpp
index 7100603616..5f9f2cb449 100644
--- a/src/qt/test/optiontests.cpp
+++ b/src/qt/test/optiontests.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <common/args.h>
#include <init.h>
#include <qt/bitcoin.h>
@@ -46,6 +50,17 @@ void OptionTests::migrateSettings()
settings.sync();
+ QVERIFY(settings.contains("nDatabaseCache"));
+ QVERIFY(settings.contains("nThreadsScriptVerif"));
+ QVERIFY(settings.contains("fUseUPnP"));
+ QVERIFY(settings.contains("fListen"));
+ QVERIFY(settings.contains("bPrune"));
+ QVERIFY(settings.contains("nPruneSize"));
+ QVERIFY(settings.contains("fUseProxy"));
+ QVERIFY(settings.contains("addrProxy"));
+ QVERIFY(settings.contains("fUseSeparateProxyTor"));
+ QVERIFY(settings.contains("addrSeparateProxyTor"));
+
OptionsModel options{m_node};
bilingual_str error;
QVERIFY(options.Init(error));
diff --git a/src/qt/test/test_main.cpp b/src/qt/test/test_main.cpp
index e45fc1ced8..c5405cca98 100644
--- a/src/qt/test/test_main.cpp
+++ b/src/qt/test/test_main.cpp
@@ -9,6 +9,7 @@
#include <interfaces/init.h>
#include <interfaces/node.h>
#include <qt/bitcoin.h>
+#include <qt/guiconstants.h>
#include <qt/test/apptests.h>
#include <qt/test/optiontests.h>
#include <qt/test/rpcnestedtests.h>
@@ -24,6 +25,7 @@
#include <QApplication>
#include <QDebug>
#include <QObject>
+#include <QSettings>
#include <QTest>
#include <functional>
@@ -48,6 +50,8 @@ const std::function<void(const std::string&)> G_TEST_LOG_FUN{};
const std::function<std::vector<const char*>()> G_TEST_COMMAND_LINE_ARGUMENTS{};
+const std::function<std::string()> G_TEST_GET_FULL_NAME{};
+
// This is all you need to run all the tests
int main(int argc, char* argv[])
{
@@ -83,36 +87,45 @@ int main(int argc, char* argv[])
setenv("QT_QPA_PLATFORM", "minimal", 0 /* overwrite */);
#endif
- BitcoinApplication app;
- app.setApplicationName("Bitcoin-Qt-test");
- app.createNode(*init);
+
+ QCoreApplication::setOrganizationName(QAPP_ORG_NAME);
+ QCoreApplication::setApplicationName(QAPP_APP_NAME_DEFAULT "-test");
int num_test_failures{0};
- AppTests app_tests(app);
- num_test_failures += QTest::qExec(&app_tests);
+ {
+ BitcoinApplication app;
+ app.createNode(*init);
+
+ AppTests app_tests(app);
+ num_test_failures += QTest::qExec(&app_tests);
- OptionTests options_tests(app.node());
- num_test_failures += QTest::qExec(&options_tests);
+ OptionTests options_tests(app.node());
+ num_test_failures += QTest::qExec(&options_tests);
- URITests test1;
- num_test_failures += QTest::qExec(&test1);
+ URITests test1;
+ num_test_failures += QTest::qExec(&test1);
- RPCNestedTests test3(app.node());
- num_test_failures += QTest::qExec(&test3);
+ RPCNestedTests test3(app.node());
+ num_test_failures += QTest::qExec(&test3);
#ifdef ENABLE_WALLET
- WalletTests test5(app.node());
- num_test_failures += QTest::qExec(&test5);
+ WalletTests test5(app.node());
+ num_test_failures += QTest::qExec(&test5);
- AddressBookTests test6(app.node());
- num_test_failures += QTest::qExec(&test6);
+ AddressBookTests test6(app.node());
+ num_test_failures += QTest::qExec(&test6);
#endif
- if (num_test_failures) {
- qWarning("\nFailed tests: %d\n", num_test_failures);
- } else {
- qDebug("\nAll tests passed.\n");
+ if (num_test_failures) {
+ qWarning("\nFailed tests: %d\n", num_test_failures);
+ } else {
+ qDebug("\nAll tests passed.\n");
+ }
}
+
+ QSettings settings;
+ settings.clear();
+
return num_test_failures;
}
diff --git a/src/qt/test/wallettests.cpp b/src/qt/test/wallettests.cpp
index f5b86f44a6..603df0b15f 100644
--- a/src/qt/test/wallettests.cpp
+++ b/src/qt/test/wallettests.cpp
@@ -418,7 +418,7 @@ void TestGUIWatchOnly(interfaces::Node& node, TestChain100Setup& test)
timer.setInterval(500);
QObject::connect(&timer, &QTimer::timeout, [&](){
for (QWidget* widget : QApplication::topLevelWidgets()) {
- if (widget->inherits("QMessageBox")) {
+ if (widget->inherits("QMessageBox") && widget->objectName().compare("psbt_copied_message") == 0) {
QMessageBox* dialog = qobject_cast<QMessageBox*>(widget);
QAbstractButton* button = dialog->button(QMessageBox::Discard);
button->setEnabled(true);
diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp
index a916e4ead6..b848b8fe94 100644
--- a/src/qt/transactiondesc.cpp
+++ b/src/qt/transactiondesc.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifdef HAVE_CONFIG_H
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/transactiondesc.h>
#include <qt/bitcoinunits.h>
diff --git a/src/qt/utilitydialog.cpp b/src/qt/utilitydialog.cpp
index f43b993628..22fe219def 100644
--- a/src/qt/utilitydialog.cpp
+++ b/src/qt/utilitydialog.cpp
@@ -58,7 +58,8 @@ HelpMessageDialog::HelpMessageDialog(QWidget *parent, bool about) :
ui->helpMessage->setVisible(false);
} else {
setWindowTitle(tr("Command-line options"));
- QString header = "Usage: bitcoin-qt [command-line options] \n";
+ QString header = "Usage: bitcoin-qt [command-line options] [URI]\n\n"
+ "Optional URI is a Bitcoin address in BIP21 URI format.\n";
QTextCursor cursor(ui->helpMessage->document());
cursor.insertText(version);
cursor.insertBlock();
diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp
index 9821f8504a..1bdf94d3b5 100644
--- a/src/qt/walletmodel.cpp
+++ b/src/qt/walletmodel.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/walletmodel.h>
#include <qt/addresstablemodel.h>
@@ -448,6 +444,13 @@ void WalletModel::unsubscribeFromCoreSignals()
// WalletModel::UnlockContext implementation
WalletModel::UnlockContext WalletModel::requestUnlock()
{
+ // Bugs in earlier versions may have resulted in wallets with private keys disabled to become "encrypted"
+ // (encryption keys are present, but not actually doing anything).
+ // To avoid issues with such wallets, check if the wallet has private keys disabled, and if so, return a context
+ // that indicates the wallet is not encrypted.
+ if (m_wallet->privateKeysDisabled()) {
+ return UnlockContext(this, /*valid=*/true, /*relock=*/false);
+ }
bool was_locked = getEncryptionStatus() == Locked;
if(was_locked)
{
diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h
index 68218b0c1b..503ee16823 100644
--- a/src/qt/walletmodel.h
+++ b/src/qt/walletmodel.h
@@ -5,10 +5,6 @@
#ifndef BITCOIN_QT_WALLETMODEL_H
#define BITCOIN_QT_WALLETMODEL_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <key.h>
#include <qt/walletmodeltransaction.h>
diff --git a/src/qt/walletmodeltransaction.cpp b/src/qt/walletmodeltransaction.cpp
index 61ccd9dd82..8222672bf3 100644
--- a/src/qt/walletmodeltransaction.cpp
+++ b/src/qt/walletmodeltransaction.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifdef HAVE_CONFIG_H
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/walletmodeltransaction.h>
#include <policy/policy.h>
diff --git a/src/random.cpp b/src/random.cpp
index ce4266a567..4fc9099704 100644
--- a/src/random.cpp
+++ b/src/random.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <random.h>
#include <compat/compat.h>
diff --git a/src/random.h b/src/random.h
index 76bae5838d..f7c20ee4b0 100644
--- a/src/random.h
+++ b/src/random.h
@@ -11,6 +11,7 @@
#include <span.h>
#include <uint256.h>
+#include <bit>
#include <cassert>
#include <chrono>
#include <cstdint>
@@ -203,7 +204,7 @@ public:
{
assert(range);
--range;
- int bits = CountBits(range);
+ int bits = std::bit_width(range);
while (true) {
uint64_t ret = randbits(bits);
if (ret <= range) return ret;
diff --git a/src/rest.cpp b/src/rest.cpp
index fbbf6cfa84..89c033b8a3 100644
--- a/src/rest.cpp
+++ b/src/rest.cpp
@@ -3,12 +3,17 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <rest.h>
#include <blockfilter.h>
#include <chain.h>
#include <chainparams.h>
#include <core_io.h>
+#include <flatfile.h>
#include <httpserver.h>
#include <index/blockfilterindex.h>
#include <index/txindex.h>
@@ -30,7 +35,7 @@
#include <validation.h>
#include <any>
-#include <string>
+#include <vector>
#include <univalue.h>
@@ -291,7 +296,7 @@ static bool rest_block(const std::any& context,
if (!ParseHashStr(hashStr, hash))
return RESTERR(req, HTTP_BAD_REQUEST, "Invalid hash: " + hashStr);
- CBlock block;
+ FlatFilePos pos{};
const CBlockIndex* pblockindex = nullptr;
const CBlockIndex* tip = nullptr;
ChainstateManager* maybe_chainman = GetChainman(context, req);
@@ -307,32 +312,33 @@ static bool rest_block(const std::any& context,
if (chainman.m_blockman.IsBlockPruned(*pblockindex)) {
return RESTERR(req, HTTP_NOT_FOUND, hashStr + " not available (pruned data)");
}
+ pos = pblockindex->GetBlockPos();
}
- if (!chainman.m_blockman.ReadBlockFromDisk(block, *pblockindex)) {
+ std::vector<uint8_t> block_data{};
+ if (!chainman.m_blockman.ReadRawBlockFromDisk(block_data, pos)) {
return RESTERR(req, HTTP_NOT_FOUND, hashStr + " not found");
}
switch (rf) {
case RESTResponseFormat::BINARY: {
- DataStream ssBlock;
- ssBlock << TX_WITH_WITNESS(block);
- std::string binaryBlock = ssBlock.str();
+ const std::string binaryBlock{block_data.begin(), block_data.end()};
req->WriteHeader("Content-Type", "application/octet-stream");
req->WriteReply(HTTP_OK, binaryBlock);
return true;
}
case RESTResponseFormat::HEX: {
- DataStream ssBlock;
- ssBlock << TX_WITH_WITNESS(block);
- std::string strHex = HexStr(ssBlock) + "\n";
+ const std::string strHex{HexStr(block_data) + "\n"};
req->WriteHeader("Content-Type", "text/plain");
req->WriteReply(HTTP_OK, strHex);
return true;
}
case RESTResponseFormat::JSON: {
+ CBlock block{};
+ DataStream block_stream{block_data};
+ block_stream >> TX_WITH_WITNESS(block);
UniValue objBlock = blockToJSON(chainman.m_blockman, block, *tip, *pblockindex, tx_verbosity);
std::string strJSON = objBlock.write() + "\n";
req->WriteHeader("Content-Type", "application/json");
diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp
index 34d308211b..a1135c27d4 100644
--- a/src/rpc/blockchain.cpp
+++ b/src/rpc/blockchain.cpp
@@ -17,6 +17,7 @@
#include <core_io.h>
#include <deploymentinfo.h>
#include <deploymentstatus.h>
+#include <flatfile.h>
#include <hash.h>
#include <index/blockfilterindex.h>
#include <index/coinstatsindex.h>
@@ -395,7 +396,8 @@ static RPCHelpMan syncwithvalidationinterfacequeue()
},
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
- SyncWithValidationInterfaceQueue();
+ NodeContext& node = EnsureAnyNodeContext(request.context);
+ CHECK_NONFATAL(node.validation_signals)->SyncWithValidationInterfaceQueue();
return UniValue::VNULL;
},
};
@@ -594,6 +596,28 @@ static CBlock GetBlockChecked(BlockManager& blockman, const CBlockIndex& blockin
return block;
}
+static std::vector<uint8_t> GetRawBlockChecked(BlockManager& blockman, const CBlockIndex& blockindex)
+{
+ std::vector<uint8_t> data{};
+ FlatFilePos pos{};
+ {
+ LOCK(cs_main);
+ if (blockman.IsBlockPruned(blockindex)) {
+ throw JSONRPCError(RPC_MISC_ERROR, "Block not available (pruned data)");
+ }
+ pos = blockindex.GetBlockPos();
+ }
+
+ if (!blockman.ReadRawBlockFromDisk(data, pos)) {
+ // Block not found on disk. This could be because we have the block
+ // header in our index but not yet have the block or did not accept the
+ // block. Or if the block was pruned right after we released the lock above.
+ throw JSONRPCError(RPC_MISC_ERROR, "Block not found on disk");
+ }
+
+ return data;
+}
+
static CBlockUndo GetUndoChecked(BlockManager& blockman, const CBlockIndex& blockindex)
{
CBlockUndo blockUndo;
@@ -734,15 +758,16 @@ static RPCHelpMan getblock()
}
}
- const CBlock block{GetBlockChecked(chainman.m_blockman, *pblockindex)};
+ const std::vector<uint8_t> block_data{GetRawBlockChecked(chainman.m_blockman, *pblockindex)};
if (verbosity <= 0) {
- DataStream ssBlock;
- ssBlock << TX_WITH_WITNESS(block);
- std::string strHex = HexStr(ssBlock);
- return strHex;
+ return HexStr(block_data);
}
+ DataStream block_stream{block_data};
+ CBlock block{};
+ block_stream >> TX_WITH_WITNESS(block);
+
TxVerbosity tx_verbosity;
if (verbosity == 1) {
tx_verbosity = TxVerbosity::SHOW_TXID;
@@ -2571,7 +2596,7 @@ static RPCHelpMan dumptxoutset()
{
return RPCHelpMan{
"dumptxoutset",
- "Write the serialized UTXO set to disk.",
+ "Write the serialized UTXO set to a file.",
{
{"path", RPCArg::Type::STR, RPCArg::Optional::NO, "Path to the output file. If relative, will be prefixed by datadir."},
},
@@ -2699,7 +2724,7 @@ static RPCHelpMan loadtxoutset()
{
return RPCHelpMan{
"loadtxoutset",
- "Load the serialized UTXO set from disk.\n"
+ "Load the serialized UTXO set from a file.\n"
"Once this snapshot is loaded, its contents will be "
"deserialized into a second chainstate data structure, which is then used to sync to "
"the network's tip. "
@@ -2753,34 +2778,14 @@ static RPCHelpMan loadtxoutset()
throw JSONRPCError(RPC_INTERNAL_ERROR, strprintf("Unable to load UTXO snapshot, "
"assumeutxo block hash in snapshot metadata not recognized (%s)", base_blockhash.ToString()));
}
- int max_secs_to_wait_for_headers = 60 * 10;
- CBlockIndex* snapshot_start_block = nullptr;
-
- LogPrintf("[snapshot] waiting to see blockheader %s in headers chain before snapshot activation\n",
- base_blockhash.ToString());
-
- while (max_secs_to_wait_for_headers > 0) {
- snapshot_start_block = WITH_LOCK(::cs_main,
+ CBlockIndex* snapshot_start_block = WITH_LOCK(::cs_main,
return chainman.m_blockman.LookupBlockIndex(base_blockhash));
- max_secs_to_wait_for_headers -= 1;
-
- if (!IsRPCRunning()) {
- throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Shutting down");
- }
-
- if (!snapshot_start_block) {
- std::this_thread::sleep_for(std::chrono::seconds(1));
- } else {
- break;
- }
- }
if (!snapshot_start_block) {
- LogPrintf("[snapshot] timed out waiting for snapshot start blockheader %s\n",
- base_blockhash.ToString());
throw JSONRPCError(
RPC_INTERNAL_ERROR,
- "Timed out waiting for base block header to appear in headers chain");
+ strprintf("The base block header (%s) must appear in the headers chain. Make sure all headers are syncing, and call this RPC again.",
+ base_blockhash.ToString()));
}
if (!chainman.ActivateSnapshot(afile, metadata, false)) {
throw JSONRPCError(RPC_INTERNAL_ERROR, "Unable to load UTXO snapshot " + fs::PathToString(path));
diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp
index 5825efdf82..b8dc148eae 100644
--- a/src/rpc/client.cpp
+++ b/src/rpc/client.cpp
@@ -128,6 +128,8 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "testmempoolaccept", 0, "rawtxs" },
{ "testmempoolaccept", 1, "maxfeerate" },
{ "submitpackage", 0, "package" },
+ { "submitpackage", 1, "maxfeerate" },
+ { "submitpackage", 2, "maxburnamount" },
{ "combinerawtransaction", 0, "txs" },
{ "fundrawtransaction", 1, "options" },
{ "fundrawtransaction", 1, "add_inputs"},
@@ -275,6 +277,11 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "logging", 1, "exclude" },
{ "disconnectnode", 1, "nodeid" },
{ "upgradewallet", 0, "version" },
+ { "gethdkeys", 0, "active_only" },
+ { "gethdkeys", 0, "options" },
+ { "gethdkeys", 0, "private" },
+ { "createwalletdescriptor", 1, "options" },
+ { "createwalletdescriptor", 1, "internal" },
// Echo with conversion (For testing only)
{ "echojson", 0, "arg0" },
{ "echojson", 1, "arg1" },
diff --git a/src/rpc/external_signer.cpp b/src/rpc/external_signer.cpp
index 310eec5f15..8d06ae4258 100644
--- a/src/rpc/external_signer.cpp
+++ b/src/rpc/external_signer.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <common/args.h>
#include <common/system.h>
#include <external_signer.h>
diff --git a/src/rpc/fees.cpp b/src/rpc/fees.cpp
index 57ba486ed9..f3345b4f1c 100644
--- a/src/rpc/fees.cpp
+++ b/src/rpc/fees.cpp
@@ -4,6 +4,7 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <core_io.h>
+#include <node/context.h>
#include <policy/feerate.h>
#include <policy/fees.h>
#include <rpc/protocol.h>
@@ -21,10 +22,6 @@
#include <cmath>
#include <string>
-namespace node {
-struct NodeContext;
-}
-
using node::NodeContext;
static RPCHelpMan estimatesmartfee()
@@ -68,7 +65,7 @@ static RPCHelpMan estimatesmartfee()
const NodeContext& node = EnsureAnyNodeContext(request.context);
const CTxMemPool& mempool = EnsureMemPool(node);
- SyncWithValidationInterfaceQueue();
+ CHECK_NONFATAL(mempool.m_signals)->SyncWithValidationInterfaceQueue();
unsigned int max_target = fee_estimator.HighestTargetTracked(FeeEstimateHorizon::LONG_HALFLIFE);
unsigned int conf_target = ParseConfirmTarget(request.params[0], max_target);
bool conservative = true;
@@ -156,8 +153,9 @@ static RPCHelpMan estimaterawfee()
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
CBlockPolicyEstimator& fee_estimator = EnsureAnyFeeEstimator(request.context);
+ const NodeContext& node = EnsureAnyNodeContext(request.context);
- SyncWithValidationInterfaceQueue();
+ CHECK_NONFATAL(node.validation_signals)->SyncWithValidationInterfaceQueue();
unsigned int max_target = fee_estimator.HighestTargetTracked(FeeEstimateHorizon::LONG_HALFLIFE);
unsigned int conf_target = ParseConfirmTarget(request.params[0], max_target);
double threshold = 0.95;
diff --git a/src/rpc/mempool.cpp b/src/rpc/mempool.cpp
index c1753a1f6e..920bb9ea7f 100644
--- a/src/rpc/mempool.cpp
+++ b/src/rpc/mempool.cpp
@@ -28,6 +28,7 @@
using kernel::DumpMempool;
+using node::DEFAULT_MAX_BURN_AMOUNT;
using node::DEFAULT_MAX_RAW_TX_FEE_RATE;
using node::MempoolPath;
using node::NodeContext;
@@ -45,8 +46,8 @@ static RPCHelpMan sendrawtransaction()
{"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The hex string of the raw transaction"},
{"maxfeerate", RPCArg::Type::AMOUNT, RPCArg::Default{FormatMoney(DEFAULT_MAX_RAW_TX_FEE_RATE.GetFeePerK())},
"Reject transactions whose fee rate is higher than the specified value, expressed in " + CURRENCY_UNIT +
- "/kvB.\nSet to 0 to accept any fee rate."},
- {"maxburnamount", RPCArg::Type::AMOUNT, RPCArg::Default{FormatMoney(0)},
+ "/kvB.\nFee rates larger than 1BTC/kvB are rejected.\nSet to 0 to accept any fee rate."},
+ {"maxburnamount", RPCArg::Type::AMOUNT, RPCArg::Default{FormatMoney(DEFAULT_MAX_BURN_AMOUNT)},
"Reject transactions with provably unspendable outputs (e.g. 'datacarrier' outputs that use the OP_RETURN opcode) greater than the specified value, expressed in " + CURRENCY_UNIT + ".\n"
"If burning funds through unspendable outputs is desired, increase this value.\n"
"This check is based on heuristics and does not guarantee spendability of outputs.\n"},
@@ -81,9 +82,7 @@ static RPCHelpMan sendrawtransaction()
CTransactionRef tx(MakeTransactionRef(std::move(mtx)));
- const CFeeRate max_raw_tx_fee_rate = request.params[1].isNull() ?
- DEFAULT_MAX_RAW_TX_FEE_RATE :
- CFeeRate(AmountFromValue(request.params[1]));
+ const CFeeRate max_raw_tx_fee_rate{ParseFeeRate(self.Arg<UniValue>(1))};
int64_t virtual_size = GetVirtualTransactionSize(*tx);
CAmount max_raw_tx_fee = max_raw_tx_fee_rate.GetFee(virtual_size);
@@ -117,7 +116,8 @@ static RPCHelpMan testmempoolaccept()
},
},
{"maxfeerate", RPCArg::Type::AMOUNT, RPCArg::Default{FormatMoney(DEFAULT_MAX_RAW_TX_FEE_RATE.GetFeePerK())},
- "Reject transactions whose fee rate is higher than the specified value, expressed in " + CURRENCY_UNIT + "/kvB\n"},
+ "Reject transactions whose fee rate is higher than the specified value, expressed in " + CURRENCY_UNIT +
+ "/kvB.\nFee rates larger than 1BTC/kvB are rejected.\nSet to 0 to accept any fee rate."},
},
RPCResult{
RPCResult::Type::ARR, "", "The result of the mempool acceptance test for each raw transaction in the input array.\n"
@@ -162,9 +162,7 @@ static RPCHelpMan testmempoolaccept()
"Array must contain between 1 and " + ToString(MAX_PACKAGE_COUNT) + " transactions.");
}
- const CFeeRate max_raw_tx_fee_rate = request.params[1].isNull() ?
- DEFAULT_MAX_RAW_TX_FEE_RATE :
- CFeeRate(AmountFromValue(request.params[1]));
+ const CFeeRate max_raw_tx_fee_rate{ParseFeeRate(self.Arg<UniValue>(1))};
std::vector<CTransactionRef> txns;
txns.reserve(raw_transactions.size());
@@ -183,7 +181,7 @@ static RPCHelpMan testmempoolaccept()
Chainstate& chainstate = chainman.ActiveChainstate();
const PackageMempoolAcceptResult package_result = [&] {
LOCK(::cs_main);
- if (txns.size() > 1) return ProcessNewPackage(chainstate, mempool, txns, /*test_accept=*/true);
+ if (txns.size() > 1) return ProcessNewPackage(chainstate, mempool, txns, /*test_accept=*/true, /*client_maxfeerate=*/{});
return PackageMempoolAcceptResult(txns[0]->GetWitnessHash(),
chainman.ProcessTransaction(txns[0], /*test_accept=*/true));
}();
@@ -826,6 +824,14 @@ static RPCHelpMan submitpackage()
{"rawtx", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, ""},
},
},
+ {"maxfeerate", RPCArg::Type::AMOUNT, RPCArg::Default{FormatMoney(DEFAULT_MAX_RAW_TX_FEE_RATE.GetFeePerK())},
+ "Reject transactions whose fee rate is higher than the specified value, expressed in " + CURRENCY_UNIT +
+ "/kvB.\nFee rates larger than 1BTC/kvB are rejected.\nSet to 0 to accept any fee rate."},
+ {"maxburnamount", RPCArg::Type::AMOUNT, RPCArg::Default{FormatMoney(DEFAULT_MAX_BURN_AMOUNT)},
+ "Reject transactions with provably unspendable outputs (e.g. 'datacarrier' outputs that use the OP_RETURN opcode) greater than the specified value, expressed in " + CURRENCY_UNIT + ".\n"
+ "If burning funds through unspendable outputs is desired, increase this value.\n"
+ "This check is based on heuristics and does not guarantee spendability of outputs.\n"
+ },
},
RPCResult{
RPCResult::Type::OBJ, "", "",
@@ -865,6 +871,17 @@ static RPCHelpMan submitpackage()
"Array must contain between 1 and " + ToString(MAX_PACKAGE_COUNT) + " transactions.");
}
+ // Fee check needs to be run with chainstate and package context
+ const CFeeRate max_raw_tx_fee_rate = ParseFeeRate(self.Arg<UniValue>(1));
+ std::optional<CFeeRate> client_maxfeerate{max_raw_tx_fee_rate};
+ // 0-value is special; it's mapped to no sanity check
+ if (max_raw_tx_fee_rate == CFeeRate(0)) {
+ client_maxfeerate = std::nullopt;
+ }
+
+ // Burn sanity check is run with no context
+ const CAmount max_burn_amount = request.params[2].isNull() ? 0 : AmountFromValue(request.params[2]);
+
std::vector<CTransactionRef> txns;
txns.reserve(raw_transactions.size());
for (const auto& rawtx : raw_transactions.getValues()) {
@@ -873,6 +890,13 @@ static RPCHelpMan submitpackage()
throw JSONRPCError(RPC_DESERIALIZATION_ERROR,
"TX decode failed: " + rawtx.get_str() + " Make sure the tx has at least one input.");
}
+
+ for (const auto& out : mtx.vout) {
+ if((out.scriptPubKey.IsUnspendable() || !out.scriptPubKey.HasValidOps()) && out.nValue > max_burn_amount) {
+ throw JSONRPCTransactionError(TransactionError::MAX_BURN_EXCEEDED);
+ }
+ }
+
txns.emplace_back(MakeTransactionRef(std::move(mtx)));
}
if (!IsChildWithParentsTree(txns)) {
@@ -882,7 +906,7 @@ static RPCHelpMan submitpackage()
NodeContext& node = EnsureAnyNodeContext(request.context);
CTxMemPool& mempool = EnsureMemPool(node);
Chainstate& chainstate = EnsureChainman(node).ActiveChainstate();
- const auto package_result = WITH_LOCK(::cs_main, return ProcessNewPackage(chainstate, mempool, txns, /*test_accept=*/ false));
+ const auto package_result = WITH_LOCK(::cs_main, return ProcessNewPackage(chainstate, mempool, txns, /*test_accept=*/ false, client_maxfeerate));
std::string package_msg = "success";
diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp
index f1abfb6396..f7cdbf52dd 100644
--- a/src/rpc/mining.cpp
+++ b/src/rpc/mining.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <chain.h>
#include <chainparams.h>
#include <common/system.h>
@@ -1038,9 +1042,9 @@ static RPCHelpMan submitblock()
bool new_block;
auto sc = std::make_shared<submitblock_StateCatcher>(block.GetHash());
- RegisterSharedValidationInterface(sc);
+ CHECK_NONFATAL(chainman.m_options.signals)->RegisterSharedValidationInterface(sc);
bool accepted = chainman.ProcessNewBlock(blockptr, /*force_processing=*/true, /*min_pow_checked=*/true, /*new_block=*/&new_block);
- UnregisterSharedValidationInterface(sc);
+ CHECK_NONFATAL(chainman.m_options.signals)->UnregisterSharedValidationInterface(sc);
if (!new_block && accepted) {
return "duplicate";
}
diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp
index 5e6f42b596..f935a3b08f 100644
--- a/src/rpc/net.cpp
+++ b/src/rpc/net.cpp
@@ -607,8 +607,8 @@ static UniValue GetNetworksInfo()
obj.pushKV("name", GetNetworkName(network));
obj.pushKV("limited", !g_reachable_nets.Contains(network));
obj.pushKV("reachable", g_reachable_nets.Contains(network));
- obj.pushKV("proxy", proxy.IsValid() ? proxy.proxy.ToStringAddrPort() : std::string());
- obj.pushKV("proxy_randomize_credentials", proxy.randomize_credentials);
+ obj.pushKV("proxy", proxy.IsValid() ? proxy.ToString() : std::string());
+ obj.pushKV("proxy_randomize_credentials", proxy.m_randomize_credentials);
networks.push_back(obj);
}
return networks;
@@ -951,7 +951,7 @@ static RPCHelpMan getnodeaddresses()
static RPCHelpMan addpeeraddress()
{
return RPCHelpMan{"addpeeraddress",
- "\nAdd the address of a potential peer to the address manager. This RPC is for testing only.\n",
+ "Add the address of a potential peer to an address manager table. This RPC is for testing only.",
{
{"address", RPCArg::Type::STR, RPCArg::Optional::NO, "The IP address of the peer"},
{"port", RPCArg::Type::NUM, RPCArg::Optional::NO, "The port of the peer"},
@@ -960,7 +960,8 @@ static RPCHelpMan addpeeraddress()
RPCResult{
RPCResult::Type::OBJ, "", "",
{
- {RPCResult::Type::BOOL, "success", "whether the peer address was successfully added to the address manager"},
+ {RPCResult::Type::BOOL, "success", "whether the peer address was successfully added to the address manager table"},
+ {RPCResult::Type::STR, "error", /*optional=*/true, "error description, if the address could not be added"},
},
},
RPCExamples{
@@ -989,8 +990,13 @@ static RPCHelpMan addpeeraddress()
success = true;
if (tried) {
// Attempt to move the address to the tried addresses table.
- addrman.Good(address);
+ if (!addrman.Good(address)) {
+ success = false;
+ obj.pushKV("error", "failed-adding-to-tried");
+ }
}
+ } else {
+ obj.pushKV("error", "failed-adding-to-new");
}
}
diff --git a/src/rpc/node.cpp b/src/rpc/node.cpp
index b085828215..b8c0080aef 100644
--- a/src/rpc/node.cpp
+++ b/src/rpc/node.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <chainparams.h>
#include <httpserver.h>
#include <index/blockfilterindex.h>
@@ -90,7 +94,7 @@ static RPCHelpMan mockscheduler()
const NodeContext& node_context{EnsureAnyNodeContext(request.context)};
CHECK_NONFATAL(node_context.scheduler)->MockForward(std::chrono::seconds{delta_seconds});
- SyncWithValidationInterfaceQueue();
+ CHECK_NONFATAL(node_context.validation_signals)->SyncWithValidationInterfaceQueue();
for (const auto& chain_client : node_context.chain_clients) {
chain_client->schedulerMockForward(std::chrono::seconds(delta_seconds));
}
diff --git a/src/rpc/register.h b/src/rpc/register.h
index c88f49ecf0..fd23dde75b 100644
--- a/src/rpc/register.h
+++ b/src/rpc/register.h
@@ -5,6 +5,10 @@
#ifndef BITCOIN_RPC_REGISTER_H
#define BITCOIN_RPC_REGISTER_H
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
/** These are in one header file to avoid creating tons of single-function
* headers for everything under src/rpc/ */
class CRPCTable;
diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp
index e1ac510cba..e7d1e3db4e 100644
--- a/src/rpc/server.cpp
+++ b/src/rpc/server.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <rpc/server.h>
#include <common/args.h>
diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp
index cf48ee11e7..51c88cc1ba 100644
--- a/src/rpc/util.cpp
+++ b/src/rpc/util.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <clientversion.h>
#include <core_io.h>
#include <common/args.h>
@@ -75,6 +79,13 @@ CAmount AmountFromValue(const UniValue& value, int decimals)
return amount;
}
+CFeeRate ParseFeeRate(const UniValue& json)
+{
+ CAmount val{AmountFromValue(json)};
+ if (val >= COIN) throw JSONRPCError(RPC_INVALID_PARAMETER, "Fee rates larger than or equal to 1BTC/kvB are not accepted");
+ return CFeeRate{val};
+}
+
uint256 ParseHashV(const UniValue& v, std::string_view name)
{
const std::string& strHex(v.get_str());
@@ -678,11 +689,13 @@ static void CheckRequiredOrDefault(const RPCArg& param)
void force_semicolon(ret_type)
// Optional arg (without default). Can also be called on required args, if needed.
+TMPL_INST(nullptr, const UniValue*, maybe_arg;);
TMPL_INST(nullptr, std::optional<double>, maybe_arg ? std::optional{maybe_arg->get_real()} : std::nullopt;);
TMPL_INST(nullptr, std::optional<bool>, maybe_arg ? std::optional{maybe_arg->get_bool()} : std::nullopt;);
TMPL_INST(nullptr, const std::string*, maybe_arg ? &maybe_arg->get_str() : nullptr;);
// Required arg or optional arg with default value.
+TMPL_INST(CheckRequiredOrDefault, const UniValue&, *CHECK_NONFATAL(maybe_arg););
TMPL_INST(CheckRequiredOrDefault, bool, CHECK_NONFATAL(maybe_arg)->get_bool(););
TMPL_INST(CheckRequiredOrDefault, int, CHECK_NONFATAL(maybe_arg)->getInt<int>(););
TMPL_INST(CheckRequiredOrDefault, uint64_t, CHECK_NONFATAL(maybe_arg)->getInt<uint64_t>(););
diff --git a/src/rpc/util.h b/src/rpc/util.h
index e2d5ed333c..ad3ed97b2e 100644
--- a/src/rpc/util.h
+++ b/src/rpc/util.h
@@ -103,6 +103,11 @@ std::vector<unsigned char> ParseHexO(const UniValue& o, std::string_view strKey)
* @returns a CAmount if the various checks pass.
*/
CAmount AmountFromValue(const UniValue& value, int decimals = 8);
+/**
+ * Parse a json number or string, denoting BTC/kvB, into a CFeeRate (sat/kvB).
+ * Reject negative values or rates larger than 1BTC/kvB.
+ */
+CFeeRate ParseFeeRate(const UniValue& json);
using RPCArgList = std::vector<std::pair<std::string, UniValue>>;
std::string HelpExampleCli(const std::string& methodname, const std::string& args);
diff --git a/src/scheduler.cpp b/src/scheduler.cpp
index 6c6f644142..a1158e0c07 100644
--- a/src/scheduler.cpp
+++ b/src/scheduler.cpp
@@ -129,7 +129,7 @@ bool CScheduler::AreThreadsServicingQueue() const
}
-void SingleThreadedSchedulerClient::MaybeScheduleProcessQueue()
+void SerialTaskRunner::MaybeScheduleProcessQueue()
{
{
LOCK(m_callbacks_mutex);
@@ -142,7 +142,7 @@ void SingleThreadedSchedulerClient::MaybeScheduleProcessQueue()
m_scheduler.schedule([this] { this->ProcessQueue(); }, std::chrono::steady_clock::now());
}
-void SingleThreadedSchedulerClient::ProcessQueue()
+void SerialTaskRunner::ProcessQueue()
{
std::function<void()> callback;
{
@@ -158,8 +158,8 @@ void SingleThreadedSchedulerClient::ProcessQueue()
// RAII the setting of fCallbacksRunning and calling MaybeScheduleProcessQueue
// to ensure both happen safely even if callback() throws.
struct RAIICallbacksRunning {
- SingleThreadedSchedulerClient* instance;
- explicit RAIICallbacksRunning(SingleThreadedSchedulerClient* _instance) : instance(_instance) {}
+ SerialTaskRunner* instance;
+ explicit RAIICallbacksRunning(SerialTaskRunner* _instance) : instance(_instance) {}
~RAIICallbacksRunning()
{
{
@@ -173,7 +173,7 @@ void SingleThreadedSchedulerClient::ProcessQueue()
callback();
}
-void SingleThreadedSchedulerClient::AddToProcessQueue(std::function<void()> func)
+void SerialTaskRunner::insert(std::function<void()> func)
{
{
LOCK(m_callbacks_mutex);
@@ -182,7 +182,7 @@ void SingleThreadedSchedulerClient::AddToProcessQueue(std::function<void()> func
MaybeScheduleProcessQueue();
}
-void SingleThreadedSchedulerClient::EmptyQueue()
+void SerialTaskRunner::flush()
{
assert(!m_scheduler.AreThreadsServicingQueue());
bool should_continue = true;
@@ -193,7 +193,7 @@ void SingleThreadedSchedulerClient::EmptyQueue()
}
}
-size_t SingleThreadedSchedulerClient::CallbacksPending()
+size_t SerialTaskRunner::size()
{
LOCK(m_callbacks_mutex);
return m_callbacks_pending.size();
diff --git a/src/scheduler.h b/src/scheduler.h
index 9212582b97..454c083b31 100644
--- a/src/scheduler.h
+++ b/src/scheduler.h
@@ -8,6 +8,7 @@
#include <attributes.h>
#include <sync.h>
#include <threadsafety.h>
+#include <util/task_runner.h>
#include <chrono>
#include <condition_variable>
@@ -120,12 +121,16 @@ private:
* B() will be able to observe all of the effects of callback A() which executed
* before it.
*/
-class SingleThreadedSchedulerClient
+class SerialTaskRunner : public util::TaskRunnerInterface
{
private:
CScheduler& m_scheduler;
Mutex m_callbacks_mutex;
+
+ // We are not allowed to assume the scheduler only runs in one thread,
+ // but must ensure all callbacks happen in-order, so we end up creating
+ // our own queue here :(
std::list<std::function<void()>> m_callbacks_pending GUARDED_BY(m_callbacks_mutex);
bool m_are_callbacks_running GUARDED_BY(m_callbacks_mutex) = false;
@@ -133,7 +138,7 @@ private:
void ProcessQueue() EXCLUSIVE_LOCKS_REQUIRED(!m_callbacks_mutex);
public:
- explicit SingleThreadedSchedulerClient(CScheduler& scheduler LIFETIMEBOUND) : m_scheduler{scheduler} {}
+ explicit SerialTaskRunner(CScheduler& scheduler LIFETIMEBOUND) : m_scheduler{scheduler} {}
/**
* Add a callback to be executed. Callbacks are executed serially
@@ -141,15 +146,15 @@ public:
* Practically, this means that callbacks can behave as if they are executed
* in order by a single thread.
*/
- void AddToProcessQueue(std::function<void()> func) EXCLUSIVE_LOCKS_REQUIRED(!m_callbacks_mutex);
+ void insert(std::function<void()> func) override EXCLUSIVE_LOCKS_REQUIRED(!m_callbacks_mutex);
/**
* Processes all remaining queue members on the calling thread, blocking until queue is empty
* Must be called after the CScheduler has no remaining processing threads!
*/
- void EmptyQueue() EXCLUSIVE_LOCKS_REQUIRED(!m_callbacks_mutex);
+ void flush() override EXCLUSIVE_LOCKS_REQUIRED(!m_callbacks_mutex);
- size_t CallbacksPending() EXCLUSIVE_LOCKS_REQUIRED(!m_callbacks_mutex);
+ size_t size() override EXCLUSIVE_LOCKS_REQUIRED(!m_callbacks_mutex);
};
#endif // BITCOIN_SCHEDULER_H
diff --git a/src/script/bitcoinconsensus.cpp b/src/script/bitcoinconsensus.cpp
deleted file mode 100644
index c4eccacf41..0000000000
--- a/src/script/bitcoinconsensus.cpp
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2022 The Bitcoin Core developers
-// Distributed under the MIT software license, see the accompanying
-// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-#include <script/bitcoinconsensus.h>
-
-#include <primitives/transaction.h>
-#include <pubkey.h>
-#include <script/interpreter.h>
-
-namespace {
-
-/** A class that deserializes a single CTransaction one time. */
-class TxInputStream
-{
-public:
- TxInputStream(const unsigned char *txTo, size_t txToLen) :
- m_data(txTo),
- m_remaining(txToLen)
- {}
-
- void read(Span<std::byte> dst)
- {
- if (dst.size() > m_remaining) {
- throw std::ios_base::failure(std::string(__func__) + ": end of data");
- }
-
- if (dst.data() == nullptr) {
- throw std::ios_base::failure(std::string(__func__) + ": bad destination buffer");
- }
-
- if (m_data == nullptr) {
- throw std::ios_base::failure(std::string(__func__) + ": bad source buffer");
- }
-
- memcpy(dst.data(), m_data, dst.size());
- m_remaining -= dst.size();
- m_data += dst.size();
- }
-
- template<typename T>
- TxInputStream& operator>>(T&& obj)
- {
- ::Unserialize(*this, obj);
- return *this;
- }
-
-private:
- const unsigned char* m_data;
- size_t m_remaining;
-};
-
-inline int set_error(bitcoinconsensus_error* ret, bitcoinconsensus_error serror)
-{
- if (ret)
- *ret = serror;
- return 0;
-}
-
-} // namespace
-
-/** Check that all specified flags are part of the libconsensus interface. */
-static bool verify_flags(unsigned int flags)
-{
- return (flags & ~(bitcoinconsensus_SCRIPT_FLAGS_VERIFY_ALL)) == 0;
-}
-
-static int verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, CAmount amount,
- const unsigned char *txTo , unsigned int txToLen,
- const UTXO *spentOutputs, unsigned int spentOutputsLen,
- unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err)
-{
- if (!verify_flags(flags)) {
- return set_error(err, bitcoinconsensus_ERR_INVALID_FLAGS);
- }
-
- if (flags & bitcoinconsensus_SCRIPT_FLAGS_VERIFY_TAPROOT && spentOutputs == nullptr) {
- return set_error(err, bitcoinconsensus_ERR_SPENT_OUTPUTS_REQUIRED);
- }
-
- try {
- TxInputStream stream(txTo, txToLen);
- CTransaction tx(deserialize, TX_WITH_WITNESS, stream);
-
- std::vector<CTxOut> spent_outputs;
- if (spentOutputs != nullptr) {
- if (spentOutputsLen != tx.vin.size()) {
- return set_error(err, bitcoinconsensus_ERR_SPENT_OUTPUTS_MISMATCH);
- }
- for (size_t i = 0; i < spentOutputsLen; i++) {
- CScript spk = CScript(spentOutputs[i].scriptPubKey, spentOutputs[i].scriptPubKey + spentOutputs[i].scriptPubKeySize);
- const CAmount& value = spentOutputs[i].value;
- CTxOut tx_out = CTxOut(value, spk);
- spent_outputs.push_back(tx_out);
- }
- }
-
- if (nIn >= tx.vin.size())
- return set_error(err, bitcoinconsensus_ERR_TX_INDEX);
- if (GetSerializeSize(TX_WITH_WITNESS(tx)) != txToLen)
- return set_error(err, bitcoinconsensus_ERR_TX_SIZE_MISMATCH);
-
- // Regardless of the verification result, the tx did not error.
- set_error(err, bitcoinconsensus_ERR_OK);
-
- PrecomputedTransactionData txdata(tx);
-
- if (spentOutputs != nullptr && flags & bitcoinconsensus_SCRIPT_FLAGS_VERIFY_TAPROOT) {
- txdata.Init(tx, std::move(spent_outputs));
- }
-
- return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), &tx.vin[nIn].scriptWitness, flags, TransactionSignatureChecker(&tx, nIn, amount, txdata, MissingDataBehavior::FAIL), nullptr);
- } catch (const std::exception&) {
- return set_error(err, bitcoinconsensus_ERR_TX_DESERIALIZE); // Error deserializing
- }
-}
-
-int bitcoinconsensus_verify_script_with_spent_outputs(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, int64_t amount,
- const unsigned char *txTo , unsigned int txToLen,
- const UTXO *spentOutputs, unsigned int spentOutputsLen,
- unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err)
-{
- CAmount am(amount);
- return ::verify_script(scriptPubKey, scriptPubKeyLen, am, txTo, txToLen, spentOutputs, spentOutputsLen, nIn, flags, err);
-}
-
-int bitcoinconsensus_verify_script_with_amount(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, int64_t amount,
- const unsigned char *txTo , unsigned int txToLen,
- unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err)
-{
- CAmount am(amount);
- UTXO *spentOutputs = nullptr;
- unsigned int spentOutputsLen = 0;
- return ::verify_script(scriptPubKey, scriptPubKeyLen, am, txTo, txToLen, spentOutputs, spentOutputsLen, nIn, flags, err);
-}
-
-
-int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen,
- const unsigned char *txTo , unsigned int txToLen,
- unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err)
-{
- if (flags & bitcoinconsensus_SCRIPT_FLAGS_VERIFY_WITNESS) {
- return set_error(err, bitcoinconsensus_ERR_AMOUNT_REQUIRED);
- }
-
- CAmount am(0);
- UTXO *spentOutputs = nullptr;
- unsigned int spentOutputsLen = 0;
- return ::verify_script(scriptPubKey, scriptPubKeyLen, am, txTo, txToLen, spentOutputs, spentOutputsLen, nIn, flags, err);
-}
-
-unsigned int bitcoinconsensus_version()
-{
- // Just use the API version for now
- return BITCOINCONSENSUS_API_VER;
-}
diff --git a/src/script/bitcoinconsensus.h b/src/script/bitcoinconsensus.h
deleted file mode 100644
index a202b5ba06..0000000000
--- a/src/script/bitcoinconsensus.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2021 The Bitcoin Core developers
-// Distributed under the MIT software license, see the accompanying
-// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-#ifndef BITCOIN_SCRIPT_BITCOINCONSENSUS_H
-#define BITCOIN_SCRIPT_BITCOINCONSENSUS_H
-
-#include <stdint.h>
-
-#if defined(BUILD_BITCOIN_INTERNAL) && defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
- #if defined(_WIN32)
- #if defined(HAVE_DLLEXPORT_ATTRIBUTE)
- #define EXPORT_SYMBOL __declspec(dllexport)
- #else
- #define EXPORT_SYMBOL
- #endif
- #elif defined(HAVE_DEFAULT_VISIBILITY_ATTRIBUTE)
- #define EXPORT_SYMBOL __attribute__ ((visibility ("default")))
- #endif
-#elif defined(MSC_VER) && !defined(STATIC_LIBBITCOINCONSENSUS)
- #define EXPORT_SYMBOL __declspec(dllimport)
-#endif
-
-#ifndef EXPORT_SYMBOL
- #define EXPORT_SYMBOL
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define BITCOINCONSENSUS_API_VER 2
-
-typedef enum bitcoinconsensus_error_t
-{
- bitcoinconsensus_ERR_OK = 0,
- bitcoinconsensus_ERR_TX_INDEX,
- bitcoinconsensus_ERR_TX_SIZE_MISMATCH,
- bitcoinconsensus_ERR_TX_DESERIALIZE,
- bitcoinconsensus_ERR_AMOUNT_REQUIRED,
- bitcoinconsensus_ERR_INVALID_FLAGS,
- bitcoinconsensus_ERR_SPENT_OUTPUTS_REQUIRED,
- bitcoinconsensus_ERR_SPENT_OUTPUTS_MISMATCH
-} bitcoinconsensus_error;
-
-/** Script verification flags */
-enum
-{
- bitcoinconsensus_SCRIPT_FLAGS_VERIFY_NONE = 0,
- bitcoinconsensus_SCRIPT_FLAGS_VERIFY_P2SH = (1U << 0), // evaluate P2SH (BIP16) subscripts
- bitcoinconsensus_SCRIPT_FLAGS_VERIFY_DERSIG = (1U << 2), // enforce strict DER (BIP66) compliance
- bitcoinconsensus_SCRIPT_FLAGS_VERIFY_NULLDUMMY = (1U << 4), // enforce NULLDUMMY (BIP147)
- bitcoinconsensus_SCRIPT_FLAGS_VERIFY_CHECKLOCKTIMEVERIFY = (1U << 9), // enable CHECKLOCKTIMEVERIFY (BIP65)
- bitcoinconsensus_SCRIPT_FLAGS_VERIFY_CHECKSEQUENCEVERIFY = (1U << 10), // enable CHECKSEQUENCEVERIFY (BIP112)
- bitcoinconsensus_SCRIPT_FLAGS_VERIFY_WITNESS = (1U << 11), // enable WITNESS (BIP141)
- bitcoinconsensus_SCRIPT_FLAGS_VERIFY_TAPROOT = (1U << 17), // enable TAPROOT (BIPs 341 & 342)
- bitcoinconsensus_SCRIPT_FLAGS_VERIFY_ALL = bitcoinconsensus_SCRIPT_FLAGS_VERIFY_P2SH | bitcoinconsensus_SCRIPT_FLAGS_VERIFY_DERSIG |
- bitcoinconsensus_SCRIPT_FLAGS_VERIFY_NULLDUMMY | bitcoinconsensus_SCRIPT_FLAGS_VERIFY_CHECKLOCKTIMEVERIFY |
- bitcoinconsensus_SCRIPT_FLAGS_VERIFY_CHECKSEQUENCEVERIFY | bitcoinconsensus_SCRIPT_FLAGS_VERIFY_WITNESS |
- bitcoinconsensus_SCRIPT_FLAGS_VERIFY_TAPROOT
-};
-
-typedef struct {
- const unsigned char *scriptPubKey;
- unsigned int scriptPubKeySize;
- int64_t value;
-} UTXO;
-
-/// Returns 1 if the input nIn of the serialized transaction pointed to by
-/// txTo correctly spends the scriptPubKey pointed to by scriptPubKey under
-/// the additional constraints specified by flags.
-/// If not nullptr, err will contain an error/success code for the operation
-EXPORT_SYMBOL int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen,
- const unsigned char *txTo , unsigned int txToLen,
- unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err);
-
-EXPORT_SYMBOL int bitcoinconsensus_verify_script_with_amount(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, int64_t amount,
- const unsigned char *txTo , unsigned int txToLen,
- unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err);
-
-EXPORT_SYMBOL int bitcoinconsensus_verify_script_with_spent_outputs(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, int64_t amount,
- const unsigned char *txTo , unsigned int txToLen,
- const UTXO *spentOutputs, unsigned int spentOutputsLen,
- unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err);
-
-EXPORT_SYMBOL unsigned int bitcoinconsensus_version();
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#undef EXPORT_SYMBOL
-
-#endif // BITCOIN_SCRIPT_BITCOINCONSENSUS_H
diff --git a/src/script/descriptor.cpp b/src/script/descriptor.cpp
index c6bc5f8f1d..a0e755afac 100644
--- a/src/script/descriptor.cpp
+++ b/src/script/descriptor.cpp
@@ -212,6 +212,11 @@ public:
/** Derive a private key, if private data is available in arg. */
virtual bool GetPrivKey(int pos, const SigningProvider& arg, CKey& key) const = 0;
+
+ /** Return the non-extended public key for this PubkeyProvider, if it has one. */
+ virtual std::optional<CPubKey> GetRootPubKey() const = 0;
+ /** Return the extended public key for this PubkeyProvider, if it has one. */
+ virtual std::optional<CExtPubKey> GetRootExtPubKey() const = 0;
};
class OriginPubkeyProvider final : public PubkeyProvider
@@ -265,6 +270,14 @@ public:
{
return m_provider->GetPrivKey(pos, arg, key);
}
+ std::optional<CPubKey> GetRootPubKey() const override
+ {
+ return m_provider->GetRootPubKey();
+ }
+ std::optional<CExtPubKey> GetRootExtPubKey() const override
+ {
+ return m_provider->GetRootExtPubKey();
+ }
};
/** An object representing a parsed constant public key in a descriptor. */
@@ -310,6 +323,14 @@ public:
{
return arg.GetKey(m_pubkey.GetID(), key);
}
+ std::optional<CPubKey> GetRootPubKey() const override
+ {
+ return m_pubkey;
+ }
+ std::optional<CExtPubKey> GetRootExtPubKey() const override
+ {
+ return std::nullopt;
+ }
};
enum class DeriveType {
@@ -525,6 +546,14 @@ public:
key = extkey.key;
return true;
}
+ std::optional<CPubKey> GetRootPubKey() const override
+ {
+ return std::nullopt;
+ }
+ std::optional<CExtPubKey> GetRootExtPubKey() const override
+ {
+ return m_root_extkey;
+ }
};
/** Base class for all Descriptor implementations. */
@@ -720,6 +749,19 @@ public:
std::optional<int64_t> MaxSatisfactionWeight(bool) const override { return {}; }
std::optional<int64_t> MaxSatisfactionElems() const override { return {}; }
+
+ void GetPubKeys(std::set<CPubKey>& pubkeys, std::set<CExtPubKey>& ext_pubs) const override
+ {
+ for (const auto& p : m_pubkey_args) {
+ std::optional<CPubKey> pub = p->GetRootPubKey();
+ if (pub) pubkeys.insert(*pub);
+ std::optional<CExtPubKey> ext_pub = p->GetRootExtPubKey();
+ if (ext_pub) ext_pubs.insert(*ext_pub);
+ }
+ for (const auto& arg : m_subdescriptor_args) {
+ arg->GetPubKeys(pubkeys, ext_pubs);
+ }
+ }
};
/** A parsed addr(A) descriptor. */
diff --git a/src/script/descriptor.h b/src/script/descriptor.h
index caa5d1608d..e78a775330 100644
--- a/src/script/descriptor.h
+++ b/src/script/descriptor.h
@@ -158,6 +158,13 @@ struct Descriptor {
/** Get the maximum size number of stack elements for satisfying this descriptor. */
virtual std::optional<int64_t> MaxSatisfactionElems() const = 0;
+
+ /** Return all (extended) public keys for this descriptor, including any from subdescriptors.
+ *
+ * @param[out] pubkeys Any public keys
+ * @param[out] ext_pubs Any extended public keys
+ */
+ virtual void GetPubKeys(std::set<CPubKey>& pubkeys, std::set<CExtPubKey>& ext_pubs) const = 0;
};
/** Parse a `descriptor` string. Included private keys are put in `out`.
diff --git a/src/script/miniscript.h b/src/script/miniscript.h
index 76b952350b..f635fa7340 100644
--- a/src/script/miniscript.h
+++ b/src/script/miniscript.h
@@ -1617,7 +1617,7 @@ public:
//! Produce a witness for this script, if possible and given the information available in the context.
//! The non-malleable satisfaction is guaranteed to be valid if it exists, and ValidSatisfaction()
//! is true. If IsSane() holds, this satisfaction is guaranteed to succeed in case the node's
- //! conditions are satisfied (private keys and hash preimages available, locktimes satsified).
+ //! conditions are satisfied (private keys and hash preimages available, locktimes satisfied).
template<typename Ctx>
Availability Satisfy(const Ctx& ctx, std::vector<std::vector<unsigned char>>& stack, bool nonmalleable = true) const {
auto ret = ProduceInput(ctx);
diff --git a/src/script/signingprovider.cpp b/src/script/signingprovider.cpp
index ff02ab5a12..baabd4d5b5 100644
--- a/src/script/signingprovider.cpp
+++ b/src/script/signingprovider.cpp
@@ -157,8 +157,10 @@ bool FillableSigningProvider::GetKey(const CKeyID &address, CKey &keyOut) const
bool FillableSigningProvider::AddCScript(const CScript& redeemScript)
{
- if (redeemScript.size() > MAX_SCRIPT_ELEMENT_SIZE)
- return error("FillableSigningProvider::AddCScript(): redeemScripts > %i bytes are invalid", MAX_SCRIPT_ELEMENT_SIZE);
+ if (redeemScript.size() > MAX_SCRIPT_ELEMENT_SIZE) {
+ LogError("FillableSigningProvider::AddCScript(): redeemScripts > %i bytes are invalid\n", MAX_SCRIPT_ELEMENT_SIZE);
+ return false;
+ }
LOCK(cs_KeyStore);
mapScripts[CScriptID(redeemScript)] = redeemScript;
@@ -368,8 +370,6 @@ TaprootBuilder& TaprootBuilder::Add(int depth, Span<const unsigned char> script,
/* Construct NodeInfo object with leaf hash and (if track is true) also leaf information. */
NodeInfo node;
node.hash = ComputeTapleafHash(leaf_version, script);
- // due to bug in clang-tidy-17:
- // NOLINTNEXTLINE(modernize-use-emplace)
if (track) node.leaves.emplace_back(LeafInfo{std::vector<unsigned char>(script.begin(), script.end()), leaf_version, {}});
/* Insert into the branch. */
Insert(std::move(node), depth);
diff --git a/src/serialize.h b/src/serialize.h
index a0b012b25c..2f13fba582 100644
--- a/src/serialize.h
+++ b/src/serialize.h
@@ -13,6 +13,7 @@
#include <span.h>
#include <algorithm>
+#include <concepts>
#include <cstdint>
#include <cstring>
#include <ios>
@@ -56,27 +57,27 @@ template<typename Stream> inline void ser_writedata8(Stream &s, uint8_t obj)
}
template<typename Stream> inline void ser_writedata16(Stream &s, uint16_t obj)
{
- obj = htole16(obj);
+ obj = htole16_internal(obj);
s.write(AsBytes(Span{&obj, 1}));
}
template<typename Stream> inline void ser_writedata16be(Stream &s, uint16_t obj)
{
- obj = htobe16(obj);
+ obj = htobe16_internal(obj);
s.write(AsBytes(Span{&obj, 1}));
}
template<typename Stream> inline void ser_writedata32(Stream &s, uint32_t obj)
{
- obj = htole32(obj);
+ obj = htole32_internal(obj);
s.write(AsBytes(Span{&obj, 1}));
}
template<typename Stream> inline void ser_writedata32be(Stream &s, uint32_t obj)
{
- obj = htobe32(obj);
+ obj = htobe32_internal(obj);
s.write(AsBytes(Span{&obj, 1}));
}
template<typename Stream> inline void ser_writedata64(Stream &s, uint64_t obj)
{
- obj = htole64(obj);
+ obj = htole64_internal(obj);
s.write(AsBytes(Span{&obj, 1}));
}
template<typename Stream> inline uint8_t ser_readdata8(Stream &s)
@@ -89,31 +90,31 @@ template<typename Stream> inline uint16_t ser_readdata16(Stream &s)
{
uint16_t obj;
s.read(AsWritableBytes(Span{&obj, 1}));
- return le16toh(obj);
+ return le16toh_internal(obj);
}
template<typename Stream> inline uint16_t ser_readdata16be(Stream &s)
{
uint16_t obj;
s.read(AsWritableBytes(Span{&obj, 1}));
- return be16toh(obj);
+ return be16toh_internal(obj);
}
template<typename Stream> inline uint32_t ser_readdata32(Stream &s)
{
uint32_t obj;
s.read(AsWritableBytes(Span{&obj, 1}));
- return le32toh(obj);
+ return le32toh_internal(obj);
}
template<typename Stream> inline uint32_t ser_readdata32be(Stream &s)
{
uint32_t obj;
s.read(AsWritableBytes(Span{&obj, 1}));
- return be32toh(obj);
+ return be32toh_internal(obj);
}
template<typename Stream> inline uint64_t ser_readdata64(Stream &s)
{
uint64_t obj;
s.read(AsWritableBytes(Span{&obj, 1}));
- return le64toh(obj);
+ return le64toh_internal(obj);
}
@@ -259,9 +260,14 @@ const Out& AsBase(const In& x)
// i.e. anything that supports .read(Span<std::byte>) and .write(Span<const std::byte>)
//
// clang-format off
-#ifndef CHAR_EQUALS_INT8
-template <typename Stream> void Serialize(Stream&, char) = delete; // char serialization forbidden. Use uint8_t or int8_t
-#endif
+
+// Typically int8_t and char are distinct types, but some systems may define int8_t
+// in terms of char. Forbid serialization of char in the typical case, but allow it if
+// it's the only way to describe an int8_t.
+template<class T>
+concept CharNotInt8 = std::same_as<T, char> && !std::same_as<T, int8_t>;
+
+template <typename Stream, CharNotInt8 V> void Serialize(Stream&, V) = delete; // char serialization forbidden. Use uint8_t or int8_t
template <typename Stream> void Serialize(Stream& s, std::byte a) { ser_writedata8(s, uint8_t(a)); }
template<typename Stream> inline void Serialize(Stream& s, int8_t a ) { ser_writedata8(s, a); }
template<typename Stream> inline void Serialize(Stream& s, uint8_t a ) { ser_writedata8(s, a); }
@@ -275,9 +281,7 @@ template <typename Stream, BasicByte B, int N> void Serialize(Stream& s, const B
template <typename Stream, BasicByte B, std::size_t N> void Serialize(Stream& s, const std::array<B, N>& a) { s.write(MakeByteSpan(a)); }
template <typename Stream, BasicByte B> void Serialize(Stream& s, Span<B> span) { s.write(AsBytes(span)); }
-#ifndef CHAR_EQUALS_INT8
-template <typename Stream> void Unserialize(Stream&, char) = delete; // char serialization forbidden. Use uint8_t or int8_t
-#endif
+template <typename Stream, CharNotInt8 V> void Unserialize(Stream&, V) = delete; // char serialization forbidden. Use uint8_t or int8_t
template <typename Stream> void Unserialize(Stream& s, std::byte& a) { a = std::byte{ser_readdata8(s)}; }
template<typename Stream> inline void Unserialize(Stream& s, int8_t& a ) { a = ser_readdata8(s); }
template<typename Stream> inline void Unserialize(Stream& s, uint8_t& a ) { a = ser_readdata8(s); }
@@ -544,10 +548,10 @@ struct CustomUintFormatter
{
if (v < 0 || v > MAX) throw std::ios_base::failure("CustomUintFormatter value out of range");
if (BigEndian) {
- uint64_t raw = htobe64(v);
+ uint64_t raw = htobe64_internal(v);
s.write(AsBytes(Span{&raw, 1}).last(Bytes));
} else {
- uint64_t raw = htole64(v);
+ uint64_t raw = htole64_internal(v);
s.write(AsBytes(Span{&raw, 1}).first(Bytes));
}
}
@@ -559,10 +563,10 @@ struct CustomUintFormatter
uint64_t raw = 0;
if (BigEndian) {
s.read(AsWritableBytes(Span{&raw, 1}).last(Bytes));
- v = static_cast<I>(be64toh(raw));
+ v = static_cast<I>(be64toh_internal(raw));
} else {
s.read(AsWritableBytes(Span{&raw, 1}).first(Bytes));
- v = static_cast<I>(le64toh(raw));
+ v = static_cast<I>(le64toh_internal(raw));
}
}
};
diff --git a/src/support/lockedpool.cpp b/src/support/lockedpool.cpp
index f92d1d8fb7..fe3ba38cde 100644
--- a/src/support/lockedpool.cpp
+++ b/src/support/lockedpool.cpp
@@ -5,10 +5,6 @@
#include <support/lockedpool.h>
#include <support/cleanse.h>
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#ifdef WIN32
#include <windows.h>
#else
diff --git a/src/sync.cpp b/src/sync.cpp
index 58752a9f18..a8bdfc1dea 100644
--- a/src/sync.cpp
+++ b/src/sync.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <sync.h>
#include <logging.h>
diff --git a/src/test/README.md b/src/test/README.md
index 0876db7a72..bab1a28f61 100644
--- a/src/test/README.md
+++ b/src/test/README.md
@@ -42,17 +42,18 @@ test_bitcoin --log_level=all --run_test=getarg_tests
```
`log_level` controls the verbosity of the test framework, which logs when a
-test case is entered, for example. `test_bitcoin` also accepts the command
-line arguments accepted by `bitcoind`. Use `--` to separate both types of
-arguments:
+test case is entered, for example.
+
+`test_bitcoin` also accepts some of the command line arguments accepted by
+`bitcoind`. Use `--` to separate these sets of arguments:
```bash
test_bitcoin --log_level=all --run_test=getarg_tests -- -printtoconsole=1
```
-The `-printtoconsole=1` after the two dashes redirects the debug log, which
-would normally go to a file in the test datadir
-(`BasicTestingSetup::m_path_root`), to the standard terminal output.
+The `-printtoconsole=1` after the two dashes sends debug logging, which
+normally goes only to `debug.log` within the data directory, also to the
+standard terminal output.
... or to run just the doubledash test:
@@ -60,7 +61,42 @@ would normally go to a file in the test datadir
test_bitcoin --run_test=getarg_tests/doubledash
```
-Run `test_bitcoin --help` for the full list.
+`test_bitcoin` creates a temporary working (data) directory with a randomly
+generated pathname within `test_common_Bitcoin Core/`, which in turn is within
+the system's temporary directory (see
+[`temp_directory_path`](https://en.cppreference.com/w/cpp/filesystem/temp_directory_path)).
+This data directory looks like a simplified form of the standard `bitcoind` data
+directory. Its content will vary depending on the test, but it will always
+have a `debug.log` file, for example.
+
+The location of the temporary data directory can be specified with the
+`-testdatadir` option. This can make debugging easier. The directory
+path used is the argument path appended with
+`/test_common_Bitcoin Core/<test-name>/datadir`.
+The directory path is created if necessary.
+Specifying this argument also causes the data directory
+not to be removed after the last test. This is useful for looking at
+what the test wrote to `debug.log` after it completes, for example.
+(The directory is removed at the start of the next test run,
+so no leftover state is used.)
+
+```bash
+$ test_bitcoin --run_test=getarg_tests/doubledash -- -testdatadir=/somewhere/mydatadir
+Test directory (will not be deleted): "/somewhere/mydatadir/test_common_Bitcoin Core/getarg_tests/doubledash/datadir
+Running 1 test case...
+
+*** No errors detected
+$ ls -l '/somewhere/mydatadir/test_common_Bitcoin Core/getarg_tests/doubledash/datadir'
+total 8
+drwxrwxr-x 2 admin admin 4096 Nov 27 22:45 blocks
+-rw-rw-r-- 1 admin admin 1003 Nov 27 22:45 debug.log
+```
+
+If you run an entire test suite, such as `--run_test=getarg_tests`, or all the test suites
+(by not specifying `--run_test`), a separate directory
+will be created for each individual test.
+
+Run `test_bitcoin --help` for the full list of tests.
### Adding test cases
diff --git a/src/test/bswap_tests.cpp b/src/test/bswap_tests.cpp
index 2be7122fc1..fe48e39c41 100644
--- a/src/test/bswap_tests.cpp
+++ b/src/test/bswap_tests.cpp
@@ -16,9 +16,9 @@ BOOST_AUTO_TEST_CASE(bswap_tests)
uint16_t e1 = 0x3412;
uint32_t e2 = 0xbc9a7856;
uint64_t e3 = 0xbc9a78563412f0de;
- BOOST_CHECK(bswap_16(u1) == e1);
- BOOST_CHECK(bswap_32(u2) == e2);
- BOOST_CHECK(bswap_64(u3) == e3);
+ BOOST_CHECK(internal_bswap_16(u1) == e1);
+ BOOST_CHECK(internal_bswap_32(u2) == e2);
+ BOOST_CHECK(internal_bswap_64(u3) == e3);
}
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/coinstatsindex_tests.cpp b/src/test/coinstatsindex_tests.cpp
index cc1ec49d41..08814c1499 100644
--- a/src/test/coinstatsindex_tests.cpp
+++ b/src/test/coinstatsindex_tests.cpp
@@ -70,7 +70,7 @@ BOOST_FIXTURE_TEST_CASE(coinstatsindex_initial_sync, TestChain100Setup)
// SyncWithValidationInterfaceQueue() call below is also needed to ensure
// TSAN always sees the test thread waiting for the notification thread, and
// avoid potential false positive reports.
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
// Shutdown sequence (c.f. Shutdown() in init.cpp)
coin_stats_index.Stop();
diff --git a/src/test/compress_tests.cpp b/src/test/compress_tests.cpp
index 264b47b07c..13c2740553 100644
--- a/src/test/compress_tests.cpp
+++ b/src/test/compress_tests.cpp
@@ -4,6 +4,7 @@
#include <compressor.h>
#include <script/script.h>
+#include <test/util/random.h>
#include <test/util/setup_common.h>
#include <stdint.h>
@@ -131,4 +132,36 @@ BOOST_AUTO_TEST_CASE(compress_script_to_uncompressed_pubkey_id)
BOOST_CHECK_EQUAL(out[0], 0x04 | (script[65] & 0x01)); // least significant bit (lsb) of last char of pubkey is mapped into out[0]
}
+BOOST_AUTO_TEST_CASE(compress_p2pk_scripts_not_on_curve)
+{
+ XOnlyPubKey x_not_on_curve;
+ do {
+ x_not_on_curve = XOnlyPubKey(g_insecure_rand_ctx.randbytes(32));
+ } while (x_not_on_curve.IsFullyValid());
+
+ // Check that P2PK script with uncompressed pubkey [=> OP_PUSH65 <0x04 .....> OP_CHECKSIG]
+ // which is not fully valid (i.e. point is not on curve) can't be compressed
+ std::vector<unsigned char> pubkey_raw(65, 0);
+ pubkey_raw[0] = 4;
+ std::copy(x_not_on_curve.begin(), x_not_on_curve.end(), &pubkey_raw[1]);
+ CPubKey pubkey_not_on_curve(pubkey_raw);
+ assert(pubkey_not_on_curve.IsValid());
+ assert(!pubkey_not_on_curve.IsFullyValid());
+ CScript script = CScript() << ToByteVector(pubkey_not_on_curve) << OP_CHECKSIG;
+ BOOST_CHECK_EQUAL(script.size(), 67U);
+
+ CompressedScript out;
+ bool done = CompressScript(script, out);
+ BOOST_CHECK_EQUAL(done, false);
+
+ // Check that compressed P2PK script with uncompressed pubkey that is not fully
+ // valid (i.e. x coordinate of the pubkey is not on curve) can't be decompressed
+ CompressedScript compressed_script(x_not_on_curve.begin(), x_not_on_curve.end());
+ for (unsigned int compression_id : {4, 5}) {
+ CScript uncompressed_script;
+ bool success = DecompressScript(uncompressed_script, compression_id, compressed_script);
+ BOOST_CHECK_EQUAL(success, false);
+ }
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/crypto_tests.cpp b/src/test/crypto_tests.cpp
index 0a6378adf4..46acc6fc9f 100644
--- a/src/test/crypto_tests.cpp
+++ b/src/test/crypto_tests.cpp
@@ -1060,28 +1060,6 @@ BOOST_AUTO_TEST_CASE(hkdf_hmac_sha256_l32_tests)
"8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d");
}
-BOOST_AUTO_TEST_CASE(countbits_tests)
-{
- FastRandomContext ctx;
- for (unsigned int i = 0; i <= 64; ++i) {
- if (i == 0) {
- // Check handling of zero.
- BOOST_CHECK_EQUAL(CountBits(0), 0U);
- } else if (i < 10) {
- for (uint64_t j = uint64_t{1} << (i - 1); (j >> i) == 0; ++j) {
- // Exhaustively test up to 10 bits
- BOOST_CHECK_EQUAL(CountBits(j), i);
- }
- } else {
- for (int k = 0; k < 1000; k++) {
- // Randomly test 1000 samples of each length above 10 bits.
- uint64_t j = (uint64_t{1}) << (i - 1) | ctx.randbits(i - 1);
- BOOST_CHECK_EQUAL(CountBits(j), i);
- }
- }
- }
-}
-
BOOST_AUTO_TEST_CASE(sha256d64)
{
for (int i = 0; i <= 32; ++i) {
diff --git a/src/test/feefrac_tests.cpp b/src/test/feefrac_tests.cpp
new file mode 100644
index 0000000000..2e015b382e
--- /dev/null
+++ b/src/test/feefrac_tests.cpp
@@ -0,0 +1,124 @@
+// Copyright (c) 2024-present The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <util/feefrac.h>
+#include <random.h>
+
+#include <boost/test/unit_test.hpp>
+
+BOOST_AUTO_TEST_SUITE(feefrac_tests)
+
+BOOST_AUTO_TEST_CASE(feefrac_operators)
+{
+ FeeFrac p1{1000, 100}, p2{500, 300};
+ FeeFrac sum{1500, 400};
+ FeeFrac diff{500, -200};
+ FeeFrac empty{0, 0};
+ FeeFrac zero_fee{0, 1}; // zero-fee allowed
+
+ BOOST_CHECK(empty == FeeFrac{}); // same as no-args
+
+ BOOST_CHECK(p1 == p1);
+ BOOST_CHECK(p1 + p2 == sum);
+ BOOST_CHECK(p1 - p2 == diff);
+
+ FeeFrac p3{2000, 200};
+ BOOST_CHECK(p1 != p3); // feefracs only equal if both fee and size are same
+ BOOST_CHECK(p2 != p3);
+
+ FeeFrac p4{3000, 300};
+ BOOST_CHECK(p1 == p4-p3);
+ BOOST_CHECK(p1 + p3 == p4);
+
+ // Fee-rate comparison
+ BOOST_CHECK(p1 > p2);
+ BOOST_CHECK(p1 >= p2);
+ BOOST_CHECK(p1 >= p4-p3);
+ BOOST_CHECK(!(p1 >> p3)); // not strictly better
+ BOOST_CHECK(p1 >> p2); // strictly greater feerate
+
+ BOOST_CHECK(p2 < p1);
+ BOOST_CHECK(p2 <= p1);
+ BOOST_CHECK(p1 <= p4-p3);
+ BOOST_CHECK(!(p3 << p1)); // not strictly worse
+ BOOST_CHECK(p2 << p1); // strictly lower feerate
+
+ // "empty" comparisons
+ BOOST_CHECK(!(p1 >> empty)); // << will always result in false
+ BOOST_CHECK(!(p1 << empty));
+ BOOST_CHECK(!(empty >> empty));
+ BOOST_CHECK(!(empty << empty));
+
+ // empty is always bigger than everything else
+ BOOST_CHECK(empty > p1);
+ BOOST_CHECK(empty > p2);
+ BOOST_CHECK(empty > p3);
+ BOOST_CHECK(empty >= p1);
+ BOOST_CHECK(empty >= p2);
+ BOOST_CHECK(empty >= p3);
+
+ // check "max" values for comparison
+ FeeFrac oversized_1{4611686000000, 4000000};
+ FeeFrac oversized_2{184467440000000, 100000};
+
+ BOOST_CHECK(oversized_1 < oversized_2);
+ BOOST_CHECK(oversized_1 <= oversized_2);
+ BOOST_CHECK(oversized_1 << oversized_2);
+ BOOST_CHECK(oversized_1 != oversized_2);
+
+ // Tests paths that use double arithmetic
+ FeeFrac busted{(static_cast<int64_t>(INT32_MAX)) + 1, INT32_MAX};
+ BOOST_CHECK(!(busted < busted));
+
+ FeeFrac max_fee{2100000000000000, INT32_MAX};
+ BOOST_CHECK(!(max_fee < max_fee));
+ BOOST_CHECK(!(max_fee > max_fee));
+ BOOST_CHECK(max_fee <= max_fee);
+ BOOST_CHECK(max_fee >= max_fee);
+
+ FeeFrac max_fee2{1, 1};
+ BOOST_CHECK(max_fee >= max_fee2);
+
+}
+
+BOOST_AUTO_TEST_CASE(build_diagram_test)
+{
+ FeeFrac p1{1000, 100};
+ FeeFrac empty{0, 0};
+ FeeFrac zero_fee{0, 1};
+ FeeFrac oversized_1{4611686000000, 4000000};
+ FeeFrac oversized_2{184467440000000, 100000};
+
+ // Diagram-building will reorder chunks
+ std::vector<FeeFrac> chunks;
+ chunks.push_back(p1);
+ chunks.push_back(zero_fee);
+ chunks.push_back(empty);
+ chunks.push_back(oversized_1);
+ chunks.push_back(oversized_2);
+
+ // Caller in charge of sorting chunks in case chunk size limit
+ // differs from cluster size limit
+ std::sort(chunks.begin(), chunks.end(), [](const FeeFrac& a, const FeeFrac& b) { return a > b; });
+
+ // Chunks are now sorted in reverse order (largest first)
+ BOOST_CHECK(chunks[0] == empty); // empty is considered "highest" fee
+ BOOST_CHECK(chunks[1] == oversized_2);
+ BOOST_CHECK(chunks[2] == oversized_1);
+ BOOST_CHECK(chunks[3] == p1);
+ BOOST_CHECK(chunks[4] == zero_fee);
+
+ std::vector<FeeFrac> generated_diagram{BuildDiagramFromChunks(chunks)};
+ BOOST_CHECK(generated_diagram.size() == 1 + chunks.size());
+
+ // Prepended with an empty, then the chunks summed in order as above
+ BOOST_CHECK(generated_diagram[0] == empty);
+ BOOST_CHECK(generated_diagram[1] == empty);
+ BOOST_CHECK(generated_diagram[2] == oversized_2);
+ BOOST_CHECK(generated_diagram[3] == oversized_2 + oversized_1);
+ BOOST_CHECK(generated_diagram[4] == oversized_2 + oversized_1 + p1);
+ BOOST_CHECK(generated_diagram[5] == oversized_2 + oversized_1 + p1 + zero_fee);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/fuzz/feefrac.cpp b/src/test/fuzz/feefrac.cpp
new file mode 100644
index 0000000000..2c7553360e
--- /dev/null
+++ b/src/test/fuzz/feefrac.cpp
@@ -0,0 +1,123 @@
+// Copyright (c) 2024 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <util/feefrac.h>
+#include <test/fuzz/FuzzedDataProvider.h>
+#include <test/fuzz/fuzz.h>
+#include <test/fuzz/util.h>
+
+#include <compare>
+#include <cstdint>
+#include <iostream>
+
+namespace {
+
+/** Compute a * b, represented in 4x32 bits, highest limb first. */
+std::array<uint32_t, 4> Mul128(uint64_t a, uint64_t b)
+{
+ std::array<uint32_t, 4> ret{0, 0, 0, 0};
+
+ /** Perform ret += v << (32 * pos), at 128-bit precision. */
+ auto add_fn = [&](uint64_t v, int pos) {
+ uint64_t accum{0};
+ for (int i = 0; i + pos < 4; ++i) {
+ // Add current value at limb pos in ret.
+ accum += ret[3 - pos - i];
+ // Add low or high half of v.
+ if (i == 0) accum += v & 0xffffffff;
+ if (i == 1) accum += v >> 32;
+ // Store lower half of result in limb pos in ret.
+ ret[3 - pos - i] = accum & 0xffffffff;
+ // Leave carry in accum.
+ accum >>= 32;
+ }
+ // Make sure no overflow.
+ assert(accum == 0);
+ };
+
+ // Multiply the 4 individual limbs (schoolbook multiply, with base 2^32).
+ add_fn((a & 0xffffffff) * (b & 0xffffffff), 0);
+ add_fn((a >> 32) * (b & 0xffffffff), 1);
+ add_fn((a & 0xffffffff) * (b >> 32), 1);
+ add_fn((a >> 32) * (b >> 32), 2);
+ return ret;
+}
+
+/* comparison helper for std::array */
+std::strong_ordering compare_arrays(const std::array<uint32_t, 4>& a, const std::array<uint32_t, 4>& b) {
+ for (size_t i = 0; i < a.size(); ++i) {
+ if (a[i] != b[i]) return a[i] <=> b[i];
+ }
+ return std::strong_ordering::equal;
+}
+
+std::strong_ordering MulCompare(int64_t a1, int64_t a2, int64_t b1, int64_t b2)
+{
+ // Compute and compare signs.
+ int sign_a = (a1 == 0 ? 0 : a1 < 0 ? -1 : 1) * (a2 == 0 ? 0 : a2 < 0 ? -1 : 1);
+ int sign_b = (b1 == 0 ? 0 : b1 < 0 ? -1 : 1) * (b2 == 0 ? 0 : b2 < 0 ? -1 : 1);
+ if (sign_a != sign_b) return sign_a <=> sign_b;
+
+ // Compute absolute values.
+ uint64_t abs_a1 = static_cast<uint64_t>(a1), abs_a2 = static_cast<uint64_t>(a2);
+ uint64_t abs_b1 = static_cast<uint64_t>(b1), abs_b2 = static_cast<uint64_t>(b2);
+ // Use (~x + 1) instead of the equivalent (-x) to silence the linter; mod 2^64 behavior is
+ // intentional here.
+ if (a1 < 0) abs_a1 = ~abs_a1 + 1;
+ if (a2 < 0) abs_a2 = ~abs_a2 + 1;
+ if (b1 < 0) abs_b1 = ~abs_b1 + 1;
+ if (b2 < 0) abs_b2 = ~abs_b2 + 1;
+
+ // Compute products of absolute values.
+ auto mul_abs_a = Mul128(abs_a1, abs_a2);
+ auto mul_abs_b = Mul128(abs_b1, abs_b2);
+ if (sign_a < 0) {
+ return compare_arrays(mul_abs_b, mul_abs_a);
+ } else {
+ return compare_arrays(mul_abs_a, mul_abs_b);
+ }
+}
+
+} // namespace
+
+FUZZ_TARGET(feefrac)
+{
+ FuzzedDataProvider provider(buffer.data(), buffer.size());
+
+ int64_t f1 = provider.ConsumeIntegral<int64_t>();
+ int32_t s1 = provider.ConsumeIntegral<int32_t>();
+ if (s1 == 0) f1 = 0;
+ FeeFrac fr1(f1, s1);
+ assert(fr1.IsEmpty() == (s1 == 0));
+
+ int64_t f2 = provider.ConsumeIntegral<int64_t>();
+ int32_t s2 = provider.ConsumeIntegral<int32_t>();
+ if (s2 == 0) f2 = 0;
+ FeeFrac fr2(f2, s2);
+ assert(fr2.IsEmpty() == (s2 == 0));
+
+ // Feerate comparisons
+ auto cmp_feerate = MulCompare(f1, s2, f2, s1);
+ assert(FeeRateCompare(fr1, fr2) == cmp_feerate);
+ assert((fr1 << fr2) == std::is_lt(cmp_feerate));
+ assert((fr1 >> fr2) == std::is_gt(cmp_feerate));
+
+ // Compare with manual invocation of FeeFrac::Mul.
+ auto cmp_mul = FeeFrac::Mul(f1, s2) <=> FeeFrac::Mul(f2, s1);
+ assert(cmp_mul == cmp_feerate);
+
+ // Same, but using FeeFrac::MulFallback.
+ auto cmp_fallback = FeeFrac::MulFallback(f1, s2) <=> FeeFrac::MulFallback(f2, s1);
+ assert(cmp_fallback == cmp_feerate);
+
+ // Total order comparisons
+ auto cmp_total = std::is_eq(cmp_feerate) ? (s2 <=> s1) : cmp_feerate;
+ assert((fr1 <=> fr2) == cmp_total);
+ assert((fr1 < fr2) == std::is_lt(cmp_total));
+ assert((fr1 > fr2) == std::is_gt(cmp_total));
+ assert((fr1 <= fr2) == std::is_lteq(cmp_total));
+ assert((fr1 >= fr2) == std::is_gteq(cmp_total));
+ assert((fr1 == fr2) == std::is_eq(cmp_total));
+ assert((fr1 != fr2) == std::is_neq(cmp_total));
+}
diff --git a/src/test/fuzz/feeratediagram.cpp b/src/test/fuzz/feeratediagram.cpp
new file mode 100644
index 0000000000..6d710093cb
--- /dev/null
+++ b/src/test/fuzz/feeratediagram.cpp
@@ -0,0 +1,119 @@
+// Copyright (c) 2023 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <stdint.h>
+
+#include <vector>
+
+#include <util/feefrac.h>
+#include <policy/rbf.h>
+
+#include <test/fuzz/fuzz.h>
+#include <test/fuzz/util.h>
+
+#include <assert.h>
+
+namespace {
+
+/** Evaluate a diagram at a specific size, returning the fee as a fraction.
+ *
+ * Fees in diagram cannot exceed 2^32, as the returned evaluation could overflow
+ * the FeeFrac::fee field in the result. */
+FeeFrac EvaluateDiagram(int32_t size, Span<const FeeFrac> diagram)
+{
+ assert(diagram.size() > 0);
+ unsigned not_above = 0;
+ unsigned not_below = diagram.size() - 1;
+ // If outside the range of diagram, extend begin/end.
+ if (size < diagram[not_above].size) return {diagram[not_above].fee, 1};
+ if (size > diagram[not_below].size) return {diagram[not_below].fee, 1};
+ // Perform bisection search to locate the diagram segment that size is in.
+ while (not_below > not_above + 1) {
+ unsigned mid = (not_below + not_above) / 2;
+ if (diagram[mid].size <= size) not_above = mid;
+ if (diagram[mid].size >= size) not_below = mid;
+ }
+ // If the size matches a transition point between segments, return its fee.
+ if (not_below == not_above) return {diagram[not_below].fee, 1};
+ // Otherwise, interpolate.
+ auto dir_coef = diagram[not_below] - diagram[not_above];
+ assert(dir_coef.size > 0);
+ // Let A = diagram[not_above] and B = diagram[not_below]
+ const auto& point_a = diagram[not_above];
+ // We want to return:
+ // A.fee + (B.fee - A.fee) / (B.size - A.size) * (size - A.size)
+ // = A.fee + dir_coef.fee / dir_coef.size * (size - A.size)
+ // = (A.fee * dir_coef.size + dir_coef.fee * (size - A.size)) / dir_coef.size
+ assert(size >= point_a.size);
+ return {point_a.fee * dir_coef.size + dir_coef.fee * (size - point_a.size), dir_coef.size};
+}
+
+std::weak_ordering CompareFeeFracWithDiagram(const FeeFrac& ff, Span<const FeeFrac> diagram)
+{
+ return FeeRateCompare(FeeFrac{ff.fee, 1}, EvaluateDiagram(ff.size, diagram));
+}
+
+std::partial_ordering CompareDiagrams(Span<const FeeFrac> dia1, Span<const FeeFrac> dia2)
+{
+ bool all_ge = true;
+ bool all_le = true;
+ for (const auto p1 : dia1) {
+ auto cmp = CompareFeeFracWithDiagram(p1, dia2);
+ if (std::is_lt(cmp)) all_ge = false;
+ if (std::is_gt(cmp)) all_le = false;
+ }
+ for (const auto p2 : dia2) {
+ auto cmp = CompareFeeFracWithDiagram(p2, dia1);
+ if (std::is_lt(cmp)) all_le = false;
+ if (std::is_gt(cmp)) all_ge = false;
+ }
+ if (all_ge && all_le) return std::partial_ordering::equivalent;
+ if (all_ge && !all_le) return std::partial_ordering::greater;
+ if (!all_ge && all_le) return std::partial_ordering::less;
+ return std::partial_ordering::unordered;
+}
+
+void PopulateChunks(FuzzedDataProvider& fuzzed_data_provider, std::vector<FeeFrac>& chunks)
+{
+ chunks.clear();
+
+ LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 50)
+ {
+ chunks.emplace_back(fuzzed_data_provider.ConsumeIntegralInRange<int64_t>(INT32_MIN>>1, INT32_MAX>>1), fuzzed_data_provider.ConsumeIntegralInRange<int32_t>(1, 1000000));
+ }
+ return;
+}
+
+} // namespace
+
+FUZZ_TARGET(build_and_compare_feerate_diagram)
+{
+ // Generate a random set of chunks
+ FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
+ std::vector<FeeFrac> chunks1, chunks2;
+ FeeFrac empty{0, 0};
+
+ PopulateChunks(fuzzed_data_provider, chunks1);
+ PopulateChunks(fuzzed_data_provider, chunks2);
+
+ std::vector<FeeFrac> diagram1{BuildDiagramFromChunks(chunks1)};
+ std::vector<FeeFrac> diagram2{BuildDiagramFromChunks(chunks2)};
+
+ assert(diagram1.front() == empty);
+ assert(diagram2.front() == empty);
+
+ auto real = CompareFeerateDiagram(diagram1, diagram2);
+ auto sim = CompareDiagrams(diagram1, diagram2);
+ assert(real == sim);
+
+ // Do explicit evaluation at up to 1000 points, and verify consistency with the result.
+ LIMITED_WHILE(fuzzed_data_provider.remaining_bytes(), 1000) {
+ int32_t size = fuzzed_data_provider.ConsumeIntegralInRange<int32_t>(0, diagram2.back().size);
+ auto eval1 = EvaluateDiagram(size, diagram1);
+ auto eval2 = EvaluateDiagram(size, diagram2);
+ auto cmp = FeeRateCompare(eval1, eval2);
+ if (std::is_lt(cmp)) assert(!std::is_gt(real));
+ if (std::is_gt(cmp)) assert(!std::is_lt(real));
+ }
+}
diff --git a/src/test/fuzz/fuzz.cpp b/src/test/fuzz/fuzz.cpp
index 6de480ff15..a8e490b459 100644
--- a/src/test/fuzz/fuzz.cpp
+++ b/src/test/fuzz/fuzz.cpp
@@ -35,6 +35,8 @@ __AFL_FUZZ_INIT();
const std::function<void(const std::string&)> G_TEST_LOG_FUN{};
+const std::function<std::string()> G_TEST_GET_FULL_NAME{};
+
/**
* A copy of the command line arguments that start with `--`.
* First `LLVMFuzzerInitialize()` is called, which saves the arguments to `g_args`.
@@ -81,7 +83,7 @@ static const TypeTestOneInput* g_test_one_input{nullptr};
void initialize()
{
// Terminate immediately if a fuzzing harness ever tries to create a TCP socket.
- CreateSock = [](const CService&) -> std::unique_ptr<Sock> { std::terminate(); };
+ CreateSock = [](const sa_family_t&) -> std::unique_ptr<Sock> { std::terminate(); };
// Terminate immediately if a fuzzing harness ever tries to perform a DNS lookup.
g_dns_lookup = [](const std::string& name, bool allow_lookup) {
diff --git a/src/test/fuzz/headerssync.cpp b/src/test/fuzz/headerssync.cpp
index 62f6bbaffe..1aa878bd6d 100644
--- a/src/test/fuzz/headerssync.cpp
+++ b/src/test/fuzz/headerssync.cpp
@@ -108,7 +108,7 @@ FUZZ_TARGET(headers_sync_state, .init = initialize_headers_sync_state_fuzz)
// If we get to redownloading, the presynced headers need
// to have the min amount of work on them.
- assert(CalculateHeadersWork(all_headers) >= min_work);
+ assert(CalculateClaimedHeadersWork(all_headers) >= min_work);
}
}
diff --git a/src/test/fuzz/integer.cpp b/src/test/fuzz/integer.cpp
index 2577f9e97a..db246bb84e 100644
--- a/src/test/fuzz/integer.cpp
+++ b/src/test/fuzz/integer.cpp
@@ -80,7 +80,6 @@ FUZZ_TARGET(integer, .init = initialize_integer)
static const uint256 u256_max(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
const std::vector<uint256> v256{u256, u256_min, u256_max};
(void)ComputeMerkleRoot(v256);
- (void)CountBits(u64);
(void)DecompressAmount(u64);
{
if (std::optional<CAmount> parsed = ParseMoney(FormatMoney(i64))) {
diff --git a/src/test/fuzz/net.cpp b/src/test/fuzz/net.cpp
index c882bd766a..e8b1480c5b 100644
--- a/src/test/fuzz/net.cpp
+++ b/src/test/fuzz/net.cpp
@@ -77,3 +77,40 @@ FUZZ_TARGET(net, .init = initialize_net)
(void)node.HasPermission(net_permission_flags);
(void)node.ConnectedThroughNetwork();
}
+
+FUZZ_TARGET(local_address, .init = initialize_net)
+{
+ FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
+ CService service{ConsumeService(fuzzed_data_provider)};
+ CNode node{ConsumeNode(fuzzed_data_provider)};
+ {
+ LOCK(g_maplocalhost_mutex);
+ mapLocalHost.clear();
+ }
+ LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
+ CallOneOf(
+ fuzzed_data_provider,
+ [&] {
+ service = ConsumeService(fuzzed_data_provider);
+ },
+ [&] {
+ const bool added{AddLocal(service, fuzzed_data_provider.ConsumeIntegralInRange<int>(0, LOCAL_MAX - 1))};
+ if (!added) return;
+ assert(service.IsRoutable());
+ assert(IsLocal(service));
+ assert(SeenLocal(service));
+ },
+ [&] {
+ (void)RemoveLocal(service);
+ },
+ [&] {
+ (void)SeenLocal(service);
+ },
+ [&] {
+ (void)IsLocal(service);
+ },
+ [&] {
+ (void)GetLocalAddress(node);
+ });
+ }
+}
diff --git a/src/test/fuzz/net_permissions.cpp b/src/test/fuzz/net_permissions.cpp
index ae343602e9..811c0de4b9 100644
--- a/src/test/fuzz/net_permissions.cpp
+++ b/src/test/fuzz/net_permissions.cpp
@@ -3,6 +3,7 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <net_permissions.h>
+#include <netbase.h>
#include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
@@ -17,7 +18,7 @@
FUZZ_TARGET(net_permissions)
{
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
- const std::string s = fuzzed_data_provider.ConsumeRandomLengthString(32);
+ const std::string s = fuzzed_data_provider.ConsumeRandomLengthString(1000);
const NetPermissionFlags net_permission_flags = ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS);
NetWhitebindPermissions net_whitebind_permissions;
@@ -31,8 +32,9 @@ FUZZ_TARGET(net_permissions)
}
NetWhitelistPermissions net_whitelist_permissions;
+ ConnectionDirection connection_direction;
bilingual_str error_net_whitelist_permissions;
- if (NetWhitelistPermissions::TryParse(s, net_whitelist_permissions, error_net_whitelist_permissions)) {
+ if (NetWhitelistPermissions::TryParse(s, net_whitelist_permissions, connection_direction, error_net_whitelist_permissions)) {
(void)NetPermissions::ToStrings(net_whitelist_permissions.m_flags);
(void)NetPermissions::AddFlag(net_whitelist_permissions.m_flags, net_permission_flags);
assert(NetPermissions::HasFlag(net_whitelist_permissions.m_flags, net_permission_flags));
diff --git a/src/test/fuzz/p2p_transport_serialization.cpp b/src/test/fuzz/p2p_transport_serialization.cpp
index a205ce19f4..1b7a732260 100644
--- a/src/test/fuzz/p2p_transport_serialization.cpp
+++ b/src/test/fuzz/p2p_transport_serialization.cpp
@@ -354,6 +354,7 @@ std::unique_ptr<Transport> MakeV2Transport(NodeId nodeid, bool initiator, RNG& r
} else {
// If it's longer, generate it from the RNG. This avoids having large amounts of
// (hopefully) irrelevant data needing to be stored in the fuzzer data.
+ garb.resize(garb_len);
for (auto& v : garb) v = uint8_t(rng());
}
// Retrieve entropy
diff --git a/src/test/fuzz/package_eval.cpp b/src/test/fuzz/package_eval.cpp
index 9e658e0ced..c801c2e325 100644
--- a/src/test/fuzz/package_eval.cpp
+++ b/src/test/fuzz/package_eval.cpp
@@ -47,7 +47,7 @@ void initialize_tx_pool()
g_outpoints_coinbase_init_mature.push_back(prevout);
}
}
- SyncWithValidationInterfaceQueue();
+ g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
}
struct OutpointsUpdater final : public CValidationInterface {
@@ -147,7 +147,7 @@ FUZZ_TARGET(tx_package_eval, .init = initialize_tx_pool)
}
auto outpoints_updater = std::make_shared<OutpointsUpdater>(mempool_outpoints);
- RegisterSharedValidationInterface(outpoints_updater);
+ node.validation_signals->RegisterSharedValidationInterface(outpoints_updater);
CTxMemPool tx_pool_{MakeMempool(fuzzed_data_provider, node)};
MockedTxPool& tx_pool = *static_cast<MockedTxPool*>(&tx_pool_);
@@ -269,7 +269,7 @@ FUZZ_TARGET(tx_package_eval, .init = initialize_tx_pool)
// Remember all added transactions
std::set<CTransactionRef> added;
auto txr = std::make_shared<TransactionsDelta>(added);
- RegisterSharedValidationInterface(txr);
+ node.validation_signals->RegisterSharedValidationInterface(txr);
// When there are multiple transactions in the package, we call ProcessNewPackage(txs, test_accept=false)
// and AcceptToMemoryPool(txs.back(), test_accept=true). When there is only 1 transaction, we might flip it
@@ -277,7 +277,7 @@ FUZZ_TARGET(tx_package_eval, .init = initialize_tx_pool)
auto single_submit = txs.size() == 1 && fuzzed_data_provider.ConsumeBool();
const auto result_package = WITH_LOCK(::cs_main,
- return ProcessNewPackage(chainstate, tx_pool, txs, /*test_accept=*/single_submit));
+ return ProcessNewPackage(chainstate, tx_pool, txs, /*test_accept=*/single_submit, /*client_maxfeerate=*/{}));
// Always set bypass_limits to false because it is not supported in ProcessNewPackage and
// can be a source of divergence.
@@ -285,8 +285,8 @@ FUZZ_TARGET(tx_package_eval, .init = initialize_tx_pool)
/*bypass_limits=*/false, /*test_accept=*/!single_submit));
const bool passed = res.m_result_type == MempoolAcceptResult::ResultType::VALID;
- SyncWithValidationInterfaceQueue();
- UnregisterSharedValidationInterface(txr);
+ node.validation_signals->SyncWithValidationInterfaceQueue();
+ node.validation_signals->UnregisterSharedValidationInterface(txr);
// There is only 1 transaction in the package. We did a test-package-accept and a ATMP
if (single_submit) {
@@ -310,7 +310,7 @@ FUZZ_TARGET(tx_package_eval, .init = initialize_tx_pool)
CheckMempoolV3Invariants(tx_pool);
}
- UnregisterSharedValidationInterface(outpoints_updater);
+ node.validation_signals->UnregisterSharedValidationInterface(outpoints_updater);
WITH_LOCK(::cs_main, tx_pool.check(chainstate.CoinsTip(), chainstate.m_chain.Height() + 1));
}
diff --git a/src/test/fuzz/process_message.cpp b/src/test/fuzz/process_message.cpp
index 56b391ed5c..a467fd5382 100644
--- a/src/test/fuzz/process_message.cpp
+++ b/src/test/fuzz/process_message.cpp
@@ -47,7 +47,7 @@ void initialize_process_message()
for (int i = 0; i < 2 * COINBASE_MATURITY; i++) {
MineBlock(g_setup->m_node, CScript() << OP_TRUE);
}
- SyncWithValidationInterfaceQueue();
+ g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
}
FUZZ_TARGET(process_message, .init = initialize_process_message)
@@ -89,6 +89,6 @@ FUZZ_TARGET(process_message, .init = initialize_process_message)
}
g_setup->m_node.peerman->SendMessages(&p2p_node);
}
- SyncWithValidationInterfaceQueue();
+ g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
g_setup->m_node.connman->StopNodes();
}
diff --git a/src/test/fuzz/process_messages.cpp b/src/test/fuzz/process_messages.cpp
index 6b264907b5..38acd432fa 100644
--- a/src/test/fuzz/process_messages.cpp
+++ b/src/test/fuzz/process_messages.cpp
@@ -37,7 +37,7 @@ void initialize_process_messages()
for (int i = 0; i < 2 * COINBASE_MATURITY; i++) {
MineBlock(g_setup->m_node, CScript() << OP_TRUE);
}
- SyncWithValidationInterfaceQueue();
+ g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
}
FUZZ_TARGET(process_messages, .init = initialize_process_messages)
@@ -89,6 +89,6 @@ FUZZ_TARGET(process_messages, .init = initialize_process_messages)
g_setup->m_node.peerman->SendMessages(&random_node);
}
}
- SyncWithValidationInterfaceQueue();
+ g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
g_setup->m_node.connman->StopNodes();
}
diff --git a/src/test/fuzz/rbf.cpp b/src/test/fuzz/rbf.cpp
index aa6385d12d..754aff4e70 100644
--- a/src/test/fuzz/rbf.cpp
+++ b/src/test/fuzz/rbf.cpp
@@ -23,12 +23,30 @@ namespace {
const BasicTestingSetup* g_setup;
} // namespace
+const int NUM_ITERS = 10000;
+
+std::vector<COutPoint> g_outpoints;
+
void initialize_rbf()
{
static const auto testing_setup = MakeNoLogFileContext<>();
g_setup = testing_setup.get();
}
+void initialize_package_rbf()
+{
+ static const auto testing_setup = MakeNoLogFileContext<>();
+ g_setup = testing_setup.get();
+
+ // Create a fixed set of unique "UTXOs" to source parents from
+ // to avoid fuzzer giving circular references
+ for (int i = 0; i < NUM_ITERS; ++i) {
+ g_outpoints.emplace_back();
+ g_outpoints.back().n = i;
+ }
+
+}
+
FUZZ_TARGET(rbf, .init = initialize_rbf)
{
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
@@ -40,7 +58,7 @@ FUZZ_TARGET(rbf, .init = initialize_rbf)
CTxMemPool pool{MemPoolOptionsForTest(g_setup->m_node)};
- LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000)
+ LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), NUM_ITERS)
{
const std::optional<CMutableTransaction> another_mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider, TX_WITH_WITNESS);
if (!another_mtx) {
@@ -63,3 +81,113 @@ FUZZ_TARGET(rbf, .init = initialize_rbf)
(void)IsRBFOptIn(tx, pool);
}
}
+
+void CheckDiagramConcave(std::vector<FeeFrac>& diagram)
+{
+ // Diagrams are in monotonically-decreasing feerate order.
+ FeeFrac last_chunk = diagram.front();
+ for (size_t i = 1; i<diagram.size(); ++i) {
+ FeeFrac next_chunk = diagram[i] - diagram[i-1];
+ assert(next_chunk <= last_chunk);
+ last_chunk = next_chunk;
+ }
+}
+
+FUZZ_TARGET(package_rbf, .init = initialize_package_rbf)
+{
+ FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
+ SetMockTime(ConsumeTime(fuzzed_data_provider));
+
+ std::optional<CMutableTransaction> child = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider, TX_WITH_WITNESS);
+ if (!child) return;
+
+ CTxMemPool pool{MemPoolOptionsForTest(g_setup->m_node)};
+
+ // Add a bunch of parent-child pairs to the mempool, and remember them.
+ std::vector<CTransaction> mempool_txs;
+ size_t iter{0};
+
+ LOCK2(cs_main, pool.cs);
+
+ LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), NUM_ITERS)
+ {
+ // Make sure txns only have one input, and that a unique input is given to avoid circular references
+ std::optional<CMutableTransaction> parent = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider, TX_WITH_WITNESS);
+ if (!parent) {
+ continue;
+ }
+ assert(iter <= g_outpoints.size());
+ parent->vin.resize(1);
+ parent->vin[0].prevout = g_outpoints[iter++];
+
+ mempool_txs.emplace_back(*parent);
+ pool.addUnchecked(ConsumeTxMemPoolEntry(fuzzed_data_provider, mempool_txs.back()));
+ if (fuzzed_data_provider.ConsumeBool() && !child->vin.empty()) {
+ child->vin[0].prevout = COutPoint{mempool_txs.back().GetHash(), 0};
+ }
+ mempool_txs.emplace_back(*child);
+ pool.addUnchecked(ConsumeTxMemPoolEntry(fuzzed_data_provider, mempool_txs.back()));
+
+ if (fuzzed_data_provider.ConsumeBool()) {
+ pool.PrioritiseTransaction(mempool_txs.back().GetHash().ToUint256(), fuzzed_data_provider.ConsumeIntegralInRange<int32_t>(-100000, 100000));
+ }
+ }
+
+ // Pick some transactions at random to be the direct conflicts
+ CTxMemPool::setEntries direct_conflicts;
+ for (auto& tx : mempool_txs) {
+ if (fuzzed_data_provider.ConsumeBool()) {
+ direct_conflicts.insert(*pool.GetIter(tx.GetHash()));
+ }
+ }
+
+ // Calculate all conflicts:
+ CTxMemPool::setEntries all_conflicts;
+ for (auto& txiter : direct_conflicts) {
+ pool.CalculateDescendants(txiter, all_conflicts);
+ }
+
+ // Calculate the feerate diagrams for a replacement.
+ CAmount replacement_fees = ConsumeMoney(fuzzed_data_provider);
+ int64_t replacement_vsize = fuzzed_data_provider.ConsumeIntegralInRange<int64_t>(1, 1000000);
+ auto calc_results{pool.CalculateFeerateDiagramsForRBF(replacement_fees, replacement_vsize, direct_conflicts, all_conflicts)};
+
+ if (calc_results.has_value()) {
+ // Sanity checks on the diagrams.
+
+ // Diagrams start at 0.
+ assert(calc_results->first.front().size == 0);
+ assert(calc_results->first.front().fee == 0);
+ assert(calc_results->second.front().size == 0);
+ assert(calc_results->second.front().fee == 0);
+
+ CheckDiagramConcave(calc_results->first);
+ CheckDiagramConcave(calc_results->second);
+
+ CAmount replaced_fee{0};
+ int64_t replaced_size{0};
+ for (auto txiter : all_conflicts) {
+ replaced_fee += txiter->GetModifiedFee();
+ replaced_size += txiter->GetTxSize();
+ }
+ // The total fee of the new diagram should be the total fee of the old
+ // diagram - replaced_fee + replacement_fees
+ assert(calc_results->first.back().fee - replaced_fee + replacement_fees == calc_results->second.back().fee);
+ assert(calc_results->first.back().size - replaced_size + replacement_vsize == calc_results->second.back().size);
+ }
+
+ // If internals report error, wrapper should too
+ auto err_tuple{ImprovesFeerateDiagram(pool, direct_conflicts, all_conflicts, replacement_fees, replacement_vsize)};
+ if (!calc_results.has_value()) {
+ assert(err_tuple.value().first == DiagramCheckError::UNCALCULABLE);
+ } else {
+ // Diagram check succeeded
+ if (!err_tuple.has_value()) {
+ // New diagram's final fee should always match or exceed old diagram's
+ assert(calc_results->first.back().fee <= calc_results->second.back().fee);
+ } else if (calc_results->first.back().fee > calc_results->second.back().fee) {
+ // Or it failed, and if old diagram had higher fees, it should be a failure
+ assert(err_tuple.value().first == DiagramCheckError::FAILURE);
+ }
+ }
+}
diff --git a/src/test/fuzz/script_bitcoin_consensus.cpp b/src/test/fuzz/script_bitcoin_consensus.cpp
deleted file mode 100644
index 846389863d..0000000000
--- a/src/test/fuzz/script_bitcoin_consensus.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2020 The Bitcoin Core developers
-// Distributed under the MIT software license, see the accompanying
-// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-#include <script/bitcoinconsensus.h>
-#include <script/interpreter.h>
-#include <test/fuzz/FuzzedDataProvider.h>
-#include <test/fuzz/fuzz.h>
-#include <test/fuzz/util.h>
-
-#include <cstdint>
-#include <string>
-#include <vector>
-
-FUZZ_TARGET(script_bitcoin_consensus)
-{
- FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
- const std::vector<uint8_t> random_bytes_1 = ConsumeRandomLengthByteVector(fuzzed_data_provider);
- const std::vector<uint8_t> random_bytes_2 = ConsumeRandomLengthByteVector(fuzzed_data_provider);
- const CAmount money = ConsumeMoney(fuzzed_data_provider);
- bitcoinconsensus_error err;
- bitcoinconsensus_error* err_p = fuzzed_data_provider.ConsumeBool() ? &err : nullptr;
- const unsigned int n_in = fuzzed_data_provider.ConsumeIntegral<unsigned int>();
- const unsigned int flags = fuzzed_data_provider.ConsumeIntegral<unsigned int>();
- assert(bitcoinconsensus_version() == BITCOINCONSENSUS_API_VER);
- if ((flags & SCRIPT_VERIFY_WITNESS) != 0 && (flags & SCRIPT_VERIFY_P2SH) == 0) {
- return;
- }
- (void)bitcoinconsensus_verify_script(random_bytes_1.data(), random_bytes_1.size(), random_bytes_2.data(), random_bytes_2.size(), n_in, flags, err_p);
- (void)bitcoinconsensus_verify_script_with_amount(random_bytes_1.data(), random_bytes_1.size(), money, random_bytes_2.data(), random_bytes_2.size(), n_in, flags, err_p);
-
- std::vector<UTXO> spent_outputs;
- std::vector<std::vector<unsigned char>> spent_spks;
- if (n_in <= 24386) {
- spent_outputs.reserve(n_in);
- spent_spks.reserve(n_in);
- for (size_t i = 0; i < n_in; ++i) {
- spent_spks.push_back(ConsumeRandomLengthByteVector(fuzzed_data_provider));
- const CAmount value{ConsumeMoney(fuzzed_data_provider)};
- const auto spk_size{static_cast<unsigned>(spent_spks.back().size())};
- spent_outputs.push_back({.scriptPubKey = spent_spks.back().data(), .scriptPubKeySize = spk_size, .value = value});
- }
- }
-
- const auto spent_outs_size{static_cast<unsigned>(spent_outputs.size())};
-
- (void)bitcoinconsensus_verify_script_with_spent_outputs(
- random_bytes_1.data(), random_bytes_1.size(), money, random_bytes_2.data(), random_bytes_2.size(),
- spent_outputs.data(), spent_outs_size, n_in, flags, err_p);
-}
diff --git a/src/test/fuzz/tx_pool.cpp b/src/test/fuzz/tx_pool.cpp
index b44b528b6f..0b4019d5eb 100644
--- a/src/test/fuzz/tx_pool.cpp
+++ b/src/test/fuzz/tx_pool.cpp
@@ -50,7 +50,7 @@ void initialize_tx_pool()
g_outpoints_coinbase_init_immature;
outpoints.push_back(prevout);
}
- SyncWithValidationInterfaceQueue();
+ g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
}
struct TransactionsDelta final : public CValidationInterface {
@@ -105,7 +105,7 @@ void Finish(FuzzedDataProvider& fuzzed_data_provider, MockedTxPool& tx_pool, Cha
assert(tx_pool.size() < info_all.size());
WITH_LOCK(::cs_main, tx_pool.check(chainstate.CoinsTip(), chainstate.m_chain.Height() + 1));
}
- SyncWithValidationInterfaceQueue();
+ g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
}
void MockTime(FuzzedDataProvider& fuzzed_data_provider, const Chainstate& chainstate)
@@ -285,13 +285,13 @@ FUZZ_TARGET(tx_pool_standard, .init = initialize_tx_pool)
std::set<CTransactionRef> removed;
std::set<CTransactionRef> added;
auto txr = std::make_shared<TransactionsDelta>(removed, added);
- RegisterSharedValidationInterface(txr);
+ node.validation_signals->RegisterSharedValidationInterface(txr);
const bool bypass_limits = fuzzed_data_provider.ConsumeBool();
// Make sure ProcessNewPackage on one transaction works.
// The result is not guaranteed to be the same as what is returned by ATMP.
const auto result_package = WITH_LOCK(::cs_main,
- return ProcessNewPackage(chainstate, tx_pool, {tx}, true));
+ return ProcessNewPackage(chainstate, tx_pool, {tx}, true, /*client_maxfeerate=*/{}));
// If something went wrong due to a package-specific policy, it might not return a
// validation result for the transaction.
if (result_package.m_state.GetResult() != PackageValidationResult::PCKG_POLICY) {
@@ -303,8 +303,8 @@ FUZZ_TARGET(tx_pool_standard, .init = initialize_tx_pool)
const auto res = WITH_LOCK(::cs_main, return AcceptToMemoryPool(chainstate, tx, GetTime(), bypass_limits, /*test_accept=*/false));
const bool accepted = res.m_result_type == MempoolAcceptResult::ResultType::VALID;
- SyncWithValidationInterfaceQueue();
- UnregisterSharedValidationInterface(txr);
+ node.validation_signals->SyncWithValidationInterfaceQueue();
+ node.validation_signals->UnregisterSharedValidationInterface(txr);
bool txid_in_mempool = tx_pool.exists(GenTxid::Txid(tx->GetHash()));
bool wtxid_in_mempool = tx_pool.exists(GenTxid::Wtxid(tx->GetWitnessHash()));
@@ -407,8 +407,6 @@ FUZZ_TARGET(tx_pool, .init = initialize_tx_pool)
const bool accepted = res.m_result_type == MempoolAcceptResult::ResultType::VALID;
if (accepted) {
txids.push_back(tx->GetHash());
- // Only check fees if accepted and not bypass_limits, otherwise it's not guaranteed that
- // trimming has happened for this tx and previous iterations.
CheckMempoolV3Invariants(tx_pool);
}
}
diff --git a/src/test/fuzz/util.cpp b/src/test/fuzz/util.cpp
index 23b0761355..259b00fcae 100644
--- a/src/test/fuzz/util.cpp
+++ b/src/test/fuzz/util.cpp
@@ -272,7 +272,7 @@ FILE* FuzzedFileProvider::open()
[&] {
mode = "a+";
});
-#if defined _GNU_SOURCE && !defined __ANDROID__
+#if defined _GNU_SOURCE && (defined(__linux__) || defined(__FreeBSD__))
const cookie_io_functions_t io_hooks = {
FuzzedFileProvider::read,
FuzzedFileProvider::write,
diff --git a/src/test/i2p_tests.cpp b/src/test/i2p_tests.cpp
index f80f07d190..d7249d88f4 100644
--- a/src/test/i2p_tests.cpp
+++ b/src/test/i2p_tests.cpp
@@ -6,6 +6,7 @@
#include <i2p.h>
#include <logging.h>
#include <netaddress.h>
+#include <netbase.h>
#include <test/util/logging.h>
#include <test/util/net.h>
#include <test/util/setup_common.h>
@@ -38,7 +39,7 @@ public:
private:
const BCLog::Level m_prev_log_level;
- const std::function<std::unique_ptr<Sock>(const CService&)> m_create_sock_orig;
+ const std::function<std::unique_ptr<Sock>(const sa_family_t&)> m_create_sock_orig;
};
BOOST_FIXTURE_TEST_SUITE(i2p_tests, EnvTestingSetup)
@@ -46,12 +47,14 @@ BOOST_FIXTURE_TEST_SUITE(i2p_tests, EnvTestingSetup)
BOOST_AUTO_TEST_CASE(unlimited_recv)
{
// Mock CreateSock() to create MockSock.
- CreateSock = [](const CService&) {
+ CreateSock = [](const sa_family_t&) {
return std::make_unique<StaticContentsSock>(std::string(i2p::sam::MAX_MSG_SIZE + 1, 'a'));
};
CThreadInterrupt interrupt;
- i2p::sam::Session session(gArgs.GetDataDirNet() / "test_i2p_private_key", CService{}, &interrupt);
+ const std::optional<CService> addr{Lookup("127.0.0.1", 9000, false)};
+ const Proxy sam_proxy(addr.value(), false);
+ i2p::sam::Session session(gArgs.GetDataDirNet() / "test_i2p_private_key", sam_proxy, &interrupt);
{
ASSERT_DEBUG_LOG("Creating persistent SAM session");
@@ -66,7 +69,7 @@ BOOST_AUTO_TEST_CASE(unlimited_recv)
BOOST_AUTO_TEST_CASE(listen_ok_accept_fail)
{
size_t num_sockets{0};
- CreateSock = [&num_sockets](const CService&) {
+ CreateSock = [&num_sockets](const sa_family_t&) {
// clang-format off
++num_sockets;
// First socket is the control socket for creating the session.
@@ -111,8 +114,10 @@ BOOST_AUTO_TEST_CASE(listen_ok_accept_fail)
};
CThreadInterrupt interrupt;
+ const CService addr{in6_addr(IN6ADDR_LOOPBACK_INIT), /*port=*/7656};
+ const Proxy sam_proxy(addr, false);
i2p::sam::Session session(gArgs.GetDataDirNet() / "test_i2p_private_key",
- CService{in6_addr(IN6ADDR_LOOPBACK_INIT), /*port=*/7656},
+ sam_proxy,
&interrupt);
i2p::Connection conn;
@@ -130,7 +135,7 @@ BOOST_AUTO_TEST_CASE(damaged_private_key)
{
const auto CreateSockOrig = CreateSock;
- CreateSock = [](const CService&) {
+ CreateSock = [](const sa_family_t&) {
return std::make_unique<StaticContentsSock>("HELLO REPLY RESULT=OK VERSION=3.1\n"
"SESSION STATUS RESULT=OK DESTINATION=\n");
};
@@ -154,7 +159,9 @@ BOOST_AUTO_TEST_CASE(damaged_private_key)
BOOST_REQUIRE(WriteBinaryFile(i2p_private_key_file, file_contents));
CThreadInterrupt interrupt;
- i2p::sam::Session session(i2p_private_key_file, CService{}, &interrupt);
+ const CService addr{in6_addr(IN6ADDR_LOOPBACK_INIT), /*port=*/7656};
+ const Proxy sam_proxy{addr, false};
+ i2p::sam::Session session(i2p_private_key_file, sam_proxy, &interrupt);
{
ASSERT_DEBUG_LOG("Creating persistent SAM session");
diff --git a/src/test/main.cpp b/src/test/main.cpp
index 0809f83c93..67740ece93 100644
--- a/src/test/main.cpp
+++ b/src/test/main.cpp
@@ -39,3 +39,10 @@ const std::function<std::vector<const char*>()> G_TEST_COMMAND_LINE_ARGUMENTS =
}
return args;
};
+
+/**
+ * Retrieve the boost unit test name.
+ */
+const std::function<std::string()> G_TEST_GET_FULL_NAME = []() {
+ return boost::unit_test::framework::current_test_case().full_name();
+};
diff --git a/src/test/netbase_tests.cpp b/src/test/netbase_tests.cpp
index fa70f62eb4..3422cb8023 100644
--- a/src/test/netbase_tests.cpp
+++ b/src/test/netbase_tests.cpp
@@ -366,6 +366,7 @@ BOOST_AUTO_TEST_CASE(netpermissions_test)
bilingual_str error;
NetWhitebindPermissions whitebindPermissions;
NetWhitelistPermissions whitelistPermissions;
+ ConnectionDirection connection_direction;
// Detect invalid white bind
BOOST_CHECK(!NetWhitebindPermissions::TryParse("", whitebindPermissions, error));
@@ -435,24 +436,33 @@ BOOST_AUTO_TEST_CASE(netpermissions_test)
BOOST_CHECK(NetWhitebindPermissions::TryParse(",,@1.2.3.4:32", whitebindPermissions, error));
BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::None);
+ BOOST_CHECK(!NetWhitebindPermissions::TryParse("out,forcerelay@1.2.3.4:32", whitebindPermissions, error));
+ BOOST_CHECK(error.original.find("whitebind may only be used for incoming connections (\"out\" was passed)") != std::string::npos);
+
// Detect invalid flag
BOOST_CHECK(!NetWhitebindPermissions::TryParse("bloom,forcerelay,oopsie@1.2.3.4:32", whitebindPermissions, error));
BOOST_CHECK(error.original.find("Invalid P2P permission") != std::string::npos);
// Check netmask error
- BOOST_CHECK(!NetWhitelistPermissions::TryParse("bloom,forcerelay,noban@1.2.3.4:32", whitelistPermissions, error));
+ BOOST_CHECK(!NetWhitelistPermissions::TryParse("bloom,forcerelay,noban@1.2.3.4:32", whitelistPermissions, connection_direction, error));
BOOST_CHECK(error.original.find("Invalid netmask specified in -whitelist") != std::string::npos);
// Happy path for whitelist parsing
- BOOST_CHECK(NetWhitelistPermissions::TryParse("noban@1.2.3.4", whitelistPermissions, error));
+ BOOST_CHECK(NetWhitelistPermissions::TryParse("noban@1.2.3.4", whitelistPermissions, connection_direction, error));
BOOST_CHECK_EQUAL(whitelistPermissions.m_flags, NetPermissionFlags::NoBan);
BOOST_CHECK(NetPermissions::HasFlag(whitelistPermissions.m_flags, NetPermissionFlags::NoBan));
- BOOST_CHECK(NetWhitelistPermissions::TryParse("bloom,forcerelay,noban,relay@1.2.3.4/32", whitelistPermissions, error));
+ BOOST_CHECK(NetWhitelistPermissions::TryParse("bloom,forcerelay,noban,relay@1.2.3.4/32", whitelistPermissions, connection_direction, error));
BOOST_CHECK_EQUAL(whitelistPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::ForceRelay | NetPermissionFlags::NoBan | NetPermissionFlags::Relay);
BOOST_CHECK(error.empty());
BOOST_CHECK_EQUAL(whitelistPermissions.m_subnet.ToString(), "1.2.3.4/32");
- BOOST_CHECK(NetWhitelistPermissions::TryParse("bloom,forcerelay,noban,relay,mempool@1.2.3.4/32", whitelistPermissions, error));
+ BOOST_CHECK(NetWhitelistPermissions::TryParse("bloom,forcerelay,noban,relay,mempool@1.2.3.4/32", whitelistPermissions, connection_direction, error));
+ BOOST_CHECK(NetWhitelistPermissions::TryParse("in,relay@1.2.3.4", whitelistPermissions, connection_direction, error));
+ BOOST_CHECK_EQUAL(connection_direction, ConnectionDirection::In);
+ BOOST_CHECK(NetWhitelistPermissions::TryParse("out,bloom@1.2.3.4", whitelistPermissions, connection_direction, error));
+ BOOST_CHECK_EQUAL(connection_direction, ConnectionDirection::Out);
+ BOOST_CHECK(NetWhitelistPermissions::TryParse("in,out,bloom@1.2.3.4", whitelistPermissions, connection_direction, error));
+ BOOST_CHECK_EQUAL(connection_direction, ConnectionDirection::Both);
const auto strings = NetPermissions::ToStrings(NetPermissionFlags::All);
BOOST_CHECK_EQUAL(strings.size(), 7U);
diff --git a/src/test/peerman_tests.cpp b/src/test/peerman_tests.cpp
index 2c79329385..28866695bc 100644
--- a/src/test/peerman_tests.cpp
+++ b/src/test/peerman_tests.cpp
@@ -25,7 +25,7 @@ static void mineBlock(const node::NodeContext& node, std::chrono::seconds block_
block.fChecked = true; // little speedup
SetMockTime(curr_time); // process block at current time
Assert(node.chainman->ProcessNewBlock(std::make_shared<const CBlock>(block), /*force_processing=*/true, /*min_pow_checked=*/true, nullptr));
- SyncWithValidationInterfaceQueue(); // drain events queue
+ node.validation_signals->SyncWithValidationInterfaceQueue(); // drain events queue
}
// Verifying when network-limited peer connections are desirable based on the node's proximity to the tip
@@ -57,7 +57,7 @@ BOOST_AUTO_TEST_CASE(connections_desirable_service_flags)
// By now, we tested that the connections desirable services flags change based on the node's time proximity to the tip.
// Now, perform the same tests for when the node receives a block.
- RegisterValidationInterface(peerman.get());
+ m_node.validation_signals->RegisterValidationInterface(peerman.get());
// First, verify a block in the past doesn't enable limited peers connections
// At this point, our time is (NODE_NETWORK_LIMITED_ALLOW_CONN_BLOCKS + 1) * 10 minutes ahead the tip's time.
diff --git a/src/test/policyestimator_tests.cpp b/src/test/policyestimator_tests.cpp
index ede73c6895..6cadc3290a 100644
--- a/src/test/policyestimator_tests.cpp
+++ b/src/test/policyestimator_tests.cpp
@@ -20,7 +20,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
{
CBlockPolicyEstimator& feeEst = *Assert(m_node.fee_estimator);
CTxMemPool& mpool = *Assert(m_node.mempool);
- RegisterValidationInterface(&feeEst);
+ m_node.validation_signals->RegisterValidationInterface(&feeEst);
TestMemPoolEntryHelper entry;
CAmount basefee(2000);
CAmount deltaFee(100);
@@ -74,7 +74,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
/*submitted_in_package=*/false,
/*chainstate_is_current=*/true,
/*has_no_mempool_parents=*/true)};
- GetMainSignals().TransactionAddedToMempool(tx_info, mpool.GetAndIncrementSequence());
+ m_node.validation_signals->TransactionAddedToMempool(tx_info, mpool.GetAndIncrementSequence());
}
uint256 hash = tx.GetHash();
txHashes[j].push_back(hash);
@@ -102,7 +102,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
// Check after just a few txs that combining buckets works as expected
if (blocknum == 3) {
// Wait for fee estimator to catch up
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
// At this point we should need to combine 3 buckets to get enough data points
// So estimateFee(1) should fail and estimateFee(2) should return somewhere around
// 9*baserate. estimateFee(2) %'s are 100,100,90 = average 97%
@@ -113,7 +113,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
}
// Wait for fee estimator to catch up
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
std::vector<CAmount> origFeeEst;
// Highest feerate is 10*baseRate and gets in all blocks,
@@ -146,7 +146,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
}
// Wait for fee estimator to catch up
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
BOOST_CHECK(feeEst.estimateFee(1) == CFeeRate(0));
for (int i = 2; i < 10;i++) {
@@ -175,7 +175,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
/*submitted_in_package=*/false,
/*chainstate_is_current=*/true,
/*has_no_mempool_parents=*/true)};
- GetMainSignals().TransactionAddedToMempool(tx_info, mpool.GetAndIncrementSequence());
+ m_node.validation_signals->TransactionAddedToMempool(tx_info, mpool.GetAndIncrementSequence());
}
uint256 hash = tx.GetHash();
txHashes[j].push_back(hash);
@@ -188,7 +188,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
}
// Wait for fee estimator to catch up
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
for (int i = 1; i < 10;i++) {
BOOST_CHECK(feeEst.estimateFee(i) == CFeeRate(0) || feeEst.estimateFee(i).GetFeePerK() > origFeeEst[i-1] - deltaFee);
@@ -212,7 +212,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
block.clear();
// Wait for fee estimator to catch up
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
BOOST_CHECK(feeEst.estimateFee(1) == CFeeRate(0));
for (int i = 2; i < 10;i++) {
@@ -239,7 +239,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
/*submitted_in_package=*/false,
/*chainstate_is_current=*/true,
/*has_no_mempool_parents=*/true)};
- GetMainSignals().TransactionAddedToMempool(tx_info, mpool.GetAndIncrementSequence());
+ m_node.validation_signals->TransactionAddedToMempool(tx_info, mpool.GetAndIncrementSequence());
}
uint256 hash = tx.GetHash();
CTransactionRef ptx = mpool.get(hash);
@@ -257,7 +257,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
block.clear();
}
// Wait for fee estimator to catch up
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
BOOST_CHECK(feeEst.estimateFee(1) == CFeeRate(0));
for (int i = 2; i < 9; i++) { // At 9, the original estimate was already at the bottom (b/c scale = 2)
BOOST_CHECK(feeEst.estimateFee(i).GetFeePerK() < origFeeEst[i-1] - deltaFee);
diff --git a/src/test/rbf_tests.cpp b/src/test/rbf_tests.cpp
index e6c135eed9..ed33969710 100644
--- a/src/test/rbf_tests.cpp
+++ b/src/test/rbf_tests.cpp
@@ -37,7 +37,38 @@ static inline CTransactionRef make_tx(const std::vector<CTransactionRef>& inputs
return MakeTransactionRef(tx);
}
-static void add_descendants(const CTransactionRef& tx, int32_t num_descendants, CTxMemPool& pool)
+// Make two child transactions from parent (which must have at least 2 outputs).
+// Each tx will have the same outputs, using the amounts specified in output_values.
+static inline std::pair<CTransactionRef, CTransactionRef> make_two_siblings(const CTransactionRef parent,
+ const std::vector<CAmount>& output_values)
+{
+ assert(parent->vout.size() >= 2);
+
+ // First tx takes first parent output
+ CMutableTransaction tx1 = CMutableTransaction();
+ tx1.vin.resize(1);
+ tx1.vout.resize(output_values.size());
+
+ tx1.vin[0].prevout.hash = parent->GetHash();
+ tx1.vin[0].prevout.n = 0;
+ // Add a witness so wtxid != txid
+ CScriptWitness witness;
+ witness.stack.emplace_back(10);
+ tx1.vin[0].scriptWitness = witness;
+
+ for (size_t i = 0; i < output_values.size(); ++i) {
+ tx1.vout[i].scriptPubKey = CScript() << OP_11 << OP_EQUAL;
+ tx1.vout[i].nValue = output_values[i];
+ }
+
+ // Second tx takes second parent output
+ CMutableTransaction tx2 = tx1;
+ tx2.vin[0].prevout.n = 1;
+
+ return std::make_pair(MakeTransactionRef(tx1), MakeTransactionRef(tx2));
+}
+
+static CTransactionRef add_descendants(const CTransactionRef& tx, int32_t num_descendants, CTxMemPool& pool)
EXCLUSIVE_LOCKS_REQUIRED(::cs_main, pool.cs)
{
AssertLockHeld(::cs_main);
@@ -50,6 +81,35 @@ static void add_descendants(const CTransactionRef& tx, int32_t num_descendants,
pool.addUnchecked(entry.FromTx(next_tx));
tx_to_spend = next_tx;
}
+ // Return last created tx
+ return tx_to_spend;
+}
+
+static CTransactionRef add_descendant_to_parents(const std::vector<CTransactionRef>& parents, CTxMemPool& pool)
+ EXCLUSIVE_LOCKS_REQUIRED(::cs_main, pool.cs)
+{
+ AssertLockHeld(::cs_main);
+ AssertLockHeld(pool.cs);
+ TestMemPoolEntryHelper entry;
+ // Assumes this isn't already spent in mempool
+ auto child_tx = make_tx(/*inputs=*/parents, /*output_values=*/{50 * CENT});
+ pool.addUnchecked(entry.FromTx(child_tx));
+ // Return last created tx
+ return child_tx;
+}
+
+// Makes two children for a single parent
+static std::pair<CTransactionRef, CTransactionRef> add_children_to_parent(const CTransactionRef parent, CTxMemPool& pool)
+ EXCLUSIVE_LOCKS_REQUIRED(::cs_main, pool.cs)
+{
+ AssertLockHeld(::cs_main);
+ AssertLockHeld(pool.cs);
+ TestMemPoolEntryHelper entry;
+ // Assumes this isn't already spent in mempool
+ auto children_tx = make_two_siblings(/*parent=*/parent, /*output_values=*/{50 * CENT});
+ pool.addUnchecked(entry.FromTx(children_tx.first));
+ pool.addUnchecked(entry.FromTx(children_tx.second));
+ return children_tx;
}
BOOST_FIXTURE_TEST_CASE(rbf_helper_functions, TestChain100Setup)
@@ -89,28 +149,51 @@ BOOST_FIXTURE_TEST_CASE(rbf_helper_functions, TestChain100Setup)
const auto tx8 = make_tx(/*inputs=*/ {m_coinbase_txns[4]}, /*output_values=*/ {999 * CENT});
pool.addUnchecked(entry.Fee(high_fee).FromTx(tx8));
- const auto entry1 = pool.GetIter(tx1->GetHash()).value();
- const auto entry2 = pool.GetIter(tx2->GetHash()).value();
- const auto entry3 = pool.GetIter(tx3->GetHash()).value();
- const auto entry4 = pool.GetIter(tx4->GetHash()).value();
- const auto entry5 = pool.GetIter(tx5->GetHash()).value();
- const auto entry6 = pool.GetIter(tx6->GetHash()).value();
- const auto entry7 = pool.GetIter(tx7->GetHash()).value();
- const auto entry8 = pool.GetIter(tx8->GetHash()).value();
-
- BOOST_CHECK_EQUAL(entry1->GetFee(), normal_fee);
- BOOST_CHECK_EQUAL(entry2->GetFee(), normal_fee);
- BOOST_CHECK_EQUAL(entry3->GetFee(), low_fee);
- BOOST_CHECK_EQUAL(entry4->GetFee(), high_fee);
- BOOST_CHECK_EQUAL(entry5->GetFee(), low_fee);
- BOOST_CHECK_EQUAL(entry6->GetFee(), low_fee);
- BOOST_CHECK_EQUAL(entry7->GetFee(), high_fee);
- BOOST_CHECK_EQUAL(entry8->GetFee(), high_fee);
-
- CTxMemPool::setEntries set_12_normal{entry1, entry2};
- CTxMemPool::setEntries set_34_cpfp{entry3, entry4};
- CTxMemPool::setEntries set_56_low{entry5, entry6};
- CTxMemPool::setEntries all_entries{entry1, entry2, entry3, entry4, entry5, entry6, entry7, entry8};
+ // Normal txs, will chain txns right before CheckConflictTopology test
+ const auto tx9 = make_tx(/*inputs=*/ {m_coinbase_txns[5]}, /*output_values=*/ {995 * CENT});
+ pool.addUnchecked(entry.Fee(normal_fee).FromTx(tx9));
+ const auto tx10 = make_tx(/*inputs=*/ {m_coinbase_txns[6]}, /*output_values=*/ {995 * CENT});
+ pool.addUnchecked(entry.Fee(normal_fee).FromTx(tx10));
+
+ // Will make these two parents of single child
+ const auto tx11 = make_tx(/*inputs=*/ {m_coinbase_txns[7]}, /*output_values=*/ {995 * CENT});
+ pool.addUnchecked(entry.Fee(normal_fee).FromTx(tx11));
+ const auto tx12 = make_tx(/*inputs=*/ {m_coinbase_txns[8]}, /*output_values=*/ {995 * CENT});
+ pool.addUnchecked(entry.Fee(normal_fee).FromTx(tx12));
+
+ // Will make two children of this single parent
+ const auto tx13 = make_tx(/*inputs=*/ {m_coinbase_txns[9]}, /*output_values=*/ {995 * CENT, 995 * CENT});
+ pool.addUnchecked(entry.Fee(normal_fee).FromTx(tx13));
+
+ const auto entry1_normal = pool.GetIter(tx1->GetHash()).value();
+ const auto entry2_normal = pool.GetIter(tx2->GetHash()).value();
+ const auto entry3_low = pool.GetIter(tx3->GetHash()).value();
+ const auto entry4_high = pool.GetIter(tx4->GetHash()).value();
+ const auto entry5_low = pool.GetIter(tx5->GetHash()).value();
+ const auto entry6_low_prioritised = pool.GetIter(tx6->GetHash()).value();
+ const auto entry7_high = pool.GetIter(tx7->GetHash()).value();
+ const auto entry8_high = pool.GetIter(tx8->GetHash()).value();
+ const auto entry9_unchained = pool.GetIter(tx9->GetHash()).value();
+ const auto entry10_unchained = pool.GetIter(tx10->GetHash()).value();
+ const auto entry11_unchained = pool.GetIter(tx11->GetHash()).value();
+ const auto entry12_unchained = pool.GetIter(tx12->GetHash()).value();
+ const auto entry13_unchained = pool.GetIter(tx13->GetHash()).value();
+
+ BOOST_CHECK_EQUAL(entry1_normal->GetFee(), normal_fee);
+ BOOST_CHECK_EQUAL(entry2_normal->GetFee(), normal_fee);
+ BOOST_CHECK_EQUAL(entry3_low->GetFee(), low_fee);
+ BOOST_CHECK_EQUAL(entry4_high->GetFee(), high_fee);
+ BOOST_CHECK_EQUAL(entry5_low->GetFee(), low_fee);
+ BOOST_CHECK_EQUAL(entry6_low_prioritised->GetFee(), low_fee);
+ BOOST_CHECK_EQUAL(entry7_high->GetFee(), high_fee);
+ BOOST_CHECK_EQUAL(entry8_high->GetFee(), high_fee);
+
+ CTxMemPool::setEntries set_12_normal{entry1_normal, entry2_normal};
+ CTxMemPool::setEntries set_34_cpfp{entry3_low, entry4_high};
+ CTxMemPool::setEntries set_56_low{entry5_low, entry6_low_prioritised};
+ CTxMemPool::setEntries set_78_high{entry7_high, entry8_high};
+ CTxMemPool::setEntries all_entries{entry1_normal, entry2_normal, entry3_low, entry4_high,
+ entry5_low, entry6_low_prioritised, entry7_high, entry8_high};
CTxMemPool::setEntries empty_set;
const auto unused_txid{GetRandHash()};
@@ -118,29 +201,29 @@ BOOST_FIXTURE_TEST_CASE(rbf_helper_functions, TestChain100Setup)
// Tests for PaysMoreThanConflicts
// These tests use feerate, not absolute fee.
BOOST_CHECK(PaysMoreThanConflicts(/*iters_conflicting=*/set_12_normal,
- /*replacement_feerate=*/CFeeRate(entry1->GetModifiedFee() + 1, entry1->GetTxSize() + 2),
+ /*replacement_feerate=*/CFeeRate(entry1_normal->GetModifiedFee() + 1, entry1_normal->GetTxSize() + 2),
/*txid=*/unused_txid).has_value());
// Replacement must be strictly greater than the originals.
- BOOST_CHECK(PaysMoreThanConflicts(set_12_normal, CFeeRate(entry1->GetModifiedFee(), entry1->GetTxSize()), unused_txid).has_value());
- BOOST_CHECK(PaysMoreThanConflicts(set_12_normal, CFeeRate(entry1->GetModifiedFee() + 1, entry1->GetTxSize()), unused_txid) == std::nullopt);
+ BOOST_CHECK(PaysMoreThanConflicts(set_12_normal, CFeeRate(entry1_normal->GetModifiedFee(), entry1_normal->GetTxSize()), unused_txid).has_value());
+ BOOST_CHECK(PaysMoreThanConflicts(set_12_normal, CFeeRate(entry1_normal->GetModifiedFee() + 1, entry1_normal->GetTxSize()), unused_txid) == std::nullopt);
// These tests use modified fees (including prioritisation), not base fees.
- BOOST_CHECK(PaysMoreThanConflicts({entry5}, CFeeRate(entry5->GetModifiedFee() + 1, entry5->GetTxSize()), unused_txid) == std::nullopt);
- BOOST_CHECK(PaysMoreThanConflicts({entry6}, CFeeRate(entry6->GetFee() + 1, entry6->GetTxSize()), unused_txid).has_value());
- BOOST_CHECK(PaysMoreThanConflicts({entry6}, CFeeRate(entry6->GetModifiedFee() + 1, entry6->GetTxSize()), unused_txid) == std::nullopt);
+ BOOST_CHECK(PaysMoreThanConflicts({entry5_low}, CFeeRate(entry5_low->GetModifiedFee() + 1, entry5_low->GetTxSize()), unused_txid) == std::nullopt);
+ BOOST_CHECK(PaysMoreThanConflicts({entry6_low_prioritised}, CFeeRate(entry6_low_prioritised->GetFee() + 1, entry6_low_prioritised->GetTxSize()), unused_txid).has_value());
+ BOOST_CHECK(PaysMoreThanConflicts({entry6_low_prioritised}, CFeeRate(entry6_low_prioritised->GetModifiedFee() + 1, entry6_low_prioritised->GetTxSize()), unused_txid) == std::nullopt);
// PaysMoreThanConflicts checks individual feerate, not ancestor feerate. This test compares
- // replacement_feerate and entry4's feerate, which are the same. The replacement_feerate is
- // considered too low even though entry4 has a low ancestor feerate.
- BOOST_CHECK(PaysMoreThanConflicts(set_34_cpfp, CFeeRate(entry4->GetModifiedFee(), entry4->GetTxSize()), unused_txid).has_value());
+ // replacement_feerate and entry4_high's feerate, which are the same. The replacement_feerate is
+ // considered too low even though entry4_high has a low ancestor feerate.
+ BOOST_CHECK(PaysMoreThanConflicts(set_34_cpfp, CFeeRate(entry4_high->GetModifiedFee(), entry4_high->GetTxSize()), unused_txid).has_value());
// Tests for EntriesAndTxidsDisjoint
BOOST_CHECK(EntriesAndTxidsDisjoint(empty_set, {tx1->GetHash()}, unused_txid) == std::nullopt);
BOOST_CHECK(EntriesAndTxidsDisjoint(set_12_normal, {tx3->GetHash()}, unused_txid) == std::nullopt);
- BOOST_CHECK(EntriesAndTxidsDisjoint({entry2}, {tx2->GetHash()}, unused_txid).has_value());
+ BOOST_CHECK(EntriesAndTxidsDisjoint({entry2_normal}, {tx2->GetHash()}, unused_txid).has_value());
BOOST_CHECK(EntriesAndTxidsDisjoint(set_12_normal, {tx1->GetHash()}, unused_txid).has_value());
BOOST_CHECK(EntriesAndTxidsDisjoint(set_12_normal, {tx2->GetHash()}, unused_txid).has_value());
// EntriesAndTxidsDisjoint does not calculate descendants of iters_conflicting; it uses whatever
- // the caller passed in. As such, no error is returned even though entry2 is a descendant of tx1.
- BOOST_CHECK(EntriesAndTxidsDisjoint({entry2}, {tx1->GetHash()}, unused_txid) == std::nullopt);
+ // the caller passed in. As such, no error is returned even though entry2_normal is a descendant of tx1.
+ BOOST_CHECK(EntriesAndTxidsDisjoint({entry2_normal}, {tx1->GetHash()}, unused_txid) == std::nullopt);
// Tests for PaysForRBF
const CFeeRate incremental_relay_feerate{DEFAULT_INCREMENTAL_RELAY_FEE};
@@ -163,8 +246,8 @@ BOOST_FIXTURE_TEST_CASE(rbf_helper_functions, TestChain100Setup)
BOOST_CHECK(PaysForRBF(low_fee, high_fee + 99999999, 99999999, incremental_relay_feerate, unused_txid) == std::nullopt);
// Tests for GetEntriesForConflicts
- CTxMemPool::setEntries all_parents{entry1, entry3, entry5, entry7, entry8};
- CTxMemPool::setEntries all_children{entry2, entry4, entry6};
+ CTxMemPool::setEntries all_parents{entry1_normal, entry3_low, entry5_low, entry7_high, entry8_high};
+ CTxMemPool::setEntries all_children{entry2_normal, entry4_high, entry6_low_prioritised};
const std::vector<CTransactionRef> parent_inputs({m_coinbase_txns[0], m_coinbase_txns[1], m_coinbase_txns[2],
m_coinbase_txns[3], m_coinbase_txns[4]});
const auto conflicts_with_parents = make_tx(parent_inputs, {50 * CENT});
@@ -215,15 +298,328 @@ BOOST_FIXTURE_TEST_CASE(rbf_helper_functions, TestChain100Setup)
BOOST_CHECK(HasNoNewUnconfirmed(/*tx=*/ *spends_unconfirmed.get(),
/*pool=*/ pool,
/*iters_conflicting=*/ all_entries) == std::nullopt);
- BOOST_CHECK(HasNoNewUnconfirmed(*spends_unconfirmed.get(), pool, {entry2}) == std::nullopt);
+ BOOST_CHECK(HasNoNewUnconfirmed(*spends_unconfirmed.get(), pool, {entry2_normal}) == std::nullopt);
BOOST_CHECK(HasNoNewUnconfirmed(*spends_unconfirmed.get(), pool, empty_set).has_value());
const auto spends_new_unconfirmed = make_tx({tx1, tx8}, {36 * CENT});
- BOOST_CHECK(HasNoNewUnconfirmed(*spends_new_unconfirmed.get(), pool, {entry2}).has_value());
+ BOOST_CHECK(HasNoNewUnconfirmed(*spends_new_unconfirmed.get(), pool, {entry2_normal}).has_value());
BOOST_CHECK(HasNoNewUnconfirmed(*spends_new_unconfirmed.get(), pool, all_entries).has_value());
const auto spends_conflicting_confirmed = make_tx({m_coinbase_txns[0], m_coinbase_txns[1]}, {45 * CENT});
- BOOST_CHECK(HasNoNewUnconfirmed(*spends_conflicting_confirmed.get(), pool, {entry1, entry3}) == std::nullopt);
+ BOOST_CHECK(HasNoNewUnconfirmed(*spends_conflicting_confirmed.get(), pool, {entry1_normal, entry3_low}) == std::nullopt);
+
+ // Tests for CheckConflictTopology
+
+ // Tx4 has 23 descendants
+ BOOST_CHECK_EQUAL(pool.CheckConflictTopology(set_34_cpfp).value(), strprintf("%s has 23 descendants, max 1 allowed", entry4_high->GetSharedTx()->GetHash().ToString()));
+
+ // No descendants yet
+ BOOST_CHECK(pool.CheckConflictTopology({entry9_unchained}) == std::nullopt);
+
+ // Add 1 descendant, still ok
+ add_descendants(tx9, 1, pool);
+ BOOST_CHECK(pool.CheckConflictTopology({entry9_unchained}) == std::nullopt);
+
+ // N direct conflicts; ok
+ BOOST_CHECK(pool.CheckConflictTopology({entry9_unchained, entry10_unchained, entry11_unchained}) == std::nullopt);
+
+ // Add 1 descendant, still ok, even if it's considered a direct conflict as well
+ const auto child_tx = add_descendants(tx10, 1, pool);
+ const auto entry10_child = pool.GetIter(child_tx->GetHash()).value();
+ BOOST_CHECK(pool.CheckConflictTopology({entry9_unchained, entry10_unchained, entry11_unchained}) == std::nullopt);
+ BOOST_CHECK(pool.CheckConflictTopology({entry9_unchained, entry10_unchained, entry11_unchained, entry10_child}) == std::nullopt);
+
+ // One more, size 3 cluster too much
+ const auto grand_child_tx = add_descendants(child_tx, 1, pool);
+ const auto entry10_grand_child = pool.GetIter(grand_child_tx->GetHash()).value();
+ BOOST_CHECK_EQUAL(pool.CheckConflictTopology({entry9_unchained, entry10_unchained, entry11_unchained}).value(), strprintf("%s has 2 descendants, max 1 allowed", entry10_unchained->GetSharedTx()->GetHash().ToString()));
+ // even if direct conflict is descendent itself
+ BOOST_CHECK_EQUAL(pool.CheckConflictTopology({entry9_unchained, entry10_grand_child, entry11_unchained}).value(), strprintf("%s has 2 ancestors, max 1 allowed", entry10_grand_child->GetSharedTx()->GetHash().ToString()));
+
+ // Make a single child from two singleton parents
+ const auto two_parent_child_tx = add_descendant_to_parents({tx11, tx12}, pool);
+ const auto entry_two_parent_child = pool.GetIter(two_parent_child_tx->GetHash()).value();
+ BOOST_CHECK_EQUAL(pool.CheckConflictTopology({entry11_unchained}).value(), strprintf("%s is not the only parent of child %s", entry11_unchained->GetSharedTx()->GetHash().ToString(), entry_two_parent_child->GetSharedTx()->GetHash().ToString()));
+ BOOST_CHECK_EQUAL(pool.CheckConflictTopology({entry12_unchained}).value(), strprintf("%s is not the only parent of child %s", entry12_unchained->GetSharedTx()->GetHash().ToString(), entry_two_parent_child->GetSharedTx()->GetHash().ToString()));
+ BOOST_CHECK_EQUAL(pool.CheckConflictTopology({entry_two_parent_child}).value(), strprintf("%s has 2 ancestors, max 1 allowed", entry_two_parent_child->GetSharedTx()->GetHash().ToString()));
+
+ // Single parent with two children, we will conflict with the siblings directly only
+ const auto two_siblings = add_children_to_parent(tx13, pool);
+ const auto entry_sibling_1 = pool.GetIter(two_siblings.first->GetHash()).value();
+ const auto entry_sibling_2 = pool.GetIter(two_siblings.second->GetHash()).value();
+ BOOST_CHECK_EQUAL(pool.CheckConflictTopology({entry_sibling_1}).value(), strprintf("%s is not the only child of parent %s", entry_sibling_1->GetSharedTx()->GetHash().ToString(), entry13_unchained->GetSharedTx()->GetHash().ToString()));
+ BOOST_CHECK_EQUAL(pool.CheckConflictTopology({entry_sibling_2}).value(), strprintf("%s is not the only child of parent %s", entry_sibling_2->GetSharedTx()->GetHash().ToString(), entry13_unchained->GetSharedTx()->GetHash().ToString()));
+
+}
+
+BOOST_FIXTURE_TEST_CASE(improves_feerate, TestChain100Setup)
+{
+ CTxMemPool& pool = *Assert(m_node.mempool);
+ LOCK2(::cs_main, pool.cs);
+ TestMemPoolEntryHelper entry;
+
+ const CAmount low_fee{CENT/100};
+ const CAmount normal_fee{CENT/10};
+
+ // low feerate parent with normal feerate child
+ const auto tx1 = make_tx(/*inputs=*/ {m_coinbase_txns[0]}, /*output_values=*/ {10 * COIN});
+ pool.addUnchecked(entry.Fee(low_fee).FromTx(tx1));
+ const auto tx2 = make_tx(/*inputs=*/ {tx1}, /*output_values=*/ {995 * CENT});
+ pool.addUnchecked(entry.Fee(normal_fee).FromTx(tx2));
+
+ const auto entry1 = pool.GetIter(tx1->GetHash()).value();
+ const auto tx1_fee = entry1->GetModifiedFee();
+ const auto tx1_size = entry1->GetTxSize();
+ const auto entry2 = pool.GetIter(tx2->GetHash()).value();
+ const auto tx2_fee = entry2->GetModifiedFee();
+ const auto tx2_size = entry2->GetTxSize();
+
+ // Now test ImprovesFeerateDiagram with various levels of "package rbf" feerates
+
+ // It doesn't improve itself
+ const auto res1 = ImprovesFeerateDiagram(pool, {entry1}, {entry1, entry2}, tx1_fee + tx2_fee, tx1_size + tx2_size);
+ BOOST_CHECK(res1.has_value());
+ BOOST_CHECK(res1.value().first == DiagramCheckError::FAILURE);
+ BOOST_CHECK(res1.value().second == "insufficient feerate: does not improve feerate diagram");
+
+ // With one more satoshi it does
+ BOOST_CHECK(ImprovesFeerateDiagram(pool, {entry1}, {entry1, entry2}, tx1_fee + tx2_fee + 1, tx1_size + tx2_size) == std::nullopt);
+
+ // With prioritisation of in-mempool conflicts, it affects the results of the comparison using the same args as just above
+ pool.PrioritiseTransaction(entry1->GetSharedTx()->GetHash(), /*nFeeDelta=*/1);
+ const auto res2 = ImprovesFeerateDiagram(pool, {entry1}, {entry1, entry2}, tx1_fee + tx2_fee + 1, tx1_size + tx2_size);
+ BOOST_CHECK(res2.has_value());
+ BOOST_CHECK(res2.value().first == DiagramCheckError::FAILURE);
+ BOOST_CHECK(res2.value().second == "insufficient feerate: does not improve feerate diagram");
+ pool.PrioritiseTransaction(entry1->GetSharedTx()->GetHash(), /*nFeeDelta=*/-1);
+
+ // With one less vB it does
+ BOOST_CHECK(ImprovesFeerateDiagram(pool, {entry1}, {entry1, entry2}, tx1_fee + tx2_fee, tx1_size + tx2_size - 1) == std::nullopt);
+
+ // Adding a grandchild makes the cluster size 3, which is uncalculable
+ const auto tx3 = make_tx(/*inputs=*/ {tx2}, /*output_values=*/ {995 * CENT});
+ pool.addUnchecked(entry.Fee(normal_fee).FromTx(tx3));
+ const auto res3 = ImprovesFeerateDiagram(pool, {entry1}, {entry1, entry2}, tx1_fee + tx2_fee + 1, tx1_size + tx2_size);
+ BOOST_CHECK(res3.has_value());
+ BOOST_CHECK(res3.value().first == DiagramCheckError::UNCALCULABLE);
+ BOOST_CHECK(res3.value().second == strprintf("%s has 2 descendants, max 1 allowed", tx1->GetHash().GetHex()));
+
+}
+
+BOOST_FIXTURE_TEST_CASE(calc_feerate_diagram_rbf, TestChain100Setup)
+{
+ CTxMemPool& pool = *Assert(m_node.mempool);
+ LOCK2(::cs_main, pool.cs);
+ TestMemPoolEntryHelper entry;
+
+ const CAmount low_fee{CENT/100};
+ const CAmount normal_fee{CENT/10};
+ const CAmount high_fee{CENT};
+
+ // low -> high -> medium fee transactions that would result in two chunks together since they
+ // are all same size
+ const auto low_tx = make_tx(/*inputs=*/ {m_coinbase_txns[0]}, /*output_values=*/ {10 * COIN});
+ pool.addUnchecked(entry.Fee(low_fee).FromTx(low_tx));
+
+ const auto entry_low = pool.GetIter(low_tx->GetHash()).value();
+ const auto low_size = entry_low->GetTxSize();
+
+ // Replacement of size 1
+ {
+ const auto replace_one{pool.CalculateFeerateDiagramsForRBF(/*replacement_fees=*/0, /*replacement_vsize=*/1, {entry_low}, {entry_low})};
+ BOOST_CHECK(replace_one.has_value());
+ std::vector<FeeFrac> expected_old_diagram{FeeFrac(0, 0), FeeFrac(low_fee, low_size)};
+ BOOST_CHECK(replace_one->first == expected_old_diagram);
+ std::vector<FeeFrac> expected_new_diagram{FeeFrac(0, 0), FeeFrac(0, 1)};
+ BOOST_CHECK(replace_one->second == expected_new_diagram);
+ }
+
+ // Non-zero replacement fee/size
+ {
+ const auto replace_one_fee{pool.CalculateFeerateDiagramsForRBF(/*replacement_fees=*/high_fee, /*replacement_vsize=*/low_size, {entry_low}, {entry_low})};
+ BOOST_CHECK(replace_one_fee.has_value());
+ std::vector<FeeFrac> expected_old_diagram{FeeFrac(0, 0), FeeFrac(low_fee, low_size)};
+ BOOST_CHECK(replace_one_fee->first == expected_old_diagram);
+ std::vector<FeeFrac> expected_new_diagram{FeeFrac(0, 0), FeeFrac(high_fee, low_size)};
+ BOOST_CHECK(replace_one_fee->second == expected_new_diagram);
+ }
+
+ // Add a second transaction to the cluster that will make a single chunk, to be evicted in the RBF
+ const auto high_tx = make_tx(/*inputs=*/ {low_tx}, /*output_values=*/ {995 * CENT});
+ pool.addUnchecked(entry.Fee(high_fee).FromTx(high_tx));
+ const auto entry_high = pool.GetIter(high_tx->GetHash()).value();
+ const auto high_size = entry_high->GetTxSize();
+
+ {
+ const auto replace_single_chunk{pool.CalculateFeerateDiagramsForRBF(/*replacement_fees=*/high_fee, /*replacement_vsize=*/low_size, {entry_low}, {entry_low, entry_high})};
+ BOOST_CHECK(replace_single_chunk.has_value());
+ std::vector<FeeFrac> expected_old_diagram{FeeFrac(0, 0), FeeFrac(low_fee + high_fee, low_size + high_size)};
+ BOOST_CHECK(replace_single_chunk->first == expected_old_diagram);
+ std::vector<FeeFrac> expected_new_diagram{FeeFrac(0, 0), FeeFrac(high_fee, low_size)};
+ BOOST_CHECK(replace_single_chunk->second == expected_new_diagram);
+ }
+
+ // Conflict with the 2nd tx, resulting in new diagram with three entries
+ {
+ const auto replace_cpfp_child{pool.CalculateFeerateDiagramsForRBF(/*replacement_fees=*/high_fee, /*replacement_vsize=*/low_size, {entry_high}, {entry_high})};
+ BOOST_CHECK(replace_cpfp_child.has_value());
+ std::vector<FeeFrac> expected_old_diagram{FeeFrac(0, 0), FeeFrac(low_fee + high_fee, low_size + high_size)};
+ BOOST_CHECK(replace_cpfp_child->first == expected_old_diagram);
+ std::vector<FeeFrac> expected_new_diagram{FeeFrac(0, 0), FeeFrac(high_fee, low_size), FeeFrac(low_fee + high_fee, low_size + low_size)};
+ BOOST_CHECK(replace_cpfp_child->second == expected_new_diagram);
+ }
+
+ // third transaction causes the topology check to fail
+ const auto normal_tx = make_tx(/*inputs=*/ {high_tx}, /*output_values=*/ {995 * CENT});
+ pool.addUnchecked(entry.Fee(normal_fee).FromTx(normal_tx));
+ const auto entry_normal = pool.GetIter(normal_tx->GetHash()).value();
+ const auto normal_size = entry_normal->GetTxSize();
+
+ {
+ const auto replace_too_large{pool.CalculateFeerateDiagramsForRBF(/*replacement_fees=*/normal_fee, /*replacement_vsize=*/normal_size, {entry_low}, {entry_low, entry_high, entry_normal})};
+ BOOST_CHECK(!replace_too_large.has_value());
+ BOOST_CHECK_EQUAL(util::ErrorString(replace_too_large).original, strprintf("%s has 2 descendants, max 1 allowed", low_tx->GetHash().GetHex()));
+ }
+
+ // Make a size 2 cluster that is itself two chunks; evict both txns
+ const auto high_tx_2 = make_tx(/*inputs=*/ {m_coinbase_txns[1]}, /*output_values=*/ {10 * COIN});
+ pool.addUnchecked(entry.Fee(high_fee).FromTx(high_tx_2));
+ const auto entry_high_2 = pool.GetIter(high_tx_2->GetHash()).value();
+ const auto high_size_2 = entry_high_2->GetTxSize();
+
+ const auto low_tx_2 = make_tx(/*inputs=*/ {high_tx_2}, /*output_values=*/ {9 * COIN});
+ pool.addUnchecked(entry.Fee(low_fee).FromTx(low_tx_2));
+ const auto entry_low_2 = pool.GetIter(low_tx_2->GetHash()).value();
+ const auto low_size_2 = entry_low_2->GetTxSize();
+
+ {
+ const auto replace_two_chunks_single_cluster{pool.CalculateFeerateDiagramsForRBF(/*replacement_fees=*/high_fee, /*replacement_vsize=*/low_size, {entry_high_2}, {entry_high_2, entry_low_2})};
+ BOOST_CHECK(replace_two_chunks_single_cluster.has_value());
+ std::vector<FeeFrac> expected_old_diagram{FeeFrac(0, 0), FeeFrac(high_fee, high_size_2), FeeFrac(low_fee + high_fee, low_size_2 + high_size_2)};
+ BOOST_CHECK(replace_two_chunks_single_cluster->first == expected_old_diagram);
+ std::vector<FeeFrac> expected_new_diagram{FeeFrac(0, 0), FeeFrac(high_fee, low_size_2)};
+ BOOST_CHECK(replace_two_chunks_single_cluster->second == expected_new_diagram);
+ }
+
+ // You can have more than two direct conflicts if the there are multiple affected clusters, all of size 2 or less
+ const auto conflict_1 = make_tx(/*inputs=*/ {m_coinbase_txns[2]}, /*output_values=*/ {10 * COIN});
+ pool.addUnchecked(entry.Fee(low_fee).FromTx(conflict_1));
+ const auto conflict_1_entry = pool.GetIter(conflict_1->GetHash()).value();
+
+ const auto conflict_2 = make_tx(/*inputs=*/ {m_coinbase_txns[3]}, /*output_values=*/ {10 * COIN});
+ pool.addUnchecked(entry.Fee(low_fee).FromTx(conflict_2));
+ const auto conflict_2_entry = pool.GetIter(conflict_2->GetHash()).value();
+
+ const auto conflict_3 = make_tx(/*inputs=*/ {m_coinbase_txns[4]}, /*output_values=*/ {10 * COIN});
+ pool.addUnchecked(entry.Fee(low_fee).FromTx(conflict_3));
+ const auto conflict_3_entry = pool.GetIter(conflict_3->GetHash()).value();
+
+ {
+ const auto replace_multiple_clusters{pool.CalculateFeerateDiagramsForRBF(/*replacement_fees=*/high_fee, /*replacement_vsize=*/low_size, {conflict_1_entry, conflict_2_entry, conflict_3_entry}, {conflict_1_entry, conflict_2_entry, conflict_3_entry})};
+ BOOST_CHECK(replace_multiple_clusters.has_value());
+ BOOST_CHECK(replace_multiple_clusters->first.size() == 4);
+ BOOST_CHECK(replace_multiple_clusters->second.size() == 2);
+ }
+
+ // Add a child transaction to conflict_1 and make it cluster size 2, two chunks due to same feerate
+ const auto conflict_1_child = make_tx(/*inputs=*/{conflict_1}, /*output_values=*/ {995 * CENT});
+ pool.addUnchecked(entry.Fee(low_fee).FromTx(conflict_1_child));
+ const auto conflict_1_child_entry = pool.GetIter(conflict_1_child->GetHash()).value();
+
+ {
+ const auto replace_multiple_clusters_2{pool.CalculateFeerateDiagramsForRBF(/*replacement_fees=*/high_fee, /*replacement_vsize=*/low_size, {conflict_1_entry, conflict_2_entry, conflict_3_entry}, {conflict_1_entry, conflict_2_entry, conflict_3_entry, conflict_1_child_entry})};
+
+ BOOST_CHECK(replace_multiple_clusters_2.has_value());
+ BOOST_CHECK(replace_multiple_clusters_2->first.size() == 5);
+ BOOST_CHECK(replace_multiple_clusters_2->second.size() == 2);
+ }
+
+ // Add another descendant to conflict_1, making the cluster size > 2 should fail at this point.
+ const auto conflict_1_grand_child = make_tx(/*inputs=*/{conflict_1_child}, /*output_values=*/ {995 * CENT});
+ pool.addUnchecked(entry.Fee(high_fee).FromTx(conflict_1_grand_child));
+ const auto conflict_1_grand_child_entry = pool.GetIter(conflict_1_child->GetHash()).value();
+
+ {
+ const auto replace_cluster_size_3{pool.CalculateFeerateDiagramsForRBF(/*replacement_fees=*/high_fee, /*replacement_vsize=*/low_size, {conflict_1_entry, conflict_2_entry, conflict_3_entry}, {conflict_1_entry, conflict_2_entry, conflict_3_entry, conflict_1_child_entry, conflict_1_grand_child_entry})};
+
+ BOOST_CHECK(!replace_cluster_size_3.has_value());
+ BOOST_CHECK_EQUAL(util::ErrorString(replace_cluster_size_3).original, strprintf("%s has 2 descendants, max 1 allowed", conflict_1->GetHash().GetHex()));
+ }
+}
+
+BOOST_AUTO_TEST_CASE(feerate_diagram_utilities)
+{
+ // Sanity check the correctness of the feerate diagram comparison.
+
+ // A strictly better case.
+ std::vector<FeeFrac> old_diagram{{FeeFrac{0, 0}, FeeFrac{950, 300}, FeeFrac{1050, 400}}};
+ std::vector<FeeFrac> new_diagram{{FeeFrac{0, 0}, FeeFrac{1000, 300}, FeeFrac{1050, 400}}};
+
+ BOOST_CHECK(std::is_lt(CompareFeerateDiagram(old_diagram, new_diagram)));
+ BOOST_CHECK(std::is_gt(CompareFeerateDiagram(new_diagram, old_diagram)));
+
+ // Incomparable diagrams
+ old_diagram = {FeeFrac{0, 0}, FeeFrac{950, 300}, FeeFrac{1050, 400}};
+ new_diagram = {FeeFrac{0, 0}, FeeFrac{1000, 300}, FeeFrac{1000, 400}};
+
+ BOOST_CHECK(CompareFeerateDiagram(old_diagram, new_diagram) == std::partial_ordering::unordered);
+ BOOST_CHECK(CompareFeerateDiagram(new_diagram, old_diagram) == std::partial_ordering::unordered);
+
+ // Strictly better but smaller size.
+ old_diagram = {FeeFrac{0, 0}, FeeFrac{950, 300}, FeeFrac{1050, 400}};
+ new_diagram = {FeeFrac{0, 0}, FeeFrac{1100, 300}};
+
+ BOOST_CHECK(std::is_lt(CompareFeerateDiagram(old_diagram, new_diagram)));
+ BOOST_CHECK(std::is_gt(CompareFeerateDiagram(new_diagram, old_diagram)));
+
+ // New diagram is strictly better due to the first chunk, even though
+ // second chunk contributes no fees
+ old_diagram = {FeeFrac{0, 0}, FeeFrac{950, 300}, FeeFrac{1050, 400}};
+ new_diagram = {FeeFrac{0, 0}, FeeFrac{1100, 100}, FeeFrac{1100, 200}};
+
+ BOOST_CHECK(std::is_lt(CompareFeerateDiagram(old_diagram, new_diagram)));
+ BOOST_CHECK(std::is_gt(CompareFeerateDiagram(new_diagram, old_diagram)));
+
+ // Feerate of first new chunk is better with, but second chunk is worse
+ old_diagram = {FeeFrac{0, 0}, FeeFrac{950, 300}, FeeFrac{1050, 400}};
+ new_diagram = {FeeFrac{0, 0}, FeeFrac{750, 100}, FeeFrac{999, 350}, FeeFrac{1150, 1000}};
+
+ BOOST_CHECK(CompareFeerateDiagram(old_diagram, new_diagram) == std::partial_ordering::unordered);
+ BOOST_CHECK(CompareFeerateDiagram(new_diagram, old_diagram) == std::partial_ordering::unordered);
+
+ // If we make the second chunk slightly better, the new diagram now wins.
+ old_diagram = {FeeFrac{0, 0}, FeeFrac{950, 300}, FeeFrac{1050, 400}};
+ new_diagram = {FeeFrac{0, 0}, FeeFrac{750, 100}, FeeFrac{1000, 350}, FeeFrac{1150, 500}};
+
+ BOOST_CHECK(std::is_lt(CompareFeerateDiagram(old_diagram, new_diagram)));
+ BOOST_CHECK(std::is_gt(CompareFeerateDiagram(new_diagram, old_diagram)));
+
+ // Identical diagrams, cannot be strictly better
+ old_diagram = {FeeFrac{0, 0}, FeeFrac{950, 300}, FeeFrac{1050, 400}};
+ new_diagram = {FeeFrac{0, 0}, FeeFrac{950, 300}, FeeFrac{1050, 400}};
+
+ BOOST_CHECK(std::is_eq(CompareFeerateDiagram(old_diagram, new_diagram)));
+ BOOST_CHECK(std::is_eq(CompareFeerateDiagram(new_diagram, old_diagram)));
+
+ // Same aggregate fee, but different total size (trigger single tail fee check step)
+ old_diagram = {FeeFrac{0, 0}, FeeFrac{950, 300}, FeeFrac{1050, 399}};
+ new_diagram = {FeeFrac{0, 0}, FeeFrac{950, 300}, FeeFrac{1050, 400}};
+
+ // No change in evaluation when tail check needed.
+ BOOST_CHECK(std::is_gt(CompareFeerateDiagram(old_diagram, new_diagram)));
+ BOOST_CHECK(std::is_lt(CompareFeerateDiagram(new_diagram, old_diagram)));
+
+ // Trigger multiple tail fee check steps
+ old_diagram = {FeeFrac{0, 0}, FeeFrac{950, 300}, FeeFrac{1050, 399}};
+ new_diagram = {FeeFrac{0, 0}, FeeFrac{950, 300}, FeeFrac{1050, 400}, FeeFrac{1050, 401}, FeeFrac{1050, 402}};
+
+ BOOST_CHECK(std::is_gt(CompareFeerateDiagram(old_diagram, new_diagram)));
+ BOOST_CHECK(std::is_lt(CompareFeerateDiagram(new_diagram, old_diagram)));
+
+ // Multiple tail fee check steps, unordered result
+ new_diagram = {FeeFrac{0, 0}, FeeFrac{950, 300}, FeeFrac{1050, 400}, FeeFrac{1050, 401}, FeeFrac{1050, 402}, FeeFrac{1051, 403}};
+ BOOST_CHECK(CompareFeerateDiagram(old_diagram, new_diagram) == std::partial_ordering::unordered);
+ BOOST_CHECK(CompareFeerateDiagram(new_diagram, old_diagram) == std::partial_ordering::unordered);
}
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/scheduler_tests.cpp b/src/test/scheduler_tests.cpp
index 3fb3378598..95e725de46 100644
--- a/src/test/scheduler_tests.cpp
+++ b/src/test/scheduler_tests.cpp
@@ -129,8 +129,8 @@ BOOST_AUTO_TEST_CASE(singlethreadedscheduler_ordered)
CScheduler scheduler;
// each queue should be well ordered with respect to itself but not other queues
- SingleThreadedSchedulerClient queue1(scheduler);
- SingleThreadedSchedulerClient queue2(scheduler);
+ SerialTaskRunner queue1(scheduler);
+ SerialTaskRunner queue2(scheduler);
// create more threads than queues
// if the queues only permit execution of one task at once then
@@ -142,7 +142,7 @@ BOOST_AUTO_TEST_CASE(singlethreadedscheduler_ordered)
threads.emplace_back([&] { scheduler.serviceQueue(); });
}
- // these are not atomic, if SinglethreadedSchedulerClient prevents
+ // these are not atomic, if SerialTaskRunner prevents
// parallel execution at the queue level no synchronization should be required here
int counter1 = 0;
int counter2 = 0;
@@ -150,12 +150,12 @@ BOOST_AUTO_TEST_CASE(singlethreadedscheduler_ordered)
// just simply count up on each queue - if execution is properly ordered then
// the callbacks should run in exactly the order in which they were enqueued
for (int i = 0; i < 100; ++i) {
- queue1.AddToProcessQueue([i, &counter1]() {
+ queue1.insert([i, &counter1]() {
bool expectation = i == counter1++;
assert(expectation);
});
- queue2.AddToProcessQueue([i, &counter2]() {
+ queue2.insert([i, &counter2]() {
bool expectation = i == counter2++;
assert(expectation);
});
diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp
index 1f674408b2..0af2fdce08 100644
--- a/src/test/script_tests.cpp
+++ b/src/test/script_tests.cpp
@@ -23,10 +23,6 @@
#include <util/fs.h>
#include <util/strencodings.h>
-#if defined(HAVE_CONSENSUS_LIB)
-#include <script/bitcoinconsensus.h>
-#endif
-
#include <cstdint>
#include <fstream>
#include <string>
@@ -139,21 +135,6 @@ void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, const CScript
if (combined_flags & SCRIPT_VERIFY_WITNESS && ~combined_flags & SCRIPT_VERIFY_P2SH) continue;
BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, &scriptWitness, combined_flags, MutableTransactionSignatureChecker(&tx, 0, txCredit.vout[0].nValue, MissingDataBehavior::ASSERT_FAIL), &err) == expect, message + strprintf(" (with flags %x)", combined_flags));
}
-
-#if defined(HAVE_CONSENSUS_LIB)
- DataStream stream;
- stream << TX_WITH_WITNESS(tx2);
- uint32_t libconsensus_flags{flags & bitcoinconsensus_SCRIPT_FLAGS_VERIFY_ALL};
- if (libconsensus_flags == flags) {
- int expectedSuccessCode = expect ? 1 : 0;
- if (flags & bitcoinconsensus_SCRIPT_FLAGS_VERIFY_WITNESS) {
- BOOST_CHECK_MESSAGE(bitcoinconsensus_verify_script_with_amount(scriptPubKey.data(), scriptPubKey.size(), txCredit.vout[0].nValue, UCharCast(stream.data()), stream.size(), 0, libconsensus_flags, nullptr) == expectedSuccessCode, message);
- } else {
- BOOST_CHECK_MESSAGE(bitcoinconsensus_verify_script_with_amount(scriptPubKey.data(), scriptPubKey.size(), 0, UCharCast(stream.data()), stream.size(), 0, libconsensus_flags, nullptr) == expectedSuccessCode, message);
- BOOST_CHECK_MESSAGE(bitcoinconsensus_verify_script(scriptPubKey.data(), scriptPubKey.size(), UCharCast(stream.data()), stream.size(), 0, libconsensus_flags, nullptr) == expectedSuccessCode, message);
- }
- }
-#endif
}
void static NegateSignatureS(std::vector<unsigned char>& vchSig) {
@@ -1494,179 +1475,6 @@ static CScriptWitness ScriptWitnessFromJSON(const UniValue& univalue)
return scriptwitness;
}
-#if defined(HAVE_CONSENSUS_LIB)
-
-/* Test simple (successful) usage of bitcoinconsensus_verify_script */
-BOOST_AUTO_TEST_CASE(bitcoinconsensus_verify_script_returns_true)
-{
- unsigned int libconsensus_flags = 0;
- int nIn = 0;
-
- CScript scriptPubKey;
- CScript scriptSig;
- CScriptWitness wit;
-
- scriptPubKey << OP_1;
- CTransaction creditTx{BuildCreditingTransaction(scriptPubKey, 1)};
- CTransaction spendTx{BuildSpendingTransaction(scriptSig, wit, creditTx)};
-
- DataStream stream;
- stream << TX_WITH_WITNESS(spendTx);
-
- bitcoinconsensus_error err;
- int result = bitcoinconsensus_verify_script(scriptPubKey.data(), scriptPubKey.size(), UCharCast(stream.data()), stream.size(), nIn, libconsensus_flags, &err);
- BOOST_CHECK_EQUAL(result, 1);
- BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_OK);
-}
-
-/* Test bitcoinconsensus_verify_script returns invalid tx index err*/
-BOOST_AUTO_TEST_CASE(bitcoinconsensus_verify_script_tx_index_err)
-{
- unsigned int libconsensus_flags = 0;
- int nIn = 3;
-
- CScript scriptPubKey;
- CScript scriptSig;
- CScriptWitness wit;
-
- scriptPubKey << OP_EQUAL;
- CTransaction creditTx{BuildCreditingTransaction(scriptPubKey, 1)};
- CTransaction spendTx{BuildSpendingTransaction(scriptSig, wit, creditTx)};
-
- DataStream stream;
- stream << TX_WITH_WITNESS(spendTx);
-
- bitcoinconsensus_error err;
- int result = bitcoinconsensus_verify_script(scriptPubKey.data(), scriptPubKey.size(), UCharCast(stream.data()), stream.size(), nIn, libconsensus_flags, &err);
- BOOST_CHECK_EQUAL(result, 0);
- BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_TX_INDEX);
-}
-
-/* Test bitcoinconsensus_verify_script returns tx size mismatch err*/
-BOOST_AUTO_TEST_CASE(bitcoinconsensus_verify_script_tx_size)
-{
- unsigned int libconsensus_flags = 0;
- int nIn = 0;
-
- CScript scriptPubKey;
- CScript scriptSig;
- CScriptWitness wit;
-
- scriptPubKey << OP_EQUAL;
- CTransaction creditTx{BuildCreditingTransaction(scriptPubKey, 1)};
- CTransaction spendTx{BuildSpendingTransaction(scriptSig, wit, creditTx)};
-
- DataStream stream;
- stream << TX_WITH_WITNESS(spendTx);
-
- bitcoinconsensus_error err;
- int result = bitcoinconsensus_verify_script(scriptPubKey.data(), scriptPubKey.size(), UCharCast(stream.data()), stream.size() * 2, nIn, libconsensus_flags, &err);
- BOOST_CHECK_EQUAL(result, 0);
- BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_TX_SIZE_MISMATCH);
-}
-
-/* Test bitcoinconsensus_verify_script returns invalid tx serialization error */
-BOOST_AUTO_TEST_CASE(bitcoinconsensus_verify_script_tx_serialization)
-{
- unsigned int libconsensus_flags = 0;
- int nIn = 0;
-
- CScript scriptPubKey;
- CScript scriptSig;
- CScriptWitness wit;
-
- scriptPubKey << OP_EQUAL;
- CTransaction creditTx{BuildCreditingTransaction(scriptPubKey, 1)};
- CTransaction spendTx{BuildSpendingTransaction(scriptSig, wit, creditTx)};
-
- DataStream stream;
- stream << 0xffffffff;
-
- bitcoinconsensus_error err;
- int result = bitcoinconsensus_verify_script(scriptPubKey.data(), scriptPubKey.size(), UCharCast(stream.data()), stream.size(), nIn, libconsensus_flags, &err);
- BOOST_CHECK_EQUAL(result, 0);
- BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_TX_DESERIALIZE);
-}
-
-/* Test bitcoinconsensus_verify_script returns amount required error */
-BOOST_AUTO_TEST_CASE(bitcoinconsensus_verify_script_amount_required_err)
-{
- unsigned int libconsensus_flags = bitcoinconsensus_SCRIPT_FLAGS_VERIFY_WITNESS;
- int nIn = 0;
-
- CScript scriptPubKey;
- CScript scriptSig;
- CScriptWitness wit;
-
- scriptPubKey << OP_EQUAL;
- CTransaction creditTx{BuildCreditingTransaction(scriptPubKey, 1)};
- CTransaction spendTx{BuildSpendingTransaction(scriptSig, wit, creditTx)};
-
- DataStream stream;
- stream << TX_WITH_WITNESS(spendTx);
-
- bitcoinconsensus_error err;
- int result = bitcoinconsensus_verify_script(scriptPubKey.data(), scriptPubKey.size(), UCharCast(stream.data()), stream.size(), nIn, libconsensus_flags, &err);
- BOOST_CHECK_EQUAL(result, 0);
- BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_AMOUNT_REQUIRED);
-}
-
-/* Test bitcoinconsensus_verify_script returns invalid flags err */
-BOOST_AUTO_TEST_CASE(bitcoinconsensus_verify_script_invalid_flags)
-{
- unsigned int libconsensus_flags = 1 << 3;
- int nIn = 0;
-
- CScript scriptPubKey;
- CScript scriptSig;
- CScriptWitness wit;
-
- scriptPubKey << OP_EQUAL;
- CTransaction creditTx{BuildCreditingTransaction(scriptPubKey, 1)};
- CTransaction spendTx{BuildSpendingTransaction(scriptSig, wit, creditTx)};
-
- DataStream stream;
- stream << TX_WITH_WITNESS(spendTx);
-
- bitcoinconsensus_error err;
- int result = bitcoinconsensus_verify_script(scriptPubKey.data(), scriptPubKey.size(), UCharCast(stream.data()), stream.size(), nIn, libconsensus_flags, &err);
- BOOST_CHECK_EQUAL(result, 0);
- BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_INVALID_FLAGS);
-}
-
-/* Test bitcoinconsensus_verify_script returns spent outputs required err */
-BOOST_AUTO_TEST_CASE(bitcoinconsensus_verify_script_spent_outputs_required_err)
-{
- unsigned int libconsensus_flags{bitcoinconsensus_SCRIPT_FLAGS_VERIFY_TAPROOT};
- const int nIn{0};
-
- CScript scriptPubKey;
- CScript scriptSig;
- CScriptWitness wit;
-
- scriptPubKey << OP_EQUAL;
- CTransaction creditTx{BuildCreditingTransaction(scriptPubKey, 1)};
- CTransaction spendTx{BuildSpendingTransaction(scriptSig, wit, creditTx)};
-
- DataStream stream;
- stream << TX_WITH_WITNESS(spendTx);
-
- bitcoinconsensus_error err;
- int result{bitcoinconsensus_verify_script_with_spent_outputs(scriptPubKey.data(), scriptPubKey.size(), creditTx.vout[0].nValue, UCharCast(stream.data()), stream.size(), nullptr, 0, nIn, libconsensus_flags, &err)};
- BOOST_CHECK_EQUAL(result, 0);
- BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_SPENT_OUTPUTS_REQUIRED);
-
- result = bitcoinconsensus_verify_script_with_amount(scriptPubKey.data(), scriptPubKey.size(), creditTx.vout[0].nValue, UCharCast(stream.data()), stream.size(), nIn, libconsensus_flags, &err);
- BOOST_CHECK_EQUAL(result, 0);
- BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_SPENT_OUTPUTS_REQUIRED);
-
- result = bitcoinconsensus_verify_script(scriptPubKey.data(), scriptPubKey.size(), UCharCast(stream.data()), stream.size(), nIn, libconsensus_flags, &err);
- BOOST_CHECK_EQUAL(result, 0);
- BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_SPENT_OUTPUTS_REQUIRED);
-}
-
-#endif // defined(HAVE_CONSENSUS_LIB)
-
static std::vector<unsigned int> AllConsensusFlags()
{
std::vector<unsigned int> ret;
@@ -1714,28 +1522,12 @@ static void AssetTest(const UniValue& test)
txdata.Init(tx, std::vector<CTxOut>(prevouts));
CachingTransactionSignatureChecker txcheck(&tx, idx, prevouts[idx].nValue, true, txdata);
-#if defined(HAVE_CONSENSUS_LIB)
- DataStream stream;
- stream << TX_WITH_WITNESS(tx);
- std::vector<UTXO> utxos;
- utxos.resize(prevouts.size());
- for (size_t i = 0; i < prevouts.size(); i++) {
- utxos[i].scriptPubKey = prevouts[i].scriptPubKey.data();
- utxos[i].scriptPubKeySize = prevouts[i].scriptPubKey.size();
- utxos[i].value = prevouts[i].nValue;
- }
-#endif
-
for (const auto flags : ALL_CONSENSUS_FLAGS) {
// "final": true tests are valid for all flags. Others are only valid with flags that are
// a subset of test_flags.
if (fin || ((flags & test_flags) == flags)) {
bool ret = VerifyScript(tx.vin[idx].scriptSig, prevouts[idx].scriptPubKey, &tx.vin[idx].scriptWitness, flags, txcheck, nullptr);
BOOST_CHECK(ret);
-#if defined(HAVE_CONSENSUS_LIB)
- int lib_ret = bitcoinconsensus_verify_script_with_spent_outputs(prevouts[idx].scriptPubKey.data(), prevouts[idx].scriptPubKey.size(), prevouts[idx].nValue, UCharCast(stream.data()), stream.size(), utxos.data(), utxos.size(), idx, flags, nullptr);
- BOOST_CHECK(lib_ret == 1);
-#endif
}
}
}
@@ -1748,27 +1540,11 @@ static void AssetTest(const UniValue& test)
txdata.Init(tx, std::vector<CTxOut>(prevouts));
CachingTransactionSignatureChecker txcheck(&tx, idx, prevouts[idx].nValue, true, txdata);
-#if defined(HAVE_CONSENSUS_LIB)
- DataStream stream;
- stream << TX_WITH_WITNESS(tx);
- std::vector<UTXO> utxos;
- utxos.resize(prevouts.size());
- for (size_t i = 0; i < prevouts.size(); i++) {
- utxos[i].scriptPubKey = prevouts[i].scriptPubKey.data();
- utxos[i].scriptPubKeySize = prevouts[i].scriptPubKey.size();
- utxos[i].value = prevouts[i].nValue;
- }
-#endif
-
for (const auto flags : ALL_CONSENSUS_FLAGS) {
// If a test is supposed to fail with test_flags, it should also fail with any superset thereof.
if ((flags & test_flags) == test_flags) {
bool ret = VerifyScript(tx.vin[idx].scriptSig, prevouts[idx].scriptPubKey, &tx.vin[idx].scriptWitness, flags, txcheck, nullptr);
BOOST_CHECK(!ret);
-#if defined(HAVE_CONSENSUS_LIB)
- int lib_ret = bitcoinconsensus_verify_script_with_spent_outputs(prevouts[idx].scriptPubKey.data(), prevouts[idx].scriptPubKey.size(), prevouts[idx].nValue, UCharCast(stream.data()), stream.size(), utxos.data(), utxos.size(), idx, flags, nullptr);
- BOOST_CHECK(lib_ret == 0);
-#endif
}
}
}
diff --git a/src/test/serfloat_tests.cpp b/src/test/serfloat_tests.cpp
index b36bdc02ca..304541074f 100644
--- a/src/test/serfloat_tests.cpp
+++ b/src/test/serfloat_tests.cpp
@@ -37,6 +37,7 @@ uint64_t TestDouble(double f) {
} // namespace
BOOST_AUTO_TEST_CASE(double_serfloat_tests) {
+ // Test specific values against their expected encoding.
BOOST_CHECK_EQUAL(TestDouble(0.0), 0U);
BOOST_CHECK_EQUAL(TestDouble(-0.0), 0x8000000000000000);
BOOST_CHECK_EQUAL(TestDouble(std::numeric_limits<double>::infinity()), 0x7ff0000000000000U);
@@ -46,55 +47,76 @@ BOOST_AUTO_TEST_CASE(double_serfloat_tests) {
BOOST_CHECK_EQUAL(TestDouble(2.0), 0x4000000000000000ULL);
BOOST_CHECK_EQUAL(TestDouble(4.0), 0x4010000000000000ULL);
BOOST_CHECK_EQUAL(TestDouble(785.066650390625), 0x4088888880000000ULL);
+ BOOST_CHECK_EQUAL(TestDouble(3.7243058682384174), 0x400dcb60e0031440);
+ BOOST_CHECK_EQUAL(TestDouble(91.64070592566159), 0x4056e901536d447a);
+ BOOST_CHECK_EQUAL(TestDouble(-98.63087668642575), 0xc058a860489c007a);
+ BOOST_CHECK_EQUAL(TestDouble(4.908737756962054), 0x4013a28c268b2b70);
+ BOOST_CHECK_EQUAL(TestDouble(77.9247330021754), 0x40537b2ed3547804);
+ BOOST_CHECK_EQUAL(TestDouble(40.24732825357566), 0x40441fa873c43dfc);
+ BOOST_CHECK_EQUAL(TestDouble(71.39395607929222), 0x4051d936938f27b6);
+ BOOST_CHECK_EQUAL(TestDouble(58.80100710817612), 0x404d668766a2bd70);
+ BOOST_CHECK_EQUAL(TestDouble(-30.10665786964975), 0xc03e1b4dee1e01b8);
+ BOOST_CHECK_EQUAL(TestDouble(60.15231509068704), 0x404e137f0f969814);
+ BOOST_CHECK_EQUAL(TestDouble(-48.15848711335961), 0xc04814494e445bc6);
+ BOOST_CHECK_EQUAL(TestDouble(26.68450101125353), 0x403aaf3b755169b0);
+ BOOST_CHECK_EQUAL(TestDouble(-65.72071986604303), 0xc0506e2046378ede);
+ BOOST_CHECK_EQUAL(TestDouble(17.95575825512381), 0x4031f4ac92b0a388);
+ BOOST_CHECK_EQUAL(TestDouble(-35.27171863226279), 0xc041a2c7ad17a42a);
+ BOOST_CHECK_EQUAL(TestDouble(-8.58810329425124), 0xc0212d1bdffef538);
+ BOOST_CHECK_EQUAL(TestDouble(88.51393044338977), 0x405620e43c83b1c8);
+ BOOST_CHECK_EQUAL(TestDouble(48.07224932612732), 0x4048093f77466ffc);
+ BOOST_CHECK_EQUAL(TestDouble(9.867348871395659e+117), 0x586f4daeb2459b9f);
+ BOOST_CHECK_EQUAL(TestDouble(-1.5166424385129721e+206), 0xeabe3bbc484bd458);
+ BOOST_CHECK_EQUAL(TestDouble(-8.585156555624594e-275), 0x8707c76eee012429);
+ BOOST_CHECK_EQUAL(TestDouble(2.2794371091628822e+113), 0x5777b2184458f4ee);
+ BOOST_CHECK_EQUAL(TestDouble(-1.1290476594131867e+163), 0xe1c91893d3488bb0);
+ BOOST_CHECK_EQUAL(TestDouble(9.143848423979275e-246), 0x0d0ff76e5f2620a3);
+ BOOST_CHECK_EQUAL(TestDouble(-2.8366718125941117e+81), 0xd0d7ec7e754b394a);
+ BOOST_CHECK_EQUAL(TestDouble(-1.2754409481684012e+229), 0xef80d32f8ec55342);
+ BOOST_CHECK_EQUAL(TestDouble(6.000577060053642e-186), 0x197a1be7c8209b6a);
+ BOOST_CHECK_EQUAL(TestDouble(2.0839423284378986e-302), 0x014c94f8689cb0a5);
+ BOOST_CHECK_EQUAL(TestDouble(-1.422140051483753e+259), 0xf5bd99271d04bb35);
+ BOOST_CHECK_EQUAL(TestDouble(-1.0593973991188853e+46), 0xc97db0cdb72d1046);
+ BOOST_CHECK_EQUAL(TestDouble(2.62945125875249e+190), 0x67779b36366c993b);
+ BOOST_CHECK_EQUAL(TestDouble(-2.920377657275094e+115), 0xd7e7b7b45908e23b);
+ BOOST_CHECK_EQUAL(TestDouble(9.790289014855851e-118), 0x27a3c031cc428bcc);
+ BOOST_CHECK_EQUAL(TestDouble(-4.629317182034961e-114), 0xa866ccf0b753705a);
+ BOOST_CHECK_EQUAL(TestDouble(-1.7674605603846528e+279), 0xf9e8ed383ffc3e25);
+ BOOST_CHECK_EQUAL(TestDouble(2.5308171727712605e+120), 0x58ef5cd55f0ec997);
+ BOOST_CHECK_EQUAL(TestDouble(-1.05034156412799e+54), 0xcb25eea1b9350fa0);
- // Roundtrip test on IEC559-compatible systems
- if (std::numeric_limits<double>::is_iec559) {
- BOOST_CHECK_EQUAL(sizeof(double), 8U);
- BOOST_CHECK_EQUAL(sizeof(uint64_t), 8U);
- // Test extreme values
- TestDouble(std::numeric_limits<double>::min());
- TestDouble(-std::numeric_limits<double>::min());
- TestDouble(std::numeric_limits<double>::max());
- TestDouble(-std::numeric_limits<double>::max());
- TestDouble(std::numeric_limits<double>::lowest());
- TestDouble(-std::numeric_limits<double>::lowest());
- TestDouble(std::numeric_limits<double>::quiet_NaN());
- TestDouble(-std::numeric_limits<double>::quiet_NaN());
- TestDouble(std::numeric_limits<double>::signaling_NaN());
- TestDouble(-std::numeric_limits<double>::signaling_NaN());
- TestDouble(std::numeric_limits<double>::denorm_min());
- TestDouble(-std::numeric_limits<double>::denorm_min());
- // Test exact encoding: on currently supported platforms, EncodeDouble
- // should produce exactly the same as the in-memory representation for non-NaN.
- for (int j = 0; j < 1000; ++j) {
- // Iterate over 9 specific bits exhaustively; the others are chosen randomly.
- // These specific bits are the sign bit, and the 2 top and bottom bits of
- // exponent and mantissa in the IEEE754 binary64 format.
- for (int x = 0; x < 512; ++x) {
- uint64_t v = InsecureRandBits(64);
- v &= ~(uint64_t{1} << 0);
- if (x & 1) v |= (uint64_t{1} << 0);
- v &= ~(uint64_t{1} << 1);
- if (x & 2) v |= (uint64_t{1} << 1);
- v &= ~(uint64_t{1} << 50);
- if (x & 4) v |= (uint64_t{1} << 50);
- v &= ~(uint64_t{1} << 51);
- if (x & 8) v |= (uint64_t{1} << 51);
- v &= ~(uint64_t{1} << 52);
- if (x & 16) v |= (uint64_t{1} << 52);
- v &= ~(uint64_t{1} << 53);
- if (x & 32) v |= (uint64_t{1} << 53);
- v &= ~(uint64_t{1} << 61);
- if (x & 64) v |= (uint64_t{1} << 61);
- v &= ~(uint64_t{1} << 62);
- if (x & 128) v |= (uint64_t{1} << 62);
- v &= ~(uint64_t{1} << 63);
- if (x & 256) v |= (uint64_t{1} << 63);
- double f;
- memcpy(&f, &v, 8);
- uint64_t v2 = TestDouble(f);
- if (!std::isnan(f)) BOOST_CHECK_EQUAL(v, v2);
+ // Test extreme values
+ BOOST_CHECK_EQUAL(TestDouble(std::numeric_limits<double>::min()), 0x10000000000000);
+ BOOST_CHECK_EQUAL(TestDouble(-std::numeric_limits<double>::min()), 0x8010000000000000);
+ BOOST_CHECK_EQUAL(TestDouble(std::numeric_limits<double>::max()), 0x7fefffffffffffff);
+ BOOST_CHECK_EQUAL(TestDouble(-std::numeric_limits<double>::max()), 0xffefffffffffffff);
+ BOOST_CHECK_EQUAL(TestDouble(std::numeric_limits<double>::lowest()), 0xffefffffffffffff);
+ BOOST_CHECK_EQUAL(TestDouble(-std::numeric_limits<double>::lowest()), 0x7fefffffffffffff);
+ BOOST_CHECK_EQUAL(TestDouble(std::numeric_limits<double>::denorm_min()), 0x1);
+ BOOST_CHECK_EQUAL(TestDouble(-std::numeric_limits<double>::denorm_min()), 0x8000000000000001);
+ // Note that all NaNs are encoded the same way.
+ BOOST_CHECK_EQUAL(TestDouble(std::numeric_limits<double>::quiet_NaN()), 0x7ff8000000000000);
+ BOOST_CHECK_EQUAL(TestDouble(-std::numeric_limits<double>::quiet_NaN()), 0x7ff8000000000000);
+ BOOST_CHECK_EQUAL(TestDouble(std::numeric_limits<double>::signaling_NaN()), 0x7ff8000000000000);
+ BOOST_CHECK_EQUAL(TestDouble(-std::numeric_limits<double>::signaling_NaN()), 0x7ff8000000000000);
+
+ // Construct doubles to test from the encoding.
+ static_assert(sizeof(double) == 8);
+ static_assert(sizeof(uint64_t) == 8);
+ for (int j = 0; j < 1000; ++j) {
+ // Iterate over 9 specific bits exhaustively; the others are chosen randomly.
+ // These specific bits are the sign bit, and the 2 top and bottom bits of
+ // exponent and mantissa in the IEEE754 binary64 format.
+ for (int x = 0; x < 512; ++x) {
+ uint64_t v = InsecureRandBits(64);
+ int x_pos = 0;
+ for (int v_pos : {0, 1, 50, 51, 52, 53, 61, 62, 63}) {
+ v &= ~(uint64_t{1} << v_pos);
+ if ((x >> (x_pos++)) & 1) v |= (uint64_t{1} << v_pos);
}
+ double f;
+ memcpy(&f, &v, 8);
+ TestDouble(f);
}
}
}
diff --git a/src/test/span_tests.cpp b/src/test/span_tests.cpp
index f6cac10b09..aae61990f7 100644
--- a/src/test/span_tests.cpp
+++ b/src/test/span_tests.cpp
@@ -53,7 +53,7 @@ BOOST_AUTO_TEST_SUITE(span_tests)
// aren't compatible with Spans at compile time.
//
// Previously there was a bug where writing a SFINAE check for vector<bool> was
-// not possible, because in libstdc++ vector<bool> has a data() memeber
+// not possible, because in libstdc++ vector<bool> has a data() member
// returning void*, and the Span template guide ignored the data() return value,
// so the template substitution would succeed, but the constructor would fail,
// resulting in a fatal compile error, rather than a SFINAE error that could be
diff --git a/src/test/streams_tests.cpp b/src/test/streams_tests.cpp
index 7d1ac5a19a..0903f987f6 100644
--- a/src/test/streams_tests.cpp
+++ b/src/test/streams_tests.cpp
@@ -29,7 +29,14 @@ BOOST_AUTO_TEST_CASE(xor_file)
BOOST_CHECK_EXCEPTION(xor_file.ignore(1), std::ios_base::failure, HasReason{"AutoFile::ignore: file handle is nullpt"});
}
{
- AutoFile xor_file{raw_file("wbx"), xor_pat};
+#ifdef __MINGW64__
+ // Our usage of mingw-w64 and the msvcrt runtime does not support
+ // the x modifier for the _wfopen().
+ const char* mode = "wb";
+#else
+ const char* mode = "wbx";
+#endif
+ AutoFile xor_file{raw_file(mode), xor_pat};
xor_file << test1 << test2;
}
{
diff --git a/src/test/system_tests.cpp b/src/test/system_tests.cpp
index 6a96b60db0..90fce9adf9 100644
--- a/src/test/system_tests.cpp
+++ b/src/test/system_tests.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
//
+
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
#include <test/util/setup_common.h>
#include <common/run_command.h>
#include <univalue.h>
@@ -25,23 +29,12 @@ BOOST_AUTO_TEST_CASE(dummy)
BOOST_AUTO_TEST_CASE(run_command)
{
-#ifdef WIN32
- // https://www.winehq.org/pipermail/wine-devel/2008-September/069387.html
- auto hntdll = GetModuleHandleA("ntdll.dll");
- assert(hntdll);
- const bool wine_runtime = GetProcAddress(hntdll, "wine_get_version");
-#endif
-
{
const UniValue result = RunCommandParseJSON("");
BOOST_CHECK(result.isNull());
}
{
-#ifdef WIN32
- const UniValue result = RunCommandParseJSON("cmd.exe /c echo {\"success\": true}");
-#else
const UniValue result = RunCommandParseJSON("echo \"{\"success\": true}\"");
-#endif
BOOST_CHECK(result.isObject());
const UniValue& success = result.find_value("success");
BOOST_CHECK(!success.isNull());
@@ -49,11 +42,7 @@ BOOST_AUTO_TEST_CASE(run_command)
}
{
// An invalid command is handled by Boost
-#ifdef WIN32
- const int expected_error{wine_runtime ? 6 : 2};
-#else
const int expected_error{2};
-#endif
BOOST_CHECK_EXCEPTION(RunCommandParseJSON("invalid_command"), boost::process::process_error, [&](const boost::process::process_error& e) {
BOOST_CHECK(std::string(e.what()).find("RunCommandParseJSON error:") == std::string::npos);
BOOST_CHECK_EQUAL(e.code().value(), expected_error);
@@ -62,11 +51,7 @@ BOOST_AUTO_TEST_CASE(run_command)
}
{
// Return non-zero exit code, no output to stderr
-#ifdef WIN32
- const std::string command{"cmd.exe /c exit 1"};
-#else
const std::string command{"false"};
-#endif
BOOST_CHECK_EXCEPTION(RunCommandParseJSON(command), std::runtime_error, [&](const std::runtime_error& e) {
const std::string what{e.what()};
BOOST_CHECK(what.find(strprintf("RunCommandParseJSON error: process(%s) returned 1: \n", command)) != std::string::npos);
@@ -75,13 +60,8 @@ BOOST_AUTO_TEST_CASE(run_command)
}
{
// Return non-zero exit code, with error message for stderr
-#ifdef WIN32
- const std::string command{"cmd.exe /c dir nosuchfile"};
- const std::string expected{wine_runtime ? "File not found." : "File Not Found"};
-#else
const std::string command{"ls nosuchfile"};
const std::string expected{"No such file or directory"};
-#endif
BOOST_CHECK_EXCEPTION(RunCommandParseJSON(command), std::runtime_error, [&](const std::runtime_error& e) {
const std::string what(e.what());
BOOST_CHECK(what.find(strprintf("RunCommandParseJSON error: process(%s) returned", command)) != std::string::npos);
@@ -91,15 +71,10 @@ BOOST_AUTO_TEST_CASE(run_command)
}
{
// Unable to parse JSON
-#ifdef WIN32
- const std::string command{"cmd.exe /c echo {"};
-#else
const std::string command{"echo {"};
-#endif
BOOST_CHECK_EXCEPTION(RunCommandParseJSON(command), std::runtime_error, HasReason("Unable to parse JSON: {"));
}
- // Test std::in, except for Windows
-#ifndef WIN32
+ // Test std::in
{
const UniValue result = RunCommandParseJSON("cat", "{\"success\": true}");
BOOST_CHECK(result.isObject());
@@ -107,7 +82,6 @@ BOOST_AUTO_TEST_CASE(run_command)
BOOST_CHECK(!success.isNull());
BOOST_CHECK_EQUAL(success.get_bool(), true);
}
-#endif
}
#endif // ENABLE_EXTERNAL_SIGNER
diff --git a/src/test/txindex_tests.cpp b/src/test/txindex_tests.cpp
index e2432a4718..5a32b02ad9 100644
--- a/src/test/txindex_tests.cpp
+++ b/src/test/txindex_tests.cpp
@@ -71,7 +71,7 @@ BOOST_FIXTURE_TEST_CASE(txindex_initial_sync, TestChain100Setup)
// SyncWithValidationInterfaceQueue() call below is also needed to ensure
// TSAN always sees the test thread waiting for the notification thread, and
// avoid potential false positive reports.
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
// shutdown sequence (c.f. Shutdown() in init.cpp)
txindex.Stop();
diff --git a/src/test/txpackage_tests.cpp b/src/test/txpackage_tests.cpp
index f6456526bb..b948ea8acb 100644
--- a/src/test/txpackage_tests.cpp
+++ b/src/test/txpackage_tests.cpp
@@ -132,7 +132,7 @@ BOOST_FIXTURE_TEST_CASE(package_validation_tests, TestChain100Setup)
/*output_amount=*/CAmount(48 * COIN), /*submit=*/false);
CTransactionRef tx_child = MakeTransactionRef(mtx_child);
Package package_parent_child{tx_parent, tx_child};
- const auto result_parent_child = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool, package_parent_child, /*test_accept=*/true);
+ const auto result_parent_child = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool, package_parent_child, /*test_accept=*/true, /*client_maxfeerate=*/{});
if (auto err_parent_child{CheckPackageMempoolAcceptResult(package_parent_child, result_parent_child, /*expect_valid=*/true, nullptr)}) {
BOOST_ERROR(err_parent_child.value());
} else {
@@ -151,7 +151,7 @@ BOOST_FIXTURE_TEST_CASE(package_validation_tests, TestChain100Setup)
CTransactionRef giant_ptx = create_placeholder_tx(999, 999);
BOOST_CHECK(GetVirtualTransactionSize(*giant_ptx) > DEFAULT_ANCESTOR_SIZE_LIMIT_KVB * 1000);
Package package_single_giant{giant_ptx};
- auto result_single_large = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool, package_single_giant, /*test_accept=*/true);
+ auto result_single_large = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool, package_single_giant, /*test_accept=*/true, /*client_maxfeerate=*/{});
if (auto err_single_large{CheckPackageMempoolAcceptResult(package_single_giant, result_single_large, /*expect_valid=*/false, nullptr)}) {
BOOST_ERROR(err_single_large.value());
} else {
@@ -275,7 +275,7 @@ BOOST_FIXTURE_TEST_CASE(package_submission_tests, TestChain100Setup)
package_unrelated.emplace_back(MakeTransactionRef(mtx));
}
auto result_unrelated_submit = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_unrelated, /*test_accept=*/false);
+ package_unrelated, /*test_accept=*/false, /*client_maxfeerate=*/{});
// We don't expect m_tx_results for each transaction when basic sanity checks haven't passed.
BOOST_CHECK(result_unrelated_submit.m_state.IsInvalid());
BOOST_CHECK_EQUAL(result_unrelated_submit.m_state.GetResult(), PackageValidationResult::PCKG_POLICY);
@@ -315,7 +315,7 @@ BOOST_FIXTURE_TEST_CASE(package_submission_tests, TestChain100Setup)
// 3 Generations is not allowed.
{
auto result_3gen_submit = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_3gen, /*test_accept=*/false);
+ package_3gen, /*test_accept=*/false, /*client_maxfeerate=*/{});
BOOST_CHECK(result_3gen_submit.m_state.IsInvalid());
BOOST_CHECK_EQUAL(result_3gen_submit.m_state.GetResult(), PackageValidationResult::PCKG_POLICY);
BOOST_CHECK_EQUAL(result_3gen_submit.m_state.GetRejectReason(), "package-not-child-with-parents");
@@ -332,7 +332,7 @@ BOOST_FIXTURE_TEST_CASE(package_submission_tests, TestChain100Setup)
CTransactionRef tx_parent_invalid = MakeTransactionRef(mtx_parent_invalid);
Package package_invalid_parent{tx_parent_invalid, tx_child};
auto result_quit_early = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_invalid_parent, /*test_accept=*/ false);
+ package_invalid_parent, /*test_accept=*/ false, /*client_maxfeerate=*/{});
if (auto err_parent_invalid{CheckPackageMempoolAcceptResult(package_invalid_parent, result_quit_early, /*expect_valid=*/false, m_node.mempool.get())}) {
BOOST_ERROR(err_parent_invalid.value());
} else {
@@ -353,7 +353,7 @@ BOOST_FIXTURE_TEST_CASE(package_submission_tests, TestChain100Setup)
package_missing_parent.push_back(MakeTransactionRef(mtx_child));
{
const auto result_missing_parent = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_missing_parent, /*test_accept=*/false);
+ package_missing_parent, /*test_accept=*/false, /*client_maxfeerate=*/{});
BOOST_CHECK(result_missing_parent.m_state.IsInvalid());
BOOST_CHECK_EQUAL(result_missing_parent.m_state.GetResult(), PackageValidationResult::PCKG_POLICY);
BOOST_CHECK_EQUAL(result_missing_parent.m_state.GetRejectReason(), "package-not-child-with-unconfirmed-parents");
@@ -363,7 +363,7 @@ BOOST_FIXTURE_TEST_CASE(package_submission_tests, TestChain100Setup)
// Submit package with parent + child.
{
const auto submit_parent_child = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_parent_child, /*test_accept=*/false);
+ package_parent_child, /*test_accept=*/false, /*client_maxfeerate=*/{});
expected_pool_size += 2;
BOOST_CHECK_MESSAGE(submit_parent_child.m_state.IsValid(),
"Package validation unexpectedly failed: " << submit_parent_child.m_state.GetRejectReason());
@@ -385,7 +385,7 @@ BOOST_FIXTURE_TEST_CASE(package_submission_tests, TestChain100Setup)
// Already-in-mempool transactions should be detected and de-duplicated.
{
const auto submit_deduped = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_parent_child, /*test_accept=*/false);
+ package_parent_child, /*test_accept=*/false, /*client_maxfeerate=*/{});
if (auto err_deduped{CheckPackageMempoolAcceptResult(package_parent_child, submit_deduped, /*expect_valid=*/true, m_node.mempool.get())}) {
BOOST_ERROR(err_deduped.value());
} else {
@@ -456,7 +456,7 @@ BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
{
Package package_parent_child1{ptx_parent, ptx_child1};
const auto submit_witness1 = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_parent_child1, /*test_accept=*/false);
+ package_parent_child1, /*test_accept=*/false, /*client_maxfeerate=*/{});
if (auto err_witness1{CheckPackageMempoolAcceptResult(package_parent_child1, submit_witness1, /*expect_valid=*/true, m_node.mempool.get())}) {
BOOST_ERROR(err_witness1.value());
}
@@ -464,7 +464,7 @@ BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
// Child2 would have been validated individually.
Package package_parent_child2{ptx_parent, ptx_child2};
const auto submit_witness2 = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_parent_child2, /*test_accept=*/false);
+ package_parent_child2, /*test_accept=*/false, /*client_maxfeerate=*/{});
if (auto err_witness2{CheckPackageMempoolAcceptResult(package_parent_child2, submit_witness2, /*expect_valid=*/true, m_node.mempool.get())}) {
BOOST_ERROR(err_witness2.value());
} else {
@@ -478,7 +478,7 @@ BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
// Deduplication should work when wtxid != txid. Submit package with the already-in-mempool
// transactions again, which should not fail.
const auto submit_segwit_dedup = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_parent_child1, /*test_accept=*/false);
+ package_parent_child1, /*test_accept=*/false, /*client_maxfeerate=*/{});
if (auto err_segwit_dedup{CheckPackageMempoolAcceptResult(package_parent_child1, submit_segwit_dedup, /*expect_valid=*/true, m_node.mempool.get())}) {
BOOST_ERROR(err_segwit_dedup.value());
} else {
@@ -508,7 +508,7 @@ BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
{
Package package_child2_grandchild{ptx_child2, ptx_grandchild};
const auto submit_spend_ignored = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_child2_grandchild, /*test_accept=*/false);
+ package_child2_grandchild, /*test_accept=*/false, /*client_maxfeerate=*/{});
if (auto err_spend_ignored{CheckPackageMempoolAcceptResult(package_child2_grandchild, submit_spend_ignored, /*expect_valid=*/true, m_node.mempool.get())}) {
BOOST_ERROR(err_spend_ignored.value());
} else {
@@ -606,7 +606,7 @@ BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
// parent3 should be accepted
// child should be accepted
{
- const auto mixed_result = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool, package_mixed, false);
+ const auto mixed_result = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool, package_mixed, false, /*client_maxfeerate=*/{});
if (auto err_mixed{CheckPackageMempoolAcceptResult(package_mixed, mixed_result, /*expect_valid=*/true, m_node.mempool.get())}) {
BOOST_ERROR(err_mixed.value());
} else {
@@ -670,7 +670,7 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
{
BOOST_CHECK_EQUAL(m_node.mempool->size(), expected_pool_size);
const auto submit_cpfp_deprio = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_cpfp, /*test_accept=*/ false);
+ package_cpfp, /*test_accept=*/ false, /*client_maxfeerate=*/{});
if (auto err_cpfp_deprio{CheckPackageMempoolAcceptResult(package_cpfp, submit_cpfp_deprio, /*expect_valid=*/false, m_node.mempool.get())}) {
BOOST_ERROR(err_cpfp_deprio.value());
} else {
@@ -692,7 +692,7 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
{
BOOST_CHECK_EQUAL(m_node.mempool->size(), expected_pool_size);
const auto submit_cpfp = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_cpfp, /*test_accept=*/ false);
+ package_cpfp, /*test_accept=*/ false, /*client_maxfeerate=*/{});
if (auto err_cpfp{CheckPackageMempoolAcceptResult(package_cpfp, submit_cpfp, /*expect_valid=*/true, m_node.mempool.get())}) {
BOOST_ERROR(err_cpfp.value());
} else {
@@ -744,7 +744,7 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
// Cheap package should fail for being too low fee.
{
const auto submit_package_too_low = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_still_too_low, /*test_accept=*/false);
+ package_still_too_low, /*test_accept=*/false, /*client_maxfeerate=*/{});
if (auto err_package_too_low{CheckPackageMempoolAcceptResult(package_still_too_low, submit_package_too_low, /*expect_valid=*/false, m_node.mempool.get())}) {
BOOST_ERROR(err_package_too_low.value());
} else {
@@ -770,7 +770,7 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
// Now that the child's fees have "increased" by 1 BTC, the cheap package should succeed.
{
const auto submit_prioritised_package = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_still_too_low, /*test_accept=*/false);
+ package_still_too_low, /*test_accept=*/false, /*client_maxfeerate=*/{});
if (auto err_prioritised{CheckPackageMempoolAcceptResult(package_still_too_low, submit_prioritised_package, /*expect_valid=*/true, m_node.mempool.get())}) {
BOOST_ERROR(err_prioritised.value());
} else {
@@ -818,7 +818,7 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
{
BOOST_CHECK_EQUAL(m_node.mempool->size(), expected_pool_size);
const auto submit_rich_parent = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
- package_rich_parent, /*test_accept=*/false);
+ package_rich_parent, /*test_accept=*/false, /*client_maxfeerate=*/{});
if (auto err_rich_parent{CheckPackageMempoolAcceptResult(package_rich_parent, submit_rich_parent, /*expect_valid=*/false, m_node.mempool.get())}) {
BOOST_ERROR(err_rich_parent.value());
} else {
diff --git a/src/test/txvalidation_tests.cpp b/src/test/txvalidation_tests.cpp
index 98d5e892f9..95583b53bf 100644
--- a/src/test/txvalidation_tests.cpp
+++ b/src/test/txvalidation_tests.cpp
@@ -115,10 +115,14 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
const auto expected_error_str{strprintf("non-v3 tx %s (wtxid=%s) cannot spend from v3 tx %s (wtxid=%s)",
tx_v2_from_v3->GetHash().ToString(), tx_v2_from_v3->GetWitnessHash().ToString(),
mempool_tx_v3->GetHash().ToString(), mempool_tx_v3->GetWitnessHash().ToString())};
- BOOST_CHECK(*SingleV3Checks(tx_v2_from_v3, *ancestors_v2_from_v3, empty_conflicts_set, GetVirtualTransactionSize(*tx_v2_from_v3)) == expected_error_str);
+ auto result_v2_from_v3{SingleV3Checks(tx_v2_from_v3, *ancestors_v2_from_v3, empty_conflicts_set, GetVirtualTransactionSize(*tx_v2_from_v3))};
+ BOOST_CHECK_EQUAL(result_v2_from_v3->first, expected_error_str);
+ BOOST_CHECK_EQUAL(result_v2_from_v3->second, nullptr);
Package package_v3_v2{mempool_tx_v3, tx_v2_from_v3};
BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v2_from_v3, GetVirtualTransactionSize(*tx_v2_from_v3), package_v3_v2, empty_ancestors), expected_error_str);
+ CTxMemPool::setEntries entries_mempool_v3{pool.GetIter(mempool_tx_v3->GetHash().ToUint256()).value()};
+ BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v2_from_v3, GetVirtualTransactionSize(*tx_v2_from_v3), {tx_v2_from_v3}, entries_mempool_v3), expected_error_str);
// mempool_tx_v3 mempool_tx_v2
// ^ ^
@@ -128,8 +132,9 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
const auto expected_error_str_2{strprintf("non-v3 tx %s (wtxid=%s) cannot spend from v3 tx %s (wtxid=%s)",
tx_v2_from_v2_and_v3->GetHash().ToString(), tx_v2_from_v2_and_v3->GetWitnessHash().ToString(),
mempool_tx_v3->GetHash().ToString(), mempool_tx_v3->GetWitnessHash().ToString())};
- BOOST_CHECK(*SingleV3Checks(tx_v2_from_v2_and_v3, *ancestors_v2_from_both, empty_conflicts_set, GetVirtualTransactionSize(*tx_v2_from_v2_and_v3))
- == expected_error_str_2);
+ auto result_v2_from_both{SingleV3Checks(tx_v2_from_v2_and_v3, *ancestors_v2_from_both, empty_conflicts_set, GetVirtualTransactionSize(*tx_v2_from_v2_and_v3))};
+ BOOST_CHECK_EQUAL(result_v2_from_both->first, expected_error_str_2);
+ BOOST_CHECK_EQUAL(result_v2_from_both->second, nullptr);
Package package_v3_v2_v2{mempool_tx_v3, mempool_tx_v2, tx_v2_from_v2_and_v3};
BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v2_from_v2_and_v3, GetVirtualTransactionSize(*tx_v2_from_v2_and_v3), package_v3_v2_v2, empty_ancestors), expected_error_str_2);
@@ -145,10 +150,14 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
const auto expected_error_str{strprintf("v3 tx %s (wtxid=%s) cannot spend from non-v3 tx %s (wtxid=%s)",
tx_v3_from_v2->GetHash().ToString(), tx_v3_from_v2->GetWitnessHash().ToString(),
mempool_tx_v2->GetHash().ToString(), mempool_tx_v2->GetWitnessHash().ToString())};
- BOOST_CHECK(*SingleV3Checks(tx_v3_from_v2, *ancestors_v3_from_v2, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_from_v2)) == expected_error_str);
+ auto result_v3_from_v2{SingleV3Checks(tx_v3_from_v2, *ancestors_v3_from_v2, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_from_v2))};
+ BOOST_CHECK_EQUAL(result_v3_from_v2->first, expected_error_str);
+ BOOST_CHECK_EQUAL(result_v3_from_v2->second, nullptr);
Package package_v2_v3{mempool_tx_v2, tx_v3_from_v2};
BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v3_from_v2, GetVirtualTransactionSize(*tx_v3_from_v2), package_v2_v3, empty_ancestors), expected_error_str);
+ CTxMemPool::setEntries entries_mempool_v2{pool.GetIter(mempool_tx_v2->GetHash().ToUint256()).value()};
+ BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v3_from_v2, GetVirtualTransactionSize(*tx_v3_from_v2), {tx_v3_from_v2}, entries_mempool_v2), expected_error_str);
// mempool_tx_v3 mempool_tx_v2
// ^ ^
@@ -158,8 +167,9 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
const auto expected_error_str_2{strprintf("v3 tx %s (wtxid=%s) cannot spend from non-v3 tx %s (wtxid=%s)",
tx_v3_from_v2_and_v3->GetHash().ToString(), tx_v3_from_v2_and_v3->GetWitnessHash().ToString(),
mempool_tx_v2->GetHash().ToString(), mempool_tx_v2->GetWitnessHash().ToString())};
- BOOST_CHECK(*SingleV3Checks(tx_v3_from_v2_and_v3, *ancestors_v3_from_both, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_from_v2_and_v3))
- == expected_error_str_2);
+ auto result_v3_from_both{SingleV3Checks(tx_v3_from_v2_and_v3, *ancestors_v3_from_both, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_from_v2_and_v3))};
+ BOOST_CHECK_EQUAL(result_v3_from_both->first, expected_error_str_2);
+ BOOST_CHECK_EQUAL(result_v3_from_both->second, nullptr);
// tx_v3_from_v2_and_v3 also violates V3_ANCESTOR_LIMIT.
const auto expected_error_str_3{strprintf("tx %s (wtxid=%s) would have too many ancestors",
@@ -211,8 +221,9 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
BOOST_CHECK_EQUAL(ancestors->size(), 3);
const auto expected_error_str{strprintf("tx %s (wtxid=%s) would have too many ancestors",
tx_v3_multi_parent->GetHash().ToString(), tx_v3_multi_parent->GetWitnessHash().ToString())};
- BOOST_CHECK_EQUAL(*SingleV3Checks(tx_v3_multi_parent, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_multi_parent)),
- expected_error_str);
+ auto result{SingleV3Checks(tx_v3_multi_parent, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_multi_parent))};
+ BOOST_CHECK_EQUAL(result->first, expected_error_str);
+ BOOST_CHECK_EQUAL(result->second, nullptr);
BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v3_multi_parent, GetVirtualTransactionSize(*tx_v3_multi_parent), package_multi_parents, empty_ancestors),
expected_error_str);
@@ -235,8 +246,9 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
auto ancestors{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v3_multi_gen), m_limits)};
const auto expected_error_str{strprintf("tx %s (wtxid=%s) would have too many ancestors",
tx_v3_multi_gen->GetHash().ToString(), tx_v3_multi_gen->GetWitnessHash().ToString())};
- BOOST_CHECK_EQUAL(*SingleV3Checks(tx_v3_multi_gen, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_multi_gen)),
- expected_error_str);
+ auto result{SingleV3Checks(tx_v3_multi_gen, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_multi_gen))};
+ BOOST_CHECK_EQUAL(result->first, expected_error_str);
+ BOOST_CHECK_EQUAL(result->second, nullptr);
// Middle tx is what triggers a failure for the grandchild:
BOOST_CHECK_EQUAL(*PackageV3Checks(middle_tx, GetVirtualTransactionSize(*middle_tx), package_multi_gen, empty_ancestors), expected_error_str);
@@ -252,8 +264,9 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
auto ancestors{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v3_child_big), m_limits)};
const auto expected_error_str{strprintf("v3 child tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
tx_v3_child_big->GetHash().ToString(), tx_v3_child_big->GetWitnessHash().ToString(), vsize, V3_CHILD_MAX_VSIZE)};
- BOOST_CHECK_EQUAL(*SingleV3Checks(tx_v3_child_big, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_child_big)),
- expected_error_str);
+ auto result{SingleV3Checks(tx_v3_child_big, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_child_big))};
+ BOOST_CHECK_EQUAL(result->first, expected_error_str);
+ BOOST_CHECK_EQUAL(result->second, nullptr);
Package package_child_big{mempool_tx_v3, tx_v3_child_big};
BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v3_child_big, GetVirtualTransactionSize(*tx_v3_child_big), package_child_big, empty_ancestors),
@@ -294,9 +307,10 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
const auto expected_error_str{strprintf("v3 child tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
tx_many_sigops->GetHash().ToString(), tx_many_sigops->GetWitnessHash().ToString(),
total_sigops * DEFAULT_BYTES_PER_SIGOP / WITNESS_SCALE_FACTOR, V3_CHILD_MAX_VSIZE)};
- BOOST_CHECK_EQUAL(*SingleV3Checks(tx_many_sigops, *ancestors, empty_conflicts_set,
- GetVirtualTransactionSize(*tx_many_sigops, /*nSigOpCost=*/total_sigops, /*bytes_per_sigop=*/ DEFAULT_BYTES_PER_SIGOP)),
- expected_error_str);
+ auto result{SingleV3Checks(tx_many_sigops, *ancestors, empty_conflicts_set,
+ GetVirtualTransactionSize(*tx_many_sigops, /*nSigOpCost=*/total_sigops, /*bytes_per_sigop=*/ DEFAULT_BYTES_PER_SIGOP))};
+ BOOST_CHECK_EQUAL(result->first, expected_error_str);
+ BOOST_CHECK_EQUAL(result->second, nullptr);
Package package_child_sigops{mempool_tx_v3, tx_many_sigops};
BOOST_CHECK_EQUAL(*PackageV3Checks(tx_many_sigops, total_sigops * DEFAULT_BYTES_PER_SIGOP / WITNESS_SCALE_FACTOR, package_child_sigops, empty_ancestors),
@@ -315,22 +329,58 @@ BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
BOOST_CHECK(PackageV3Checks(tx_mempool_v3_child, GetVirtualTransactionSize(*tx_mempool_v3_child), package_v3_1p1c, empty_ancestors) == std::nullopt);
}
- // A v3 transaction cannot have more than 1 descendant.
- // Configuration where tx has multiple direct children.
+ // A v3 transaction cannot have more than 1 descendant. Sibling is returned when exactly 1 exists.
{
auto tx_v3_child2 = make_tx({COutPoint{mempool_tx_v3->GetHash(), 1}}, /*version=*/3);
- auto ancestors{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v3_child2), m_limits)};
+
+ // Configuration where parent already has 1 other child in mempool
+ auto ancestors_1sibling{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v3_child2), m_limits)};
const auto expected_error_str{strprintf("tx %s (wtxid=%s) would exceed descendant count limit",
mempool_tx_v3->GetHash().ToString(), mempool_tx_v3->GetWitnessHash().ToString())};
- BOOST_CHECK_EQUAL(*SingleV3Checks(tx_v3_child2, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_child2)),
- expected_error_str);
- // If replacing the child, make sure there is no double-counting.
- BOOST_CHECK(SingleV3Checks(tx_v3_child2, *ancestors, {tx_mempool_v3_child->GetHash()}, GetVirtualTransactionSize(*tx_v3_child2))
+ auto result_with_sibling_eviction{SingleV3Checks(tx_v3_child2, *ancestors_1sibling, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_child2))};
+ BOOST_CHECK_EQUAL(result_with_sibling_eviction->first, expected_error_str);
+ // The other mempool child is returned to allow for sibling eviction.
+ BOOST_CHECK_EQUAL(result_with_sibling_eviction->second, tx_mempool_v3_child);
+
+ // If directly replacing the child, make sure there is no double-counting.
+ BOOST_CHECK(SingleV3Checks(tx_v3_child2, *ancestors_1sibling, {tx_mempool_v3_child->GetHash()}, GetVirtualTransactionSize(*tx_v3_child2))
== std::nullopt);
Package package_v3_1p2c{mempool_tx_v3, tx_mempool_v3_child, tx_v3_child2};
BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v3_child2, GetVirtualTransactionSize(*tx_v3_child2), package_v3_1p2c, empty_ancestors),
expected_error_str);
+
+ // Configuration where parent already has 2 other children in mempool (no sibling eviction allowed). This may happen as the result of a reorg.
+ pool.addUnchecked(entry.FromTx(tx_v3_child2));
+ auto tx_v3_child3 = make_tx({COutPoint{mempool_tx_v3->GetHash(), 24}}, /*version=*/3);
+ auto entry_mempool_parent = pool.GetIter(mempool_tx_v3->GetHash().ToUint256()).value();
+ BOOST_CHECK_EQUAL(entry_mempool_parent->GetCountWithDescendants(), 3);
+ auto ancestors_2siblings{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v3_child3), m_limits)};
+
+ auto result_2children{SingleV3Checks(tx_v3_child3, *ancestors_2siblings, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_child3))};
+ BOOST_CHECK_EQUAL(result_2children->first, expected_error_str);
+ // The other mempool child is not returned because sibling eviction is not allowed.
+ BOOST_CHECK_EQUAL(result_2children->second, nullptr);
+ }
+
+ // Sibling eviction: parent already has 1 other child, which also has its own child (no sibling eviction allowed). This may happen as the result of a reorg.
+ {
+ auto tx_mempool_grandparent = make_tx(random_outpoints(1), /*version=*/3);
+ auto tx_mempool_sibling = make_tx({COutPoint{tx_mempool_grandparent->GetHash(), 0}}, /*version=*/3);
+ auto tx_mempool_nibling = make_tx({COutPoint{tx_mempool_sibling->GetHash(), 0}}, /*version=*/3);
+ auto tx_to_submit = make_tx({COutPoint{tx_mempool_grandparent->GetHash(), 1}}, /*version=*/3);
+
+ pool.addUnchecked(entry.FromTx(tx_mempool_grandparent));
+ pool.addUnchecked(entry.FromTx(tx_mempool_sibling));
+ pool.addUnchecked(entry.FromTx(tx_mempool_nibling));
+
+ auto ancestors_3gen{pool.CalculateMemPoolAncestors(entry.FromTx(tx_to_submit), m_limits)};
+ const auto expected_error_str{strprintf("tx %s (wtxid=%s) would exceed descendant count limit",
+ tx_mempool_grandparent->GetHash().ToString(), tx_mempool_grandparent->GetWitnessHash().ToString())};
+ auto result_3gen{SingleV3Checks(tx_to_submit, *ancestors_3gen, empty_conflicts_set, GetVirtualTransactionSize(*tx_to_submit))};
+ BOOST_CHECK_EQUAL(result_3gen->first, expected_error_str);
+ // The other mempool child is not returned because sibling eviction is not allowed.
+ BOOST_CHECK_EQUAL(result_3gen->second, nullptr);
}
// Configuration where tx has multiple generations of descendants is not tested because that is
diff --git a/src/test/util/chainstate.h b/src/test/util/chainstate.h
index e2a88eacdd..ff95e64b7e 100644
--- a/src/test/util/chainstate.h
+++ b/src/test/util/chainstate.h
@@ -91,13 +91,16 @@ CreateAndActivateUTXOSnapshot(
// these blocks instead
CBlockIndex *pindex = orig_tip;
while (pindex && pindex != chain.m_chain.Tip()) {
- pindex->nStatus &= ~BLOCK_HAVE_DATA;
- pindex->nStatus &= ~BLOCK_HAVE_UNDO;
- // We have to set the ASSUMED_VALID flag, because otherwise it
- // would not be possible to have a block index entry without HAVE_DATA
- // and with nTx > 0 (since we aren't setting the pruned flag);
- // see CheckBlockIndex().
- pindex->nStatus |= BLOCK_ASSUMED_VALID;
+ // Remove all data and validity flags by just setting
+ // BLOCK_VALID_TREE. Also reset transaction counts and sequence
+ // ids that are set when blocks are received, to make test setup
+ // more realistic and satisfy consistency checks in
+ // CheckBlockIndex().
+ assert(pindex->IsValid(BlockStatus::BLOCK_VALID_TREE));
+ pindex->nStatus = BlockStatus::BLOCK_VALID_TREE;
+ pindex->nTx = 0;
+ pindex->nChainTx = 0;
+ pindex->nSequenceId = 0;
pindex = pindex->pprev;
}
}
diff --git a/src/test/util/mining.cpp b/src/test/util/mining.cpp
index 08d1b4c902..ad7a38d3fe 100644
--- a/src/test/util/mining.cpp
+++ b/src/test/util/mining.cpp
@@ -95,12 +95,12 @@ COutPoint MineBlock(const NodeContext& node, std::shared_ptr<CBlock>& block)
const auto old_height = WITH_LOCK(chainman.GetMutex(), return chainman.ActiveHeight());
bool new_block;
BlockValidationStateCatcher bvsc{block->GetHash()};
- RegisterValidationInterface(&bvsc);
+ node.validation_signals->RegisterValidationInterface(&bvsc);
const bool processed{chainman.ProcessNewBlock(block, true, true, &new_block)};
const bool duplicate{!new_block && processed};
assert(!duplicate);
- UnregisterValidationInterface(&bvsc);
- SyncWithValidationInterfaceQueue();
+ node.validation_signals->UnregisterValidationInterface(&bvsc);
+ node.validation_signals->SyncWithValidationInterfaceQueue();
const bool was_valid{bvsc.m_state && bvsc.m_state->IsValid()};
assert(old_height + was_valid == WITH_LOCK(chainman.GetMutex(), return chainman.ActiveHeight()));
diff --git a/src/test/util/setup_common.cpp b/src/test/util/setup_common.cpp
index 9f587d7ec0..2c18184261 100644
--- a/src/test/util/setup_common.cpp
+++ b/src/test/util/setup_common.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <test/util/setup_common.h>
#include <kernel/validation_cache_sizes.h>
@@ -48,6 +52,7 @@
#include <txmempool.h>
#include <util/chaintype.h>
#include <util/check.h>
+#include <util/fs_helpers.h>
#include <util/rbf.h>
#include <util/strencodings.h>
#include <util/string.h>
@@ -96,9 +101,22 @@ struct NetworkSetup
};
static NetworkSetup g_networksetup_instance;
+/** Register test-only arguments */
+static void SetupUnitTestArgs(ArgsManager& argsman)
+{
+ argsman.AddArg("-testdatadir", strprintf("Custom data directory (default: %s<random_string>)", fs::PathToString(fs::temp_directory_path() / "test_common_" PACKAGE_NAME / "")),
+ ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
+}
+
+/** Test setup failure */
+static void ExitFailure(std::string_view str_err)
+{
+ std::cerr << str_err << std::endl;
+ exit(EXIT_FAILURE);
+}
+
BasicTestingSetup::BasicTestingSetup(const ChainType chainType, const std::vector<const char*>& extra_args)
- : m_path_root{fs::temp_directory_path() / "test_common_" PACKAGE_NAME / g_insecure_rand_ctx_temp_path.rand256().ToString()},
- m_args{}
+ : m_args{}
{
m_node.shutdown = &m_interrupt;
m_node.args = &gArgs;
@@ -119,18 +137,49 @@ BasicTestingSetup::BasicTestingSetup(const ChainType chainType, const std::vecto
arguments = Cat(arguments, G_TEST_COMMAND_LINE_ARGUMENTS());
}
util::ThreadRename("test");
- fs::create_directories(m_path_root);
- m_args.ForceSetArg("-datadir", fs::PathToString(m_path_root));
- gArgs.ForceSetArg("-datadir", fs::PathToString(m_path_root));
gArgs.ClearPathCache();
{
SetupServerArgs(*m_node.args);
+ SetupUnitTestArgs(*m_node.args);
std::string error;
if (!m_node.args->ParseParameters(arguments.size(), arguments.data(), error)) {
m_node.args->ClearArgs();
throw std::runtime_error{error};
}
}
+
+ if (!m_node.args->IsArgSet("-testdatadir")) {
+ // By default, the data directory has a random name
+ const auto rand_str{g_insecure_rand_ctx_temp_path.rand256().ToString()};
+ m_path_root = fs::temp_directory_path() / "test_common_" PACKAGE_NAME / rand_str;
+ TryCreateDirectories(m_path_root);
+ } else {
+ // Custom data directory
+ m_has_custom_datadir = true;
+ fs::path root_dir{m_node.args->GetPathArg("-testdatadir")};
+ if (root_dir.empty()) ExitFailure("-testdatadir argument is empty, please specify a path");
+
+ root_dir = fs::absolute(root_dir);
+ const std::string test_path{G_TEST_GET_FULL_NAME ? G_TEST_GET_FULL_NAME() : ""};
+ m_path_lock = root_dir / "test_common_" PACKAGE_NAME / fs::PathFromString(test_path);
+ m_path_root = m_path_lock / "datadir";
+
+ // Try to obtain the lock; if unsuccessful don't disturb the existing test.
+ TryCreateDirectories(m_path_lock);
+ if (util::LockDirectory(m_path_lock, ".lock", /*probe_only=*/false) != util::LockResult::Success) {
+ ExitFailure("Cannot obtain a lock on test data lock directory " + fs::PathToString(m_path_lock) + '\n' + "The test executable is probably already running.");
+ }
+
+ // Always start with a fresh data directory; this doesn't delete the .lock file located one level above.
+ fs::remove_all(m_path_root);
+ if (!TryCreateDirectories(m_path_root)) ExitFailure("Cannot create test data directory");
+
+ // Print the test directory name if custom.
+ std::cout << "Test directory (will not be deleted): " << m_path_root << std::endl;
+ }
+ m_args.ForceSetArg("-datadir", fs::PathToString(m_path_root));
+ gArgs.ForceSetArg("-datadir", fs::PathToString(m_path_root));
+
SelectParams(chainType);
SeedInsecureRand();
if (G_TEST_LOG_FUN) LogInstance().PushBackCallback(G_TEST_LOG_FUN);
@@ -158,7 +207,13 @@ BasicTestingSetup::~BasicTestingSetup()
m_node.kernel.reset();
SetMockTime(0s); // Reset mocktime for following tests
LogInstance().DisconnectTestLogger();
- fs::remove_all(m_path_root);
+ if (m_has_custom_datadir) {
+ // Only remove the lock file, preserve the data directory.
+ UnlockDirectory(m_path_lock, ".lock");
+ fs::remove(m_path_lock / ".lock");
+ } else {
+ fs::remove_all(m_path_root);
+ }
gArgs.ClearArgs();
}
@@ -171,7 +226,7 @@ ChainTestingSetup::ChainTestingSetup(const ChainType chainType, const std::vecto
// from blocking due to queue overrun.
m_node.scheduler = std::make_unique<CScheduler>();
m_node.scheduler->m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { m_node.scheduler->serviceQueue(); });
- GetMainSignals().RegisterBackgroundSignalScheduler(*m_node.scheduler);
+ m_node.validation_signals = std::make_unique<ValidationSignals>(std::make_unique<SerialTaskRunner>(*m_node.scheduler));
m_node.fee_estimator = std::make_unique<CBlockPolicyEstimator>(FeeestPath(*m_node.args), DEFAULT_ACCEPT_STALE_FEE_ESTIMATES);
m_node.mempool = std::make_unique<CTxMemPool>(MemPoolOptionsForTest(m_node));
@@ -185,6 +240,7 @@ ChainTestingSetup::ChainTestingSetup(const ChainType chainType, const std::vecto
.datadir = m_args.GetDataDirNet(),
.check_block_index = true,
.notifications = *m_node.notifications,
+ .signals = m_node.validation_signals.get(),
.worker_threads_num = 2,
};
const BlockManager::Options blockman_opts{
@@ -202,8 +258,7 @@ ChainTestingSetup::ChainTestingSetup(const ChainType chainType, const std::vecto
ChainTestingSetup::~ChainTestingSetup()
{
if (m_node.scheduler) m_node.scheduler->stop();
- GetMainSignals().FlushBackgroundCallbacks();
- GetMainSignals().UnregisterBackgroundSignalScheduler();
+ m_node.validation_signals->FlushBackgroundCallbacks();
m_node.connman.reset();
m_node.banman.reset();
m_node.addrman.reset();
@@ -212,6 +267,7 @@ ChainTestingSetup::~ChainTestingSetup()
m_node.mempool.reset();
m_node.fee_estimator.reset();
m_node.chainman.reset();
+ m_node.validation_signals.reset();
m_node.scheduler.reset();
}
diff --git a/src/test/util/setup_common.h b/src/test/util/setup_common.h
index 9ff4c372a5..8ccf9b571c 100644
--- a/src/test/util/setup_common.h
+++ b/src/test/util/setup_common.h
@@ -32,6 +32,9 @@ extern const std::function<void(const std::string&)> G_TEST_LOG_FUN;
/** Retrieve the command line arguments. */
extern const std::function<std::vector<const char*>()> G_TEST_COMMAND_LINE_ARGUMENTS;
+/** Retrieve the unit test name. */
+extern const std::function<std::string()> G_TEST_GET_FULL_NAME;
+
// Enable BOOST_CHECK_EQUAL for enum class types
namespace std {
template <typename T>
@@ -53,7 +56,9 @@ struct BasicTestingSetup {
explicit BasicTestingSetup(const ChainType chainType = ChainType::MAIN, const std::vector<const char*>& extra_args = {});
~BasicTestingSetup();
- const fs::path m_path_root;
+ fs::path m_path_root;
+ fs::path m_path_lock;
+ bool m_has_custom_datadir{false};
ArgsManager m_args;
};
diff --git a/src/test/util/txmempool.cpp b/src/test/util/txmempool.cpp
index 3b4161ddd3..71cf8aca60 100644
--- a/src/test/util/txmempool.cpp
+++ b/src/test/util/txmempool.cpp
@@ -22,6 +22,7 @@ CTxMemPool::Options MemPoolOptionsForTest(const NodeContext& node)
// Default to always checking mempool regardless of
// chainparams.DefaultConsistencyChecks for tests
.check_ratio = 1,
+ .signals = node.validation_signals.get(),
};
const auto result{ApplyArgsManOptions(*node.args, ::Params(), mempool_opts)};
Assert(result);
diff --git a/src/test/validation_block_tests.cpp b/src/test/validation_block_tests.cpp
index 35e5c6a037..316ab86c2b 100644
--- a/src/test/validation_block_tests.cpp
+++ b/src/test/validation_block_tests.cpp
@@ -158,7 +158,7 @@ BOOST_AUTO_TEST_CASE(processnewblock_signals_ordering)
bool ignored;
// Connect the genesis block and drain any outstanding events
BOOST_CHECK(Assert(m_node.chainman)->ProcessNewBlock(std::make_shared<CBlock>(Params().GenesisBlock()), true, true, &ignored));
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
// subscribe to events (this subscriber will validate event ordering)
const CBlockIndex* initial_tip = nullptr;
@@ -167,7 +167,7 @@ BOOST_AUTO_TEST_CASE(processnewblock_signals_ordering)
initial_tip = m_node.chainman->ActiveChain().Tip();
}
auto sub = std::make_shared<TestSubscriber>(initial_tip->GetBlockHash());
- RegisterSharedValidationInterface(sub);
+ m_node.validation_signals->RegisterSharedValidationInterface(sub);
// create a bunch of threads that repeatedly process a block generated above at random
// this will create parallelism and randomness inside validation - the ValidationInterface
@@ -196,9 +196,9 @@ BOOST_AUTO_TEST_CASE(processnewblock_signals_ordering)
for (auto& t : threads) {
t.join();
}
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
- UnregisterSharedValidationInterface(sub);
+ m_node.validation_signals->UnregisterSharedValidationInterface(sub);
LOCK(cs_main);
BOOST_CHECK_EQUAL(sub->m_expected_tip, m_node.chainman->ActiveChain().Tip()->GetBlockHash());
diff --git a/src/test/validation_chainstatemanager_tests.cpp b/src/test/validation_chainstatemanager_tests.cpp
index a33e71d50e..4bf66a55eb 100644
--- a/src/test/validation_chainstatemanager_tests.cpp
+++ b/src/test/validation_chainstatemanager_tests.cpp
@@ -102,7 +102,7 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager, TestChain100Setup)
BOOST_CHECK_EQUAL(active_tip2, c2.m_chain.Tip());
// Let scheduler events finish running to avoid accessing memory that is going to be unloaded
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
}
//! Test rebalancing the caches associated with each chainstate.
@@ -276,9 +276,6 @@ struct SnapshotTestSetup : TestChain100Setup {
BOOST_CHECK_EQUAL(
*node::ReadSnapshotBaseBlockhash(found),
*chainman.SnapshotBlockhash());
-
- // Ensure that the genesis block was not marked assumed-valid.
- BOOST_CHECK(!chainman.ActiveChain().Genesis()->IsAssumedValid());
}
const auto& au_data = ::Params().AssumeutxoForHeight(snapshot_height);
@@ -374,7 +371,7 @@ struct SnapshotTestSetup : TestChain100Setup {
cs->ForceFlushStateToDisk();
}
// Process all callbacks referring to the old manager before wiping it.
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
LOCK(::cs_main);
chainman.ResetChainstates();
BOOST_CHECK_EQUAL(chainman.GetAll().size(), 0);
@@ -383,6 +380,7 @@ struct SnapshotTestSetup : TestChain100Setup {
.chainparams = ::Params(),
.datadir = chainman.m_options.datadir,
.notifications = *m_node.notifications,
+ .signals = m_node.validation_signals.get(),
};
const BlockManager::Options blockman_opts{
.chainparams = chainman_opts.chainparams,
@@ -409,7 +407,7 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_activate_snapshot, SnapshotTestSetup)
//! - First, verify that setBlockIndexCandidates is as expected when using a single,
//! fully-validating chainstate.
//!
-//! - Then mark a region of the chain BLOCK_ASSUMED_VALID and introduce a second chainstate
+//! - Then mark a region of the chain as missing data and introduce a second chainstate
//! that will tolerate assumed-valid blocks. Run LoadBlockIndex() and ensure that the first
//! chainstate only contains fully validated blocks and the other chainstate contains all blocks,
//! except those marked assume-valid, because those entries don't HAVE_DATA.
@@ -420,7 +418,6 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_loadblockindex, TestChain100Setup)
Chainstate& cs1 = chainman.ActiveChainstate();
int num_indexes{0};
- int num_assumed_valid{0};
// Blocks in range [assumed_valid_start_idx, last_assumed_valid_idx) will be
// marked as assumed-valid and not having data.
const int expected_assumed_valid{20};
@@ -455,35 +452,30 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_loadblockindex, TestChain100Setup)
reload_all_block_indexes();
BOOST_CHECK_EQUAL(cs1.setBlockIndexCandidates.size(), 1);
- // Mark some region of the chain assumed-valid, and remove the HAVE_DATA flag.
+ // Reset some region of the chain's nStatus, removing the HAVE_DATA flag.
for (int i = 0; i <= cs1.m_chain.Height(); ++i) {
LOCK(::cs_main);
auto index = cs1.m_chain[i];
- // Blocks with heights in range [91, 110] are marked ASSUMED_VALID
+ // Blocks with heights in range [91, 110] are marked as missing data.
if (i < last_assumed_valid_idx && i >= assumed_valid_start_idx) {
- index->nStatus = BlockStatus::BLOCK_VALID_TREE | BlockStatus::BLOCK_ASSUMED_VALID;
+ index->nStatus = BlockStatus::BLOCK_VALID_TREE;
+ index->nTx = 0;
+ index->nChainTx = 0;
}
++num_indexes;
- if (index->IsAssumedValid()) ++num_assumed_valid;
// Note the last fully-validated block as the expected validated tip.
if (i == (assumed_valid_start_idx - 1)) {
validated_tip = index;
- BOOST_CHECK(!index->IsAssumedValid());
}
// Note the last assumed valid block as the snapshot base
if (i == last_assumed_valid_idx - 1) {
assumed_base = index;
- BOOST_CHECK(index->IsAssumedValid());
- } else if (i == last_assumed_valid_idx) {
- BOOST_CHECK(!index->IsAssumedValid());
}
}
- BOOST_CHECK_EQUAL(expected_assumed_valid, num_assumed_valid);
-
// Note: cs2's tip is not set when ActivateExistingSnapshot is called.
Chainstate& cs2 = WITH_LOCK(::cs_main,
return chainman.ActivateExistingSnapshot(*assumed_base->phashBlock));
diff --git a/src/test/validation_tests.cpp b/src/test/validation_tests.cpp
index 14440571eb..93a884be6d 100644
--- a/src/test/validation_tests.cpp
+++ b/src/test/validation_tests.cpp
@@ -4,12 +4,17 @@
#include <chainparams.h>
#include <consensus/amount.h>
+#include <consensus/merkle.h>
+#include <core_io.h>
+#include <hash.h>
#include <net.h>
#include <signet.h>
#include <uint256.h>
#include <util/chaintype.h>
#include <validation.h>
+#include <string>
+
#include <test/util/setup_common.h>
#include <boost/test/unit_test.hpp>
@@ -145,4 +150,214 @@ BOOST_AUTO_TEST_CASE(test_assumeutxo)
BOOST_CHECK_EQUAL(out110_2.nChainTx, 111U);
}
+BOOST_AUTO_TEST_CASE(block_malleation)
+{
+ // Test utilities that calls `IsBlockMutated` and then clears the validity
+ // cache flags on `CBlock`.
+ auto is_mutated = [](CBlock& block, bool check_witness_root) {
+ bool mutated{IsBlockMutated(block, check_witness_root)};
+ block.fChecked = false;
+ block.m_checked_witness_commitment = false;
+ block.m_checked_merkle_root = false;
+ return mutated;
+ };
+ auto is_not_mutated = [&is_mutated](CBlock& block, bool check_witness_root) {
+ return !is_mutated(block, check_witness_root);
+ };
+
+ // Test utilities to create coinbase transactions and insert witness
+ // commitments.
+ //
+ // Note: this will not include the witness stack by default to avoid
+ // triggering the "no witnesses allowed for blocks that don't commit to
+ // witnesses" rule when testing other malleation vectors.
+ auto create_coinbase_tx = [](bool include_witness = false) {
+ CMutableTransaction coinbase;
+ coinbase.vin.resize(1);
+ if (include_witness) {
+ coinbase.vin[0].scriptWitness.stack.resize(1);
+ coinbase.vin[0].scriptWitness.stack[0] = std::vector<unsigned char>(32, 0x00);
+ }
+
+ coinbase.vout.resize(1);
+ coinbase.vout[0].scriptPubKey.resize(MINIMUM_WITNESS_COMMITMENT);
+ coinbase.vout[0].scriptPubKey[0] = OP_RETURN;
+ coinbase.vout[0].scriptPubKey[1] = 0x24;
+ coinbase.vout[0].scriptPubKey[2] = 0xaa;
+ coinbase.vout[0].scriptPubKey[3] = 0x21;
+ coinbase.vout[0].scriptPubKey[4] = 0xa9;
+ coinbase.vout[0].scriptPubKey[5] = 0xed;
+
+ auto tx = MakeTransactionRef(coinbase);
+ assert(tx->IsCoinBase());
+ return tx;
+ };
+ auto insert_witness_commitment = [](CBlock& block, uint256 commitment) {
+ assert(!block.vtx.empty() && block.vtx[0]->IsCoinBase() && !block.vtx[0]->vout.empty());
+
+ CMutableTransaction mtx{*block.vtx[0]};
+ CHash256().Write(commitment).Write(std::vector<unsigned char>(32, 0x00)).Finalize(commitment);
+ memcpy(&mtx.vout[0].scriptPubKey[6], commitment.begin(), 32);
+ block.vtx[0] = MakeTransactionRef(mtx);
+ };
+
+ {
+ CBlock block;
+
+ // Empty block is expected to have merkle root of 0x0.
+ BOOST_CHECK(block.vtx.empty());
+ block.hashMerkleRoot = uint256{1};
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/false));
+ block.hashMerkleRoot = uint256{};
+ BOOST_CHECK(is_not_mutated(block, /*check_witness_root=*/false));
+
+ // Block with a single coinbase tx is mutated if the merkle root is not
+ // equal to the coinbase tx's hash.
+ block.vtx.push_back(create_coinbase_tx());
+ BOOST_CHECK(block.vtx[0]->GetHash() != block.hashMerkleRoot);
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/false));
+ block.hashMerkleRoot = block.vtx[0]->GetHash();
+ BOOST_CHECK(is_not_mutated(block, /*check_witness_root=*/false));
+
+ // Block with two transactions is mutated if the merkle root does not
+ // match the double sha256 of the concatenation of the two transaction
+ // hashes.
+ block.vtx.push_back(MakeTransactionRef(CMutableTransaction{}));
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/false));
+ HashWriter hasher;
+ hasher.write(block.vtx[0]->GetHash());
+ hasher.write(block.vtx[1]->GetHash());
+ block.hashMerkleRoot = hasher.GetHash();
+ BOOST_CHECK(is_not_mutated(block, /*check_witness_root=*/false));
+
+ // Block with two transactions is mutated if any node is duplicate.
+ {
+ block.vtx[1] = block.vtx[0];
+ HashWriter hasher;
+ hasher.write(block.vtx[0]->GetHash());
+ hasher.write(block.vtx[1]->GetHash());
+ block.hashMerkleRoot = hasher.GetHash();
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/false));
+ }
+
+ // Blocks with 64-byte coinbase transactions are not considered mutated
+ block.vtx.clear();
+ {
+ CMutableTransaction mtx;
+ mtx.vin.resize(1);
+ mtx.vout.resize(1);
+ mtx.vout[0].scriptPubKey.resize(4);
+ block.vtx.push_back(MakeTransactionRef(mtx));
+ block.hashMerkleRoot = block.vtx.back()->GetHash();
+ assert(block.vtx.back()->IsCoinBase());
+ assert(GetSerializeSize(TX_NO_WITNESS(block.vtx.back())) == 64);
+ }
+ BOOST_CHECK(is_not_mutated(block, /*check_witness_root=*/false));
+ }
+
+ {
+ // Test merkle root malleation
+
+ // Pseudo code to mine transactions tx{1,2,3}:
+ //
+ // ```
+ // loop {
+ // tx1 = random_tx()
+ // tx2 = random_tx()
+ // tx3 = deserialize_tx(txid(tx1) || txid(tx2));
+ // if serialized_size_without_witness(tx3) == 64 {
+ // print(hex(tx3))
+ // break
+ // }
+ // }
+ // ```
+ //
+ // The `random_tx` function used to mine the txs below simply created
+ // empty transactions with a random version field.
+ CMutableTransaction tx1;
+ BOOST_CHECK(DecodeHexTx(tx1, "ff204bd0000000000000", /*try_no_witness=*/true, /*try_witness=*/false));
+ CMutableTransaction tx2;
+ BOOST_CHECK(DecodeHexTx(tx2, "8ae53c92000000000000", /*try_no_witness=*/true, /*try_witness=*/false));
+ CMutableTransaction tx3;
+ BOOST_CHECK(DecodeHexTx(tx3, "cdaf22d00002c6a7f848f8ae4d30054e61dcf3303d6fe01d282163341f06feecc10032b3160fcab87bdfe3ecfb769206ef2d991b92f8a268e423a6ef4d485f06", /*try_no_witness=*/true, /*try_witness=*/false));
+ {
+ // Verify that double_sha256(txid1||txid2) == txid3
+ HashWriter hasher;
+ hasher.write(tx1.GetHash());
+ hasher.write(tx2.GetHash());
+ assert(hasher.GetHash() == tx3.GetHash());
+ // Verify that tx3 is 64 bytes in size (without witness).
+ assert(GetSerializeSize(TX_NO_WITNESS(tx3)) == 64);
+ }
+
+ CBlock block;
+ block.vtx.push_back(MakeTransactionRef(tx1));
+ block.vtx.push_back(MakeTransactionRef(tx2));
+ uint256 merkle_root = block.hashMerkleRoot = BlockMerkleRoot(block);
+ BOOST_CHECK(is_not_mutated(block, /*check_witness_root=*/false));
+
+ // Mutate the block by replacing the two transactions with one 64-byte
+ // transaction that serializes into the concatenation of the txids of
+ // the transactions in the unmutated block.
+ block.vtx.clear();
+ block.vtx.push_back(MakeTransactionRef(tx3));
+ BOOST_CHECK(!block.vtx.back()->IsCoinBase());
+ BOOST_CHECK(BlockMerkleRoot(block) == merkle_root);
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/false));
+ }
+
+ {
+ CBlock block;
+ block.vtx.push_back(create_coinbase_tx(/*include_witness=*/true));
+ {
+ CMutableTransaction mtx;
+ mtx.vin.resize(1);
+ mtx.vin[0].scriptWitness.stack.resize(1);
+ mtx.vin[0].scriptWitness.stack[0] = {0};
+ block.vtx.push_back(MakeTransactionRef(mtx));
+ }
+ block.hashMerkleRoot = BlockMerkleRoot(block);
+ // Block with witnesses is considered mutated if the witness commitment
+ // is not validated.
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/false));
+ // Block with invalid witness commitment is considered mutated.
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/true));
+
+ // Block with valid commitment is not mutated
+ {
+ auto commitment{BlockWitnessMerkleRoot(block)};
+ insert_witness_commitment(block, commitment);
+ block.hashMerkleRoot = BlockMerkleRoot(block);
+ }
+ BOOST_CHECK(is_not_mutated(block, /*check_witness_root=*/true));
+
+ // Malleating witnesses should be caught by `IsBlockMutated`.
+ {
+ CMutableTransaction mtx{*block.vtx[1]};
+ assert(!mtx.vin[0].scriptWitness.stack[0].empty());
+ ++mtx.vin[0].scriptWitness.stack[0][0];
+ block.vtx[1] = MakeTransactionRef(mtx);
+ }
+ // Without also updating the witness commitment, the merkle root should
+ // not change when changing one of the witnesses.
+ BOOST_CHECK(block.hashMerkleRoot == BlockMerkleRoot(block));
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/true));
+ {
+ auto commitment{BlockWitnessMerkleRoot(block)};
+ insert_witness_commitment(block, commitment);
+ block.hashMerkleRoot = BlockMerkleRoot(block);
+ }
+ BOOST_CHECK(is_not_mutated(block, /*check_witness_root=*/true));
+
+ // Test malleating the coinbase witness reserved value
+ {
+ CMutableTransaction mtx{*block.vtx[0]};
+ mtx.vin[0].scriptWitness.stack.resize(0);
+ block.vtx[0] = MakeTransactionRef(mtx);
+ block.hashMerkleRoot = BlockMerkleRoot(block);
+ }
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/true));
+ }
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/validationinterface_tests.cpp b/src/test/validationinterface_tests.cpp
index 5979441057..a46cfc3029 100644
--- a/src/test/validationinterface_tests.cpp
+++ b/src/test/validationinterface_tests.cpp
@@ -28,7 +28,7 @@ BOOST_AUTO_TEST_CASE(unregister_validation_interface_race)
const CBlock block_dummy;
BlockValidationState state_dummy;
while (generate) {
- GetMainSignals().BlockChecked(block_dummy, state_dummy);
+ m_node.validation_signals->BlockChecked(block_dummy, state_dummy);
}
}};
@@ -37,8 +37,8 @@ BOOST_AUTO_TEST_CASE(unregister_validation_interface_race)
// keep going for about 1 sec, which is 250k iterations
for (int i = 0; i < 250000; i++) {
auto sub = std::make_shared<TestSubscriberNoop>();
- RegisterSharedValidationInterface(sub);
- UnregisterSharedValidationInterface(sub);
+ m_node.validation_signals->RegisterSharedValidationInterface(sub);
+ m_node.validation_signals->UnregisterSharedValidationInterface(sub);
}
// tell the other thread we are done
generate = false;
@@ -52,8 +52,8 @@ BOOST_AUTO_TEST_CASE(unregister_validation_interface_race)
class TestInterface : public CValidationInterface
{
public:
- TestInterface(std::function<void()> on_call = nullptr, std::function<void()> on_destroy = nullptr)
- : m_on_call(std::move(on_call)), m_on_destroy(std::move(on_destroy))
+ TestInterface(ValidationSignals& signals, std::function<void()> on_call = nullptr, std::function<void()> on_destroy = nullptr)
+ : m_on_call(std::move(on_call)), m_on_destroy(std::move(on_destroy)), m_signals{signals}
{
}
virtual ~TestInterface()
@@ -64,14 +64,15 @@ public:
{
if (m_on_call) m_on_call();
}
- static void Call()
+ void Call()
{
CBlock block;
BlockValidationState state;
- GetMainSignals().BlockChecked(block, state);
+ m_signals.BlockChecked(block, state);
}
std::function<void()> m_on_call;
std::function<void()> m_on_destroy;
+ ValidationSignals& m_signals;
};
// Regression test to ensure UnregisterAllValidationInterfaces calls don't
@@ -80,17 +81,23 @@ public:
BOOST_AUTO_TEST_CASE(unregister_all_during_call)
{
bool destroyed = false;
- RegisterSharedValidationInterface(std::make_shared<TestInterface>(
+ auto shared{std::make_shared<TestInterface>(
+ *m_node.validation_signals,
[&] {
// First call should decrements reference count 2 -> 1
- UnregisterAllValidationInterfaces();
+ m_node.validation_signals->UnregisterAllValidationInterfaces();
BOOST_CHECK(!destroyed);
// Second call should not decrement reference count 1 -> 0
- UnregisterAllValidationInterfaces();
+ m_node.validation_signals->UnregisterAllValidationInterfaces();
BOOST_CHECK(!destroyed);
},
- [&] { destroyed = true; }));
- TestInterface::Call();
+ [&] { destroyed = true; })};
+ m_node.validation_signals->RegisterSharedValidationInterface(shared);
+ BOOST_CHECK(shared.use_count() == 2);
+ shared->Call();
+ BOOST_CHECK(shared.use_count() == 1);
+ BOOST_CHECK(!destroyed);
+ shared.reset();
BOOST_CHECK(destroyed);
}
diff --git a/src/txmempool.cpp b/src/txmempool.cpp
index de340f6b6d..82eec6241f 100644
--- a/src/txmempool.cpp
+++ b/src/txmempool.cpp
@@ -17,6 +17,7 @@
#include <random.h>
#include <reverse_iterator.h>
#include <util/check.h>
+#include <util/feefrac.h>
#include <util/moneystr.h>
#include <util/overflow.h>
#include <util/result.h>
@@ -406,7 +407,8 @@ CTxMemPool::CTxMemPool(const Options& opts)
m_require_standard{opts.require_standard},
m_full_rbf{opts.full_rbf},
m_persist_v1_dat{opts.persist_v1_dat},
- m_limits{opts.limits}
+ m_limits{opts.limits},
+ m_signals{opts.signals}
{
}
@@ -487,12 +489,12 @@ void CTxMemPool::removeUnchecked(txiter it, MemPoolRemovalReason reason)
// even if not directly reported below.
uint64_t mempool_sequence = GetAndIncrementSequence();
- if (reason != MemPoolRemovalReason::BLOCK) {
+ if (reason != MemPoolRemovalReason::BLOCK && m_signals) {
// Notify clients that a transaction has been removed from the mempool
// for any reason except being included in a block. Clients interested
// in transactions included in blocks can subscribe to the BlockConnected
// notification.
- GetMainSignals().TransactionRemovedFromMempool(it->GetSharedTx(), reason, mempool_sequence);
+ m_signals->TransactionRemovedFromMempool(it->GetSharedTx(), reason, mempool_sequence);
}
TRACE5(mempool, removed,
it->GetTx().GetHash().data(),
@@ -643,7 +645,9 @@ void CTxMemPool::removeForBlock(const std::vector<CTransactionRef>& vtx, unsigne
removeConflicts(*tx);
ClearPrioritisation(tx->GetHash());
}
- GetMainSignals().MempoolTransactionsRemovedForBlock(txs_removed_for_block, nBlockHeight);
+ if (m_signals) {
+ m_signals->MempoolTransactionsRemovedForBlock(txs_removed_for_block, nBlockHeight);
+ }
lastRollingFeeUpdate = GetTime();
blockSinceLastRollingFeeBump = true;
}
@@ -1235,3 +1239,132 @@ std::vector<CTxMemPool::txiter> CTxMemPool::GatherClusters(const std::vector<uin
}
return clustered_txs;
}
+
+std::optional<std::string> CTxMemPool::CheckConflictTopology(const setEntries& direct_conflicts)
+{
+ for (const auto& direct_conflict : direct_conflicts) {
+ // Ancestor and descendant counts are inclusive of the tx itself.
+ const auto ancestor_count{direct_conflict->GetCountWithAncestors()};
+ const auto descendant_count{direct_conflict->GetCountWithDescendants()};
+ const bool has_ancestor{ancestor_count > 1};
+ const bool has_descendant{descendant_count > 1};
+ const auto& txid_string{direct_conflict->GetSharedTx()->GetHash().ToString()};
+ // The only allowed configurations are:
+ // 1 ancestor and 0 descendant
+ // 0 ancestor and 1 descendant
+ // 0 ancestor and 0 descendant
+ if (ancestor_count > 2) {
+ return strprintf("%s has %u ancestors, max 1 allowed", txid_string, ancestor_count - 1);
+ } else if (descendant_count > 2) {
+ return strprintf("%s has %u descendants, max 1 allowed", txid_string, descendant_count - 1);
+ } else if (has_ancestor && has_descendant) {
+ return strprintf("%s has both ancestor and descendant, exceeding cluster limit of 2", txid_string);
+ }
+ // Additionally enforce that:
+ // If we have a child, we are its only parent.
+ // If we have a parent, we are its only child.
+ if (has_descendant) {
+ const auto& our_child = direct_conflict->GetMemPoolChildrenConst().begin();
+ if (our_child->get().GetCountWithAncestors() > 2) {
+ return strprintf("%s is not the only parent of child %s",
+ txid_string, our_child->get().GetSharedTx()->GetHash().ToString());
+ }
+ } else if (has_ancestor) {
+ const auto& our_parent = direct_conflict->GetMemPoolParentsConst().begin();
+ if (our_parent->get().GetCountWithDescendants() > 2) {
+ return strprintf("%s is not the only child of parent %s",
+ txid_string, our_parent->get().GetSharedTx()->GetHash().ToString());
+ }
+ }
+ }
+ return std::nullopt;
+}
+
+util::Result<std::pair<std::vector<FeeFrac>, std::vector<FeeFrac>>> CTxMemPool::CalculateFeerateDiagramsForRBF(CAmount replacement_fees, int64_t replacement_vsize, const setEntries& direct_conflicts, const setEntries& all_conflicts)
+{
+ Assume(replacement_vsize > 0);
+
+ auto err_string{CheckConflictTopology(direct_conflicts)};
+ if (err_string.has_value()) {
+ // Unsupported topology for calculating a feerate diagram
+ return util::Error{Untranslated(err_string.value())};
+ }
+
+ // new diagram will have chunks that consist of each ancestor of
+ // direct_conflicts that is at its own fee/size, along with the replacement
+ // tx/package at its own fee/size
+
+ // old diagram will consist of the ancestors and descendants of each element of
+ // all_conflicts. every such transaction will either be at its own feerate (followed
+ // by any descendant at its own feerate), or as a single chunk at the descendant's
+ // ancestor feerate.
+
+ std::vector<FeeFrac> old_chunks;
+ // Step 1: build the old diagram.
+
+ // The above clusters are all trivially linearized;
+ // they have a strict topology of 1 or two connected transactions.
+
+ // OLD: Compute existing chunks from all affected clusters
+ for (auto txiter : all_conflicts) {
+ // Does this transaction have descendants?
+ if (txiter->GetCountWithDescendants() > 1) {
+ // Consider this tx when we consider the descendant.
+ continue;
+ }
+ // Does this transaction have ancestors?
+ FeeFrac individual{txiter->GetModifiedFee(), txiter->GetTxSize()};
+ if (txiter->GetCountWithAncestors() > 1) {
+ // We'll add chunks for either the ancestor by itself and this tx
+ // by itself, or for a combined package.
+ FeeFrac package{txiter->GetModFeesWithAncestors(), static_cast<int32_t>(txiter->GetSizeWithAncestors())};
+ if (individual >> package) {
+ // The individual feerate is higher than the package, and
+ // therefore higher than the parent's fee. Chunk these
+ // together.
+ old_chunks.emplace_back(package);
+ } else {
+ // Add two points, one for the parent and one for this child.
+ old_chunks.emplace_back(package - individual);
+ old_chunks.emplace_back(individual);
+ }
+ } else {
+ old_chunks.emplace_back(individual);
+ }
+ }
+
+ // No topology restrictions post-chunking; sort
+ std::sort(old_chunks.begin(), old_chunks.end(), std::greater());
+ std::vector<FeeFrac> old_diagram = BuildDiagramFromChunks(old_chunks);
+
+ std::vector<FeeFrac> new_chunks;
+
+ /* Step 2: build the NEW diagram
+ * CON = Conflicts of proposed chunk
+ * CNK = Proposed chunk
+ * NEW = OLD - CON + CNK: New diagram includes all chunks in OLD, minus
+ * the conflicts, plus the proposed chunk
+ */
+
+ // OLD - CON: Add any parents of direct conflicts that are not conflicted themselves
+ for (auto direct_conflict : direct_conflicts) {
+ // If a direct conflict has an ancestor that is not in all_conflicts,
+ // it can be affected by the replacement of the child.
+ if (direct_conflict->GetMemPoolParentsConst().size() > 0) {
+ // Grab the parent.
+ const CTxMemPoolEntry& parent = direct_conflict->GetMemPoolParentsConst().begin()->get();
+ if (!all_conflicts.count(mapTx.iterator_to(parent))) {
+ // This transaction would be left over, so add to the NEW
+ // diagram.
+ new_chunks.emplace_back(parent.GetModifiedFee(), parent.GetTxSize());
+ }
+ }
+ }
+ // + CNK: Add the proposed chunk itself
+ new_chunks.emplace_back(replacement_fees, int32_t(replacement_vsize));
+
+ // No topology restrictions post-chunking; sort
+ std::sort(new_chunks.begin(), new_chunks.end(), std::greater());
+ std::vector<FeeFrac> new_diagram = BuildDiagramFromChunks(new_chunks);
+ return std::make_pair(old_diagram, new_diagram);
+}
diff --git a/src/txmempool.h b/src/txmempool.h
index b98355c65f..9dd4d56da7 100644
--- a/src/txmempool.h
+++ b/src/txmempool.h
@@ -21,6 +21,7 @@
#include <util/epochguard.h>
#include <util/hasher.h>
#include <util/result.h>
+#include <util/feefrac.h>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/identity.hpp>
@@ -40,6 +41,7 @@
#include <vector>
class CChain;
+class ValidationSignals;
/** Fake height value used in Coin to signify they are only in the memory pool (since 0.8) */
static const uint32_t MEMPOOL_HEIGHT = 0x7FFFFFFF;
@@ -447,6 +449,8 @@ public:
const Limits m_limits;
+ ValidationSignals* const m_signals;
+
/** Create a new CTxMemPool.
* Sanity checks will be off by default for performance, because otherwise
* accepting transactions becomes O(N^2) where N is the number of transactions
@@ -733,6 +737,28 @@ public:
return m_sequence_number;
}
+ /**
+ * Calculate the old and new mempool feerate diagrams relating to the
+ * clusters that would be affected by a potential replacement transaction.
+ * (replacement_fees, replacement_vsize) values are gathered from a
+ * proposed set of replacement transactions that are considered as a single
+ * chunk, and represent their complete cluster. In other words, they have no
+ * in-mempool ancestors.
+ *
+ * @param[in] replacement_fees Package fees
+ * @param[in] replacement_vsize Package size (must be greater than 0)
+ * @param[in] direct_conflicts All transactions that would be removed directly by
+ * having a conflicting input with a proposed transaction
+ * @param[in] all_conflicts All transactions that would be removed
+ * @return old and new diagram pair respectively, or an error string if the conflicts don't match a calculable topology
+ */
+ util::Result<std::pair<std::vector<FeeFrac>, std::vector<FeeFrac>>> CalculateFeerateDiagramsForRBF(CAmount replacement_fees, int64_t replacement_vsize, const setEntries& direct_conflicts, const setEntries& all_conflicts) EXCLUSIVE_LOCKS_REQUIRED(cs);
+
+ /* Check that all direct conflicts are in a cluster size of two or less. Each
+ * direct conflict may be in a separate cluster.
+ */
+ std::optional<std::string> CheckConflictTopology(const setEntries& direct_conflicts);
+
private:
/** UpdateForDescendants is used by UpdateTransactionsFromBlock to update
* the descendants for a single transaction that has been added to the
diff --git a/src/util/asmap.cpp b/src/util/asmap.cpp
index 360573cbae..f50cd8a28c 100644
--- a/src/util/asmap.cpp
+++ b/src/util/asmap.cpp
@@ -5,13 +5,13 @@
#include <util/asmap.h>
#include <clientversion.h>
-#include <crypto/common.h>
#include <logging.h>
#include <serialize.h>
#include <streams.h>
#include <util/fs.h>
#include <algorithm>
+#include <bit>
#include <cassert>
#include <cstdio>
#include <utility>
@@ -111,7 +111,7 @@ uint32_t Interpret(const std::vector<bool> &asmap, const std::vector<bool> &ip)
} else if (opcode == Instruction::MATCH) {
match = DecodeMatch(pos, endpos);
if (match == INVALID) break; // Match bits straddle EOF
- matchlen = CountBits(match) - 1;
+ matchlen = std::bit_width(match) - 1;
if (bits < matchlen) break; // Not enough input bits
for (uint32_t bit = 0; bit < matchlen; bit++) {
if ((ip[ip.size() - bits]) != ((match >> (matchlen - 1 - bit)) & 1)) {
@@ -175,7 +175,7 @@ bool SanityCheckASMap(const std::vector<bool>& asmap, int bits)
} else if (opcode == Instruction::MATCH) {
uint32_t match = DecodeMatch(pos, endpos);
if (match == INVALID) return false; // Match bits straddle EOF
- int matchlen = CountBits(match) - 1;
+ int matchlen = std::bit_width(match) - 1;
if (prevopcode != Instruction::MATCH) had_incomplete_match = false;
if (matchlen < 8 && had_incomplete_match) return false; // Within a sequence of matches only at most one should be incomplete
had_incomplete_match = (matchlen < 8);
diff --git a/src/util/feefrac.cpp b/src/util/feefrac.cpp
new file mode 100644
index 0000000000..68fb836936
--- /dev/null
+++ b/src/util/feefrac.cpp
@@ -0,0 +1,87 @@
+// Copyright (c) The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <util/feefrac.h>
+#include <algorithm>
+#include <array>
+#include <vector>
+
+std::vector<FeeFrac> BuildDiagramFromChunks(const Span<const FeeFrac> chunks)
+{
+ std::vector<FeeFrac> diagram;
+ diagram.reserve(chunks.size() + 1);
+
+ diagram.emplace_back(0, 0);
+ for (auto& chunk : chunks) {
+ diagram.emplace_back(diagram.back() + chunk);
+ }
+ return diagram;
+}
+
+std::partial_ordering CompareFeerateDiagram(Span<const FeeFrac> dia0, Span<const FeeFrac> dia1)
+{
+ /** Array to allow indexed access to input diagrams. */
+ const std::array<Span<const FeeFrac>, 2> dias = {dia0, dia1};
+ /** How many elements we have processed in each input. */
+ size_t next_index[2] = {1, 1};
+ /** Whether the corresponding input is strictly better than the other at least in one place. */
+ bool better_somewhere[2] = {false, false};
+ /** Get the first unprocessed point in diagram number dia. */
+ const auto next_point = [&](int dia) { return dias[dia][next_index[dia]]; };
+ /** Get the last processed point in diagram number dia. */
+ const auto prev_point = [&](int dia) { return dias[dia][next_index[dia] - 1]; };
+
+ // Diagrams should be non-empty, and first elements zero in size and fee
+ Assert(!dia0.empty() && !dia1.empty());
+ Assert(prev_point(0).IsEmpty());
+ Assert(prev_point(1).IsEmpty());
+
+ do {
+ bool done_0 = next_index[0] == dias[0].size();
+ bool done_1 = next_index[1] == dias[1].size();
+ if (done_0 && done_1) break;
+
+ // Determine which diagram has the first unprocessed point. If a single side is finished, use the
+ // other one. Only up to one can be done due to check above.
+ const int unproc_side = (done_0 || done_1) ? done_0 : next_point(0).size > next_point(1).size;
+
+ // Let `P` be the next point on diagram unproc_side, and `A` and `B` the previous and next points
+ // on the other diagram. We want to know if P lies above or below the line AB. To determine this, we
+ // compute the slopes of line AB and of line AP, and compare them. These slopes are fee per size,
+ // and can thus be expressed as FeeFracs.
+ const FeeFrac& point_p = next_point(unproc_side);
+ const FeeFrac& point_a = prev_point(!unproc_side);
+
+ const auto slope_ap = point_p - point_a;
+ Assume(slope_ap.size > 0);
+ std::weak_ordering cmp = std::weak_ordering::equivalent;
+ if (done_0 || done_1) {
+ // If a single side has no points left, act as if AB has slope tail_feerate(of 0).
+ Assume(!(done_0 && done_1));
+ cmp = FeeRateCompare(slope_ap, FeeFrac(0, 1));
+ } else {
+ // If both sides have points left, compute B, and the slope of AB explicitly.
+ const FeeFrac& point_b = next_point(!unproc_side);
+ const auto slope_ab = point_b - point_a;
+ Assume(slope_ab.size >= slope_ap.size);
+ cmp = FeeRateCompare(slope_ap, slope_ab);
+
+ // If B and P have the same size, B can be marked as processed (in addition to P, see
+ // below), as we've already performed a comparison at this size.
+ if (point_b.size == point_p.size) ++next_index[!unproc_side];
+ }
+ // If P lies above AB, unproc_side is better in P. If P lies below AB, then !unproc_side is
+ // better in P.
+ if (std::is_gt(cmp)) better_somewhere[unproc_side] = true;
+ if (std::is_lt(cmp)) better_somewhere[!unproc_side] = true;
+ ++next_index[unproc_side];
+
+ // If both diagrams are better somewhere, they are incomparable.
+ if (better_somewhere[0] && better_somewhere[1]) return std::partial_ordering::unordered;
+
+ } while(true);
+
+ // Otherwise compare the better_somewhere values.
+ return better_somewhere[0] <=> better_somewhere[1];
+}
diff --git a/src/util/feefrac.h b/src/util/feefrac.h
new file mode 100644
index 0000000000..7102f85f88
--- /dev/null
+++ b/src/util/feefrac.h
@@ -0,0 +1,160 @@
+// Copyright (c) The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_UTIL_FEEFRAC_H
+#define BITCOIN_UTIL_FEEFRAC_H
+
+#include <stdint.h>
+#include <compare>
+#include <vector>
+#include <span.h>
+#include <util/check.h>
+
+/** Data structure storing a fee and size, ordered by increasing fee/size.
+ *
+ * The size of a FeeFrac cannot be zero unless the fee is also zero.
+ *
+ * FeeFracs have a total ordering, first by increasing feerate (ratio of fee over size), and then
+ * by decreasing size. The empty FeeFrac (fee and size both 0) sorts last. So for example, the
+ * following FeeFracs are in sorted order:
+ *
+ * - fee=0 size=1 (feerate 0)
+ * - fee=1 size=2 (feerate 0.5)
+ * - fee=2 size=3 (feerate 0.667...)
+ * - fee=2 size=2 (feerate 1)
+ * - fee=1 size=1 (feerate 1)
+ * - fee=3 size=2 (feerate 1.5)
+ * - fee=2 size=1 (feerate 2)
+ * - fee=0 size=0 (undefined feerate)
+ *
+ * A FeeFrac is considered "better" if it sorts after another, by this ordering. All standard
+ * comparison operators (<=>, ==, !=, >, <, >=, <=) respect this ordering.
+ *
+ * The FeeRateCompare, and >> and << operators only compare feerate and treat equal feerate but
+ * different size as equivalent. The empty FeeFrac is neither lower or higher in feerate than any
+ * other.
+ */
+struct FeeFrac
+{
+ /** Fallback version for Mul (see below).
+ *
+ * Separate to permit testing on platforms where it isn't actually needed.
+ */
+ static inline std::pair<int64_t, uint32_t> MulFallback(int64_t a, int32_t b) noexcept
+ {
+ // Otherwise, emulate 96-bit multiplication using two 64-bit multiplies.
+ int64_t low = int64_t{static_cast<uint32_t>(a)} * b;
+ int64_t high = (a >> 32) * b;
+ return {high + (low >> 32), static_cast<uint32_t>(low)};
+ }
+
+ // Compute a * b, returning an unspecified but totally ordered type.
+#ifdef __SIZEOF_INT128__
+ static inline __int128 Mul(int64_t a, int32_t b) noexcept
+ {
+ // If __int128 is available, use 128-bit wide multiply.
+ return __int128{a} * b;
+ }
+#else
+ static constexpr auto Mul = MulFallback;
+#endif
+
+ int64_t fee;
+ int32_t size;
+
+ /** Construct an IsEmpty() FeeFrac. */
+ inline FeeFrac() noexcept : fee{0}, size{0} {}
+
+ /** Construct a FeeFrac with specified fee and size. */
+ inline FeeFrac(int64_t f, int32_t s) noexcept : fee{f}, size{s} {}
+
+ inline FeeFrac(const FeeFrac&) noexcept = default;
+ inline FeeFrac& operator=(const FeeFrac&) noexcept = default;
+
+ /** Check if this is empty (size and fee are 0). */
+ bool inline IsEmpty() const noexcept {
+ return size == 0;
+ }
+
+ /** Add fee and size of another FeeFrac to this one. */
+ void inline operator+=(const FeeFrac& other) noexcept
+ {
+ fee += other.fee;
+ size += other.size;
+ }
+
+ /** Subtract fee and size of another FeeFrac from this one. */
+ void inline operator-=(const FeeFrac& other) noexcept
+ {
+ fee -= other.fee;
+ size -= other.size;
+ }
+
+ /** Sum fee and size. */
+ friend inline FeeFrac operator+(const FeeFrac& a, const FeeFrac& b) noexcept
+ {
+ return {a.fee + b.fee, a.size + b.size};
+ }
+
+ /** Subtract both fee and size. */
+ friend inline FeeFrac operator-(const FeeFrac& a, const FeeFrac& b) noexcept
+ {
+ return {a.fee - b.fee, a.size - b.size};
+ }
+
+ /** Check if two FeeFrac objects are equal (both same fee and same size). */
+ friend inline bool operator==(const FeeFrac& a, const FeeFrac& b) noexcept
+ {
+ return a.fee == b.fee && a.size == b.size;
+ }
+
+ /** Compare two FeeFracs just by feerate. */
+ friend inline std::weak_ordering FeeRateCompare(const FeeFrac& a, const FeeFrac& b) noexcept
+ {
+ auto cross_a = Mul(a.fee, b.size), cross_b = Mul(b.fee, a.size);
+ return cross_a <=> cross_b;
+ }
+
+ /** Check if a FeeFrac object has strictly lower feerate than another. */
+ friend inline bool operator<<(const FeeFrac& a, const FeeFrac& b) noexcept
+ {
+ auto cross_a = Mul(a.fee, b.size), cross_b = Mul(b.fee, a.size);
+ return cross_a < cross_b;
+ }
+
+ /** Check if a FeeFrac object has strictly higher feerate than another. */
+ friend inline bool operator>>(const FeeFrac& a, const FeeFrac& b) noexcept
+ {
+ auto cross_a = Mul(a.fee, b.size), cross_b = Mul(b.fee, a.size);
+ return cross_a > cross_b;
+ }
+
+ /** Compare two FeeFracs. <, >, <=, and >= are auto-generated from this. */
+ friend inline std::strong_ordering operator<=>(const FeeFrac& a, const FeeFrac& b) noexcept
+ {
+ auto cross_a = Mul(a.fee, b.size), cross_b = Mul(b.fee, a.size);
+ if (cross_a == cross_b) return b.size <=> a.size;
+ return cross_a <=> cross_b;
+ }
+
+ /** Swap two FeeFracs. */
+ friend inline void swap(FeeFrac& a, FeeFrac& b) noexcept
+ {
+ std::swap(a.fee, b.fee);
+ std::swap(a.size, b.size);
+ }
+};
+
+/** Takes the pre-computed and topologically-valid chunks and generates a fee diagram which starts at FeeFrac of (0, 0) */
+std::vector<FeeFrac> BuildDiagramFromChunks(Span<const FeeFrac> chunks);
+
+/** Compares two feerate diagrams. The shorter one is implicitly
+ * extended with a horizontal straight line.
+ *
+ * A feerate diagram consists of a list of (fee, size) points with the property that size
+ * is strictly increasing and that the first entry is (0, 0).
+ */
+std::partial_ordering CompareFeerateDiagram(Span<const FeeFrac> dia0, Span<const FeeFrac> dia1);
+
+#endif // BITCOIN_UTIL_FEEFRAC_H
diff --git a/src/util/fs_helpers.cpp b/src/util/fs_helpers.cpp
index 4de8833a3f..bce5602462 100644
--- a/src/util/fs_helpers.cpp
+++ b/src/util/fs_helpers.cpp
@@ -69,7 +69,7 @@ LockResult LockDirectory(const fs::path& directory, const fs::path& lockfile_nam
}
auto lock = std::make_unique<fsbridge::FileLock>(pathLockFile);
if (!lock->TryLock()) {
- error("Error while attempting to lock directory %s: %s", fs::PathToString(directory), lock->GetReason());
+ LogError("Error while attempting to lock directory %s: %s\n", fs::PathToString(directory), lock->GetReason());
return LockResult::ErrorLock;
}
if (!probe_only) {
@@ -249,20 +249,9 @@ fs::path GetSpecialFolderPath(int nFolder, bool fCreate)
bool RenameOver(fs::path src, fs::path dest)
{
-#ifdef __MINGW64__
- // This is a workaround for a bug in libstdc++ which
- // implements fs::rename with _wrename function.
- // This bug has been fixed in upstream:
- // - GCC 10.3: 8dd1c1085587c9f8a21bb5e588dfe1e8cdbba79e
- // - GCC 11.1: 1dfd95f0a0ca1d9e6cbc00e6cbfd1fa20a98f312
- // For more details see the commits mentioned above.
- return MoveFileExW(src.wstring().c_str(), dest.wstring().c_str(),
- MOVEFILE_REPLACE_EXISTING) != 0;
-#else
std::error_code error;
fs::rename(src, dest, error);
return !error;
-#endif
}
/**
diff --git a/src/util/strencodings.cpp b/src/util/strencodings.cpp
index a54f408496..7b5ded2975 100644
--- a/src/util/strencodings.cpp
+++ b/src/util/strencodings.cpp
@@ -81,6 +81,8 @@ template <typename Byte>
std::optional<std::vector<Byte>> TryParseHex(std::string_view str)
{
std::vector<Byte> vch;
+ vch.reserve(str.size() / 2); // two hex characters form a single byte
+
auto it = str.begin();
while (it != str.end()) {
if (IsSpace(*it)) {
@@ -444,6 +446,7 @@ bool ParseFixedPoint(std::string_view val, int decimals, int64_t *amount_out)
std::string ToLower(std::string_view str)
{
std::string r;
+ r.reserve(str.size());
for (auto ch : str) r += ToLower(ch);
return r;
}
@@ -451,6 +454,7 @@ std::string ToLower(std::string_view str)
std::string ToUpper(std::string_view str)
{
std::string r;
+ r.reserve(str.size());
for (auto ch : str) r += ToUpper(ch);
return r;
}
diff --git a/src/util/task_runner.h b/src/util/task_runner.h
new file mode 100644
index 0000000000..d3cd8007de
--- /dev/null
+++ b/src/util/task_runner.h
@@ -0,0 +1,52 @@
+// Copyright (c) 2024-present The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_UTIL_TASK_RUNNER_H
+#define BITCOIN_UTIL_TASK_RUNNER_H
+
+#include <cstddef>
+#include <functional>
+
+namespace util {
+
+/** @file
+ * This header provides an interface and simple implementation for a task
+ * runner. Another threaded, serial implementation using a queue is available in
+ * the scheduler module's SerialTaskRunner.
+ */
+
+class TaskRunnerInterface
+{
+public:
+ virtual ~TaskRunnerInterface() {}
+
+ /**
+ * The callback can either be queued for later/asynchronous/threaded
+ * processing, or be executed immediately for synchronous processing.
+ */
+
+ virtual void insert(std::function<void()> func) = 0;
+
+ /**
+ * Forces the processing of all pending events.
+ */
+ virtual void flush() = 0;
+
+ /**
+ * Returns the number of currently pending events.
+ */
+ virtual size_t size() = 0;
+};
+
+class ImmediateTaskRunner : public TaskRunnerInterface
+{
+public:
+ void insert(std::function<void()> func) override { func(); }
+ void flush() override {}
+ size_t size() override { return 0; }
+};
+
+} // namespace util
+
+#endif // BITCOIN_UTIL_TASK_RUNNER_H
diff --git a/src/util/transaction_identifier.h b/src/util/transaction_identifier.h
index 89e10dee01..d4a0ede25a 100644
--- a/src/util/transaction_identifier.h
+++ b/src/util/transaction_identifier.h
@@ -44,6 +44,7 @@ public:
constexpr void SetNull() { m_wrapped.SetNull(); }
std::string GetHex() const { return m_wrapped.GetHex(); }
std::string ToString() const { return m_wrapped.ToString(); }
+ static constexpr auto size() { return decltype(m_wrapped)::size(); }
constexpr const std::byte* data() const { return reinterpret_cast<const std::byte*>(m_wrapped.data()); }
constexpr const std::byte* begin() const { return reinterpret_cast<const std::byte*>(m_wrapped.begin()); }
constexpr const std::byte* end() const { return reinterpret_cast<const std::byte*>(m_wrapped.end()); }
diff --git a/src/validation.cpp b/src/validation.cpp
index 0552bde665..8a78f2106d 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <validation.h>
#include <arith_uint256.h>
@@ -468,6 +472,11 @@ public:
* policies such as mempool min fee and min relay fee.
*/
const bool m_package_feerates;
+ /** Used for local submission of transactions to catch "absurd" fees
+ * due to fee miscalculation by wallets. std:nullopt implies unset, allowing any feerates.
+ * Any individual transaction failing this check causes immediate failure.
+ */
+ const std::optional<CFeeRate> m_client_maxfeerate;
/** Parameters for single transaction mempool validation. */
static ATMPArgs SingleAccept(const CChainParams& chainparams, int64_t accept_time,
@@ -481,6 +490,7 @@ public:
/* m_allow_replacement */ true,
/* m_package_submission */ false,
/* m_package_feerates */ false,
+ /* m_client_maxfeerate */ {}, // checked by caller
};
}
@@ -495,12 +505,13 @@ public:
/* m_allow_replacement */ false,
/* m_package_submission */ false, // not submitting to mempool
/* m_package_feerates */ false,
+ /* m_client_maxfeerate */ {}, // checked by caller
};
}
/** Parameters for child-with-unconfirmed-parents package validation. */
static ATMPArgs PackageChildWithParents(const CChainParams& chainparams, int64_t accept_time,
- std::vector<COutPoint>& coins_to_uncache) {
+ std::vector<COutPoint>& coins_to_uncache, const std::optional<CFeeRate>& client_maxfeerate) {
return ATMPArgs{/* m_chainparams */ chainparams,
/* m_accept_time */ accept_time,
/* m_bypass_limits */ false,
@@ -509,6 +520,7 @@ public:
/* m_allow_replacement */ false,
/* m_package_submission */ true,
/* m_package_feerates */ true,
+ /* m_client_maxfeerate */ client_maxfeerate,
};
}
@@ -522,6 +534,7 @@ public:
/* m_allow_replacement */ true,
/* m_package_submission */ true, // do not LimitMempoolSize in Finalize()
/* m_package_feerates */ false, // only 1 transaction
+ /* m_client_maxfeerate */ package_args.m_client_maxfeerate,
};
}
@@ -535,7 +548,8 @@ public:
bool test_accept,
bool allow_replacement,
bool package_submission,
- bool package_feerates)
+ bool package_feerates,
+ std::optional<CFeeRate> client_maxfeerate)
: m_chainparams{chainparams},
m_accept_time{accept_time},
m_bypass_limits{bypass_limits},
@@ -543,7 +557,8 @@ public:
m_test_accept{test_accept},
m_allow_replacement{allow_replacement},
m_package_submission{package_submission},
- m_package_feerates{package_feerates}
+ m_package_feerates{package_feerates},
+ m_client_maxfeerate{client_maxfeerate}
{
}
};
@@ -585,12 +600,14 @@ private:
// of checking a given transaction.
struct Workspace {
explicit Workspace(const CTransactionRef& ptx) : m_ptx(ptx), m_hash(ptx->GetHash()) {}
- /** Txids of mempool transactions that this transaction directly conflicts with. */
+ /** Txids of mempool transactions that this transaction directly conflicts with or may
+ * replace via sibling eviction. */
std::set<Txid> m_conflicts;
- /** Iterators to mempool entries that this transaction directly conflicts with. */
+ /** Iterators to mempool entries that this transaction directly conflicts with or may
+ * replace via sibling eviction. */
CTxMemPool::setEntries m_iters_conflicting;
/** Iterators to all mempool entries that would be replaced by this transaction, including
- * those it directly conflicts with and their descendants. */
+ * m_conflicts and their descendants. */
CTxMemPool::setEntries m_all_conflicting;
/** All mempool ancestors of this transaction. */
CTxMemPool::setEntries m_ancestors;
@@ -598,9 +615,12 @@ private:
* inserted into the mempool until Finalize(). */
std::unique_ptr<CTxMemPoolEntry> m_entry;
/** Pointers to the transactions that have been removed from the mempool and replaced by
- * this transaction, used to return to the MemPoolAccept caller. Only populated if
+ * this transaction (everything in m_all_conflicting), used to return to the MemPoolAccept caller. Only populated if
* validation is successful and the original transactions are removed. */
std::list<CTransactionRef> m_replaced_transactions;
+ /** Whether RBF-related data structures (m_conflicts, m_iters_conflicting, m_all_conflicting,
+ * m_replaced_transactions) include a sibling in addition to txns with conflicting inputs. */
+ bool m_sibling_eviction{false};
/** Virtual size of the transaction as used by the mempool, calculated using serialized size
* of the transaction and sigops. */
@@ -690,7 +710,8 @@ private:
Chainstate& m_active_chainstate;
- /** Whether the transaction(s) would replace any mempool transactions. If so, RBF rules apply. */
+ /** Whether the transaction(s) would replace any mempool transactions and/or evict any siblings.
+ * If so, RBF rules apply. */
bool m_rbf{false};
};
@@ -954,8 +975,27 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
}
ws.m_ancestors = *ancestors;
- if (const auto err_string{SingleV3Checks(ws.m_ptx, ws.m_ancestors, ws.m_conflicts, ws.m_vsize)}) {
- return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "v3-rule-violation", *err_string);
+ // Even though just checking direct mempool parents for inheritance would be sufficient, we
+ // check using the full ancestor set here because it's more convenient to use what we have
+ // already calculated.
+ if (const auto err{SingleV3Checks(ws.m_ptx, ws.m_ancestors, ws.m_conflicts, ws.m_vsize)}) {
+ // Disabled within package validation.
+ if (err->second != nullptr && args.m_allow_replacement) {
+ // Potential sibling eviction. Add the sibling to our list of mempool conflicts to be
+ // included in RBF checks.
+ ws.m_conflicts.insert(err->second->GetHash());
+ // Adding the sibling to m_iters_conflicting here means that it doesn't count towards
+ // RBF Carve Out above. This is correct, since removing to-be-replaced transactions from
+ // the descendant count is done separately in SingleV3Checks for v3 transactions.
+ ws.m_iters_conflicting.insert(m_pool.GetIter(err->second->GetHash()).value());
+ ws.m_sibling_eviction = true;
+ // The sibling will be treated as part of the to-be-replaced set in ReplacementChecks.
+ // Note that we are not checking whether it opts in to replaceability via BIP125 or v3
+ // (which is normally done in PreChecks). However, the only way a v3 transaction can
+ // have a non-v3 and non-BIP125 descendant is due to a reorg.
+ } else {
+ return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "v3-rule-violation", err->first);
+ }
}
// A transaction that spends outputs that would be replaced by it is invalid. Now
@@ -995,18 +1035,21 @@ bool MemPoolAccept::ReplacementChecks(Workspace& ws)
// Even though this is a fee-related failure, this result is TX_MEMPOOL_POLICY, not
// TX_RECONSIDERABLE, because it cannot be bypassed using package validation.
// This must be changed if package RBF is enabled.
- return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "insufficient fee", *err_string);
+ return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY,
+ strprintf("insufficient fee%s", ws.m_sibling_eviction ? " (including sibling eviction)" : ""), *err_string);
}
// Calculate all conflicting entries and enforce Rule #5.
if (const auto err_string{GetEntriesForConflicts(tx, m_pool, ws.m_iters_conflicting, ws.m_all_conflicting)}) {
return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY,
- "too many potential replacements", *err_string);
+ strprintf("too many potential replacements%s", ws.m_sibling_eviction ? " (including sibling eviction)" : ""), *err_string);
}
// Enforce Rule #2.
if (const auto err_string{HasNoNewUnconfirmed(tx, m_pool, ws.m_iters_conflicting)}) {
+ // Sibling eviction is only done for v3 transactions, which cannot have multiple ancestors.
+ Assume(!ws.m_sibling_eviction);
return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY,
- "replacement-adds-unconfirmed", *err_string);
+ strprintf("replacement-adds-unconfirmed%s", ws.m_sibling_eviction ? " (including sibling eviction)" : ""), *err_string);
}
// Check if it's economically rational to mine this transaction rather than the ones it
// replaces and pays for its own relay fees. Enforce Rules #3 and #4.
@@ -1019,7 +1062,8 @@ bool MemPoolAccept::ReplacementChecks(Workspace& ws)
// Even though this is a fee-related failure, this result is TX_MEMPOOL_POLICY, not
// TX_RECONSIDERABLE, because it cannot be bypassed using package validation.
// This must be changed if package RBF is enabled.
- return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "insufficient fee", *err_string);
+ return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY,
+ strprintf("insufficient fee%s", ws.m_sibling_eviction ? " (including sibling eviction)" : ""), *err_string);
}
return true;
}
@@ -1224,13 +1268,14 @@ bool MemPoolAccept::SubmitPackage(const ATMPArgs& args, std::vector<Workspace>&
results.emplace(ws.m_ptx->GetWitnessHash(),
MempoolAcceptResult::Success(std::move(ws.m_replaced_transactions), ws.m_vsize,
ws.m_base_fees, effective_feerate, effective_feerate_wtxids));
+ if (!m_pool.m_signals) continue;
const CTransaction& tx = *ws.m_ptx;
const auto tx_info = NewMempoolTransactionInfo(ws.m_ptx, ws.m_base_fees,
ws.m_vsize, ws.m_entry->GetHeight(),
args.m_bypass_limits, args.m_package_submission,
IsCurrentForFeeEstimation(m_active_chainstate),
m_pool.HasNoInputsOf(tx));
- GetMainSignals().TransactionAddedToMempool(tx_info, m_pool.GetAndIncrementSequence());
+ m_pool.m_signals->TransactionAddedToMempool(tx_info, m_pool.GetAndIncrementSequence());
}
return all_submitted;
}
@@ -1238,7 +1283,7 @@ bool MemPoolAccept::SubmitPackage(const ATMPArgs& args, std::vector<Workspace>&
MempoolAcceptResult MemPoolAccept::AcceptSingleTransaction(const CTransactionRef& ptx, ATMPArgs& args)
{
AssertLockHeld(cs_main);
- LOCK(m_pool.cs); // mempool "read lock" (held through GetMainSignals().TransactionAddedToMempool())
+ LOCK(m_pool.cs); // mempool "read lock" (held through m_pool.m_signals->TransactionAddedToMempool())
Workspace ws(ptx);
const std::vector<Wtxid> single_wtxid{ws.m_ptx->GetWitnessHash()};
@@ -1251,6 +1296,12 @@ MempoolAcceptResult MemPoolAccept::AcceptSingleTransaction(const CTransactionRef
return MempoolAcceptResult::Failure(ws.m_state);
}
+ // Individual modified feerate exceeded caller-defined max; abort
+ if (args.m_client_maxfeerate && CFeeRate(ws.m_modified_fees, ws.m_vsize) > args.m_client_maxfeerate.value()) {
+ ws.m_state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "max feerate exceeded", "");
+ return MempoolAcceptResult::Failure(ws.m_state);
+ }
+
if (m_rbf && !ReplacementChecks(ws)) return MempoolAcceptResult::Failure(ws.m_state);
// Perform the inexpensive checks first and avoid hashing and signature verification unless
@@ -1273,13 +1324,15 @@ MempoolAcceptResult MemPoolAccept::AcceptSingleTransaction(const CTransactionRef
return MempoolAcceptResult::FeeFailure(ws.m_state, CFeeRate(ws.m_modified_fees, ws.m_vsize), {ws.m_ptx->GetWitnessHash()});
}
- const CTransaction& tx = *ws.m_ptx;
- const auto tx_info = NewMempoolTransactionInfo(ws.m_ptx, ws.m_base_fees,
- ws.m_vsize, ws.m_entry->GetHeight(),
- args.m_bypass_limits, args.m_package_submission,
- IsCurrentForFeeEstimation(m_active_chainstate),
- m_pool.HasNoInputsOf(tx));
- GetMainSignals().TransactionAddedToMempool(tx_info, m_pool.GetAndIncrementSequence());
+ if (m_pool.m_signals) {
+ const CTransaction& tx = *ws.m_ptx;
+ const auto tx_info = NewMempoolTransactionInfo(ws.m_ptx, ws.m_base_fees,
+ ws.m_vsize, ws.m_entry->GetHeight(),
+ args.m_bypass_limits, args.m_package_submission,
+ IsCurrentForFeeEstimation(m_active_chainstate),
+ m_pool.HasNoInputsOf(tx));
+ m_pool.m_signals->TransactionAddedToMempool(tx_info, m_pool.GetAndIncrementSequence());
+ }
return MempoolAcceptResult::Success(std::move(ws.m_replaced_transactions), ws.m_vsize, ws.m_base_fees,
effective_feerate, single_wtxid);
@@ -1309,6 +1362,16 @@ PackageMempoolAcceptResult MemPoolAccept::AcceptMultipleTransactions(const std::
results.emplace(ws.m_ptx->GetWitnessHash(), MempoolAcceptResult::Failure(ws.m_state));
return PackageMempoolAcceptResult(package_state, std::move(results));
}
+
+ // Individual modified feerate exceeded caller-defined max; abort
+ // N.B. this doesn't take into account CPFPs. Chunk-aware validation may be more robust.
+ if (args.m_client_maxfeerate && CFeeRate(ws.m_modified_fees, ws.m_vsize) > args.m_client_maxfeerate.value()) {
+ package_state.Invalid(PackageValidationResult::PCKG_TX, "max feerate exceeded");
+ // Exit early to avoid doing pointless work. Update the failed tx result; the rest are unfinished.
+ results.emplace(ws.m_ptx->GetWitnessHash(), MempoolAcceptResult::Failure(ws.m_state));
+ return PackageMempoolAcceptResult(package_state, std::move(results));
+ }
+
// Make the coins created by this transaction available for subsequent transactions in the
// package to spend. Since we already checked conflicts in the package and we don't allow
// replacements, we don't need to track the coins spent. Note that this logic will need to be
@@ -1653,7 +1716,7 @@ MempoolAcceptResult AcceptToMemoryPool(Chainstate& active_chainstate, const CTra
}
PackageMempoolAcceptResult ProcessNewPackage(Chainstate& active_chainstate, CTxMemPool& pool,
- const Package& package, bool test_accept)
+ const Package& package, bool test_accept, const std::optional<CFeeRate>& client_maxfeerate)
{
AssertLockHeld(cs_main);
assert(!package.empty());
@@ -1667,7 +1730,7 @@ PackageMempoolAcceptResult ProcessNewPackage(Chainstate& active_chainstate, CTxM
auto args = MemPoolAccept::ATMPArgs::PackageTestAccept(chainparams, GetTime(), coins_to_uncache);
return MemPoolAccept(pool, active_chainstate).AcceptMultipleTransactions(package, args);
} else {
- auto args = MemPoolAccept::ATMPArgs::PackageChildWithParents(chainparams, GetTime(), coins_to_uncache);
+ auto args = MemPoolAccept::ATMPArgs::PackageChildWithParents(chainparams, GetTime(), coins_to_uncache, client_maxfeerate);
return MemPoolAccept(pool, active_chainstate).AcceptPackage(package, args);
}
}();
@@ -1988,10 +2051,10 @@ bool CheckInputScripts(const CTransaction& tx, TxValidationState& state,
return true;
}
-bool FatalError(Notifications& notifications, BlockValidationState& state, const std::string& strMessage, const bilingual_str& userMessage)
+bool FatalError(Notifications& notifications, BlockValidationState& state, const bilingual_str& message)
{
- notifications.fatalError(strMessage, userMessage);
- return state.Error(strMessage);
+ notifications.fatalError(message);
+ return state.Error(message.original);
}
/**
@@ -2038,12 +2101,12 @@ DisconnectResult Chainstate::DisconnectBlock(const CBlock& block, const CBlockIn
CBlockUndo blockUndo;
if (!m_blockman.UndoReadFromDisk(blockUndo, *pindex)) {
- error("DisconnectBlock(): failure reading undo data");
+ LogError("DisconnectBlock(): failure reading undo data\n");
return DISCONNECT_FAILED;
}
if (blockUndo.vtxundo.size() + 1 != block.vtx.size()) {
- error("DisconnectBlock(): block and undo data inconsistent");
+ LogError("DisconnectBlock(): block and undo data inconsistent\n");
return DISCONNECT_FAILED;
}
@@ -2082,7 +2145,7 @@ DisconnectResult Chainstate::DisconnectBlock(const CBlock& block, const CBlockIn
if (i > 0) { // not coinbases
CTxUndo &txundo = blockUndo.vtxundo[i-1];
if (txundo.vprevout.size() != tx.vin.size()) {
- error("DisconnectBlock(): transaction and undo data inconsistent");
+ LogError("DisconnectBlock(): transaction and undo data inconsistent\n");
return DISCONNECT_FAILED;
}
for (unsigned int j = tx.vin.size(); j > 0;) {
@@ -2213,9 +2276,10 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
// We don't write down blocks to disk if they may have been
// corrupted, so this should be impossible unless we're having hardware
// problems.
- return FatalError(m_chainman.GetNotifications(), state, "Corrupt block found indicating potential hardware failure; shutting down");
+ return FatalError(m_chainman.GetNotifications(), state, _("Corrupt block found indicating potential hardware failure."));
}
- return error("%s: Consensus::CheckBlock: %s", __func__, state.ToString());
+ LogError("%s: Consensus::CheckBlock: %s\n", __func__, state.ToString());
+ return false;
}
// verify that the view's current state corresponds to the previous block
@@ -2401,7 +2465,8 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
// Any transaction validation failure in ConnectBlock is a block consensus failure
state.Invalid(BlockValidationResult::BLOCK_CONSENSUS,
tx_state.GetRejectReason(), tx_state.GetDebugMessage());
- return error("%s: Consensus::CheckTxInputs: %s, %s", __func__, tx.GetHash().ToString(), state.ToString());
+ LogError("%s: Consensus::CheckTxInputs: %s, %s\n", __func__, tx.GetHash().ToString(), state.ToString());
+ return false;
}
nFees += txfee;
if (!MoneyRange(nFees)) {
@@ -2442,8 +2507,9 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
// Any transaction validation failure in ConnectBlock is a block consensus failure
state.Invalid(BlockValidationResult::BLOCK_CONSENSUS,
tx_state.GetRejectReason(), tx_state.GetDebugMessage());
- return error("ConnectBlock(): CheckInputScripts on %s failed with %s",
+ LogError("ConnectBlock(): CheckInputScripts on %s failed with %s\n",
tx.GetHash().ToString(), state.ToString());
+ return false;
}
control.Add(std::move(vChecks));
}
@@ -2636,7 +2702,7 @@ bool Chainstate::FlushStateToDisk(
if (fDoFullFlush || fPeriodicWrite) {
// Ensure we can write block index
if (!CheckDiskSpace(m_blockman.m_opts.blocks_dir)) {
- return FatalError(m_chainman.GetNotifications(), state, "Disk space is too low!", _("Disk space is too low!"));
+ return FatalError(m_chainman.GetNotifications(), state, _("Disk space is too low!"));
}
{
LOG_TIME_MILLIS_WITH_CATEGORY("write block and undo data to disk", BCLog::BENCH);
@@ -2654,7 +2720,7 @@ bool Chainstate::FlushStateToDisk(
LOG_TIME_MILLIS_WITH_CATEGORY("write block index to disk", BCLog::BENCH);
if (!m_blockman.WriteBlockIndexDB()) {
- return FatalError(m_chainman.GetNotifications(), state, "Failed to write to block index database");
+ return FatalError(m_chainman.GetNotifications(), state, _("Failed to write to block index database."));
}
}
// Finally remove any pruned files
@@ -2676,11 +2742,11 @@ bool Chainstate::FlushStateToDisk(
// an overestimation, as most will delete an existing entry or
// overwrite one. Still, use a conservative safety factor of 2.
if (!CheckDiskSpace(m_chainman.m_options.datadir, 48 * 2 * 2 * CoinsTip().GetCacheSize())) {
- return FatalError(m_chainman.GetNotifications(), state, "Disk space is too low!", _("Disk space is too low!"));
+ return FatalError(m_chainman.GetNotifications(), state, _("Disk space is too low!"));
}
// Flush the chainstate (which may refer to block index entries).
if (!CoinsTip().Flush())
- return FatalError(m_chainman.GetNotifications(), state, "Failed to write to coin database");
+ return FatalError(m_chainman.GetNotifications(), state, _("Failed to write to coin database."));
m_last_flush = nNow;
full_flush_completed = true;
TRACE5(utxocache, flush,
@@ -2691,12 +2757,12 @@ bool Chainstate::FlushStateToDisk(
(bool)fFlushForPrune);
}
}
- if (full_flush_completed) {
+ if (full_flush_completed && m_chainman.m_options.signals) {
// Update best block in wallet (so we can detect restored wallets).
- GetMainSignals().ChainStateFlushed(this->GetRole(), m_chain.GetLocator());
+ m_chainman.m_options.signals->ChainStateFlushed(this->GetRole(), m_chain.GetLocator());
}
} catch (const std::runtime_error& e) {
- return FatalError(m_chainman.GetNotifications(), state, std::string("System error while flushing: ") + e.what());
+ return FatalError(m_chainman.GetNotifications(), state, strprintf(_("System error while flushing: %s"), e.what()));
}
return true;
}
@@ -2816,15 +2882,18 @@ bool Chainstate::DisconnectTip(BlockValidationState& state, DisconnectedBlockTra
std::shared_ptr<CBlock> pblock = std::make_shared<CBlock>();
CBlock& block = *pblock;
if (!m_blockman.ReadBlockFromDisk(block, *pindexDelete)) {
- return error("DisconnectTip(): Failed to read block");
+ LogError("DisconnectTip(): Failed to read block\n");
+ return false;
}
// Apply the block atomically to the chain state.
const auto time_start{SteadyClock::now()};
{
CCoinsViewCache view(&CoinsTip());
assert(view.GetBestBlock() == pindexDelete->GetBlockHash());
- if (DisconnectBlock(block, pindexDelete, view) != DISCONNECT_OK)
- return error("DisconnectTip(): DisconnectBlock %s failed", pindexDelete->GetBlockHash().ToString());
+ if (DisconnectBlock(block, pindexDelete, view) != DISCONNECT_OK) {
+ LogError("DisconnectTip(): DisconnectBlock %s failed\n", pindexDelete->GetBlockHash().ToString());
+ return false;
+ }
bool flushed = view.Flush();
assert(flushed);
}
@@ -2860,7 +2929,9 @@ bool Chainstate::DisconnectTip(BlockValidationState& state, DisconnectedBlockTra
UpdateTip(pindexDelete->pprev);
// Let wallets know transactions went from 1-confirmed to
// 0-confirmed or conflicted:
- GetMainSignals().BlockDisconnected(pblock, pindexDelete);
+ if (m_chainman.m_options.signals) {
+ m_chainman.m_options.signals->BlockDisconnected(pblock, pindexDelete);
+ }
return true;
}
@@ -2927,7 +2998,7 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew,
if (!pblock) {
std::shared_ptr<CBlock> pblockNew = std::make_shared<CBlock>();
if (!m_blockman.ReadBlockFromDisk(*pblockNew, *pindexNew)) {
- return FatalError(m_chainman.GetNotifications(), state, "Failed to read block");
+ return FatalError(m_chainman.GetNotifications(), state, _("Failed to read block."));
}
pthisBlock = pblockNew;
} else {
@@ -2945,11 +3016,14 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew,
{
CCoinsViewCache view(&CoinsTip());
bool rv = ConnectBlock(blockConnecting, state, pindexNew, view);
- GetMainSignals().BlockChecked(blockConnecting, state);
+ if (m_chainman.m_options.signals) {
+ m_chainman.m_options.signals->BlockChecked(blockConnecting, state);
+ }
if (!rv) {
if (state.IsInvalid())
InvalidBlockFound(pindexNew, state);
- return error("%s: ConnectBlock %s failed, %s", __func__, pindexNew->GetBlockHash().ToString(), state.ToString());
+ LogError("%s: ConnectBlock %s failed, %s\n", __func__, pindexNew->GetBlockHash().ToString(), state.ToString());
+ return false;
}
time_3 = SteadyClock::now();
time_connect_total += time_3 - time_2;
@@ -3111,7 +3185,7 @@ bool Chainstate::ActivateBestChainStep(BlockValidationState& state, CBlockIndex*
// If we're unable to disconnect a block during normal operation,
// then that is a failure of our local system -- we should abort
// rather than stay on a less work chain.
- FatalError(m_chainman.GetNotifications(), state, "Failed to disconnect block; see debug.log for details");
+ FatalError(m_chainman.GetNotifications(), state, _("Failed to disconnect block."));
return false;
}
fBlocksDisconnected = true;
@@ -3206,11 +3280,11 @@ static bool NotifyHeaderTip(ChainstateManager& chainman) LOCKS_EXCLUDED(cs_main)
return fNotify;
}
-static void LimitValidationInterfaceQueue() LOCKS_EXCLUDED(cs_main) {
+static void LimitValidationInterfaceQueue(ValidationSignals& signals) LOCKS_EXCLUDED(cs_main) {
AssertLockNotHeld(cs_main);
- if (GetMainSignals().CallbacksPending() > 10) {
- SyncWithValidationInterfaceQueue();
+ if (signals.CallbacksPending() > 10) {
+ signals.SyncWithValidationInterfaceQueue();
}
}
@@ -3248,7 +3322,7 @@ bool Chainstate::ActivateBestChain(BlockValidationState& state, std::shared_ptr<
// Note that if a validationinterface callback ends up calling
// ActivateBestChain this may lead to a deadlock! We should
// probably have a DEBUG_LOCKORDER test for this in the future.
- LimitValidationInterfaceQueue();
+ if (m_chainman.m_options.signals) LimitValidationInterfaceQueue(*m_chainman.m_options.signals);
{
LOCK(cs_main);
@@ -3287,7 +3361,9 @@ bool Chainstate::ActivateBestChain(BlockValidationState& state, std::shared_ptr<
for (const PerBlockConnectTrace& trace : connectTrace.GetBlocksConnected()) {
assert(trace.pblock && trace.pindex);
- GetMainSignals().BlockConnected(this->GetRole(), trace.pblock, trace.pindex);
+ if (m_chainman.m_options.signals) {
+ m_chainman.m_options.signals->BlockConnected(this->GetRole(), trace.pblock, trace.pindex);
+ }
}
// This will have been toggled in
@@ -3313,7 +3389,9 @@ bool Chainstate::ActivateBestChain(BlockValidationState& state, std::shared_ptr<
// Enqueue while holding cs_main to ensure that UpdatedBlockTip is called in the order in which blocks are connected
if (this == &m_chainman.ActiveChainstate() && pindexFork != pindexNewTip) {
// Notify ValidationInterface subscribers
- GetMainSignals().UpdatedBlockTip(pindexNewTip, pindexFork, still_in_ibd);
+ if (m_chainman.m_options.signals) {
+ m_chainman.m_options.signals->UpdatedBlockTip(pindexNewTip, pindexFork, still_in_ibd);
+ }
// Always notify the UI if a new block tip was connected
if (kernel::IsInterrupted(m_chainman.GetNotifications().blockTip(GetSynchronizationState(still_in_ibd), *pindexNewTip))) {
@@ -3447,7 +3525,7 @@ bool Chainstate::InvalidateBlock(BlockValidationState& state, CBlockIndex* pinde
if (m_chainman.m_interrupt) break;
// Make sure the queue of validation callbacks doesn't grow unboundedly.
- LimitValidationInterfaceQueue();
+ if (m_chainman.m_options.signals) LimitValidationInterfaceQueue(*m_chainman.m_options.signals);
LOCK(cs_main);
// Lock for as long as disconnectpool is in scope to make sure MaybeUpdateMempoolForReorg is
@@ -3609,7 +3687,18 @@ void ChainstateManager::ReceivedBlockTransactions(const CBlock& block, CBlockInd
{
AssertLockHeld(cs_main);
pindexNew->nTx = block.vtx.size();
- pindexNew->nChainTx = 0;
+ // Typically nChainTx will be 0 at this point, but it can be nonzero if this
+ // is a pruned block which is being downloaded again, or if this is an
+ // assumeutxo snapshot block which has a hardcoded nChainTx value from the
+ // snapshot metadata. If the pindex is not the snapshot block and the
+ // nChainTx value is not zero, assert that value is actually correct.
+ auto prev_tx_sum = [](CBlockIndex& block) { return block.nTx + (block.pprev ? block.pprev->nChainTx : 0); };
+ if (!Assume(pindexNew->nChainTx == 0 || pindexNew->nChainTx == prev_tx_sum(*pindexNew) ||
+ pindexNew == GetSnapshotBaseBlock())) {
+ LogWarning("Internal bug detected: block %d has unexpected nChainTx %i that should be %i (%s %s). Please report this issue here: %s\n",
+ pindexNew->nHeight, pindexNew->nChainTx, prev_tx_sum(*pindexNew), PACKAGE_NAME, FormatFullVersion(), PACKAGE_BUGREPORT);
+ pindexNew->nChainTx = 0;
+ }
pindexNew->nFile = pos.nFile;
pindexNew->nDataPos = pos.nPos;
pindexNew->nUndoPos = 0;
@@ -3629,7 +3718,15 @@ void ChainstateManager::ReceivedBlockTransactions(const CBlock& block, CBlockInd
while (!queue.empty()) {
CBlockIndex *pindex = queue.front();
queue.pop_front();
- pindex->nChainTx = (pindex->pprev ? pindex->pprev->nChainTx : 0) + pindex->nTx;
+ // Before setting nChainTx, assert that it is 0 or already set to
+ // the correct value. This assert will fail after receiving the
+ // assumeutxo snapshot block if assumeutxo snapshot metadata has an
+ // incorrect hardcoded AssumeutxoData::nChainTx value.
+ if (!Assume(pindex->nChainTx == 0 || pindex->nChainTx == prev_tx_sum(*pindex))) {
+ LogWarning("Internal bug detected: block %d has unexpected nChainTx %i that should be %i (%s %s). Please report this issue here: %s\n",
+ pindex->nHeight, pindex->nChainTx, prev_tx_sum(*pindex), PACKAGE_NAME, FormatFullVersion(), PACKAGE_BUGREPORT);
+ }
+ pindex->nChainTx = prev_tx_sum(*pindex);
pindex->nSequenceId = nBlockSequenceId++;
for (Chainstate *c : GetAll()) {
c->TryAddBlockIndexCandidate(pindex);
@@ -3658,6 +3755,87 @@ static bool CheckBlockHeader(const CBlockHeader& block, BlockValidationState& st
return true;
}
+static bool CheckMerkleRoot(const CBlock& block, BlockValidationState& state)
+{
+ if (block.m_checked_merkle_root) return true;
+
+ bool mutated;
+ uint256 merkle_root = BlockMerkleRoot(block, &mutated);
+ if (block.hashMerkleRoot != merkle_root) {
+ return state.Invalid(
+ /*result=*/BlockValidationResult::BLOCK_MUTATED,
+ /*reject_reason=*/"bad-txnmrklroot",
+ /*debug_message=*/"hashMerkleRoot mismatch");
+ }
+
+ // Check for merkle tree malleability (CVE-2012-2459): repeating sequences
+ // of transactions in a block without affecting the merkle root of a block,
+ // while still invalidating it.
+ if (mutated) {
+ return state.Invalid(
+ /*result=*/BlockValidationResult::BLOCK_MUTATED,
+ /*reject_reason=*/"bad-txns-duplicate",
+ /*debug_message=*/"duplicate transaction");
+ }
+
+ block.m_checked_merkle_root = true;
+ return true;
+}
+
+/** CheckWitnessMalleation performs checks for block malleation with regard to
+ * its witnesses.
+ *
+ * Note: If the witness commitment is expected (i.e. `expect_witness_commitment
+ * = true`), then the block is required to have at least one transaction and the
+ * first transaction needs to have at least one input. */
+static bool CheckWitnessMalleation(const CBlock& block, bool expect_witness_commitment, BlockValidationState& state)
+{
+ if (expect_witness_commitment) {
+ if (block.m_checked_witness_commitment) return true;
+
+ int commitpos = GetWitnessCommitmentIndex(block);
+ if (commitpos != NO_WITNESS_COMMITMENT) {
+ assert(!block.vtx.empty() && !block.vtx[0]->vin.empty());
+ const auto& witness_stack{block.vtx[0]->vin[0].scriptWitness.stack};
+
+ if (witness_stack.size() != 1 || witness_stack[0].size() != 32) {
+ return state.Invalid(
+ /*result=*/BlockValidationResult::BLOCK_MUTATED,
+ /*reject_reason=*/"bad-witness-nonce-size",
+ /*debug_message=*/strprintf("%s : invalid witness reserved value size", __func__));
+ }
+
+ // The malleation check is ignored; as the transaction tree itself
+ // already does not permit it, it is impossible to trigger in the
+ // witness tree.
+ uint256 hash_witness = BlockWitnessMerkleRoot(block, /*mutated=*/nullptr);
+
+ CHash256().Write(hash_witness).Write(witness_stack[0]).Finalize(hash_witness);
+ if (memcmp(hash_witness.begin(), &block.vtx[0]->vout[commitpos].scriptPubKey[6], 32)) {
+ return state.Invalid(
+ /*result=*/BlockValidationResult::BLOCK_MUTATED,
+ /*reject_reason=*/"bad-witness-merkle-match",
+ /*debug_message=*/strprintf("%s : witness merkle commitment mismatch", __func__));
+ }
+
+ block.m_checked_witness_commitment = true;
+ return true;
+ }
+ }
+
+ // No witness data is allowed in blocks that don't commit to witness data, as this would otherwise leave room for spam
+ for (const auto& tx : block.vtx) {
+ if (tx->HasWitness()) {
+ return state.Invalid(
+ /*result=*/BlockValidationResult::BLOCK_MUTATED,
+ /*reject_reason=*/"unexpected-witness",
+ /*debug_message=*/strprintf("%s : unexpected witness data found", __func__));
+ }
+ }
+
+ return true;
+}
+
bool CheckBlock(const CBlock& block, BlockValidationState& state, const Consensus::Params& consensusParams, bool fCheckPOW, bool fCheckMerkleRoot)
{
// These are checks that are independent of context.
@@ -3676,17 +3854,8 @@ bool CheckBlock(const CBlock& block, BlockValidationState& state, const Consensu
}
// Check the merkle root.
- if (fCheckMerkleRoot) {
- bool mutated;
- uint256 hashMerkleRoot2 = BlockMerkleRoot(block, &mutated);
- if (block.hashMerkleRoot != hashMerkleRoot2)
- return state.Invalid(BlockValidationResult::BLOCK_MUTATED, "bad-txnmrklroot", "hashMerkleRoot mismatch");
-
- // Check for merkle tree malleability (CVE-2012-2459): repeating sequences
- // of transactions in a block without affecting the merkle root of a block,
- // while still invalidating it.
- if (mutated)
- return state.Invalid(BlockValidationResult::BLOCK_MUTATED, "bad-txns-duplicate", "duplicate transaction");
+ if (fCheckMerkleRoot && !CheckMerkleRoot(block, state)) {
+ return false;
}
// All potential-corruption validation must be done before we do any
@@ -3777,7 +3946,38 @@ bool HasValidProofOfWork(const std::vector<CBlockHeader>& headers, const Consens
[&](const auto& header) { return CheckProofOfWork(header.GetHash(), header.nBits, consensusParams);});
}
-arith_uint256 CalculateHeadersWork(const std::vector<CBlockHeader>& headers)
+bool IsBlockMutated(const CBlock& block, bool check_witness_root)
+{
+ BlockValidationState state;
+ if (!CheckMerkleRoot(block, state)) {
+ LogDebug(BCLog::VALIDATION, "Block mutated: %s\n", state.ToString());
+ return true;
+ }
+
+ if (block.vtx.empty() || !block.vtx[0]->IsCoinBase()) {
+ // Consider the block mutated if any transaction is 64 bytes in size (see 3.1
+ // in "Weaknesses in Bitcoin’s Merkle Root Construction":
+ // https://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20190225/a27d8837/attachment-0001.pdf).
+ //
+ // Note: This is not a consensus change as this only applies to blocks that
+ // don't have a coinbase transaction and would therefore already be invalid.
+ return std::any_of(block.vtx.begin(), block.vtx.end(),
+ [](auto& tx) { return GetSerializeSize(TX_NO_WITNESS(tx)) == 64; });
+ } else {
+ // Theoretically it is still possible for a block with a 64 byte
+ // coinbase transaction to be mutated but we neglect that possibility
+ // here as it requires at least 224 bits of work.
+ }
+
+ if (!CheckWitnessMalleation(block, check_witness_root, state)) {
+ LogDebug(BCLog::VALIDATION, "Block mutated: %s\n", state.ToString());
+ return true;
+ }
+
+ return false;
+}
+
+arith_uint256 CalculateClaimedHeadersWork(const std::vector<CBlockHeader>& headers)
{
arith_uint256 total_work{0};
for (const CBlockHeader& header : headers) {
@@ -3885,33 +4085,8 @@ static bool ContextualCheckBlock(const CBlock& block, BlockValidationState& stat
// * There must be at least one output whose scriptPubKey is a single 36-byte push, the first 4 bytes of which are
// {0xaa, 0x21, 0xa9, 0xed}, and the following 32 bytes are SHA256^2(witness root, witness reserved value). In case there are
// multiple, the last one is used.
- bool fHaveWitness = false;
- if (DeploymentActiveAfter(pindexPrev, chainman, Consensus::DEPLOYMENT_SEGWIT)) {
- int commitpos = GetWitnessCommitmentIndex(block);
- if (commitpos != NO_WITNESS_COMMITMENT) {
- bool malleated = false;
- uint256 hashWitness = BlockWitnessMerkleRoot(block, &malleated);
- // The malleation check is ignored; as the transaction tree itself
- // already does not permit it, it is impossible to trigger in the
- // witness tree.
- if (block.vtx[0]->vin[0].scriptWitness.stack.size() != 1 || block.vtx[0]->vin[0].scriptWitness.stack[0].size() != 32) {
- return state.Invalid(BlockValidationResult::BLOCK_MUTATED, "bad-witness-nonce-size", strprintf("%s : invalid witness reserved value size", __func__));
- }
- CHash256().Write(hashWitness).Write(block.vtx[0]->vin[0].scriptWitness.stack[0]).Finalize(hashWitness);
- if (memcmp(hashWitness.begin(), &block.vtx[0]->vout[commitpos].scriptPubKey[6], 32)) {
- return state.Invalid(BlockValidationResult::BLOCK_MUTATED, "bad-witness-merkle-match", strprintf("%s : witness merkle commitment mismatch", __func__));
- }
- fHaveWitness = true;
- }
- }
-
- // No witness data is allowed in blocks that don't commit to witness data, as this would otherwise leave room for spam
- if (!fHaveWitness) {
- for (const auto& tx : block.vtx) {
- if (tx->HasWitness()) {
- return state.Invalid(BlockValidationResult::BLOCK_MUTATED, "unexpected-witness", strprintf("%s : unexpected witness data found", __func__));
- }
- }
+ if (!CheckWitnessMalleation(block, DeploymentActiveAfter(pindexPrev, chainman, Consensus::DEPLOYMENT_SEGWIT), state)) {
+ return false;
}
// After the coinbase witness reserved value and commitment are verified,
@@ -4059,9 +4234,10 @@ bool ChainstateManager::ProcessNewBlockHeaders(const std::vector<CBlockHeader>&
if (NotifyHeaderTip(*this)) {
if (IsInitialBlockDownload() && ppindex && *ppindex) {
const CBlockIndex& last_accepted{**ppindex};
- const int64_t blocks_left{(GetTime() - last_accepted.GetBlockTime()) / GetConsensus().nPowTargetSpacing};
+ int64_t blocks_left{(NodeClock::now() - last_accepted.Time()) / GetConsensus().PowTargetSpacing()};
+ blocks_left = std::max<int64_t>(0, blocks_left);
const double progress{100.0 * last_accepted.nHeight / (last_accepted.nHeight + blocks_left)};
- LogPrintf("Synchronizing blockheaders, height: %d (~%.2f%%)\n", last_accepted.nHeight, progress);
+ LogInfo("Synchronizing blockheaders, height: %d (~%.2f%%)\n", last_accepted.nHeight, progress);
}
}
return true;
@@ -4085,9 +4261,10 @@ void ChainstateManager::ReportHeadersPresync(const arith_uint256& work, int64_t
bool initial_download = IsInitialBlockDownload();
GetNotifications().headerTip(GetSynchronizationState(initial_download), height, timestamp, /*presync=*/true);
if (initial_download) {
- const int64_t blocks_left{(GetTime() - timestamp) / GetConsensus().nPowTargetSpacing};
+ int64_t blocks_left{(NodeClock::now() - NodeSeconds{std::chrono::seconds{timestamp}}) / GetConsensus().PowTargetSpacing()};
+ blocks_left = std::max<int64_t>(0, blocks_left);
const double progress{100.0 * height / (height + blocks_left)};
- LogPrintf("Pre-synchronizing blockheaders, height: %d (~%.2f%%)\n", height, progress);
+ LogInfo("Pre-synchronizing blockheaders, height: %d (~%.2f%%)\n", height, progress);
}
}
@@ -4150,13 +4327,15 @@ bool ChainstateManager::AcceptBlock(const std::shared_ptr<const CBlock>& pblock,
pindex->nStatus |= BLOCK_FAILED_VALID;
m_blockman.m_dirty_blockindex.insert(pindex);
}
- return error("%s: %s", __func__, state.ToString());
+ LogError("%s: %s\n", __func__, state.ToString());
+ return false;
}
// Header is valid/has work, merkle tree and segwit merkle tree are good...RELAY NOW
// (but if it does not build on our best tip, let the SendMessages loop relay it)
- if (!IsInitialBlockDownload() && ActiveTip() == pindex->pprev)
- GetMainSignals().NewPoWValidBlock(pindex, pblock);
+ if (!IsInitialBlockDownload() && ActiveTip() == pindex->pprev && m_options.signals) {
+ m_options.signals->NewPoWValidBlock(pindex, pblock);
+ }
// Write block to history file
if (fNewBlock) *fNewBlock = true;
@@ -4168,7 +4347,7 @@ bool ChainstateManager::AcceptBlock(const std::shared_ptr<const CBlock>& pblock,
}
ReceivedBlockTransactions(block, pindex, blockPos);
} catch (const std::runtime_error& e) {
- return FatalError(GetNotifications(), state, std::string("System error: ") + e.what());
+ return FatalError(GetNotifications(), state, strprintf(_("System error while saving block to disk: %s"), e.what()));
}
// TODO: FlushStateToDisk() handles flushing of both block and chainstate
@@ -4209,8 +4388,11 @@ bool ChainstateManager::ProcessNewBlock(const std::shared_ptr<const CBlock>& blo
ret = AcceptBlock(block, state, &pindex, force_processing, nullptr, new_block, min_pow_checked);
}
if (!ret) {
- GetMainSignals().BlockChecked(*block, state);
- return error("%s: AcceptBlock FAILED (%s)", __func__, state.ToString());
+ if (m_options.signals) {
+ m_options.signals->BlockChecked(*block, state);
+ }
+ LogError("%s: AcceptBlock FAILED (%s)\n", __func__, state.ToString());
+ return false;
}
}
@@ -4218,13 +4400,15 @@ bool ChainstateManager::ProcessNewBlock(const std::shared_ptr<const CBlock>& blo
BlockValidationState state; // Only used to report errors, not invalidity - ignore it
if (!ActiveChainstate().ActivateBestChain(state, block)) {
- return error("%s: ActivateBestChain failed (%s)", __func__, state.ToString());
+ LogError("%s: ActivateBestChain failed (%s)\n", __func__, state.ToString());
+ return false;
}
Chainstate* bg_chain{WITH_LOCK(cs_main, return BackgroundSyncInProgress() ? m_ibd_chainstate.get() : nullptr)};
BlockValidationState bg_state;
if (bg_chain && !bg_chain->ActivateBestChain(bg_state, block)) {
- return error("%s: [background] ActivateBestChain failed (%s)", __func__, bg_state.ToString());
+ LogError("%s: [background] ActivateBestChain failed (%s)\n", __func__, bg_state.ToString());
+ return false;
}
return true;
@@ -4262,12 +4446,18 @@ bool TestBlockValidity(BlockValidationState& state,
indexDummy.phashBlock = &block_hash;
// NOTE: CheckBlockHeader is called by CheckBlock
- if (!ContextualCheckBlockHeader(block, state, chainstate.m_blockman, chainstate.m_chainman, pindexPrev))
- return error("%s: Consensus::ContextualCheckBlockHeader: %s", __func__, state.ToString());
- if (!CheckBlock(block, state, chainparams.GetConsensus(), fCheckPOW, fCheckMerkleRoot))
- return error("%s: Consensus::CheckBlock: %s", __func__, state.ToString());
- if (!ContextualCheckBlock(block, state, chainstate.m_chainman, pindexPrev))
- return error("%s: Consensus::ContextualCheckBlock: %s", __func__, state.ToString());
+ if (!ContextualCheckBlockHeader(block, state, chainstate.m_blockman, chainstate.m_chainman, pindexPrev)) {
+ LogError("%s: Consensus::ContextualCheckBlockHeader: %s\n", __func__, state.ToString());
+ return false;
+ }
+ if (!CheckBlock(block, state, chainparams.GetConsensus(), fCheckPOW, fCheckMerkleRoot)) {
+ LogError("%s: Consensus::CheckBlock: %s\n", __func__, state.ToString());
+ return false;
+ }
+ if (!ContextualCheckBlock(block, state, chainstate.m_chainman, pindexPrev)) {
+ LogError("%s: Consensus::ContextualCheckBlock: %s\n", __func__, state.ToString());
+ return false;
+ }
if (!chainstate.ConnectBlock(block, state, &indexDummy, viewNew, true)) {
return false;
}
@@ -4471,7 +4661,8 @@ bool Chainstate::RollforwardBlock(const CBlockIndex* pindex, CCoinsViewCache& in
// TODO: merge with ConnectBlock
CBlock block;
if (!m_blockman.ReadBlockFromDisk(block, *pindex)) {
- return error("ReplayBlock(): ReadBlockFromDisk failed at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
+ LogError("ReplayBlock(): ReadBlockFromDisk failed at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
+ return false;
}
for (const CTransactionRef& tx : block.vtx) {
@@ -4495,7 +4686,10 @@ bool Chainstate::ReplayBlocks()
std::vector<uint256> hashHeads = db.GetHeadBlocks();
if (hashHeads.empty()) return true; // We're already in a consistent state.
- if (hashHeads.size() != 2) return error("ReplayBlocks(): unknown inconsistent state");
+ if (hashHeads.size() != 2) {
+ LogError("ReplayBlocks(): unknown inconsistent state\n");
+ return false;
+ }
m_chainman.GetNotifications().progress(_("Replaying blocks…"), 0, false);
LogPrintf("Replaying blocks\n");
@@ -4505,13 +4699,15 @@ bool Chainstate::ReplayBlocks()
const CBlockIndex* pindexFork = nullptr; // Latest block common to both the old and the new tip.
if (m_blockman.m_block_index.count(hashHeads[0]) == 0) {
- return error("ReplayBlocks(): reorganization to unknown block requested");
+ LogError("ReplayBlocks(): reorganization to unknown block requested\n");
+ return false;
}
pindexNew = &(m_blockman.m_block_index[hashHeads[0]]);
if (!hashHeads[1].IsNull()) { // The old tip is allowed to be 0, indicating it's the first flush.
if (m_blockman.m_block_index.count(hashHeads[1]) == 0) {
- return error("ReplayBlocks(): reorganization from unknown block requested");
+ LogError("ReplayBlocks(): reorganization from unknown block requested\n");
+ return false;
}
pindexOld = &(m_blockman.m_block_index[hashHeads[1]]);
pindexFork = LastCommonAncestor(pindexOld, pindexNew);
@@ -4523,12 +4719,14 @@ bool Chainstate::ReplayBlocks()
if (pindexOld->nHeight > 0) { // Never disconnect the genesis block.
CBlock block;
if (!m_blockman.ReadBlockFromDisk(block, *pindexOld)) {
- return error("RollbackBlock(): ReadBlockFromDisk() failed at %d, hash=%s", pindexOld->nHeight, pindexOld->GetBlockHash().ToString());
+ LogError("RollbackBlock(): ReadBlockFromDisk() failed at %d, hash=%s\n", pindexOld->nHeight, pindexOld->GetBlockHash().ToString());
+ return false;
}
LogPrintf("Rolling back %s (%i)\n", pindexOld->GetBlockHash().ToString(), pindexOld->nHeight);
DisconnectResult res = DisconnectBlock(block, pindexOld, cache);
if (res == DISCONNECT_FAILED) {
- return error("RollbackBlock(): DisconnectBlock failed at %d, hash=%s", pindexOld->nHeight, pindexOld->GetBlockHash().ToString());
+ LogError("RollbackBlock(): DisconnectBlock failed at %d, hash=%s\n", pindexOld->nHeight, pindexOld->GetBlockHash().ToString());
+ return false;
}
// If DISCONNECT_UNCLEAN is returned, it means a non-existing UTXO was deleted, or an existing UTXO was
// overwritten. It corresponds to cases where the block-to-be-disconnect never had all its operations
@@ -4647,12 +4845,14 @@ bool Chainstate::LoadGenesisBlock()
const CBlock& block = params.GenesisBlock();
FlatFilePos blockPos{m_blockman.SaveBlockToDisk(block, 0, nullptr)};
if (blockPos.IsNull()) {
- return error("%s: writing genesis block to disk failed", __func__);
+ LogError("%s: writing genesis block to disk failed\n", __func__);
+ return false;
}
CBlockIndex* pindex = m_blockman.AddToBlockIndex(block, m_chainman.m_best_header);
m_chainman.ReceivedBlockTransactions(block, pindex, blockPos);
} catch (const std::runtime_error& e) {
- return error("%s: failed to write genesis block: %s", __func__, e.what());
+ LogError("%s: failed to write genesis block: %s\n", __func__, e.what());
+ return false;
}
return true;
@@ -4831,7 +5031,7 @@ void ChainstateManager::LoadExternalBlockFile(
}
}
} catch (const std::runtime_error& e) {
- GetNotifications().fatalError(std::string("System error: ") + e.what());
+ GetNotifications().fatalError(strprintf(_("System error while loading external block file: %s"), e.what()));
}
LogPrintf("Loaded %i blocks from external file in %dms\n", nLoaded, Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
}
@@ -4871,16 +5071,31 @@ void ChainstateManager::CheckBlockIndex()
size_t nNodes = 0;
int nHeight = 0;
CBlockIndex* pindexFirstInvalid = nullptr; // Oldest ancestor of pindex which is invalid.
- CBlockIndex* pindexFirstMissing = nullptr; // Oldest ancestor of pindex which does not have BLOCK_HAVE_DATA.
- CBlockIndex* pindexFirstNeverProcessed = nullptr; // Oldest ancestor of pindex for which nTx == 0.
+ CBlockIndex* pindexFirstMissing = nullptr; // Oldest ancestor of pindex which does not have BLOCK_HAVE_DATA, since assumeutxo snapshot if used.
+ CBlockIndex* pindexFirstNeverProcessed = nullptr; // Oldest ancestor of pindex for which nTx == 0, since assumeutxo snapshot if used.
CBlockIndex* pindexFirstNotTreeValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_TREE (regardless of being valid or not).
- CBlockIndex* pindexFirstNotTransactionsValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_TRANSACTIONS (regardless of being valid or not).
- CBlockIndex* pindexFirstNotChainValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_CHAIN (regardless of being valid or not).
- CBlockIndex* pindexFirstNotScriptsValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_SCRIPTS (regardless of being valid or not).
- CBlockIndex* pindexFirstAssumeValid = nullptr; // Oldest ancestor of pindex which has BLOCK_ASSUMED_VALID
+ CBlockIndex* pindexFirstNotTransactionsValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_TRANSACTIONS (regardless of being valid or not), since assumeutxo snapshot if used.
+ CBlockIndex* pindexFirstNotChainValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_CHAIN (regardless of being valid or not), since assumeutxo snapshot if used.
+ CBlockIndex* pindexFirstNotScriptsValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_SCRIPTS (regardless of being valid or not), since assumeutxo snapshot if used.
+
+ // After checking an assumeutxo snapshot block, reset pindexFirst pointers
+ // to earlier blocks that have not been downloaded or validated yet, so
+ // checks for later blocks can assume the earlier blocks were validated and
+ // be stricter, testing for more requirements.
+ const CBlockIndex* snap_base{GetSnapshotBaseBlock()};
+ CBlockIndex *snap_first_missing{}, *snap_first_notx{}, *snap_first_notv{}, *snap_first_nocv{}, *snap_first_nosv{};
+ auto snap_update_firsts = [&] {
+ if (pindex == snap_base) {
+ std::swap(snap_first_missing, pindexFirstMissing);
+ std::swap(snap_first_notx, pindexFirstNeverProcessed);
+ std::swap(snap_first_notv, pindexFirstNotTransactionsValid);
+ std::swap(snap_first_nocv, pindexFirstNotChainValid);
+ std::swap(snap_first_nosv, pindexFirstNotScriptsValid);
+ }
+ };
+
while (pindex != nullptr) {
nNodes++;
- if (pindexFirstAssumeValid == nullptr && pindex->nStatus & BLOCK_ASSUMED_VALID) pindexFirstAssumeValid = pindex;
if (pindexFirstInvalid == nullptr && pindex->nStatus & BLOCK_FAILED_VALID) pindexFirstInvalid = pindex;
if (pindexFirstMissing == nullptr && !(pindex->nStatus & BLOCK_HAVE_DATA)) {
pindexFirstMissing = pindex;
@@ -4888,10 +5103,7 @@ void ChainstateManager::CheckBlockIndex()
if (pindexFirstNeverProcessed == nullptr && pindex->nTx == 0) pindexFirstNeverProcessed = pindex;
if (pindex->pprev != nullptr && pindexFirstNotTreeValid == nullptr && (pindex->nStatus & BLOCK_VALID_MASK) < BLOCK_VALID_TREE) pindexFirstNotTreeValid = pindex;
- if (pindex->pprev != nullptr && !pindex->IsAssumedValid()) {
- // Skip validity flag checks for BLOCK_ASSUMED_VALID index entries, since these
- // *_VALID_MASK flags will not be present for index entries we are temporarily assuming
- // valid.
+ if (pindex->pprev != nullptr) {
if (pindexFirstNotTransactionsValid == nullptr &&
(pindex->nStatus & BLOCK_VALID_MASK) < BLOCK_VALID_TRANSACTIONS) {
pindexFirstNotTransactionsValid = pindex;
@@ -4921,36 +5133,26 @@ void ChainstateManager::CheckBlockIndex()
if (!pindex->HaveNumChainTxs()) assert(pindex->nSequenceId <= 0); // nSequenceId can't be set positive for blocks that aren't linked (negative is used for preciousblock)
// VALID_TRANSACTIONS is equivalent to nTx > 0 for all nodes (whether or not pruning has occurred).
// HAVE_DATA is only equivalent to nTx > 0 (or VALID_TRANSACTIONS) if no pruning has occurred.
- // Unless these indexes are assumed valid and pending block download on a
- // background chainstate.
- if (!m_blockman.m_have_pruned && !pindex->IsAssumedValid()) {
+ if (!m_blockman.m_have_pruned) {
// If we've never pruned, then HAVE_DATA should be equivalent to nTx > 0
assert(!(pindex->nStatus & BLOCK_HAVE_DATA) == (pindex->nTx == 0));
- if (pindexFirstAssumeValid == nullptr) {
- // If we've got some assume valid blocks, then we might have
- // missing blocks (not HAVE_DATA) but still treat them as
- // having been processed (with a fake nTx value). Otherwise, we
- // can assert that these are the same.
- assert(pindexFirstMissing == pindexFirstNeverProcessed);
- }
+ assert(pindexFirstMissing == pindexFirstNeverProcessed);
} else {
// If we have pruned, then we can only say that HAVE_DATA implies nTx > 0
if (pindex->nStatus & BLOCK_HAVE_DATA) assert(pindex->nTx > 0);
}
if (pindex->nStatus & BLOCK_HAVE_UNDO) assert(pindex->nStatus & BLOCK_HAVE_DATA);
- if (pindex->IsAssumedValid()) {
- // Assumed-valid blocks should have some nTx value.
- assert(pindex->nTx > 0);
+ if (snap_base && snap_base->GetAncestor(pindex->nHeight) == pindex) {
// Assumed-valid blocks should connect to the main chain.
assert((pindex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_TREE);
- } else {
- // Otherwise there should only be an nTx value if we have
- // actually seen a block's transactions.
- assert(((pindex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_TRANSACTIONS) == (pindex->nTx > 0)); // This is pruning-independent.
}
+ // There should only be an nTx value if we have
+ // actually seen a block's transactions.
+ assert(((pindex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_TRANSACTIONS) == (pindex->nTx > 0)); // This is pruning-independent.
// All parents having had data (at some point) is equivalent to all parents being VALID_TRANSACTIONS, which is equivalent to HaveNumChainTxs().
- assert((pindexFirstNeverProcessed == nullptr) == pindex->HaveNumChainTxs());
- assert((pindexFirstNotTransactionsValid == nullptr) == pindex->HaveNumChainTxs());
+ // HaveNumChainTxs will also be set in the assumeutxo snapshot block from snapshot metadata.
+ assert((pindexFirstNeverProcessed == nullptr || pindex == snap_base) == pindex->HaveNumChainTxs());
+ assert((pindexFirstNotTransactionsValid == nullptr || pindex == snap_base) == pindex->HaveNumChainTxs());
assert(pindex->nHeight == nHeight); // nHeight must be consistent.
assert(pindex->pprev == nullptr || pindex->nChainWork >= pindex->pprev->nChainWork); // For every block except the genesis block, the chainwork must be larger than the parent's.
assert(nHeight < 2 || (pindex->pskip && (pindex->pskip->nHeight < nHeight))); // The pskip pointer must point back for all but the first 2 blocks.
@@ -4963,30 +5165,64 @@ void ChainstateManager::CheckBlockIndex()
assert((pindex->nStatus & BLOCK_FAILED_MASK) == 0); // The failed mask cannot be set for blocks without invalid parents.
}
// Make sure nChainTx sum is correctly computed.
- unsigned int prev_chain_tx = pindex->pprev ? pindex->pprev->nChainTx : 0;
- assert((pindex->nChainTx == pindex->nTx + prev_chain_tx)
- // Transaction may be completely unset - happens if only the header was accepted but the block hasn't been processed.
- || (pindex->nChainTx == 0 && pindex->nTx == 0)
- // nChainTx may be unset, but nTx set (if a block has been accepted, but one of its predecessors hasn't been processed yet)
- || (pindex->nChainTx == 0 && prev_chain_tx == 0 && pindex->pprev)
- // Transaction counts prior to snapshot are unknown.
- || pindex->IsAssumedValid());
+ if (!pindex->pprev) {
+ // If no previous block, nTx and nChainTx must be the same.
+ assert(pindex->nChainTx == pindex->nTx);
+ } else if (pindex->pprev->nChainTx > 0 && pindex->nTx > 0) {
+ // If previous nChainTx is set and number of transactions in block is known, sum must be set.
+ assert(pindex->nChainTx == pindex->nTx + pindex->pprev->nChainTx);
+ } else {
+ // Otherwise nChainTx should only be set if this is a snapshot
+ // block, and must be set if it is.
+ assert((pindex->nChainTx != 0) == (pindex == snap_base));
+ }
+
// Chainstate-specific checks on setBlockIndexCandidates
for (auto c : GetAll()) {
if (c->m_chain.Tip() == nullptr) continue;
- if (!CBlockIndexWorkComparator()(pindex, c->m_chain.Tip()) && pindexFirstNeverProcessed == nullptr) {
+ // Two main factors determine whether pindex is a candidate in
+ // setBlockIndexCandidates:
+ //
+ // - If pindex has less work than the chain tip, it should not be a
+ // candidate, and this will be asserted below. Otherwise it is a
+ // potential candidate.
+ //
+ // - If pindex or one of its parent blocks back to the genesis block
+ // or an assumeutxo snapshot never downloaded transactions
+ // (pindexFirstNeverProcessed is non-null), it should not be a
+ // candidate, and this will be asserted below. The only exception
+ // is if pindex itself is an assumeutxo snapshot block. Then it is
+ // also a potential candidate.
+ if (!CBlockIndexWorkComparator()(pindex, c->m_chain.Tip()) && (pindexFirstNeverProcessed == nullptr || pindex == snap_base)) {
+ // If pindex was detected as invalid (pindexFirstInvalid is
+ // non-null), it is not required to be in
+ // setBlockIndexCandidates.
if (pindexFirstInvalid == nullptr) {
- const bool is_active = c == &ActiveChainstate();
- // If this block sorts at least as good as the current tip and
- // is valid and we have all data for its parents, it must be in
- // setBlockIndexCandidates. m_chain.Tip() must also be there
- // even if some data has been pruned.
+ // If pindex and all its parents back to the genesis block
+ // or an assumeutxo snapshot block downloaded transactions,
+ // and the transactions were not pruned (pindexFirstMissing
+ // is null), it is a potential candidate. The check
+ // excludes pruned blocks, because if any blocks were
+ // pruned between pindex the current chain tip, pindex will
+ // only temporarily be added to setBlockIndexCandidates,
+ // before being moved to m_blocks_unlinked. This check
+ // could be improved to verify that if all blocks between
+ // the chain tip and pindex have data, pindex must be a
+ // candidate.
//
- if ((pindexFirstMissing == nullptr || pindex == c->m_chain.Tip())) {
- // The active chainstate should always have this block
- // as a candidate, but a background chainstate should
- // only have it if it is an ancestor of the snapshot base.
- if (is_active || GetSnapshotBaseBlock()->GetAncestor(pindex->nHeight) == pindex) {
+ // If pindex is the chain tip, it also is a potential
+ // candidate.
+ //
+ // If the chainstate was loaded from a snapshot and pindex
+ // is the base of the snapshot, pindex is also a potential
+ // candidate.
+ if (pindexFirstMissing == nullptr || pindex == c->m_chain.Tip() || pindex == c->SnapshotBase()) {
+ // If this chainstate is the active chainstate, pindex
+ // must be in setBlockIndexCandidates. Otherwise, this
+ // chainstate is a background validation chainstate, and
+ // pindex only needs to be added if it is an ancestor of
+ // the snapshot that is being validated.
+ if (c == &ActiveChainstate() || snap_base->GetAncestor(pindex->nHeight) == pindex) {
assert(c->setBlockIndexCandidates.count(pindex));
}
}
@@ -5017,7 +5253,7 @@ void ChainstateManager::CheckBlockIndex()
if (pindexFirstMissing == nullptr) assert(!foundInUnlinked); // We aren't missing data for any parent -- cannot be in m_blocks_unlinked.
if (pindex->pprev && (pindex->nStatus & BLOCK_HAVE_DATA) && pindexFirstNeverProcessed == nullptr && pindexFirstMissing != nullptr) {
// We HAVE_DATA for this block, have received data for all parents at some point, but we're currently missing data for some parent.
- assert(m_blockman.m_have_pruned || pindexFirstAssumeValid != nullptr); // We must have pruned, or else we're using a snapshot (causing us to have faked the received data for some parent(s)).
+ assert(m_blockman.m_have_pruned);
// This block may have entered m_blocks_unlinked if:
// - it has a descendant that at some point had more work than the
// tip, and
@@ -5030,7 +5266,7 @@ void ChainstateManager::CheckBlockIndex()
const bool is_active = c == &ActiveChainstate();
if (!CBlockIndexWorkComparator()(pindex, c->m_chain.Tip()) && c->setBlockIndexCandidates.count(pindex) == 0) {
if (pindexFirstInvalid == nullptr) {
- if (is_active || GetSnapshotBaseBlock()->GetAncestor(pindex->nHeight) == pindex) {
+ if (is_active || snap_base->GetAncestor(pindex->nHeight) == pindex) {
assert(foundInUnlinked);
}
}
@@ -5041,6 +5277,7 @@ void ChainstateManager::CheckBlockIndex()
// End: actual consistency checks.
// Try descending into the first subnode.
+ snap_update_firsts();
std::pair<std::multimap<CBlockIndex*,CBlockIndex*>::iterator,std::multimap<CBlockIndex*,CBlockIndex*>::iterator> range = forward.equal_range(pindex);
if (range.first != range.second) {
// A subnode was found.
@@ -5052,6 +5289,7 @@ void ChainstateManager::CheckBlockIndex()
// Move upwards until we reach a node of which we have not yet visited the last child.
while (pindex) {
// We are going to either move to a parent or a sibling of pindex.
+ snap_update_firsts();
// If pindex was the first with a certain property, unset the corresponding variable.
if (pindex == pindexFirstInvalid) pindexFirstInvalid = nullptr;
if (pindex == pindexFirstMissing) pindexFirstMissing = nullptr;
@@ -5060,7 +5298,6 @@ void ChainstateManager::CheckBlockIndex()
if (pindex == pindexFirstNotTransactionsValid) pindexFirstNotTransactionsValid = nullptr;
if (pindex == pindexFirstNotChainValid) pindexFirstNotChainValid = nullptr;
if (pindex == pindexFirstNotScriptsValid) pindexFirstNotScriptsValid = nullptr;
- if (pindex == pindexFirstAssumeValid) pindexFirstAssumeValid = nullptr;
// Find our parent.
CBlockIndex* pindexPar = pindex->pprev;
// Find which child we just visited.
@@ -5134,6 +5371,12 @@ double GuessVerificationProgress(const ChainTxData& data, const CBlockIndex *pin
if (pindex == nullptr)
return 0.0;
+ if (!Assume(pindex->nChainTx > 0)) {
+ LogWarning("Internal bug detected: block %d has unset nChainTx (%s %s). Please report this issue here: %s\n",
+ pindex->nHeight, PACKAGE_NAME, FormatFullVersion(), PACKAGE_BUGREPORT);
+ return 0.0;
+ }
+
int64_t nNow = time(nullptr);
double fTxTotal;
@@ -5298,8 +5541,8 @@ bool ChainstateManager::ActivateSnapshot(
snapshot_chainstate.reset();
bool removed = DeleteCoinsDBFromDisk(*snapshot_datadir, /*is_snapshot=*/true);
if (!removed) {
- GetNotifications().fatalError(strprintf("Failed to remove snapshot chainstate dir (%s). "
- "Manually remove it before restarting.\n", fs::PathToString(*snapshot_datadir)));
+ GetNotifications().fatalError(strprintf(_("Failed to remove snapshot chainstate dir (%s). "
+ "Manually remove it before restarting.\n"), fs::PathToString(*snapshot_datadir)));
}
}
return false;
@@ -5540,30 +5783,14 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
// Fake various pieces of CBlockIndex state:
CBlockIndex* index = nullptr;
- // Don't make any modifications to the genesis block.
- // This is especially important because we don't want to erroneously
- // apply BLOCK_ASSUMED_VALID to genesis, which would happen if we didn't skip
- // it here (since it apparently isn't BLOCK_VALID_SCRIPTS).
+ // Don't make any modifications to the genesis block since it shouldn't be
+ // necessary, and since the genesis block doesn't have normal flags like
+ // BLOCK_VALID_SCRIPTS set.
constexpr int AFTER_GENESIS_START{1};
for (int i = AFTER_GENESIS_START; i <= snapshot_chainstate.m_chain.Height(); ++i) {
index = snapshot_chainstate.m_chain[i];
- // Fake nTx so that LoadBlockIndex() loads assumed-valid CBlockIndex
- // entries (among other things)
- if (!index->nTx) {
- index->nTx = 1;
- }
- // Fake nChainTx so that GuessVerificationProgress reports accurately
- index->nChainTx = index->pprev->nChainTx + index->nTx;
-
- // Mark unvalidated block index entries beneath the snapshot base block as assumed-valid.
- if (!index->IsValid(BLOCK_VALID_SCRIPTS)) {
- // This flag will be removed once the block is fully validated by a
- // background chainstate.
- index->nStatus |= BLOCK_ASSUMED_VALID;
- }
-
// Fake BLOCK_OPT_WITNESS so that Chainstate::NeedsRedownload()
// won't ask to rewind the entire assumed-valid chain on startup.
if (DeploymentActiveAt(*index, *this, Consensus::DEPLOYMENT_SEGWIT)) {
@@ -5579,6 +5806,7 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
}
assert(index);
+ assert(index == snapshot_start_block);
index->nChainTx = au_data.nChainTx;
snapshot_chainstate.setBlockIndexCandidates.insert(snapshot_start_block);
@@ -5653,7 +5881,7 @@ SnapshotCompletionResult ChainstateManager::MaybeCompleteSnapshotValidation()
user_error = strprintf(Untranslated("%s\n%s"), user_error, util::ErrorString(rename_result));
}
- GetNotifications().fatalError(user_error.original, user_error);
+ GetNotifications().fatalError(user_error);
};
if (index_new.GetBlockHash() != snapshot_blockhash) {
@@ -5994,9 +6222,9 @@ bool ChainstateManager::ValidatedSnapshotCleanup()
const fs::filesystem_error& err) {
LogPrintf("Error renaming path (%s) -> (%s): %s\n",
fs::PathToString(p_old), fs::PathToString(p_new), err.what());
- GetNotifications().fatalError(strprintf(
+ GetNotifications().fatalError(strprintf(_(
"Rename of '%s' -> '%s' failed. "
- "Cannot clean up the background chainstate leveldb directory.",
+ "Cannot clean up the background chainstate leveldb directory."),
fs::PathToString(p_old), fs::PathToString(p_new)));
};
diff --git a/src/validation.h b/src/validation.h
index fd9b53df8f..e3b2a2d59b 100644
--- a/src/validation.h
+++ b/src/validation.h
@@ -6,10 +6,6 @@
#ifndef BITCOIN_VALIDATION_H
#define BITCOIN_VALIDATION_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <arith_uint256.h>
#include <attributes.h>
#include <chain.h>
@@ -97,7 +93,7 @@ extern const std::vector<std::string> CHECKLEVEL_DOC;
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams);
-bool FatalError(kernel::Notifications& notifications, BlockValidationState& state, const std::string& strMessage, const bilingual_str& userMessage = {});
+bool FatalError(kernel::Notifications& notifications, BlockValidationState& state, const bilingual_str& message);
/** Guess verification progress (as a fraction between 0.0=genesis and 1.0=current tip). */
double GuessVerificationProgress(const ChainTxData& data, const CBlockIndex* pindex);
@@ -278,13 +274,15 @@ MempoolAcceptResult AcceptToMemoryPool(Chainstate& active_chainstate, const CTra
/**
* Validate (and maybe submit) a package to the mempool. See doc/policy/packages.md for full details
* on package validation rules.
-* @param[in] test_accept When true, run validation checks but don't submit to mempool.
+* @param[in] test_accept When true, run validation checks but don't submit to mempool.
+* @param[in] client_maxfeerate If exceeded by an individual transaction, rest of (sub)package evaluation is aborted.
+* Only for sanity checks against local submission of transactions.
* @returns a PackageMempoolAcceptResult which includes a MempoolAcceptResult for each transaction.
* If a transaction fails, validation will exit early and some results may be missing. It is also
* possible for the package to be partially submitted.
*/
PackageMempoolAcceptResult ProcessNewPackage(Chainstate& active_chainstate, CTxMemPool& pool,
- const Package& txns, bool test_accept)
+ const Package& txns, bool test_accept, const std::optional<CFeeRate>& client_maxfeerate)
EXCLUSIVE_LOCKS_REQUIRED(cs_main);
/* Mempool validation helper functions */
@@ -383,8 +381,11 @@ bool TestBlockValidity(BlockValidationState& state,
/** Check with the proof of work on each blockheader matches the value in nBits */
bool HasValidProofOfWork(const std::vector<CBlockHeader>& headers, const Consensus::Params& consensusParams);
-/** Return the sum of the work on a given set of headers */
-arith_uint256 CalculateHeadersWork(const std::vector<CBlockHeader>& headers);
+/** Check if a block has been mutated (with respect to its merkle root and witness commitments). */
+bool IsBlockMutated(const CBlock& block, bool check_witness_root);
+
+/** Return the sum of the claimed work on a given set of headers. No verification of PoW is done. */
+arith_uint256 CalculateClaimedHeadersWork(const std::vector<CBlockHeader>& headers);
enum class VerifyDBResult {
SUCCESS,
@@ -477,7 +478,7 @@ enum class CoinsCacheSizeState
* current best chain.
*
* Eventually, the API here is targeted at being exposed externally as a
- * consumable libconsensus library, so any functions added must only call
+ * consumable library, so any functions added must only call
* other class member functions, pure functions in other parts of the consensus
* library, callbacks via the validation interface, or read/write-to-disk
* functions (eventually this will also be via callbacks).
@@ -584,9 +585,10 @@ public:
const CBlockIndex* SnapshotBase() EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
/**
- * The set of all CBlockIndex entries with either BLOCK_VALID_TRANSACTIONS (for
- * itself and all ancestors) *or* BLOCK_ASSUMED_VALID (if using background
- * chainstates) and as good as our current tip or better. Entries may be failed,
+ * The set of all CBlockIndex entries that have as much work as our current
+ * tip or more, and transaction data needed to be validated (with
+ * BLOCK_VALID_TRANSACTIONS for each block and its parents back to the
+ * genesis block or an assumeutxo snapshot block). Entries may be failed,
* though, and pruning nodes may be missing the data for the block.
*/
std::set<CBlockIndex*, node::CBlockIndexWorkComparator> setBlockIndexCandidates;
diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp
index 5e944a7c47..813fde109c 100644
--- a/src/validationinterface.cpp
+++ b/src/validationinterface.cpp
@@ -5,7 +5,6 @@
#include <validationinterface.h>
-#include <attributes.h>
#include <chain.h>
#include <consensus/validation.h>
#include <kernel/chain.h>
@@ -13,7 +12,8 @@
#include <logging.h>
#include <primitives/block.h>
#include <primitives/transaction.h>
-#include <scheduler.h>
+#include <util/check.h>
+#include <util/task_runner.h>
#include <future>
#include <unordered_map>
@@ -22,14 +22,14 @@
std::string RemovalReasonToString(const MemPoolRemovalReason& r) noexcept;
/**
- * MainSignalsImpl manages a list of shared_ptr<CValidationInterface> callbacks.
+ * ValidationSignalsImpl manages a list of shared_ptr<CValidationInterface> callbacks.
*
* A std::unordered_map is used to track what callbacks are currently
* registered, and a std::list is used to store the callbacks that are
* currently registered as well as any callbacks that are just unregistered
* and about to be deleted when they are done executing.
*/
-class MainSignalsImpl
+class ValidationSignalsImpl
{
private:
Mutex m_mutex;
@@ -42,12 +42,10 @@ private:
std::unordered_map<CValidationInterface*, std::list<ListEntry>::iterator> m_map GUARDED_BY(m_mutex);
public:
- // We are not allowed to assume the scheduler only runs in one thread,
- // but must ensure all callbacks happen in-order, so we end up creating
- // our own queue here :(
- SingleThreadedSchedulerClient m_schedulerClient;
+ std::unique_ptr<util::TaskRunnerInterface> m_task_runner;
- explicit MainSignalsImpl(CScheduler& scheduler LIFETIMEBOUND) : m_schedulerClient(scheduler) {}
+ explicit ValidationSignalsImpl(std::unique_ptr<util::TaskRunnerInterface> task_runner)
+ : m_task_runner{std::move(Assert(task_runner))} {}
void Register(std::shared_ptr<CValidationInterface> callbacks) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
{
@@ -94,77 +92,56 @@ public:
}
};
-static CMainSignals g_signals;
+ValidationSignals::ValidationSignals(std::unique_ptr<util::TaskRunnerInterface> task_runner)
+ : m_internals{std::make_unique<ValidationSignalsImpl>(std::move(task_runner))} {}
-void CMainSignals::RegisterBackgroundSignalScheduler(CScheduler& scheduler)
-{
- assert(!m_internals);
- m_internals = std::make_unique<MainSignalsImpl>(scheduler);
-}
-
-void CMainSignals::UnregisterBackgroundSignalScheduler()
-{
- m_internals.reset(nullptr);
-}
+ValidationSignals::~ValidationSignals() {}
-void CMainSignals::FlushBackgroundCallbacks()
+void ValidationSignals::FlushBackgroundCallbacks()
{
- if (m_internals) {
- m_internals->m_schedulerClient.EmptyQueue();
- }
+ m_internals->m_task_runner->flush();
}
-size_t CMainSignals::CallbacksPending()
+size_t ValidationSignals::CallbacksPending()
{
- if (!m_internals) return 0;
- return m_internals->m_schedulerClient.CallbacksPending();
+ return m_internals->m_task_runner->size();
}
-CMainSignals& GetMainSignals()
-{
- return g_signals;
-}
-
-void RegisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks)
+void ValidationSignals::RegisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks)
{
// Each connection captures the shared_ptr to ensure that each callback is
// executed before the subscriber is destroyed. For more details see #18338.
- g_signals.m_internals->Register(std::move(callbacks));
+ m_internals->Register(std::move(callbacks));
}
-void RegisterValidationInterface(CValidationInterface* callbacks)
+void ValidationSignals::RegisterValidationInterface(CValidationInterface* callbacks)
{
// Create a shared_ptr with a no-op deleter - CValidationInterface lifecycle
// is managed by the caller.
RegisterSharedValidationInterface({callbacks, [](CValidationInterface*){}});
}
-void UnregisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks)
+void ValidationSignals::UnregisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks)
{
UnregisterValidationInterface(callbacks.get());
}
-void UnregisterValidationInterface(CValidationInterface* callbacks)
+void ValidationSignals::UnregisterValidationInterface(CValidationInterface* callbacks)
{
- if (g_signals.m_internals) {
- g_signals.m_internals->Unregister(callbacks);
- }
+ m_internals->Unregister(callbacks);
}
-void UnregisterAllValidationInterfaces()
+void ValidationSignals::UnregisterAllValidationInterfaces()
{
- if (!g_signals.m_internals) {
- return;
- }
- g_signals.m_internals->Clear();
+ m_internals->Clear();
}
-void CallFunctionInValidationInterfaceQueue(std::function<void()> func)
+void ValidationSignals::CallFunctionInValidationInterfaceQueue(std::function<void()> func)
{
- g_signals.m_internals->m_schedulerClient.AddToProcessQueue(std::move(func));
+ m_internals->m_task_runner->insert(std::move(func));
}
-void SyncWithValidationInterfaceQueue()
+void ValidationSignals::SyncWithValidationInterfaceQueue()
{
AssertLockNotHeld(cs_main);
// Block until the validation queue drains
@@ -183,7 +160,7 @@ void SyncWithValidationInterfaceQueue()
do { \
auto local_name = (name); \
LOG_EVENT("Enqueuing " fmt, local_name, __VA_ARGS__); \
- m_internals->m_schedulerClient.AddToProcessQueue([=] { \
+ m_internals->m_task_runner->insert([=] { \
LOG_EVENT(fmt, local_name, __VA_ARGS__); \
event(); \
}); \
@@ -192,7 +169,7 @@ void SyncWithValidationInterfaceQueue()
#define LOG_EVENT(fmt, ...) \
LogPrint(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
-void CMainSignals::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {
+void ValidationSignals::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {
// Dependencies exist that require UpdatedBlockTip events to be delivered in the order in which
// the chain actually updates. One way to ensure this is for the caller to invoke this signal
// in the same critical section where the chain is updated
@@ -206,7 +183,7 @@ void CMainSignals::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockInd
fInitialDownload);
}
-void CMainSignals::TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t mempool_sequence)
+void ValidationSignals::TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t mempool_sequence)
{
auto event = [tx, mempool_sequence, this] {
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.TransactionAddedToMempool(tx, mempool_sequence); });
@@ -216,7 +193,7 @@ void CMainSignals::TransactionAddedToMempool(const NewMempoolTransactionInfo& tx
tx.info.m_tx->GetWitnessHash().ToString());
}
-void CMainSignals::TransactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRemovalReason reason, uint64_t mempool_sequence) {
+void ValidationSignals::TransactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRemovalReason reason, uint64_t mempool_sequence) {
auto event = [tx, reason, mempool_sequence, this] {
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.TransactionRemovedFromMempool(tx, reason, mempool_sequence); });
};
@@ -226,7 +203,7 @@ void CMainSignals::TransactionRemovedFromMempool(const CTransactionRef& tx, MemP
RemovalReasonToString(reason));
}
-void CMainSignals::BlockConnected(ChainstateRole role, const std::shared_ptr<const CBlock> &pblock, const CBlockIndex *pindex) {
+void ValidationSignals::BlockConnected(ChainstateRole role, const std::shared_ptr<const CBlock> &pblock, const CBlockIndex *pindex) {
auto event = [role, pblock, pindex, this] {
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.BlockConnected(role, pblock, pindex); });
};
@@ -235,7 +212,7 @@ void CMainSignals::BlockConnected(ChainstateRole role, const std::shared_ptr<con
pindex->nHeight);
}
-void CMainSignals::MempoolTransactionsRemovedForBlock(const std::vector<RemovedMempoolTransactionInfo>& txs_removed_for_block, unsigned int nBlockHeight)
+void ValidationSignals::MempoolTransactionsRemovedForBlock(const std::vector<RemovedMempoolTransactionInfo>& txs_removed_for_block, unsigned int nBlockHeight)
{
auto event = [txs_removed_for_block, nBlockHeight, this] {
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.MempoolTransactionsRemovedForBlock(txs_removed_for_block, nBlockHeight); });
@@ -245,7 +222,7 @@ void CMainSignals::MempoolTransactionsRemovedForBlock(const std::vector<RemovedM
txs_removed_for_block.size());
}
-void CMainSignals::BlockDisconnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindex)
+void ValidationSignals::BlockDisconnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindex)
{
auto event = [pblock, pindex, this] {
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.BlockDisconnected(pblock, pindex); });
@@ -255,7 +232,7 @@ void CMainSignals::BlockDisconnected(const std::shared_ptr<const CBlock>& pblock
pindex->nHeight);
}
-void CMainSignals::ChainStateFlushed(ChainstateRole role, const CBlockLocator &locator) {
+void ValidationSignals::ChainStateFlushed(ChainstateRole role, const CBlockLocator &locator) {
auto event = [role, locator, this] {
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.ChainStateFlushed(role, locator); });
};
@@ -263,13 +240,13 @@ void CMainSignals::ChainStateFlushed(ChainstateRole role, const CBlockLocator &l
locator.IsNull() ? "null" : locator.vHave.front().ToString());
}
-void CMainSignals::BlockChecked(const CBlock& block, const BlockValidationState& state) {
+void ValidationSignals::BlockChecked(const CBlock& block, const BlockValidationState& state) {
LOG_EVENT("%s: block hash=%s state=%s", __func__,
block.GetHash().ToString(), state.ToString());
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.BlockChecked(block, state); });
}
-void CMainSignals::NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock> &block) {
+void ValidationSignals::NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock> &block) {
LOG_EVENT("%s: block hash=%s", __func__, block->GetHash().ToString());
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.NewPoWValidBlock(pindex, block); });
}
diff --git a/src/validationinterface.h b/src/validationinterface.h
index d9292ae2c9..6f49a73c93 100644
--- a/src/validationinterface.h
+++ b/src/validationinterface.h
@@ -6,61 +6,29 @@
#ifndef BITCOIN_VALIDATIONINTERFACE_H
#define BITCOIN_VALIDATIONINTERFACE_H
-#include <kernel/cs_main.h>
#include <kernel/chain.h>
+#include <kernel/cs_main.h>
#include <primitives/transaction.h> // CTransaction(Ref)
#include <sync.h>
+#include <cstddef>
+#include <cstdint>
#include <functional>
#include <memory>
+#include <vector>
+
+namespace util {
+class TaskRunnerInterface;
+} // namespace util
class BlockValidationState;
class CBlock;
class CBlockIndex;
struct CBlockLocator;
-class CValidationInterface;
-class CScheduler;
enum class MemPoolRemovalReason;
struct RemovedMempoolTransactionInfo;
struct NewMempoolTransactionInfo;
-/** Register subscriber */
-void RegisterValidationInterface(CValidationInterface* callbacks);
-/** Unregister subscriber. DEPRECATED. This is not safe to use when the RPC server or main message handler thread is running. */
-void UnregisterValidationInterface(CValidationInterface* callbacks);
-/** Unregister all subscribers */
-void UnregisterAllValidationInterfaces();
-
-// Alternate registration functions that release a shared_ptr after the last
-// notification is sent. These are useful for race-free cleanup, since
-// unregistration is nonblocking and can return before the last notification is
-// processed.
-/** Register subscriber */
-void RegisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks);
-/** Unregister subscriber */
-void UnregisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks);
-
-/**
- * Pushes a function to callback onto the notification queue, guaranteeing any
- * callbacks generated prior to now are finished when the function is called.
- *
- * Be very careful blocking on func to be called if any locks are held -
- * validation interface clients may not be able to make progress as they often
- * wait for things like cs_main, so blocking until func is called with cs_main
- * will result in a deadlock (that DEBUG_LOCKORDER will miss).
- */
-void CallFunctionInValidationInterfaceQueue(std::function<void ()> func);
-/**
- * This is a synonym for the following, which asserts certain locks are not
- * held:
- * std::promise<void> promise;
- * CallFunctionInValidationInterfaceQueue([&promise] {
- * promise.set_value();
- * });
- * promise.get_future().wait();
- */
-void SyncWithValidationInterfaceQueue() LOCKS_EXCLUDED(cs_main);
-
/**
* Implement this to subscribe to events generated in validation and mempool
*
@@ -185,30 +153,65 @@ protected:
* has been received and connected to the headers tree, though not validated yet.
*/
virtual void NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& block) {};
- friend class CMainSignals;
+ friend class ValidationSignals;
friend class ValidationInterfaceTest;
};
-class MainSignalsImpl;
-class CMainSignals {
+class ValidationSignalsImpl;
+class ValidationSignals {
private:
- std::unique_ptr<MainSignalsImpl> m_internals;
-
- friend void ::RegisterSharedValidationInterface(std::shared_ptr<CValidationInterface>);
- friend void ::UnregisterValidationInterface(CValidationInterface*);
- friend void ::UnregisterAllValidationInterfaces();
- friend void ::CallFunctionInValidationInterfaceQueue(std::function<void ()> func);
+ std::unique_ptr<ValidationSignalsImpl> m_internals;
public:
- /** Register a CScheduler to give callbacks which should run in the background (may only be called once) */
- void RegisterBackgroundSignalScheduler(CScheduler& scheduler);
- /** Unregister a CScheduler to give callbacks which should run in the background - these callbacks will now be dropped! */
- void UnregisterBackgroundSignalScheduler();
+ // The task runner will block validation if it calls its insert method's
+ // func argument synchronously. In this class func contains a loop that
+ // dispatches a single validation event to all subscribers sequentially.
+ explicit ValidationSignals(std::unique_ptr<util::TaskRunnerInterface> task_runner);
+
+ ~ValidationSignals();
+
/** Call any remaining callbacks on the calling thread */
void FlushBackgroundCallbacks();
size_t CallbacksPending();
+ /** Register subscriber */
+ void RegisterValidationInterface(CValidationInterface* callbacks);
+ /** Unregister subscriber. DEPRECATED. This is not safe to use when the RPC server or main message handler thread is running. */
+ void UnregisterValidationInterface(CValidationInterface* callbacks);
+ /** Unregister all subscribers */
+ void UnregisterAllValidationInterfaces();
+
+ // Alternate registration functions that release a shared_ptr after the last
+ // notification is sent. These are useful for race-free cleanup, since
+ // unregistration is nonblocking and can return before the last notification is
+ // processed.
+ /** Register subscriber */
+ void RegisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks);
+ /** Unregister subscriber */
+ void UnregisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks);
+
+ /**
+ * Pushes a function to callback onto the notification queue, guaranteeing any
+ * callbacks generated prior to now are finished when the function is called.
+ *
+ * Be very careful blocking on func to be called if any locks are held -
+ * validation interface clients may not be able to make progress as they often
+ * wait for things like cs_main, so blocking until func is called with cs_main
+ * will result in a deadlock (that DEBUG_LOCKORDER will miss).
+ */
+ void CallFunctionInValidationInterfaceQueue(std::function<void ()> func);
+
+ /**
+ * This is a synonym for the following, which asserts certain locks are not
+ * held:
+ * std::promise<void> promise;
+ * CallFunctionInValidationInterfaceQueue([&promise] {
+ * promise.set_value();
+ * });
+ * promise.get_future().wait();
+ */
+ void SyncWithValidationInterfaceQueue() LOCKS_EXCLUDED(cs_main);
void UpdatedBlockTip(const CBlockIndex *, const CBlockIndex *, bool fInitialDownload);
void TransactionAddedToMempool(const NewMempoolTransactionInfo&, uint64_t mempool_sequence);
@@ -221,6 +224,4 @@ public:
void NewPoWValidBlock(const CBlockIndex *, const std::shared_ptr<const CBlock>&);
};
-CMainSignals& GetMainSignals();
-
#endif // BITCOIN_VALIDATIONINTERFACE_H
diff --git a/src/wallet/bdb.cpp b/src/wallet/bdb.cpp
index cbf6c9b1ea..38cca32f80 100644
--- a/src/wallet/bdb.cpp
+++ b/src/wallet/bdb.cpp
@@ -887,7 +887,12 @@ bool BerkeleyBatch::HasKey(DataStream&& key)
bool BerkeleyBatch::ErasePrefix(Span<const std::byte> prefix)
{
- if (!TxnBegin()) return false;
+ // Because this function erases records one by one, ensure that it is executed within a txn context.
+ // Otherwise, consistency is at risk; it's possible that certain records are removed while others
+ // remain due to an internal failure during the procedure.
+ // Additionally, the Dbc::del() cursor delete call below would fail without an active transaction.
+ if (!Assume(activeTxn)) return false;
+
auto cursor{std::make_unique<BerkeleyCursor>(m_database, *this)};
// const_cast is safe below even though prefix_key is an in/out parameter,
// because we are not using the DB_DBT_USERMEM flag, so BDB will allocate
@@ -901,7 +906,7 @@ bool BerkeleyBatch::ErasePrefix(Span<const std::byte> prefix)
ret = cursor->dbc()->del(0);
}
cursor.reset();
- return TxnCommit() && (ret == 0 || ret == DB_NOTFOUND);
+ return ret == 0 || ret == DB_NOTFOUND;
}
void BerkeleyDatabase::AddRef()
diff --git a/src/wallet/init.cpp b/src/wallet/init.cpp
index 088343458c..f151fad740 100644
--- a/src/wallet/init.cpp
+++ b/src/wallet/init.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <common/args.h>
#include <init.h>
#include <interfaces/chain.h>
diff --git a/src/wallet/interfaces.cpp b/src/wallet/interfaces.cpp
index d15273dfc9..d33e6f3873 100644
--- a/src/wallet/interfaces.cpp
+++ b/src/wallet/interfaces.cpp
@@ -92,7 +92,7 @@ WalletTxStatus MakeWalletTxStatus(const CWallet& wallet, const CWalletTx& wtx)
WalletTxStatus result;
result.block_height =
wtx.state<TxStateConfirmed>() ? wtx.state<TxStateConfirmed>()->confirmed_block_height :
- wtx.state<TxStateConflicted>() ? wtx.state<TxStateConflicted>()->conflicting_block_height :
+ wtx.state<TxStateBlockConflicted>() ? wtx.state<TxStateBlockConflicted>()->conflicting_block_height :
std::numeric_limits<int>::max();
result.blocks_to_maturity = wallet.GetTxBlocksToMaturity(wtx);
result.depth_in_main_chain = wallet.GetTxDepthInMainChain(wtx);
@@ -101,7 +101,7 @@ WalletTxStatus MakeWalletTxStatus(const CWallet& wallet, const CWalletTx& wtx)
result.is_trusted = CachedTxIsTrusted(wallet, wtx);
result.is_abandoned = wtx.isAbandoned();
result.is_coinbase = wtx.IsCoinBase();
- result.is_in_main_chain = wallet.IsTxInMainChain(wtx);
+ result.is_in_main_chain = wtx.isConfirmed();
return result;
}
diff --git a/src/wallet/receive.cpp b/src/wallet/receive.cpp
index b9d8d9abc9..ea3ffff549 100644
--- a/src/wallet/receive.cpp
+++ b/src/wallet/receive.cpp
@@ -149,7 +149,7 @@ CAmount CachedTxGetImmatureCredit(const CWallet& wallet, const CWalletTx& wtx, c
{
AssertLockHeld(wallet.cs_wallet);
- if (wallet.IsTxImmatureCoinBase(wtx) && wallet.IsTxInMainChain(wtx)) {
+ if (wallet.IsTxImmatureCoinBase(wtx) && wtx.isConfirmed()) {
return GetCachableAmount(wallet, wtx, CWalletTx::IMMATURE_CREDIT, filter);
}
@@ -256,9 +256,8 @@ bool CachedTxIsFromMe(const CWallet& wallet, const CWalletTx& wtx, const isminef
bool CachedTxIsTrusted(const CWallet& wallet, const CWalletTx& wtx, std::set<uint256>& trusted_parents)
{
AssertLockHeld(wallet.cs_wallet);
- int nDepth = wallet.GetTxDepthInMainChain(wtx);
- if (nDepth >= 1) return true;
- if (nDepth < 0) return false;
+ if (wtx.isConfirmed()) return true;
+ if (wtx.isBlockConflicted()) return false;
// using wtx's cached debit
if (!wallet.m_spend_zero_conf_change || !CachedTxIsFromMe(wallet, wtx, ISMINE_ALL)) return false;
diff --git a/src/wallet/rpc/addresses.cpp b/src/wallet/rpc/addresses.cpp
index e9b93afc30..acaa2d8b15 100644
--- a/src/wallet/rpc/addresses.cpp
+++ b/src/wallet/rpc/addresses.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <core_io.h>
#include <key_io.h>
#include <rpc/util.h>
diff --git a/src/wallet/rpc/backup.cpp b/src/wallet/rpc/backup.cpp
index 99c548bf1d..5167e986b1 100644
--- a/src/wallet/rpc/backup.cpp
+++ b/src/wallet/rpc/backup.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <chain.h>
#include <clientversion.h>
#include <core_io.h>
@@ -394,14 +398,8 @@ RPCHelpMan removeprunedfunds()
uint256 hash(ParseHashV(request.params[0], "txid"));
std::vector<uint256> vHash;
vHash.push_back(hash);
- std::vector<uint256> vHashOut;
-
- if (pwallet->ZapSelectTx(vHash, vHashOut) != DBErrors::LOAD_OK) {
- throw JSONRPCError(RPC_WALLET_ERROR, "Could not properly delete the transaction.");
- }
-
- if(vHashOut.empty()) {
- throw JSONRPCError(RPC_INVALID_PARAMETER, "Transaction does not exist in wallet.");
+ if (auto res = pwallet->RemoveTxs(vHash); !res) {
+ throw JSONRPCError(RPC_WALLET_ERROR, util::ErrorString(res).original);
}
return UniValue::VNULL;
diff --git a/src/wallet/rpc/transactions.cpp b/src/wallet/rpc/transactions.cpp
index e6c021d426..05b340995d 100644
--- a/src/wallet/rpc/transactions.cpp
+++ b/src/wallet/rpc/transactions.cpp
@@ -40,6 +40,10 @@ static void WalletTxToJSON(const CWallet& wallet, const CWalletTx& wtx, UniValue
for (const uint256& conflict : wallet.GetTxConflicts(wtx))
conflicts.push_back(conflict.GetHex());
entry.pushKV("walletconflicts", conflicts);
+ UniValue mempool_conflicts(UniValue::VARR);
+ for (const Txid& mempool_conflict : wtx.mempool_conflicts)
+ mempool_conflicts.push_back(mempool_conflict.GetHex());
+ entry.pushKV("mempoolconflicts", mempool_conflicts);
entry.pushKV("time", wtx.GetTxTime());
entry.pushKV("timereceived", int64_t{wtx.nTimeReceived});
@@ -417,6 +421,10 @@ static std::vector<RPCResult> TransactionDescriptionString()
}},
{RPCResult::Type::STR_HEX, "replaced_by_txid", /*optional=*/true, "Only if 'category' is 'send'. The txid if this tx was replaced."},
{RPCResult::Type::STR_HEX, "replaces_txid", /*optional=*/true, "Only if 'category' is 'send'. The txid if this tx replaces another."},
+ {RPCResult::Type::ARR, "mempoolconflicts", "Transactions that directly conflict with either this transaction or an ancestor transaction",
+ {
+ {RPCResult::Type::STR_HEX, "txid", "The transaction id."},
+ }},
{RPCResult::Type::STR, "to", /*optional=*/true, "If a comment to is associated with the transaction."},
{RPCResult::Type::NUM_TIME, "time", "The transaction time expressed in " + UNIX_EPOCH_TIME + "."},
{RPCResult::Type::NUM_TIME, "timereceived", "The time received expressed in " + UNIX_EPOCH_TIME + "."},
diff --git a/src/wallet/rpc/wallet.cpp b/src/wallet/rpc/wallet.cpp
index 391153a2a1..a684d4e191 100644
--- a/src/wallet/rpc/wallet.cpp
+++ b/src/wallet/rpc/wallet.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <core_io.h>
#include <key_io.h>
#include <rpc/server.h>
@@ -748,13 +752,13 @@ RPCHelpMan simulaterawtransaction()
static RPCHelpMan migratewallet()
{
return RPCHelpMan{"migratewallet",
- "EXPERIMENTAL warning: This call may not work as expected and may be changed in future releases\n"
"\nMigrate the wallet to a descriptor wallet.\n"
"A new wallet backup will need to be made.\n"
"\nThe migration process will create a backup of the wallet before migrating. This backup\n"
"file will be named <wallet name>-<timestamp>.legacy.bak and can be found in the directory\n"
"for this wallet. In the event of an incorrect migration, the backup can be restored using restorewallet."
- "\nEncrypted wallets must have the passphrase provided as an argument to this call.",
+ "\nEncrypted wallets must have the passphrase provided as an argument to this call.\n"
+ "\nThis RPC may take a long time to complete. Increasing the RPC client timeout is recommended.",
{
{"wallet_name", RPCArg::Type::STR, RPCArg::DefaultHint{"the wallet name from the RPC endpoint"}, "The name of the wallet to migrate. If provided both here and in the RPC endpoint, the two must be identical."},
{"passphrase", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "The wallet passphrase"},
@@ -813,6 +817,217 @@ static RPCHelpMan migratewallet()
};
}
+RPCHelpMan gethdkeys()
+{
+ return RPCHelpMan{
+ "gethdkeys",
+ "\nList all BIP 32 HD keys in the wallet and which descriptors use them.\n",
+ {
+ {"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "", {
+ {"active_only", RPCArg::Type::BOOL, RPCArg::Default{false}, "Show the keys for only active descriptors"},
+ {"private", RPCArg::Type::BOOL, RPCArg::Default{false}, "Show private keys"}
+ }},
+ },
+ RPCResult{RPCResult::Type::ARR, "", "", {
+ {
+ {RPCResult::Type::OBJ, "", "", {
+ {RPCResult::Type::STR, "xpub", "The extended public key"},
+ {RPCResult::Type::BOOL, "has_private", "Whether the wallet has the private key for this xpub"},
+ {RPCResult::Type::STR, "xprv", /*optional=*/true, "The extended private key if \"private\" is true"},
+ {RPCResult::Type::ARR, "descriptors", "Array of descriptor objects that use this HD key",
+ {
+ {RPCResult::Type::OBJ, "", "", {
+ {RPCResult::Type::STR, "desc", "Descriptor string representation"},
+ {RPCResult::Type::BOOL, "active", "Whether this descriptor is currently used to generate new addresses"},
+ }},
+ }},
+ }},
+ }
+ }},
+ RPCExamples{
+ HelpExampleCli("gethdkeys", "") + HelpExampleRpc("gethdkeys", "")
+ + HelpExampleCliNamed("gethdkeys", {{"active_only", "true"}, {"private", "true"}}) + HelpExampleRpcNamed("gethdkeys", {{"active_only", "true"}, {"private", "true"}})
+ },
+ [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
+ {
+ const std::shared_ptr<const CWallet> wallet = GetWalletForJSONRPCRequest(request);
+ if (!wallet) return UniValue::VNULL;
+
+ if (!wallet->IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS)) {
+ throw JSONRPCError(RPC_WALLET_ERROR, "gethdkeys is not available for non-descriptor wallets");
+ }
+
+ LOCK(wallet->cs_wallet);
+
+ UniValue options{request.params[0].isNull() ? UniValue::VOBJ : request.params[0]};
+ const bool active_only{options.exists("active_only") ? options["active_only"].get_bool() : false};
+ const bool priv{options.exists("private") ? options["private"].get_bool() : false};
+ if (priv) {
+ EnsureWalletIsUnlocked(*wallet);
+ }
+
+
+ std::set<ScriptPubKeyMan*> spkms;
+ if (active_only) {
+ spkms = wallet->GetActiveScriptPubKeyMans();
+ } else {
+ spkms = wallet->GetAllScriptPubKeyMans();
+ }
+
+ std::map<CExtPubKey, std::set<std::tuple<std::string, bool, bool>>> wallet_xpubs;
+ std::map<CExtPubKey, CExtKey> wallet_xprvs;
+ for (auto* spkm : spkms) {
+ auto* desc_spkm{dynamic_cast<DescriptorScriptPubKeyMan*>(spkm)};
+ CHECK_NONFATAL(desc_spkm);
+ LOCK(desc_spkm->cs_desc_man);
+ WalletDescriptor w_desc = desc_spkm->GetWalletDescriptor();
+
+ // Retrieve the pubkeys from the descriptor
+ std::set<CPubKey> desc_pubkeys;
+ std::set<CExtPubKey> desc_xpubs;
+ w_desc.descriptor->GetPubKeys(desc_pubkeys, desc_xpubs);
+ for (const CExtPubKey& xpub : desc_xpubs) {
+ std::string desc_str;
+ bool ok = desc_spkm->GetDescriptorString(desc_str, false);
+ CHECK_NONFATAL(ok);
+ wallet_xpubs[xpub].emplace(desc_str, wallet->IsActiveScriptPubKeyMan(*spkm), desc_spkm->HasPrivKey(xpub.pubkey.GetID()));
+ if (std::optional<CKey> key = priv ? desc_spkm->GetKey(xpub.pubkey.GetID()) : std::nullopt) {
+ wallet_xprvs[xpub] = CExtKey(xpub, *key);
+ }
+ }
+ }
+
+ UniValue response(UniValue::VARR);
+ for (const auto& [xpub, descs] : wallet_xpubs) {
+ bool has_xprv = false;
+ UniValue descriptors(UniValue::VARR);
+ for (const auto& [desc, active, has_priv] : descs) {
+ UniValue d(UniValue::VOBJ);
+ d.pushKV("desc", desc);
+ d.pushKV("active", active);
+ has_xprv |= has_priv;
+
+ descriptors.push_back(std::move(d));
+ }
+ UniValue xpub_info(UniValue::VOBJ);
+ xpub_info.pushKV("xpub", EncodeExtPubKey(xpub));
+ xpub_info.pushKV("has_private", has_xprv);
+ if (priv) {
+ xpub_info.pushKV("xprv", EncodeExtKey(wallet_xprvs.at(xpub)));
+ }
+ xpub_info.pushKV("descriptors", std::move(descriptors));
+
+ response.push_back(std::move(xpub_info));
+ }
+
+ return response;
+ },
+ };
+}
+
+static RPCHelpMan createwalletdescriptor()
+{
+ return RPCHelpMan{"createwalletdescriptor",
+ "Creates the wallet's descriptor for the given address type. "
+ "The address type must be one that the wallet does not already have a descriptor for."
+ + HELP_REQUIRING_PASSPHRASE,
+ {
+ {"type", RPCArg::Type::STR, RPCArg::Optional::NO, "The address type the descriptor will produce. Options are \"legacy\", \"p2sh-segwit\", \"bech32\", and \"bech32m\"."},
+ {"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "", {
+ {"internal", RPCArg::Type::BOOL, RPCArg::DefaultHint{"Both external and internal will be generated unless this parameter is specified"}, "Whether to only make one descriptor that is internal (if parameter is true) or external (if parameter is false)"},
+ {"hdkey", RPCArg::Type::STR, RPCArg::DefaultHint{"The HD key used by all other active descriptors"}, "The HD key that the wallet knows the private key of, listed using 'gethdkeys', to use for this descriptor's key"},
+ }},
+ },
+ RPCResult{
+ RPCResult::Type::OBJ, "", "",
+ {
+ {RPCResult::Type::ARR, "descs", "The public descriptors that were added to the wallet",
+ {{RPCResult::Type::STR, "", ""}}
+ }
+ },
+ },
+ RPCExamples{
+ HelpExampleCli("createwalletdescriptor", "bech32m")
+ + HelpExampleRpc("createwalletdescriptor", "bech32m")
+ },
+ [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
+ {
+ std::shared_ptr<CWallet> const pwallet = GetWalletForJSONRPCRequest(request);
+ if (!pwallet) return UniValue::VNULL;
+
+ // Make sure wallet is a descriptor wallet
+ if (!pwallet->IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS)) {
+ throw JSONRPCError(RPC_WALLET_ERROR, "createwalletdescriptor is not available for non-descriptor wallets");
+ }
+
+ std::optional<OutputType> output_type = ParseOutputType(request.params[0].get_str());
+ if (!output_type) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Unknown address type '%s'", request.params[0].get_str()));
+ }
+
+ UniValue options{request.params[1].isNull() ? UniValue::VOBJ : request.params[1]};
+ UniValue internal_only{options["internal"]};
+ UniValue hdkey{options["hdkey"]};
+
+ std::vector<bool> internals;
+ if (internal_only.isNull()) {
+ internals.push_back(false);
+ internals.push_back(true);
+ } else {
+ internals.push_back(internal_only.get_bool());
+ }
+
+ LOCK(pwallet->cs_wallet);
+ EnsureWalletIsUnlocked(*pwallet);
+
+ CExtPubKey xpub;
+ if (hdkey.isNull()) {
+ std::set<CExtPubKey> active_xpubs = pwallet->GetActiveHDPubKeys();
+ if (active_xpubs.size() != 1) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Unable to determine which HD key to use from active descriptors. Please specify with 'hdkey'");
+ }
+ xpub = *active_xpubs.begin();
+ } else {
+ xpub = DecodeExtPubKey(hdkey.get_str());
+ if (!xpub.pubkey.IsValid()) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Unable to parse HD key. Please provide a valid xpub");
+ }
+ }
+
+ std::optional<CKey> key = pwallet->GetKey(xpub.pubkey.GetID());
+ if (!key) {
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Private key for %s is not known", EncodeExtPubKey(xpub)));
+ }
+ CExtKey active_hdkey(xpub, *key);
+
+ std::vector<std::reference_wrapper<DescriptorScriptPubKeyMan>> spkms;
+ WalletBatch batch{pwallet->GetDatabase()};
+ for (bool internal : internals) {
+ WalletDescriptor w_desc = GenerateWalletDescriptor(xpub, *output_type, internal);
+ uint256 w_id = DescriptorID(*w_desc.descriptor);
+ if (!pwallet->GetScriptPubKeyMan(w_id)) {
+ spkms.emplace_back(pwallet->SetupDescriptorScriptPubKeyMan(batch, active_hdkey, *output_type, internal));
+ }
+ }
+ if (spkms.empty()) {
+ throw JSONRPCError(RPC_WALLET_ERROR, "Descriptor already exists");
+ }
+
+ // Fetch each descspkm from the wallet in order to get the descriptor strings
+ UniValue descs{UniValue::VARR};
+ for (const auto& spkm : spkms) {
+ std::string desc_str;
+ bool ok = spkm.get().GetDescriptorString(desc_str, false);
+ CHECK_NONFATAL(ok);
+ descs.push_back(desc_str);
+ }
+ UniValue out{UniValue::VOBJ};
+ out.pushKV("descs", std::move(descs));
+ return out;
+ }
+ };
+}
+
// addresses
RPCHelpMan getaddressinfo();
RPCHelpMan getnewaddress();
@@ -896,6 +1111,7 @@ Span<const CRPCCommand> GetWalletRPCCommands()
{"wallet", &bumpfee},
{"wallet", &psbtbumpfee},
{"wallet", &createwallet},
+ {"wallet", &createwalletdescriptor},
{"wallet", &restorewallet},
{"wallet", &dumpprivkey},
{"wallet", &dumpwallet},
@@ -903,6 +1119,7 @@ Span<const CRPCCommand> GetWalletRPCCommands()
{"wallet", &getaddressesbylabel},
{"wallet", &getaddressinfo},
{"wallet", &getbalance},
+ {"wallet", &gethdkeys},
{"wallet", &getnewaddress},
{"wallet", &getrawchangeaddress},
{"wallet", &getreceivedbyaddress},
diff --git a/src/wallet/scriptpubkeyman.cpp b/src/wallet/scriptpubkeyman.cpp
index e07771b17f..59171f6db7 100644
--- a/src/wallet/scriptpubkeyman.cpp
+++ b/src/wallet/scriptpubkeyman.cpp
@@ -11,6 +11,7 @@
#include <script/sign.h>
#include <script/solver.h>
#include <util/bip32.h>
+#include <util/check.h>
#include <util/strencodings.h>
#include <util/string.h>
#include <util/time.h>
@@ -1288,6 +1289,9 @@ bool LegacyScriptPubKeyMan::TopUp(unsigned int kpSize)
}
if (!batch.TxnCommit()) throw std::runtime_error(strprintf("Error during keypool top up. Cannot commit changes for wallet %s", m_storage.GetDisplayName()));
NotifyCanGetAddressesChanged();
+ // Note: Unlike with DescriptorSPKM, LegacySPKM does not need to call
+ // m_storage.TopUpCallback() as we do not know what new scripts the LegacySPKM is
+ // watching for. CWallet's scriptPubKey cache is not used for LegacySPKMs.
return true;
}
@@ -2140,6 +2144,36 @@ std::map<CKeyID, CKey> DescriptorScriptPubKeyMan::GetKeys() const
return m_map_keys;
}
+bool DescriptorScriptPubKeyMan::HasPrivKey(const CKeyID& keyid) const
+{
+ AssertLockHeld(cs_desc_man);
+ return m_map_keys.contains(keyid) || m_map_crypted_keys.contains(keyid);
+}
+
+std::optional<CKey> DescriptorScriptPubKeyMan::GetKey(const CKeyID& keyid) const
+{
+ AssertLockHeld(cs_desc_man);
+ if (m_storage.HasEncryptionKeys() && !m_storage.IsLocked()) {
+ const auto& it = m_map_crypted_keys.find(keyid);
+ if (it == m_map_crypted_keys.end()) {
+ return std::nullopt;
+ }
+ const std::vector<unsigned char>& crypted_secret = it->second.second;
+ CKey key;
+ if (!Assume(m_storage.WithEncryptionKey([&](const CKeyingMaterial& encryption_key) {
+ return DecryptKey(encryption_key, crypted_secret, it->second.first, key);
+ }))) {
+ return std::nullopt;
+ }
+ return key;
+ }
+ const auto& it = m_map_keys.find(keyid);
+ if (it == m_map_keys.end()) {
+ return std::nullopt;
+ }
+ return it->second;
+}
+
bool DescriptorScriptPubKeyMan::TopUp(unsigned int size)
{
WalletBatch batch(m_storage.GetDatabase());
@@ -2152,6 +2186,7 @@ bool DescriptorScriptPubKeyMan::TopUp(unsigned int size)
bool DescriptorScriptPubKeyMan::TopUpWithDB(WalletBatch& batch, unsigned int size)
{
LOCK(cs_desc_man);
+ std::set<CScript> new_spks;
unsigned int target_size;
if (size > 0) {
target_size = size;
@@ -2182,6 +2217,7 @@ bool DescriptorScriptPubKeyMan::TopUpWithDB(WalletBatch& batch, unsigned int siz
if (!m_wallet_descriptor.descriptor->Expand(i, provider, scripts_temp, out_keys, &temp_cache)) return false;
}
// Add all of the scriptPubKeys to the scriptPubKey set
+ new_spks.insert(scripts_temp.begin(), scripts_temp.end());
for (const CScript& script : scripts_temp) {
m_map_script_pub_keys[script] = i;
}
@@ -2207,6 +2243,7 @@ bool DescriptorScriptPubKeyMan::TopUpWithDB(WalletBatch& batch, unsigned int siz
// By this point, the cache size should be the size of the entire range
assert(m_wallet_descriptor.range_end - 1 == m_max_cached_index);
+ m_storage.TopUpCallback(new_spks, this);
NotifyCanGetAddressesChanged();
return true;
}
@@ -2290,55 +2327,7 @@ bool DescriptorScriptPubKeyMan::SetupDescriptorGeneration(WalletBatch& batch, co
return false;
}
- int64_t creation_time = GetTime();
-
- std::string xpub = EncodeExtPubKey(master_key.Neuter());
-
- // Build descriptor string
- std::string desc_prefix;
- std::string desc_suffix = "/*)";
- switch (addr_type) {
- case OutputType::LEGACY: {
- desc_prefix = "pkh(" + xpub + "/44h";
- break;
- }
- case OutputType::P2SH_SEGWIT: {
- desc_prefix = "sh(wpkh(" + xpub + "/49h";
- desc_suffix += ")";
- break;
- }
- case OutputType::BECH32: {
- desc_prefix = "wpkh(" + xpub + "/84h";
- break;
- }
- case OutputType::BECH32M: {
- desc_prefix = "tr(" + xpub + "/86h";
- break;
- }
- case OutputType::UNKNOWN: {
- // We should never have a DescriptorScriptPubKeyMan for an UNKNOWN OutputType,
- // so if we get to this point something is wrong
- assert(false);
- }
- } // no default case, so the compiler can warn about missing cases
- assert(!desc_prefix.empty());
-
- // Mainnet derives at 0', testnet and regtest derive at 1'
- if (Params().IsTestChain()) {
- desc_prefix += "/1h";
- } else {
- desc_prefix += "/0h";
- }
-
- std::string internal_path = internal ? "/1" : "/0";
- std::string desc_str = desc_prefix + "/0h" + internal_path + desc_suffix;
-
- // Make the descriptor
- FlatSigningProvider keys;
- std::string error;
- std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, error, false);
- WalletDescriptor w_desc(std::move(desc), creation_time, 0, 0, 0);
- m_wallet_descriptor = w_desc;
+ m_wallet_descriptor = GenerateWalletDescriptor(master_key.Neuter(), addr_type, internal);
// Store the master private key, and descriptor
if (!AddDescriptorKeyWithDB(batch, master_key.key, master_key.key.GetPubKey())) {
@@ -2620,6 +2609,7 @@ uint256 DescriptorScriptPubKeyMan::GetID() const
void DescriptorScriptPubKeyMan::SetCache(const DescriptorCache& cache)
{
LOCK(cs_desc_man);
+ std::set<CScript> new_spks;
m_wallet_descriptor.cache = cache;
for (int32_t i = m_wallet_descriptor.range_start; i < m_wallet_descriptor.range_end; ++i) {
FlatSigningProvider out_keys;
@@ -2628,6 +2618,7 @@ void DescriptorScriptPubKeyMan::SetCache(const DescriptorCache& cache)
throw std::runtime_error("Error: Unable to expand wallet descriptor from cache");
}
// Add all of the scriptPubKeys to the scriptPubKey set
+ new_spks.insert(scripts_temp.begin(), scripts_temp.end());
for (const CScript& script : scripts_temp) {
if (m_map_script_pub_keys.count(script) != 0) {
throw std::runtime_error(strprintf("Error: Already loaded script at index %d as being at index %d", i, m_map_script_pub_keys[script]));
@@ -2645,6 +2636,8 @@ void DescriptorScriptPubKeyMan::SetCache(const DescriptorCache& cache)
}
m_max_cached_index++;
}
+ // Make sure the wallet knows about our new spks
+ m_storage.TopUpCallback(new_spks, this);
}
bool DescriptorScriptPubKeyMan::AddKey(const CKeyID& key_id, const CKey& key)
diff --git a/src/wallet/scriptpubkeyman.h b/src/wallet/scriptpubkeyman.h
index 1c99e5ffcd..4575881d96 100644
--- a/src/wallet/scriptpubkeyman.h
+++ b/src/wallet/scriptpubkeyman.h
@@ -31,6 +31,7 @@ struct bilingual_str;
namespace wallet {
struct MigrationData;
+class ScriptPubKeyMan;
// Wallet storage things that ScriptPubKeyMans need in order to be able to store things to the wallet database.
// It provides access to things that are part of the entire wallet and not specific to a ScriptPubKeyMan such as
@@ -51,6 +52,8 @@ public:
virtual bool WithEncryptionKey(std::function<bool (const CKeyingMaterial&)> cb) const = 0;
virtual bool HasEncryptionKeys() const = 0;
virtual bool IsLocked() const = 0;
+ //! Callback function for after TopUp completes containing any scripts that were added by a SPKMan
+ virtual void TopUpCallback(const std::set<CScript>&, ScriptPubKeyMan*) = 0;
};
//! Constant representing an unknown spkm creation time
@@ -630,6 +633,9 @@ public:
bool SetupDescriptorGeneration(WalletBatch& batch, const CExtKey& master_key, OutputType addr_type, bool internal);
bool HavePrivateKeys() const override;
+ bool HasPrivKey(const CKeyID& keyid) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
+ //! Retrieve the particular key if it is available. Returns nullopt if the key is not in the wallet, or if the wallet is locked.
+ std::optional<CKey> GetKey(const CKeyID& keyid) const EXCLUSIVE_LOCKS_REQUIRED(cs_desc_man);
std::optional<int64_t> GetOldestKeyPoolTime() const override;
unsigned int GetKeyPoolSize() const override;
@@ -666,7 +672,7 @@ public:
std::unordered_set<CScript, SaltedSipHasher> GetScriptPubKeys(int32_t minimum_index) const;
int32_t GetEndRange() const;
- bool GetDescriptorString(std::string& out, const bool priv) const;
+ [[nodiscard]] bool GetDescriptorString(std::string& out, const bool priv) const;
void UpgradeDescriptorCache();
};
diff --git a/src/wallet/sqlite.cpp b/src/wallet/sqlite.cpp
index 2cbeedbde6..34f18bf0b1 100644
--- a/src/wallet/sqlite.cpp
+++ b/src/wallet/sqlite.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <wallet/sqlite.h>
#include <chainparams.h>
diff --git a/src/wallet/test/db_tests.cpp b/src/wallet/test/db_tests.cpp
index adbbb94318..f783424df8 100644
--- a/src/wallet/test/db_tests.cpp
+++ b/src/wallet/test/db_tests.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <boost/test/unit_test.hpp>
#include <test/util/setup_common.h>
@@ -228,6 +232,39 @@ BOOST_AUTO_TEST_CASE(db_availability_after_write_error)
}
}
+// Verify 'ErasePrefix' functionality using db keys similar to the ones used by the wallet.
+// Keys are in the form of std::pair<TYPE, ENTRY_ID>
+BOOST_AUTO_TEST_CASE(erase_prefix)
+{
+ const std::string key = "key";
+ const std::string key2 = "key2";
+ const std::string value = "value";
+ const std::string value2 = "value_2";
+ auto make_key = [](std::string type, std::string id) { return std::make_pair(type, id); };
+
+ for (const auto& database : TestDatabases(m_path_root)) {
+ std::unique_ptr<DatabaseBatch> batch = database->MakeBatch();
+
+ // Write two entries with the same key type prefix, a third one with a different prefix
+ // and a fourth one with the type-id values inverted
+ BOOST_CHECK(batch->Write(make_key(key, value), value));
+ BOOST_CHECK(batch->Write(make_key(key, value2), value2));
+ BOOST_CHECK(batch->Write(make_key(key2, value), value));
+ BOOST_CHECK(batch->Write(make_key(value, key), value));
+
+ // Erase the ones with the same prefix and verify result
+ BOOST_CHECK(batch->TxnBegin());
+ BOOST_CHECK(batch->ErasePrefix(DataStream() << key));
+ BOOST_CHECK(batch->TxnCommit());
+
+ BOOST_CHECK(!batch->Exists(make_key(key, value)));
+ BOOST_CHECK(!batch->Exists(make_key(key, value2)));
+ // Also verify that entries with a different prefix were not erased
+ BOOST_CHECK(batch->Exists(make_key(key2, value)));
+ BOOST_CHECK(batch->Exists(make_key(value, key)));
+ }
+}
+
#ifdef USE_SQLITE
// Test-only statement execution error
diff --git a/src/wallet/test/fuzz/coinselection.cpp b/src/wallet/test/fuzz/coinselection.cpp
index 3ffeecdf34..297432de9e 100644
--- a/src/wallet/test/fuzz/coinselection.cpp
+++ b/src/wallet/test/fuzz/coinselection.cpp
@@ -158,7 +158,7 @@ FUZZ_TARGET(coin_grinder_is_optimal)
// Only make UTXOs with positive effective value
const CAmount input_fee = coin_params.m_effective_feerate.GetFee(n_input_bytes);
// Ensure that each UTXO has at least an effective value of 1 sat
- const CAmount eff_value{fuzzed_data_provider.ConsumeIntegralInRange<CAmount>(1, MAX_MONEY - max_spendable - max_output_groups + group_pos.size())};
+ const CAmount eff_value{fuzzed_data_provider.ConsumeIntegralInRange<CAmount>(1, MAX_MONEY + group_pos.size() - max_spendable - max_output_groups)};
const CAmount amount{eff_value + input_fee};
std::vector<COutput> temp_utxo_pool;
diff --git a/src/wallet/test/util.cpp b/src/wallet/test/util.cpp
index cbf3ccd1ec..49d206f409 100644
--- a/src/wallet/test/util.cpp
+++ b/src/wallet/test/util.cpp
@@ -71,7 +71,8 @@ std::shared_ptr<CWallet> TestLoadWallet(WalletContext& context)
void TestUnloadWallet(std::shared_ptr<CWallet>&& wallet)
{
- SyncWithValidationInterfaceQueue();
+ // Calls SyncWithValidationInterfaceQueue
+ wallet->chain().waitForNotificationsIfTipChanged({});
wallet->m_chain_notifications_handler.reset();
UnloadWallet(std::move(wallet));
}
diff --git a/src/wallet/test/util.h b/src/wallet/test/util.h
index 8bd238648f..9f2974ece6 100644
--- a/src/wallet/test/util.h
+++ b/src/wallet/test/util.h
@@ -5,6 +5,10 @@
#ifndef BITCOIN_WALLET_TEST_UTIL_H
#define BITCOIN_WALLET_TEST_UTIL_H
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <addresstype.h>
#include <wallet/db.h>
diff --git a/src/wallet/test/wallet_tests.cpp b/src/wallet/test/wallet_tests.cpp
index 65297054df..3a67b9a433 100644
--- a/src/wallet/test/wallet_tests.cpp
+++ b/src/wallet/test/wallet_tests.cpp
@@ -445,9 +445,11 @@ BOOST_FIXTURE_TEST_CASE(LoadReceiveRequests, TestingSetup)
auto requests = wallet->GetAddressReceiveRequests();
auto erequests = {"val_rr11", "val_rr20"};
BOOST_CHECK_EQUAL_COLLECTIONS(requests.begin(), requests.end(), std::begin(erequests), std::end(erequests));
- WalletBatch batch{wallet->GetDatabase()};
- BOOST_CHECK(batch.WriteAddressPreviouslySpent(PKHash(), false));
- BOOST_CHECK(batch.EraseAddressData(ScriptHash()));
+ RunWithinTxn(wallet->GetDatabase(), /*process_desc*/"test", [](WalletBatch& batch){
+ BOOST_CHECK(batch.WriteAddressPreviouslySpent(PKHash(), false));
+ BOOST_CHECK(batch.EraseAddressData(ScriptHash()));
+ return true;
+ });
});
TestLoadWallet(name, format, [](std::shared_ptr<CWallet> wallet) EXCLUSIVE_LOCKS_REQUIRED(wallet->cs_wallet) {
BOOST_CHECK(!wallet->IsAddressPreviouslySpent(PKHash()));
@@ -812,7 +814,7 @@ BOOST_FIXTURE_TEST_CASE(CreateWallet, TestChain100Setup)
// transactionAddedToMempool notifications, and create block and mempool
// transactions paying to the wallet
std::promise<void> promise;
- CallFunctionInValidationInterfaceQueue([&promise] {
+ m_node.validation_signals->CallFunctionInValidationInterfaceQueue([&promise] {
promise.get_future().wait();
});
std::string error;
@@ -840,7 +842,7 @@ BOOST_FIXTURE_TEST_CASE(CreateWallet, TestChain100Setup)
// Unblock notification queue and make sure stale blockConnected and
// transactionAddedToMempool events are processed
promise.set_value();
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
// AddToWallet events for block_tx and mempool_tx events are counted a
// second time as the notification queue is processed
BOOST_CHECK_EQUAL(addtx_count, 5);
@@ -863,7 +865,7 @@ BOOST_FIXTURE_TEST_CASE(CreateWallet, TestChain100Setup)
m_coinbase_txns.push_back(CreateAndProcessBlock({block_tx}, GetScriptForRawPubKey(coinbaseKey.GetPubKey())).vtx[0]);
mempool_tx = TestSimpleSpend(*m_coinbase_txns[3], 0, coinbaseKey, GetScriptForRawPubKey(key.GetPubKey()));
BOOST_CHECK(m_node.chain->broadcastTransaction(MakeTransactionRef(mempool_tx), DEFAULT_TRANSACTION_MAXFEE, false, error));
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
});
wallet = TestLoadWallet(context);
// Since mempool transactions are requested at the end of loading, there will
@@ -888,7 +890,7 @@ BOOST_FIXTURE_TEST_CASE(CreateWalletWithoutChain, BasicTestingSetup)
UnloadWallet(std::move(wallet));
}
-BOOST_FIXTURE_TEST_CASE(ZapSelectTx, TestChain100Setup)
+BOOST_FIXTURE_TEST_CASE(RemoveTxs, TestChain100Setup)
{
m_args.ForceSetArg("-unsafesqlitesync", "1");
WalletContext context;
@@ -903,7 +905,7 @@ BOOST_FIXTURE_TEST_CASE(ZapSelectTx, TestChain100Setup)
auto block_tx = TestSimpleSpend(*m_coinbase_txns[0], 0, coinbaseKey, GetScriptForRawPubKey(key.GetPubKey()));
CreateAndProcessBlock({block_tx}, GetScriptForRawPubKey(coinbaseKey.GetPubKey()));
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
{
auto block_hash = block_tx.GetHash();
@@ -913,8 +915,8 @@ BOOST_FIXTURE_TEST_CASE(ZapSelectTx, TestChain100Setup)
BOOST_CHECK(wallet->HasWalletSpend(prev_tx));
BOOST_CHECK_EQUAL(wallet->mapWallet.count(block_hash), 1u);
- std::vector<uint256> vHashIn{ block_hash }, vHashOut;
- BOOST_CHECK_EQUAL(wallet->ZapSelectTx(vHashIn, vHashOut), DBErrors::LOAD_OK);
+ std::vector<uint256> vHashIn{ block_hash };
+ BOOST_CHECK(wallet->RemoveTxs(vHashIn));
BOOST_CHECK(!wallet->HasWalletSpend(prev_tx));
BOOST_CHECK_EQUAL(wallet->mapWallet.count(block_hash), 0u);
diff --git a/src/wallet/test/walletload_tests.cpp b/src/wallet/test/walletload_tests.cpp
index 3dba2231f0..2e43eda582 100644
--- a/src/wallet/test/walletload_tests.cpp
+++ b/src/wallet/test/walletload_tests.cpp
@@ -34,6 +34,7 @@ public:
std::optional<int64_t> ScriptSize() const override { return {}; }
std::optional<int64_t> MaxSatisfactionWeight(bool) const override { return {}; }
std::optional<int64_t> MaxSatisfactionElems() const override { return {}; }
+ void GetPubKeys(std::set<CPubKey>& pubkeys, std::set<CExtPubKey>& ext_pubs) const override {}
};
BOOST_FIXTURE_TEST_CASE(wallet_load_descriptors, TestingSetup)
diff --git a/src/wallet/transaction.cpp b/src/wallet/transaction.cpp
index 6777257e53..561880482f 100644
--- a/src/wallet/transaction.cpp
+++ b/src/wallet/transaction.cpp
@@ -45,7 +45,7 @@ void CWalletTx::updateState(interfaces::Chain& chain)
};
if (auto* conf = state<TxStateConfirmed>()) {
lookup_block(conf->confirmed_block_hash, conf->confirmed_block_height, m_state);
- } else if (auto* conf = state<TxStateConflicted>()) {
+ } else if (auto* conf = state<TxStateBlockConflicted>()) {
lookup_block(conf->conflicting_block_hash, conf->conflicting_block_height, m_state);
}
}
diff --git a/src/wallet/transaction.h b/src/wallet/transaction.h
index ddeb931112..9c27574103 100644
--- a/src/wallet/transaction.h
+++ b/src/wallet/transaction.h
@@ -43,12 +43,12 @@ struct TxStateInMempool {
};
//! State of rejected transaction that conflicts with a confirmed block.
-struct TxStateConflicted {
+struct TxStateBlockConflicted {
uint256 conflicting_block_hash;
int conflicting_block_height;
- explicit TxStateConflicted(const uint256& block_hash, int height) : conflicting_block_hash(block_hash), conflicting_block_height(height) {}
- std::string toString() const { return strprintf("Conflicted (block=%s, height=%i)", conflicting_block_hash.ToString(), conflicting_block_height); }
+ explicit TxStateBlockConflicted(const uint256& block_hash, int height) : conflicting_block_hash(block_hash), conflicting_block_height(height) {}
+ std::string toString() const { return strprintf("BlockConflicted (block=%s, height=%i)", conflicting_block_hash.ToString(), conflicting_block_height); }
};
//! State of transaction not confirmed or conflicting with a known block and
@@ -75,7 +75,7 @@ struct TxStateUnrecognized {
};
//! All possible CWalletTx states
-using TxState = std::variant<TxStateConfirmed, TxStateInMempool, TxStateConflicted, TxStateInactive, TxStateUnrecognized>;
+using TxState = std::variant<TxStateConfirmed, TxStateInMempool, TxStateBlockConflicted, TxStateInactive, TxStateUnrecognized>;
//! Subset of states transaction sync logic is implemented to handle.
using SyncTxState = std::variant<TxStateConfirmed, TxStateInMempool, TxStateInactive>;
@@ -90,7 +90,7 @@ static inline TxState TxStateInterpretSerialized(TxStateUnrecognized data)
} else if (data.index >= 0) {
return TxStateConfirmed{data.block_hash, /*height=*/-1, data.index};
} else if (data.index == -1) {
- return TxStateConflicted{data.block_hash, /*height=*/-1};
+ return TxStateBlockConflicted{data.block_hash, /*height=*/-1};
}
return data;
}
@@ -102,7 +102,7 @@ static inline uint256 TxStateSerializedBlockHash(const TxState& state)
[](const TxStateInactive& inactive) { return inactive.abandoned ? uint256::ONE : uint256::ZERO; },
[](const TxStateInMempool& in_mempool) { return uint256::ZERO; },
[](const TxStateConfirmed& confirmed) { return confirmed.confirmed_block_hash; },
- [](const TxStateConflicted& conflicted) { return conflicted.conflicting_block_hash; },
+ [](const TxStateBlockConflicted& conflicted) { return conflicted.conflicting_block_hash; },
[](const TxStateUnrecognized& unrecognized) { return unrecognized.block_hash; }
}, state);
}
@@ -114,7 +114,7 @@ static inline int TxStateSerializedIndex(const TxState& state)
[](const TxStateInactive& inactive) { return inactive.abandoned ? -1 : 0; },
[](const TxStateInMempool& in_mempool) { return 0; },
[](const TxStateConfirmed& confirmed) { return confirmed.position_in_block; },
- [](const TxStateConflicted& conflicted) { return -1; },
+ [](const TxStateBlockConflicted& conflicted) { return -1; },
[](const TxStateUnrecognized& unrecognized) { return unrecognized.index; }
}, state);
}
@@ -258,6 +258,14 @@ public:
CTransactionRef tx;
TxState m_state;
+ // Set of mempool transactions that conflict
+ // directly with the transaction, or that conflict
+ // with an ancestor transaction. This set will be
+ // empty if state is InMempool or Confirmed, but
+ // can be nonempty if state is Inactive or
+ // BlockConflicted.
+ std::set<Txid> mempool_conflicts;
+
template<typename Stream>
void Serialize(Stream& s) const
{
@@ -335,9 +343,10 @@ public:
void updateState(interfaces::Chain& chain);
bool isAbandoned() const { return state<TxStateInactive>() && state<TxStateInactive>()->abandoned; }
- bool isConflicted() const { return state<TxStateConflicted>(); }
+ bool isMempoolConflicted() const { return !mempool_conflicts.empty(); }
+ bool isBlockConflicted() const { return state<TxStateBlockConflicted>(); }
bool isInactive() const { return state<TxStateInactive>(); }
- bool isUnconfirmed() const { return !isAbandoned() && !isConflicted() && !isConfirmed(); }
+ bool isUnconfirmed() const { return !isAbandoned() && !isBlockConflicted() && !isMempoolConflicted() && !isConfirmed(); }
bool isConfirmed() const { return state<TxStateConfirmed>(); }
const Txid& GetHash() const LIFETIMEBOUND { return tx->GetHash(); }
const Wtxid& GetWitnessHash() const LIFETIMEBOUND { return tx->GetWitnessHash(); }
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
index fdf610955b..96c4397504 100644
--- a/src/wallet/wallet.cpp
+++ b/src/wallet/wallet.cpp
@@ -752,8 +752,8 @@ bool CWallet::IsSpent(const COutPoint& outpoint) const
const uint256& wtxid = it->second;
const auto mit = mapWallet.find(wtxid);
if (mit != mapWallet.end()) {
- int depth = GetTxDepthInMainChain(mit->second);
- if (depth > 0 || (depth == 0 && !mit->second.isAbandoned()))
+ const auto& wtx = mit->second;
+ if (!wtx.isAbandoned() && !wtx.isBlockConflicted() && !wtx.isMempoolConflicted())
return true; // Spent
}
}
@@ -1197,7 +1197,7 @@ bool CWallet::LoadToWallet(const uint256& hash, const UpdateWalletTxFn& fill_wtx
auto it = mapWallet.find(txin.prevout.hash);
if (it != mapWallet.end()) {
CWalletTx& prevtx = it->second;
- if (auto* prev = prevtx.state<TxStateConflicted>()) {
+ if (auto* prev = prevtx.state<TxStateBlockConflicted>()) {
MarkConflicted(prev->conflicting_block_hash, prev->conflicting_block_height, wtx.GetHash());
}
}
@@ -1309,7 +1309,7 @@ bool CWallet::AbandonTransaction(const uint256& hashTx)
assert(!wtx.isConfirmed());
assert(!wtx.InMempool());
// If already conflicted or abandoned, no need to set abandoned
- if (!wtx.isConflicted() && !wtx.isAbandoned()) {
+ if (!wtx.isBlockConflicted() && !wtx.isAbandoned()) {
wtx.m_state = TxStateInactive{/*abandoned=*/true};
return TxUpdate::NOTIFY_CHANGED;
}
@@ -1346,7 +1346,7 @@ void CWallet::MarkConflicted(const uint256& hashBlock, int conflicting_height, c
if (conflictconfirms < GetTxDepthInMainChain(wtx)) {
// Block is 'more conflicted' than current confirm; update.
// Mark transaction as conflicted with this block.
- wtx.m_state = TxStateConflicted{hashBlock, conflicting_height};
+ wtx.m_state = TxStateBlockConflicted{hashBlock, conflicting_height};
return TxUpdate::CHANGED;
}
return TxUpdate::UNCHANGED;
@@ -1360,7 +1360,10 @@ void CWallet::MarkConflicted(const uint256& hashBlock, int conflicting_height, c
void CWallet::RecursiveUpdateTxState(const uint256& tx_hash, const TryUpdatingStateFn& try_updating_state) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet) {
// Do not flush the wallet here for performance reasons
WalletBatch batch(GetDatabase(), false);
+ RecursiveUpdateTxState(&batch, tx_hash, try_updating_state);
+}
+void CWallet::RecursiveUpdateTxState(WalletBatch* batch, const uint256& tx_hash, const TryUpdatingStateFn& try_updating_state) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet) {
std::set<uint256> todo;
std::set<uint256> done;
@@ -1377,7 +1380,7 @@ void CWallet::RecursiveUpdateTxState(const uint256& tx_hash, const TryUpdatingSt
TxUpdate update_state = try_updating_state(wtx);
if (update_state != TxUpdate::UNCHANGED) {
wtx.MarkDirty();
- batch.WriteTx(wtx);
+ if (batch) batch->WriteTx(wtx);
// Iterate over all its outputs, and update those tx states as well (if applicable)
for (unsigned int i = 0; i < wtx.tx->vout.size(); ++i) {
std::pair<TxSpends::const_iterator, TxSpends::const_iterator> range = mapTxSpends.equal_range(COutPoint(Txid::FromUint256(now), i));
@@ -1418,6 +1421,20 @@ void CWallet::transactionAddedToMempool(const CTransactionRef& tx) {
if (it != mapWallet.end()) {
RefreshMempoolStatus(it->second, chain());
}
+
+ const Txid& txid = tx->GetHash();
+
+ for (const CTxIn& tx_in : tx->vin) {
+ // For each wallet transaction spending this prevout..
+ for (auto range = mapTxSpends.equal_range(tx_in.prevout); range.first != range.second; range.first++) {
+ const uint256& spent_id = range.first->second;
+ // Skip the recently added tx
+ if (spent_id == txid) continue;
+ RecursiveUpdateTxState(/*batch=*/nullptr, spent_id, [&txid](CWalletTx& wtx) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet) {
+ return wtx.mempool_conflicts.insert(txid).second ? TxUpdate::CHANGED : TxUpdate::UNCHANGED;
+ });
+ }
+ }
}
void CWallet::transactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRemovalReason reason) {
@@ -1455,6 +1472,21 @@ void CWallet::transactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRe
// https://github.com/bitcoin-core/bitcoin-devwiki/wiki/Wallet-Transaction-Conflict-Tracking
SyncTransaction(tx, TxStateInactive{});
}
+
+ const Txid& txid = tx->GetHash();
+
+ for (const CTxIn& tx_in : tx->vin) {
+ // Iterate over all wallet transactions spending txin.prev
+ // and recursively mark them as no longer conflicting with
+ // txid
+ for (auto range = mapTxSpends.equal_range(tx_in.prevout); range.first != range.second; range.first++) {
+ const uint256& spent_id = range.first->second;
+
+ RecursiveUpdateTxState(/*batch=*/nullptr, spent_id, [&txid](CWalletTx& wtx) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet) {
+ return wtx.mempool_conflicts.erase(txid) ? TxUpdate::CHANGED : TxUpdate::UNCHANGED;
+ });
+ }
+ }
}
void CWallet::blockConnected(ChainstateRole role, const interfaces::BlockInfo& block)
@@ -1506,11 +1538,11 @@ void CWallet::blockDisconnected(const interfaces::BlockInfo& block)
for (TxSpends::const_iterator _it = range.first; _it != range.second; ++_it) {
CWalletTx& wtx = mapWallet.find(_it->second)->second;
- if (!wtx.isConflicted()) continue;
+ if (!wtx.isBlockConflicted()) continue;
auto try_updating_state = [&](CWalletTx& tx) {
- if (!tx.isConflicted()) return TxUpdate::UNCHANGED;
- if (tx.state<TxStateConflicted>()->conflicting_block_height >= disconnect_height) {
+ if (!tx.isBlockConflicted()) return TxUpdate::UNCHANGED;
+ if (tx.state<TxStateBlockConflicted>()->conflicting_block_height >= disconnect_height) {
tx.m_state = TxStateInactive{};
return TxUpdate::CHANGED;
}
@@ -1571,11 +1603,22 @@ isminetype CWallet::IsMine(const CTxDestination& dest) const
isminetype CWallet::IsMine(const CScript& script) const
{
AssertLockHeld(cs_wallet);
- isminetype result = ISMINE_NO;
- for (const auto& spk_man_pair : m_spk_managers) {
- result = std::max(result, spk_man_pair.second->IsMine(script));
+
+ // Search the cache so that IsMine is called only on the relevant SPKMs instead of on everything in m_spk_managers
+ const auto& it = m_cached_spks.find(script);
+ if (it != m_cached_spks.end()) {
+ isminetype res = ISMINE_NO;
+ for (const auto& spkm : it->second) {
+ res = std::max(res, spkm->IsMine(script));
+ }
+ Assume(res == ISMINE_SPENDABLE);
+ return res;
}
- return result;
+
+ // Legacy wallet
+ if (IsLegacy()) return GetLegacyScriptPubKeyMan()->IsMine(script);
+
+ return ISMINE_NO;
}
bool CWallet::IsMine(const CTransaction& tx) const
@@ -2320,12 +2363,41 @@ DBErrors CWallet::LoadWallet()
return nLoadWalletRet;
}
-DBErrors CWallet::ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256>& vHashOut)
+util::Result<void> CWallet::RemoveTxs(std::vector<uint256>& txs_to_remove)
{
AssertLockHeld(cs_wallet);
- DBErrors nZapSelectTxRet = WalletBatch(GetDatabase()).ZapSelectTx(vHashIn, vHashOut);
- for (const uint256& hash : vHashOut) {
- const auto& it = mapWallet.find(hash);
+ WalletBatch batch(GetDatabase());
+ if (!batch.TxnBegin()) return util::Error{_("Error starting db txn for wallet transactions removal")};
+
+ // Check for transaction existence and remove entries from disk
+ using TxIterator = std::unordered_map<uint256, CWalletTx, SaltedTxidHasher>::const_iterator;
+ std::vector<TxIterator> erased_txs;
+ bilingual_str str_err;
+ for (const uint256& hash : txs_to_remove) {
+ auto it_wtx = mapWallet.find(hash);
+ if (it_wtx == mapWallet.end()) {
+ str_err = strprintf(_("Transaction %s does not belong to this wallet"), hash.GetHex());
+ break;
+ }
+ if (!batch.EraseTx(hash)) {
+ str_err = strprintf(_("Failure removing transaction: %s"), hash.GetHex());
+ break;
+ }
+ erased_txs.emplace_back(it_wtx);
+ }
+
+ // Roll back removals in case of an error
+ if (!str_err.empty()) {
+ batch.TxnAbort();
+ return util::Error{str_err};
+ }
+
+ // Dump changes to disk
+ if (!batch.TxnCommit()) return util::Error{_("Error committing db txn for wallet transactions removal")};
+
+ // Update the in-memory state and notify upper layers about the removals
+ for (const auto& it : erased_txs) {
+ const uint256 hash{it->first};
wtxOrdered.erase(it->second.m_it_wtxOrdered);
for (const auto& txin : it->second.tx->vin)
mapTxSpends.erase(txin.prevout);
@@ -2333,22 +2405,9 @@ DBErrors CWallet::ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256
NotifyTransactionChanged(hash, CT_DELETED);
}
- if (nZapSelectTxRet == DBErrors::NEED_REWRITE)
- {
- if (GetDatabase().Rewrite("\x04pool"))
- {
- for (const auto& spk_man_pair : m_spk_managers) {
- spk_man_pair.second->RewriteDB();
- }
- }
- }
-
- if (nZapSelectTxRet != DBErrors::LOAD_OK)
- return nZapSelectTxRet;
-
MarkDirty();
- return DBErrors::LOAD_OK;
+ return {}; // all good
}
bool CWallet::SetAddressBookWithDB(WalletBatch& batch, const CTxDestination& address, const std::string& strName, const std::optional<AddressPurpose>& new_purpose)
@@ -2395,8 +2454,9 @@ bool CWallet::SetAddressBook(const CTxDestination& address, const std::string& s
bool CWallet::DelAddressBook(const CTxDestination& address)
{
- WalletBatch batch(GetDatabase());
- return DelAddressBookWithDB(batch, address);
+ return RunWithinTxn(GetDatabase(), /*process_desc=*/"address book entry removal", [&](WalletBatch& batch){
+ return DelAddressBookWithDB(batch, address);
+ });
}
bool CWallet::DelAddressBookWithDB(WalletBatch& batch, const CTxDestination& address)
@@ -2579,8 +2639,10 @@ util::Result<CTxDestination> ReserveDestination::GetReservedDestination(bool int
if (nIndex == -1) {
CKeyPool keypool;
- auto op_address = m_spk_man->GetReservedDestination(type, internal, nIndex, keypool);
+ int64_t index;
+ auto op_address = m_spk_man->GetReservedDestination(type, internal, index, keypool);
if (!op_address) return op_address;
+ nIndex = index;
address = *op_address;
fInternal = keypool.fInternal;
}
@@ -2757,7 +2819,7 @@ unsigned int CWallet::ComputeTimeSmart(const CWalletTx& wtx, bool rescanning_old
std::optional<uint256> block_hash;
if (auto* conf = wtx.state<TxStateConfirmed>()) {
block_hash = conf->confirmed_block_hash;
- } else if (auto* conf = wtx.state<TxStateConflicted>()) {
+ } else if (auto* conf = wtx.state<TxStateBlockConflicted>()) {
block_hash = conf->conflicting_block_hash;
}
@@ -3347,7 +3409,7 @@ int CWallet::GetTxDepthInMainChain(const CWalletTx& wtx) const
if (auto* conf = wtx.state<TxStateConfirmed>()) {
assert(conf->confirmed_block_height >= 0);
return GetLastBlockHeight() - conf->confirmed_block_height + 1;
- } else if (auto* conf = wtx.state<TxStateConflicted>()) {
+ } else if (auto* conf = wtx.state<TxStateBlockConflicted>()) {
assert(conf->conflicting_block_height >= 0);
return -1 * (GetLastBlockHeight() - conf->conflicting_block_height + 1);
} else {
@@ -3435,6 +3497,17 @@ std::set<ScriptPubKeyMan*> CWallet::GetActiveScriptPubKeyMans() const
return spk_mans;
}
+bool CWallet::IsActiveScriptPubKeyMan(const ScriptPubKeyMan& spkm) const
+{
+ for (const auto& [_, ext_spkm] : m_external_spk_managers) {
+ if (ext_spkm == &spkm) return true;
+ }
+ for (const auto& [_, int_spkm] : m_internal_spk_managers) {
+ if (int_spkm == &spkm) return true;
+ }
+ return false;
+}
+
std::set<ScriptPubKeyMan*> CWallet::GetAllScriptPubKeyMans() const
{
std::set<ScriptPubKeyMan*> spk_mans;
@@ -3457,12 +3530,18 @@ ScriptPubKeyMan* CWallet::GetScriptPubKeyMan(const OutputType& type, bool intern
std::set<ScriptPubKeyMan*> CWallet::GetScriptPubKeyMans(const CScript& script) const
{
std::set<ScriptPubKeyMan*> spk_mans;
- SignatureData sigdata;
- for (const auto& spk_man_pair : m_spk_managers) {
- if (spk_man_pair.second->CanProvide(script, sigdata)) {
- spk_mans.insert(spk_man_pair.second.get());
- }
+
+ // Search the cache for relevant SPKMs instead of iterating m_spk_managers
+ const auto& it = m_cached_spks.find(script);
+ if (it != m_cached_spks.end()) {
+ spk_mans.insert(it->second.begin(), it->second.end());
}
+ SignatureData sigdata;
+ Assume(std::all_of(spk_mans.begin(), spk_mans.end(), [&script, &sigdata](ScriptPubKeyMan* spkm) { return spkm->CanProvide(script, sigdata); }));
+
+ // Legacy wallet
+ if (IsLegacy() && GetLegacyScriptPubKeyMan()->CanProvide(script, sigdata)) spk_mans.insert(GetLegacyScriptPubKeyMan());
+
return spk_mans;
}
@@ -3482,11 +3561,17 @@ std::unique_ptr<SigningProvider> CWallet::GetSolvingProvider(const CScript& scri
std::unique_ptr<SigningProvider> CWallet::GetSolvingProvider(const CScript& script, SignatureData& sigdata) const
{
- for (const auto& spk_man_pair : m_spk_managers) {
- if (spk_man_pair.second->CanProvide(script, sigdata)) {
- return spk_man_pair.second->GetSolvingProvider(script);
- }
+ // Search the cache for relevant SPKMs instead of iterating m_spk_managers
+ const auto& it = m_cached_spks.find(script);
+ if (it != m_cached_spks.end()) {
+ // All spkms for a given script must already be able to make a SigningProvider for the script, so just return the first one.
+ Assume(it->second.at(0)->CanProvide(script, sigdata));
+ return it->second.at(0)->GetSolvingProvider(script);
}
+
+ // Legacy wallet
+ if (IsLegacy() && GetLegacyScriptPubKeyMan()->CanProvide(script, sigdata)) return GetLegacyScriptPubKeyMan()->GetSolvingProvider(script);
+
return nullptr;
}
@@ -3565,15 +3650,36 @@ void CWallet::ConnectScriptPubKeyManNotifiers()
}
}
-void CWallet::LoadDescriptorScriptPubKeyMan(uint256 id, WalletDescriptor& desc)
+DescriptorScriptPubKeyMan& CWallet::LoadDescriptorScriptPubKeyMan(uint256 id, WalletDescriptor& desc)
{
+ DescriptorScriptPubKeyMan* spk_manager;
if (IsWalletFlagSet(WALLET_FLAG_EXTERNAL_SIGNER)) {
- auto spk_manager = std::unique_ptr<ScriptPubKeyMan>(new ExternalSignerScriptPubKeyMan(*this, desc, m_keypool_size));
- AddScriptPubKeyMan(id, std::move(spk_manager));
+ spk_manager = new ExternalSignerScriptPubKeyMan(*this, desc, m_keypool_size);
} else {
- auto spk_manager = std::unique_ptr<ScriptPubKeyMan>(new DescriptorScriptPubKeyMan(*this, desc, m_keypool_size));
- AddScriptPubKeyMan(id, std::move(spk_manager));
+ spk_manager = new DescriptorScriptPubKeyMan(*this, desc, m_keypool_size);
+ }
+ AddScriptPubKeyMan(id, std::unique_ptr<ScriptPubKeyMan>(spk_manager));
+ return *spk_manager;
+}
+
+DescriptorScriptPubKeyMan& CWallet::SetupDescriptorScriptPubKeyMan(WalletBatch& batch, const CExtKey& master_key, const OutputType& output_type, bool internal)
+{
+ AssertLockHeld(cs_wallet);
+ auto spk_manager = std::unique_ptr<DescriptorScriptPubKeyMan>(new DescriptorScriptPubKeyMan(*this, m_keypool_size));
+ if (IsCrypted()) {
+ if (IsLocked()) {
+ throw std::runtime_error(std::string(__func__) + ": Wallet is locked, cannot setup new descriptors");
+ }
+ if (!spk_manager->CheckDecryptionKey(vMasterKey) && !spk_manager->Encrypt(vMasterKey, &batch)) {
+ throw std::runtime_error(std::string(__func__) + ": Could not encrypt new descriptors");
+ }
}
+ spk_manager->SetupDescriptorGeneration(batch, master_key, output_type, internal);
+ DescriptorScriptPubKeyMan* out = spk_manager.get();
+ uint256 id = spk_manager->GetID();
+ AddScriptPubKeyMan(id, std::move(spk_manager));
+ AddActiveScriptPubKeyManWithDb(batch, id, output_type, internal);
+ return *out;
}
void CWallet::SetupDescriptorScriptPubKeyMans(const CExtKey& master_key)
@@ -3586,19 +3692,7 @@ void CWallet::SetupDescriptorScriptPubKeyMans(const CExtKey& master_key)
for (bool internal : {false, true}) {
for (OutputType t : OUTPUT_TYPES) {
- auto spk_manager = std::unique_ptr<DescriptorScriptPubKeyMan>(new DescriptorScriptPubKeyMan(*this, m_keypool_size));
- if (IsCrypted()) {
- if (IsLocked()) {
- throw std::runtime_error(std::string(__func__) + ": Wallet is locked, cannot setup new descriptors");
- }
- if (!spk_manager->CheckDecryptionKey(vMasterKey) && !spk_manager->Encrypt(vMasterKey, &batch)) {
- throw std::runtime_error(std::string(__func__) + ": Could not encrypt new descriptors");
- }
- }
- spk_manager->SetupDescriptorGeneration(batch, master_key, t, internal);
- uint256 id = spk_manager->GetID();
- AddScriptPubKeyMan(id, std::move(spk_manager));
- AddActiveScriptPubKeyManWithDb(batch, id, t, internal);
+ SetupDescriptorScriptPubKeyMan(batch, master_key, t, internal);
}
}
@@ -3928,6 +4022,8 @@ bool CWallet::ApplyMigrationData(MigrationData& data, bilingual_str& error)
if (ExtractDestination(script, dest)) not_migrated_dests.emplace(dest);
}
+ Assume(!m_cached_spks.empty());
+
for (auto& desc_spkm : data.desc_spkms) {
if (m_spk_managers.count(desc_spkm->GetID()) > 0) {
error = _("Error: Duplicate descriptors created during migration. Your wallet may be corrupted.");
@@ -4025,19 +4121,10 @@ bool CWallet::ApplyMigrationData(MigrationData& data, bilingual_str& error)
watchonly_batch.reset(); // Flush
// Do the removes
if (txids_to_delete.size() > 0) {
- std::vector<uint256> deleted_txids;
- if (ZapSelectTx(txids_to_delete, deleted_txids) != DBErrors::LOAD_OK) {
- error = _("Error: Could not delete watchonly transactions");
- return false;
- }
- if (deleted_txids != txids_to_delete) {
- error = _("Error: Not all watchonly txs could be deleted");
+ if (auto res = RemoveTxs(txids_to_delete); !res) {
+ error = _("Error: Could not delete watchonly transactions. ") + util::ErrorString(res);
return false;
}
- // Tell the GUI of each tx
- for (const uint256& txid : deleted_txids) {
- NotifyTransactionChanged(txid, CT_UPDATED);
- }
}
// Pair external wallets with their corresponding db handler
@@ -4300,7 +4387,7 @@ util::Result<MigrationResult> MigrateLegacyToDescriptor(const std::string& walle
// Make a backup of the DB
fs::path this_wallet_dir = fs::absolute(fs::PathFromString(local_wallet->GetDatabase().Filename())).parent_path();
- fs::path backup_filename = fs::PathFromString(strprintf("%s-%d.legacy.bak", wallet_name, GetTime()));
+ fs::path backup_filename = fs::PathFromString(strprintf("%s_%d.legacy.bak", (wallet_name.empty() ? "default_wallet" : wallet_name), GetTime()));
fs::path backup_path = this_wallet_dir / backup_filename;
if (!local_wallet->BackupWallet(fs::PathToString(backup_path))) {
if (was_loaded) {
@@ -4420,4 +4507,53 @@ util::Result<MigrationResult> MigrateLegacyToDescriptor(const std::string& walle
}
return res;
}
+
+void CWallet::CacheNewScriptPubKeys(const std::set<CScript>& spks, ScriptPubKeyMan* spkm)
+{
+ for (const auto& script : spks) {
+ m_cached_spks[script].push_back(spkm);
+ }
+}
+
+void CWallet::TopUpCallback(const std::set<CScript>& spks, ScriptPubKeyMan* spkm)
+{
+ // Update scriptPubKey cache
+ CacheNewScriptPubKeys(spks, spkm);
+}
+
+std::set<CExtPubKey> CWallet::GetActiveHDPubKeys() const
+{
+ AssertLockHeld(cs_wallet);
+
+ Assert(IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS));
+
+ std::set<CExtPubKey> active_xpubs;
+ for (const auto& spkm : GetActiveScriptPubKeyMans()) {
+ const DescriptorScriptPubKeyMan* desc_spkm = dynamic_cast<DescriptorScriptPubKeyMan*>(spkm);
+ assert(desc_spkm);
+ LOCK(desc_spkm->cs_desc_man);
+ WalletDescriptor w_desc = desc_spkm->GetWalletDescriptor();
+
+ std::set<CPubKey> desc_pubkeys;
+ std::set<CExtPubKey> desc_xpubs;
+ w_desc.descriptor->GetPubKeys(desc_pubkeys, desc_xpubs);
+ active_xpubs.merge(std::move(desc_xpubs));
+ }
+ return active_xpubs;
+}
+
+std::optional<CKey> CWallet::GetKey(const CKeyID& keyid) const
+{
+ Assert(IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS));
+
+ for (const auto& spkm : GetAllScriptPubKeyMans()) {
+ const DescriptorScriptPubKeyMan* desc_spkm = dynamic_cast<DescriptorScriptPubKeyMan*>(spkm);
+ assert(desc_spkm);
+ LOCK(desc_spkm->cs_desc_man);
+ if (std::optional<CKey> key = desc_spkm->GetKey(keyid)) {
+ return key;
+ }
+ }
+ return std::nullopt;
+}
} // namespace wallet
diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h
index c0d10ab7fc..b49b5a7d0d 100644
--- a/src/wallet/wallet.h
+++ b/src/wallet/wallet.h
@@ -364,6 +364,7 @@ private:
/** Mark a transaction (and its in-wallet descendants) as a particular tx state. */
void RecursiveUpdateTxState(const uint256& tx_hash, const TryUpdatingStateFn& try_updating_state) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
+ void RecursiveUpdateTxState(WalletBatch* batch, const uint256& tx_hash, const TryUpdatingStateFn& try_updating_state) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
/** Mark a transaction's inputs dirty, thus forcing the outputs to be recomputed */
void MarkInputsDirty(const CTransactionRef& tx) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
@@ -422,6 +423,9 @@ private:
// Same as 'AddActiveScriptPubKeyMan' but designed for use within a batch transaction context
void AddActiveScriptPubKeyManWithDb(WalletBatch& batch, uint256 id, OutputType type, bool internal);
+ //! Cache of descriptor ScriptPubKeys used for IsMine. Maps ScriptPubKey to set of spkms
+ std::unordered_map<CScript, std::vector<ScriptPubKeyMan*>, SaltedSipHasher> m_cached_spks;
+
/**
* Catch wallet up to current chain, scanning new blocks, updating the best
* block locator and m_last_block_processed, and registering for
@@ -515,11 +519,6 @@ public:
* referenced in transaction, and might cause assert failures.
*/
int GetTxDepthInMainChain(const CWalletTx& wtx) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
- bool IsTxInMainChain(const CWalletTx& wtx) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet)
- {
- AssertLockHeld(cs_wallet);
- return GetTxDepthInMainChain(wtx) > 0;
- }
/**
* @return number of blocks to maturity for this transaction:
@@ -790,7 +789,9 @@ public:
void chainStateFlushed(ChainstateRole role, const CBlockLocator& loc) override;
DBErrors LoadWallet();
- DBErrors ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256>& vHashOut) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
+
+ /** Erases the provided transactions from the wallet. */
+ util::Result<void> RemoveTxs(std::vector<uint256>& txs_to_remove) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
bool SetAddressBook(const CTxDestination& address, const std::string& strName, const std::optional<AddressPurpose>& purpose);
@@ -937,6 +938,7 @@ public:
//! Returns all unique ScriptPubKeyMans in m_internal_spk_managers and m_external_spk_managers
std::set<ScriptPubKeyMan*> GetActiveScriptPubKeyMans() const;
+ bool IsActiveScriptPubKeyMan(const ScriptPubKeyMan& spkm) const;
//! Returns all unique ScriptPubKeyMans
std::set<ScriptPubKeyMan*> GetAllScriptPubKeyMans() const;
@@ -992,7 +994,7 @@ public:
void ConnectScriptPubKeyManNotifiers();
//! Instantiate a descriptor ScriptPubKeyMan from the WalletDescriptor and load it
- void LoadDescriptorScriptPubKeyMan(uint256 id, WalletDescriptor& desc);
+ DescriptorScriptPubKeyMan& LoadDescriptorScriptPubKeyMan(uint256 id, WalletDescriptor& desc);
//! Adds the active ScriptPubKeyMan for the specified type and internal. Writes it to the wallet file
//! @param[in] id The unique id for the ScriptPubKeyMan
@@ -1012,6 +1014,8 @@ public:
//! @param[in] internal Whether this ScriptPubKeyMan provides change addresses
void DeactivateScriptPubKeyMan(uint256 id, OutputType type, bool internal);
+ //! Create new DescriptorScriptPubKeyMan and add it to the wallet
+ DescriptorScriptPubKeyMan& SetupDescriptorScriptPubKeyMan(WalletBatch& batch, const CExtKey& master_key, const OutputType& output_type, bool internal) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
//! Create new DescriptorScriptPubKeyMans and add them to the wallet
void SetupDescriptorScriptPubKeyMans(const CExtKey& master_key) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
void SetupDescriptorScriptPubKeyMans() EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
@@ -1043,6 +1047,18 @@ public:
//! Whether the (external) signer performs R-value signature grinding
bool CanGrindR() const;
+
+ //! Add scriptPubKeys for this ScriptPubKeyMan into the scriptPubKey cache
+ void CacheNewScriptPubKeys(const std::set<CScript>& spks, ScriptPubKeyMan* spkm);
+
+ void TopUpCallback(const std::set<CScript>& spks, ScriptPubKeyMan* spkm) override;
+
+ //! Retrieve the xpubs in use by the active descriptors
+ std::set<CExtPubKey> GetActiveHDPubKeys() const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
+
+ //! Find the private key for the given key id from the wallet's descriptors, if available
+ //! Returns nullopt when no descriptor has the key or if the wallet is locked.
+ std::optional<CKey> GetKey(const CKeyID& keyid) const;
};
/**
diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp
index f3dd5b328e..b1ce7ee4e7 100644
--- a/src/wallet/walletdb.cpp
+++ b/src/wallet/walletdb.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <wallet/walletdb.h>
#include <common/system.h>
@@ -804,10 +808,10 @@ static DBErrors LoadDescriptorWalletRecords(CWallet* pwallet, DatabaseBatch& bat
strErr = strprintf("%s\nDetails: %s", strErr, e.what());
return DBErrors::UNKNOWN_DESCRIPTOR;
}
- pwallet->LoadDescriptorScriptPubKeyMan(id, desc);
+ DescriptorScriptPubKeyMan& spkm = pwallet->LoadDescriptorScriptPubKeyMan(id, desc);
// Prior to doing anything with this spkm, verify ID compatibility
- if (id != pwallet->GetDescriptorScriptPubKeyMan(desc)->GetID()) {
+ if (id != spkm.GetID()) {
strErr = "The descriptor ID calculated by the wallet differs from the one in DB";
return DBErrors::CORRUPT;
}
@@ -1230,88 +1234,33 @@ DBErrors WalletBatch::LoadWallet(CWallet* pwallet)
return result;
}
-DBErrors WalletBatch::FindWalletTxHashes(std::vector<uint256>& tx_hashes)
+static bool RunWithinTxn(WalletBatch& batch, std::string_view process_desc, const std::function<bool(WalletBatch&)>& func)
{
- DBErrors result = DBErrors::LOAD_OK;
-
- try {
- int nMinVersion = 0;
- if (m_batch->Read(DBKeys::MINVERSION, nMinVersion)) {
- if (nMinVersion > FEATURE_LATEST)
- return DBErrors::TOO_NEW;
- }
-
- // Get cursor
- std::unique_ptr<DatabaseCursor> cursor = m_batch->GetNewCursor();
- if (!cursor)
- {
- LogPrintf("Error getting wallet database cursor\n");
- return DBErrors::CORRUPT;
- }
+ if (!batch.TxnBegin()) {
+ LogPrint(BCLog::WALLETDB, "Error: cannot create db txn for %s\n", process_desc);
+ return false;
+ }
- while (true)
- {
- // Read next record
- DataStream ssKey{};
- DataStream ssValue{};
- DatabaseCursor::Status status = cursor->Next(ssKey, ssValue);
- if (status == DatabaseCursor::Status::DONE) {
- break;
- } else if (status == DatabaseCursor::Status::FAIL) {
- LogPrintf("Error reading next record from wallet database\n");
- return DBErrors::CORRUPT;
- }
+ // Run procedure
+ if (!func(batch)) {
+ LogPrint(BCLog::WALLETDB, "Error: %s failed\n", process_desc);
+ batch.TxnAbort();
+ return false;
+ }
- std::string strType;
- ssKey >> strType;
- if (strType == DBKeys::TX) {
- uint256 hash;
- ssKey >> hash;
- tx_hashes.push_back(hash);
- }
- }
- } catch (...) {
- result = DBErrors::CORRUPT;
+ if (!batch.TxnCommit()) {
+ LogPrint(BCLog::WALLETDB, "Error: cannot commit db txn for %s\n", process_desc);
+ return false;
}
- return result;
+ // All good
+ return true;
}
-DBErrors WalletBatch::ZapSelectTx(std::vector<uint256>& vTxHashIn, std::vector<uint256>& vTxHashOut)
+bool RunWithinTxn(WalletDatabase& database, std::string_view process_desc, const std::function<bool(WalletBatch&)>& func)
{
- // build list of wallet TX hashes
- std::vector<uint256> vTxHash;
- DBErrors err = FindWalletTxHashes(vTxHash);
- if (err != DBErrors::LOAD_OK) {
- return err;
- }
-
- std::sort(vTxHash.begin(), vTxHash.end());
- std::sort(vTxHashIn.begin(), vTxHashIn.end());
-
- // erase each matching wallet TX
- bool delerror = false;
- std::vector<uint256>::iterator it = vTxHashIn.begin();
- for (const uint256& hash : vTxHash) {
- while (it < vTxHashIn.end() && (*it) < hash) {
- it++;
- }
- if (it == vTxHashIn.end()) {
- break;
- }
- else if ((*it) == hash) {
- if(!EraseTx(hash)) {
- LogPrint(BCLog::WALLETDB, "Transaction was found for deletion but returned database error: %s\n", hash.GetHex());
- delerror = true;
- }
- vTxHashOut.push_back(hash);
- }
- }
-
- if (delerror) {
- return DBErrors::CORRUPT;
- }
- return DBErrors::LOAD_OK;
+ WalletBatch batch(database);
+ return RunWithinTxn(batch, process_desc, func);
}
void MaybeCompactWalletDB(WalletContext& context)
@@ -1376,47 +1325,11 @@ bool WalletBatch::WriteWalletFlags(const uint64_t flags)
bool WalletBatch::EraseRecords(const std::unordered_set<std::string>& types)
{
- // Begin db txn
- if (!m_batch->TxnBegin()) return false;
-
- // Get cursor
- std::unique_ptr<DatabaseCursor> cursor = m_batch->GetNewCursor();
- if (!cursor)
- {
- return false;
- }
-
- // Iterate the DB and look for any records that have the type prefixes
- while (true) {
- // Read next record
- DataStream key{};
- DataStream value{};
- DatabaseCursor::Status status = cursor->Next(key, value);
- if (status == DatabaseCursor::Status::DONE) {
- break;
- } else if (status == DatabaseCursor::Status::FAIL) {
- cursor.reset(nullptr);
- m_batch->TxnAbort(); // abort db txn
- return false;
- }
-
- // Make a copy of key to avoid data being deleted by the following read of the type
- const SerializeData key_data{key.begin(), key.end()};
-
- std::string type;
- key >> type;
-
- if (types.count(type) > 0) {
- if (!m_batch->Erase(Span{key_data})) {
- cursor.reset(nullptr);
- m_batch->TxnAbort();
- return false; // erase failed
- }
- }
- }
- // Finish db txn
- cursor.reset(nullptr);
- return m_batch->TxnCommit();
+ return RunWithinTxn(*this, "erase records", [&types](WalletBatch& self) {
+ return std::all_of(types.begin(), types.end(), [&self](const std::string& type) {
+ return self.m_batch->ErasePrefix(DataStream() << type);
+ });
+ });
}
bool WalletBatch::TxnBegin()
diff --git a/src/wallet/walletdb.h b/src/wallet/walletdb.h
index dad0b18a78..9474a59660 100644
--- a/src/wallet/walletdb.h
+++ b/src/wallet/walletdb.h
@@ -275,8 +275,6 @@ public:
bool EraseActiveScriptPubKeyMan(uint8_t type, bool internal);
DBErrors LoadWallet(CWallet* pwallet);
- DBErrors FindWalletTxHashes(std::vector<uint256>& tx_hashes);
- DBErrors ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256>& vHashOut);
//! write the hdchain model (external chain child index counter)
bool WriteHDChain(const CHDChain& chain);
@@ -296,6 +294,20 @@ private:
WalletDatabase& m_database;
};
+/**
+ * Executes the provided function 'func' within a database transaction context.
+ *
+ * This function ensures that all db modifications performed within 'func()' are
+ * atomically committed to the db at the end of the process. And, in case of a
+ * failure during execution, all performed changes are rolled back.
+ *
+ * @param database The db connection instance to perform the transaction on.
+ * @param process_desc A description of the process being executed, used for logging purposes in the event of a failure.
+ * @param func The function to be executed within the db txn context. It returns a boolean indicating whether to commit or roll back the txn.
+ * @return true if the db txn executed successfully, false otherwise.
+ */
+bool RunWithinTxn(WalletDatabase& database, std::string_view process_desc, const std::function<bool(WalletBatch&)>& func);
+
//! Compacts BDB state so that wallet.dat is self-contained (if there are changes)
void MaybeCompactWalletDB(WalletContext& context);
diff --git a/src/wallet/walletutil.cpp b/src/wallet/walletutil.cpp
index fdd5bc36d8..0de2617d45 100644
--- a/src/wallet/walletutil.cpp
+++ b/src/wallet/walletutil.cpp
@@ -4,7 +4,9 @@
#include <wallet/walletutil.h>
+#include <chainparams.h>
#include <common/args.h>
+#include <key_io.h>
#include <logging.h>
namespace wallet {
@@ -43,4 +45,58 @@ WalletFeature GetClosestWalletFeature(int version)
}
return static_cast<WalletFeature>(0);
}
+
+WalletDescriptor GenerateWalletDescriptor(const CExtPubKey& master_key, const OutputType& addr_type, bool internal)
+{
+ int64_t creation_time = GetTime();
+
+ std::string xpub = EncodeExtPubKey(master_key);
+
+ // Build descriptor string
+ std::string desc_prefix;
+ std::string desc_suffix = "/*)";
+ switch (addr_type) {
+ case OutputType::LEGACY: {
+ desc_prefix = "pkh(" + xpub + "/44h";
+ break;
+ }
+ case OutputType::P2SH_SEGWIT: {
+ desc_prefix = "sh(wpkh(" + xpub + "/49h";
+ desc_suffix += ")";
+ break;
+ }
+ case OutputType::BECH32: {
+ desc_prefix = "wpkh(" + xpub + "/84h";
+ break;
+ }
+ case OutputType::BECH32M: {
+ desc_prefix = "tr(" + xpub + "/86h";
+ break;
+ }
+ case OutputType::UNKNOWN: {
+ // We should never have a DescriptorScriptPubKeyMan for an UNKNOWN OutputType,
+ // so if we get to this point something is wrong
+ assert(false);
+ }
+ } // no default case, so the compiler can warn about missing cases
+ assert(!desc_prefix.empty());
+
+ // Mainnet derives at 0', testnet and regtest derive at 1'
+ if (Params().IsTestChain()) {
+ desc_prefix += "/1h";
+ } else {
+ desc_prefix += "/0h";
+ }
+
+ std::string internal_path = internal ? "/1" : "/0";
+ std::string desc_str = desc_prefix + "/0h" + internal_path + desc_suffix;
+
+ // Make the descriptor
+ FlatSigningProvider keys;
+ std::string error;
+ std::unique_ptr<Descriptor> desc = Parse(desc_str, keys, error, false);
+ WalletDescriptor w_desc(std::move(desc), creation_time, 0, 0, 0);
+ return w_desc;
+}
+
} // namespace wallet
diff --git a/src/wallet/walletutil.h b/src/wallet/walletutil.h
index 7ad3ffe9e4..38926c1eb8 100644
--- a/src/wallet/walletutil.h
+++ b/src/wallet/walletutil.h
@@ -114,6 +114,8 @@ public:
WalletDescriptor() {}
WalletDescriptor(std::shared_ptr<Descriptor> descriptor, uint64_t creation_time, int32_t range_start, int32_t range_end, int32_t next_index) : descriptor(descriptor), id(DescriptorID(*descriptor)), creation_time(creation_time), range_start(range_start), range_end(range_end), next_index(next_index) { }
};
+
+WalletDescriptor GenerateWalletDescriptor(const CExtPubKey& master_key, const OutputType& output_type, bool internal);
} // namespace wallet
#endif // BITCOIN_WALLET_WALLETUTIL_H
diff --git a/src/warnings.cpp b/src/warnings.cpp
index cb73c7aea2..84b021dad5 100644
--- a/src/warnings.cpp
+++ b/src/warnings.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <warnings.h>
#include <common/system.h>
diff --git a/src/zmq/zmqnotificationinterface.cpp b/src/zmq/zmqnotificationinterface.cpp
index 63c2737706..d10db046f5 100644
--- a/src/zmq/zmqnotificationinterface.cpp
+++ b/src/zmq/zmqnotificationinterface.cpp
@@ -41,7 +41,7 @@ std::list<const CZMQAbstractNotifier*> CZMQNotificationInterface::GetActiveNotif
return result;
}
-std::unique_ptr<CZMQNotificationInterface> CZMQNotificationInterface::Create(std::function<bool(CBlock&, const CBlockIndex&)> get_block_by_index)
+std::unique_ptr<CZMQNotificationInterface> CZMQNotificationInterface::Create(std::function<bool(std::vector<uint8_t>&, const CBlockIndex&)> get_block_by_index)
{
std::map<std::string, CZMQNotifierFactory> factories;
factories["pubhashblock"] = CZMQAbstractNotifier::Create<CZMQPublishHashBlockNotifier>;
diff --git a/src/zmq/zmqnotificationinterface.h b/src/zmq/zmqnotificationinterface.h
index 45d0982bd3..c879fdd0dd 100644
--- a/src/zmq/zmqnotificationinterface.h
+++ b/src/zmq/zmqnotificationinterface.h
@@ -12,6 +12,7 @@
#include <functional>
#include <list>
#include <memory>
+#include <vector>
class CBlock;
class CBlockIndex;
@@ -25,7 +26,7 @@ public:
std::list<const CZMQAbstractNotifier*> GetActiveNotifiers() const;
- static std::unique_ptr<CZMQNotificationInterface> Create(std::function<bool(CBlock&, const CBlockIndex&)> get_block_by_index);
+ static std::unique_ptr<CZMQNotificationInterface> Create(std::function<bool(std::vector<uint8_t>&, const CBlockIndex&)> get_block_by_index);
protected:
bool Initialize();
diff --git a/src/zmq/zmqpublishnotifier.cpp b/src/zmq/zmqpublishnotifier.cpp
index 0f20706364..608870c489 100644
--- a/src/zmq/zmqpublishnotifier.cpp
+++ b/src/zmq/zmqpublishnotifier.cpp
@@ -243,16 +243,13 @@ bool CZMQPublishRawBlockNotifier::NotifyBlock(const CBlockIndex *pindex)
{
LogPrint(BCLog::ZMQ, "Publish rawblock %s to %s\n", pindex->GetBlockHash().GetHex(), this->address);
- DataStream ss;
- CBlock block;
+ std::vector<uint8_t> block{};
if (!m_get_block_by_index(block, *pindex)) {
zmqError("Can't read block from disk");
return false;
}
- ss << TX_WITH_WITNESS(block);
-
- return SendZmqMessage(MSG_RAWBLOCK, &(*ss.begin()), ss.size());
+ return SendZmqMessage(MSG_RAWBLOCK, block.data(), block.size());
}
bool CZMQPublishRawTransactionNotifier::NotifyTransaction(const CTransaction &transaction)
diff --git a/src/zmq/zmqpublishnotifier.h b/src/zmq/zmqpublishnotifier.h
index a5cd433761..cc941a899c 100644
--- a/src/zmq/zmqpublishnotifier.h
+++ b/src/zmq/zmqpublishnotifier.h
@@ -10,8 +10,8 @@
#include <cstddef>
#include <cstdint>
#include <functional>
+#include <vector>
-class CBlock;
class CBlockIndex;
class CTransaction;
@@ -49,10 +49,10 @@ public:
class CZMQPublishRawBlockNotifier : public CZMQAbstractPublishNotifier
{
private:
- const std::function<bool(CBlock&, const CBlockIndex&)> m_get_block_by_index;
+ const std::function<bool(std::vector<uint8_t>&, const CBlockIndex&)> m_get_block_by_index;
public:
- CZMQPublishRawBlockNotifier(std::function<bool(CBlock&, const CBlockIndex&)> get_block_by_index)
+ CZMQPublishRawBlockNotifier(std::function<bool(std::vector<uint8_t>&, const CBlockIndex&)> get_block_by_index)
: m_get_block_by_index{std::move(get_block_by_index)} {}
bool NotifyBlock(const CBlockIndex *pindex) override;
};
diff --git a/test/functional/feature_abortnode.py b/test/functional/feature_abortnode.py
index 740d3b7f0e..01ba2834c4 100755
--- a/test/functional/feature_abortnode.py
+++ b/test/functional/feature_abortnode.py
@@ -36,7 +36,7 @@ class AbortNodeTest(BitcoinTestFramework):
# Check that node0 aborted
self.log.info("Waiting for crash")
- self.nodes[0].wait_until_stopped(timeout=5, expect_error=True, expected_stderr="Error: A fatal internal error occurred, see debug.log for details")
+ self.nodes[0].wait_until_stopped(timeout=5, expect_error=True, expected_stderr="Error: A fatal internal error occurred, see debug.log for details: Failed to disconnect block.")
self.log.info("Node crashed - now verifying restart fails")
self.nodes[0].assert_start_raises_init_error()
diff --git a/test/functional/feature_addrman.py b/test/functional/feature_addrman.py
index a7ce864fde..95d33d62ea 100755
--- a/test/functional/feature_addrman.py
+++ b/test/functional/feature_addrman.py
@@ -156,12 +156,7 @@ class AddrmanTest(BitcoinTestFramework):
)
self.log.info("Check that missing addrman is recreated")
- self.stop_node(0)
- os.remove(peers_dat)
- with self.nodes[0].assert_debug_log([
- f'Creating peers.dat because the file was not found ("{peers_dat}")',
- ]):
- self.start_node(0)
+ self.restart_node(0, clear_addrman=True)
assert_equal(self.nodes[0].getnodeaddresses(), [])
diff --git a/test/functional/feature_asmap.py b/test/functional/feature_asmap.py
index ae483fe449..024a8fa18c 100755
--- a/test/functional/feature_asmap.py
+++ b/test/functional/feature_asmap.py
@@ -39,11 +39,12 @@ def expected_messages(filename):
class AsmapTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 1
- self.extra_args = [["-checkaddrman=1"]] # Do addrman checks on all operations.
+ # Do addrman checks on all operations and use deterministic addrman
+ self.extra_args = [["-checkaddrman=1", "-test=addrman"]]
def fill_addrman(self, node_id):
- """Add 1 tried address to the addrman, followed by 1 new address."""
- for addr, tried in [[0, True], [1, False]]:
+ """Add 2 tried addresses to the addrman, followed by 2 new addresses."""
+ for addr, tried in [[0, True], [1, True], [2, False], [3, False]]:
self.nodes[node_id].addpeeraddress(address=f"101.{addr}.0.0", tried=tried, port=8333)
def test_without_asmap_arg(self):
@@ -84,12 +85,12 @@ class AsmapTest(BitcoinTestFramework):
self.log.info("Test bitcoind -asmap restart with addrman containing new and tried entries")
self.stop_node(0)
shutil.copyfile(self.asmap_raw, self.default_asmap)
- self.start_node(0, ["-asmap", "-checkaddrman=1"])
+ self.start_node(0, ["-asmap", "-checkaddrman=1", "-test=addrman"])
self.fill_addrman(node_id=0)
- self.restart_node(0, ["-asmap", "-checkaddrman=1"])
+ self.restart_node(0, ["-asmap", "-checkaddrman=1", "-test=addrman"])
with self.node.assert_debug_log(
expected_msgs=[
- "CheckAddrman: new 1, tried 1, total 2 started",
+ "CheckAddrman: new 2, tried 2, total 4 started",
"CheckAddrman: completed",
]
):
@@ -114,7 +115,7 @@ class AsmapTest(BitcoinTestFramework):
def test_asmap_health_check(self):
self.log.info('Test bitcoind -asmap logs ASMap Health Check with basic stats')
shutil.copyfile(self.asmap_raw, self.default_asmap)
- msg = "ASMap Health Check: 2 clearnet peers are mapped to 1 ASNs with 0 peers being unmapped"
+ msg = "ASMap Health Check: 4 clearnet peers are mapped to 3 ASNs with 0 peers being unmapped"
with self.node.assert_debug_log(expected_msgs=[msg]):
self.start_node(0, extra_args=['-asmap'])
os.remove(self.default_asmap)
diff --git a/test/functional/feature_assumeutxo.py b/test/functional/feature_assumeutxo.py
index 528680f2ca..3e882f47b8 100755
--- a/test/functional/feature_assumeutxo.py
+++ b/test/functional/feature_assumeutxo.py
@@ -34,6 +34,7 @@ Interesting starting states could be loading a snapshot when the current chain t
"""
from shutil import rmtree
+from dataclasses import dataclass
from test_framework.messages import tx_from_hex
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import (
@@ -60,7 +61,7 @@ class AssumeutxoTest(BitcoinTestFramework):
self.extra_args = [
[],
["-fastprune", "-prune=1", "-blockfilterindex=1", "-coinstatsindex=1"],
- ["-txindex=1", "-blockfilterindex=1", "-coinstatsindex=1"],
+ ["-persistmempool=0","-txindex=1", "-blockfilterindex=1", "-coinstatsindex=1"],
]
def setup_network(self):
@@ -113,6 +114,12 @@ class AssumeutxoTest(BitcoinTestFramework):
f.write(valid_snapshot_contents[(32 + 8 + offset + len(content)):])
expected_error(log_msg=f"[snapshot] bad snapshot content hash: expected a4bf3407ccb2cc0145c49ebba8fa91199f8a3903daf0883875941497d2493c27, got {wrong_hash}")
+ def test_headers_not_synced(self, valid_snapshot_path):
+ for node in self.nodes[1:]:
+ assert_raises_rpc_error(-32603, "The base block header (3bb7ce5eba0be48939b7a521ac1ba9316afee2c7bada3a0cca24188e6d7d96c0) must appear in the headers chain. Make sure all headers are syncing, and call this RPC again.",
+ node.loadtxoutset,
+ valid_snapshot_path)
+
def test_invalid_chainstate_scenarios(self):
self.log.info("Test different scenarios of invalid snapshot chainstate in datadir")
@@ -127,7 +134,7 @@ class AssumeutxoTest(BitcoinTestFramework):
with self.nodes[0].assert_debug_log([log_msg]):
self.nodes[0].assert_start_raises_init_error(expected_msg=error_msg)
- expected_error_msg = f"Error: A fatal internal error occurred, see debug.log for details"
+ expected_error_msg = f"Error: A fatal internal error occurred, see debug.log for details: Assumeutxo data not found for the given blockhash '7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a'."
error_details = f"Assumeutxo data not found for the given blockhash"
expected_error(log_msg=error_details, error_msg=expected_error_msg)
@@ -135,6 +142,19 @@ class AssumeutxoTest(BitcoinTestFramework):
rmtree(chainstate_snapshot_path)
self.start_node(0)
+ def test_invalid_mempool_state(self, dump_output_path):
+ self.log.info("Test bitcoind should fail when mempool not empty.")
+ node=self.nodes[2]
+ tx = MiniWallet(node).send_self_transfer(from_node=node)
+
+ assert tx['txid'] in node.getrawmempool()
+
+ # Attempt to load the snapshot on Node 2 and expect it to fail
+ with node.assert_debug_log(expected_msgs=["[snapshot] can't activate a snapshot when mempool not empty"]):
+ assert_raises_rpc_error(-32603, "Unable to load UTXO snapshot", node.loadtxoutset, dump_output_path)
+
+ self.restart_node(2, extra_args=self.extra_args[2])
+
def run_test(self):
"""
Bring up two (disconnected) nodes, mine some new blocks on the first,
@@ -153,26 +173,28 @@ class AssumeutxoTest(BitcoinTestFramework):
for n in self.nodes:
n.setmocktime(n.getblockheader(n.getbestblockhash())['time'])
- self.sync_blocks()
-
# Generate a series of blocks that `n0` will have in the snapshot,
- # but that n1 doesn't yet see. In order for the snapshot to activate,
- # though, we have to ferry over the new headers to n1 so that it
- # isn't waiting forever to see the header of the snapshot's base block
- # while disconnected from n0.
+ # but that n1 and n2 don't yet see.
+ assert n0.getblockcount() == START_HEIGHT
+ blocks = {START_HEIGHT: Block(n0.getbestblockhash(), 1, START_HEIGHT + 1)}
for i in range(100):
+ block_tx = 1
if i % 3 == 0:
self.mini_wallet.send_self_transfer(from_node=n0)
+ block_tx += 1
self.generate(n0, nblocks=1, sync_fun=self.no_op)
- newblock = n0.getblock(n0.getbestblockhash(), 0)
-
- # make n1 aware of the new header, but don't give it the block.
- n1.submitheader(newblock)
- n2.submitheader(newblock)
+ height = n0.getblockcount()
+ hash = n0.getbestblockhash()
+ blocks[height] = Block(hash, block_tx, blocks[height-1].chain_tx + block_tx)
+ if i == 4:
+ # Create a stale block that forks off the main chain before the snapshot.
+ temp_invalid = n0.getbestblockhash()
+ n0.invalidateblock(temp_invalid)
+ stale_hash = self.generateblock(n0, output="raw(aaaa)", transactions=[], sync_fun=self.no_op)["hash"]
+ n0.invalidateblock(stale_hash)
+ n0.reconsiderblock(temp_invalid)
+ stale_block = n0.getblock(stale_hash, 0)
- # Ensure everyone is seeing the same headers.
- for n in self.nodes:
- assert_equal(n.getblockchaininfo()["headers"], SNAPSHOT_BASE_HEIGHT)
self.log.info("-- Testing assumeutxo + some indexes + pruning")
@@ -182,10 +204,27 @@ class AssumeutxoTest(BitcoinTestFramework):
self.log.info(f"Creating a UTXO snapshot at height {SNAPSHOT_BASE_HEIGHT}")
dump_output = n0.dumptxoutset('utxos.dat')
+ self.log.info("Test loading snapshot when headers are not synced")
+ self.test_headers_not_synced(dump_output['path'])
+
+ # In order for the snapshot to activate, we have to ferry over the new
+ # headers to n1 and n2 so that they see the header of the snapshot's
+ # base block while disconnected from n0.
+ for i in range(1, 300):
+ block = n0.getblock(n0.getblockhash(i), 0)
+ # make n1 and n2 aware of the new header, but don't give them the
+ # block.
+ n1.submitheader(block)
+ n2.submitheader(block)
+
+ # Ensure everyone is seeing the same headers.
+ for n in self.nodes:
+ assert_equal(n.getblockchaininfo()["headers"], SNAPSHOT_BASE_HEIGHT)
+
assert_equal(
dump_output['txoutset_hash'],
"a4bf3407ccb2cc0145c49ebba8fa91199f8a3903daf0883875941497d2493c27")
- assert_equal(dump_output["nchaintx"], 334)
+ assert_equal(dump_output["nchaintx"], blocks[SNAPSHOT_BASE_HEIGHT].chain_tx)
assert_equal(n0.getblockchaininfo()["blocks"], SNAPSHOT_BASE_HEIGHT)
# Mine more blocks on top of the snapshot that n1 hasn't yet seen. This
@@ -197,6 +236,7 @@ class AssumeutxoTest(BitcoinTestFramework):
assert_equal(n0.getblockchaininfo()["blocks"], FINAL_HEIGHT)
+ self.test_invalid_mempool_state(dump_output['path'])
self.test_invalid_snapshot_scenarios(dump_output['path'])
self.test_invalid_chainstate_scenarios()
@@ -205,6 +245,29 @@ class AssumeutxoTest(BitcoinTestFramework):
assert_equal(loaded['coins_loaded'], SNAPSHOT_BASE_HEIGHT)
assert_equal(loaded['base_height'], SNAPSHOT_BASE_HEIGHT)
+ def check_tx_counts(final: bool) -> None:
+ """Check nTx and nChainTx intermediate values right after loading
+ the snapshot, and final values after the snapshot is validated."""
+ for height, block in blocks.items():
+ tx = n1.getblockheader(block.hash)["nTx"]
+ chain_tx = n1.getchaintxstats(nblocks=1, blockhash=block.hash)["txcount"]
+
+ # Intermediate nTx of the starting block should be set, but nTx of
+ # later blocks should be 0 before they are downloaded.
+ if final or height == START_HEIGHT:
+ assert_equal(tx, block.tx)
+ else:
+ assert_equal(tx, 0)
+
+ # Intermediate nChainTx of the starting block and snapshot block
+ # should be set, but others should be 0 until they are downloaded.
+ if final or height in (START_HEIGHT, SNAPSHOT_BASE_HEIGHT):
+ assert_equal(chain_tx, block.chain_tx)
+ else:
+ assert_equal(chain_tx, 0)
+
+ check_tx_counts(final=False)
+
normal, snapshot = n1.getchainstates()["chainstates"]
assert_equal(normal['blocks'], START_HEIGHT)
assert_equal(normal.get('snapshot_blockhash'), None)
@@ -215,6 +278,15 @@ class AssumeutxoTest(BitcoinTestFramework):
assert_equal(n1.getblockchaininfo()["blocks"], SNAPSHOT_BASE_HEIGHT)
+ self.log.info("Submit a stale block that forked off the chain before the snapshot")
+ # Normally a block like this would not be downloaded, but if it is
+ # submitted early before the background chain catches up to the fork
+ # point, it winds up in m_blocks_unlinked and triggers a corner case
+ # that previously crashed CheckBlockIndex.
+ n1.submitblock(stale_block)
+ n1.getchaintips()
+ n1.getblock(stale_hash)
+
self.log.info("Submit a spending transaction for a snapshot chainstate coin to the mempool")
# spend the coinbase output of the first block that is not available on node1
spend_coin_blockhash = n1.getblockhash(START_HEIGHT + 1)
@@ -252,6 +324,16 @@ class AssumeutxoTest(BitcoinTestFramework):
self.log.info("Restarted node before snapshot validation completed, reloading...")
self.restart_node(1, extra_args=self.extra_args[1])
+
+ # Send snapshot block to n1 out of order. This makes the test less
+ # realistic because normally the snapshot block is one of the last
+ # blocks downloaded, but its useful to test because it triggers more
+ # corner cases in ReceivedBlockTransactions() and CheckBlockIndex()
+ # setting and testing nChainTx values, and it exposed previous bugs.
+ snapshot_hash = n0.getblockhash(SNAPSHOT_BASE_HEIGHT)
+ snapshot_block = n0.getblock(snapshot_hash, 0)
+ n1.submitblock(snapshot_block)
+
self.connect_nodes(0, 1)
self.log.info(f"Ensuring snapshot chain syncs to tip. ({FINAL_HEIGHT})")
@@ -268,6 +350,8 @@ class AssumeutxoTest(BitcoinTestFramework):
}
self.wait_until(lambda: n1.getindexinfo() == completed_idx_state)
+ self.log.info("Re-check nTx and nChainTx values")
+ check_tx_counts(final=True)
for i in (0, 1):
n = self.nodes[i]
@@ -342,6 +426,11 @@ class AssumeutxoTest(BitcoinTestFramework):
self.connect_nodes(0, 2)
self.wait_until(lambda: n2.getblockcount() == FINAL_HEIGHT)
+@dataclass
+class Block:
+ hash: str
+ tx: int
+ chain_tx: int
if __name__ == '__main__':
AssumeutxoTest().main()
diff --git a/test/functional/feature_assumevalid.py b/test/functional/feature_assumevalid.py
index 613d2eab14..982fa79915 100755
--- a/test/functional/feature_assumevalid.py
+++ b/test/functional/feature_assumevalid.py
@@ -159,7 +159,7 @@ class AssumeValidTest(BitcoinTestFramework):
for i in range(2202):
p2p1.send_message(msg_block(self.blocks[i]))
# Syncing 2200 blocks can take a while on slow systems. Give it plenty of time to sync.
- p2p1.sync_with_ping(960)
+ p2p1.sync_with_ping(timeout=960)
assert_equal(self.nodes[1].getblock(self.nodes[1].getbestblockhash())['height'], 2202)
p2p2 = self.nodes[2].add_p2p_connection(BaseNode())
diff --git a/test/functional/feature_block.py b/test/functional/feature_block.py
index 58ef1e761d..8a95975184 100755
--- a/test/functional/feature_block.py
+++ b/test/functional/feature_block.py
@@ -1263,6 +1263,10 @@ class FullBlockTest(BitcoinTestFramework):
b89a = self.update_block("89a", [tx])
self.send_blocks([b89a], success=False, reject_reason='bad-txns-inputs-missingorspent', reconnect=True)
+ # Don't use v2transport for the large reorg, which is too slow with the unoptimized python ChaCha20 implementation
+ if self.options.v2transport:
+ self.nodes[0].disconnect_p2ps()
+ self.helper_peer = self.nodes[0].add_p2p_connection(P2PDataStore(), supports_v2_p2p=False)
self.log.info("Test a re-org of one week's worth of blocks (1088 blocks)")
self.move_tip(88)
diff --git a/test/functional/feature_cltv.py b/test/functional/feature_cltv.py
index 8c45fb5a4d..fb3f662271 100755
--- a/test/functional/feature_cltv.py
+++ b/test/functional/feature_cltv.py
@@ -83,9 +83,10 @@ CLTV_HEIGHT = 111
class BIP65Test(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 1
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.extra_args = [[
f'-testactivationheight=cltv@{CLTV_HEIGHT}',
- '-whitelist=noban@127.0.0.1',
'-par=1', # Use only one script thread to get the exact reject reason for testing
'-acceptnonstdtxn=1', # cltv_invalidate is nonstandard
]]
diff --git a/test/functional/feature_csv_activation.py b/test/functional/feature_csv_activation.py
index 92e4187f3c..bc1f9e8f2f 100755
--- a/test/functional/feature_csv_activation.py
+++ b/test/functional/feature_csv_activation.py
@@ -95,8 +95,9 @@ class BIP68_112_113Test(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 1
self.setup_clean_chain = True
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.extra_args = [[
- '-whitelist=noban@127.0.0.1',
f'-testactivationheight=csv@{CSV_ACTIVATION_HEIGHT}',
'-par=1', # Use only one script thread to get the exact reject reason for testing
]]
diff --git a/test/functional/feature_dersig.py b/test/functional/feature_dersig.py
index 44c12b2a59..035e7151ca 100755
--- a/test/functional/feature_dersig.py
+++ b/test/functional/feature_dersig.py
@@ -47,9 +47,10 @@ DERSIG_HEIGHT = 102
class BIP66Test(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 1
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.extra_args = [[
f'-testactivationheight=dersig@{DERSIG_HEIGHT}',
- '-whitelist=noban@127.0.0.1',
'-par=1', # Use only one script thread to get the exact log msg for testing
]]
self.setup_clean_chain = True
diff --git a/test/functional/feature_fee_estimation.py b/test/functional/feature_fee_estimation.py
index 4f56d585d3..ffc87f8b8b 100755
--- a/test/functional/feature_fee_estimation.py
+++ b/test/functional/feature_fee_estimation.py
@@ -132,11 +132,12 @@ def make_tx(wallet, utxo, feerate):
class EstimateFeeTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 3
- # Force fSendTrickle to true (via whitelist.noban)
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.extra_args = [
- ["-whitelist=noban@127.0.0.1"],
- ["-whitelist=noban@127.0.0.1", "-blockmaxweight=68000"],
- ["-whitelist=noban@127.0.0.1", "-blockmaxweight=32000"],
+ [],
+ ["-blockmaxweight=68000"],
+ ["-blockmaxweight=32000"],
]
def setup_network(self):
diff --git a/test/functional/feature_index_prune.py b/test/functional/feature_index_prune.py
index d6e802b399..b3bf35b524 100755
--- a/test/functional/feature_index_prune.py
+++ b/test/functional/feature_index_prune.py
@@ -128,7 +128,7 @@ class FeatureIndexPruneTest(BitcoinTestFramework):
self.log.info("make sure we get an init error when starting the nodes again with the indices")
filter_msg = "Error: basic block filter index best block of the index goes beyond pruned data. Please disable the index or reindex (which will download the whole blockchain again)"
stats_msg = "Error: coinstatsindex best block of the index goes beyond pruned data. Please disable the index or reindex (which will download the whole blockchain again)"
- end_msg = f"{os.linesep}Error: Failed to start indexes, shutting down.."
+ end_msg = f"{os.linesep}Error: A fatal internal error occurred, see debug.log for details: Failed to start indexes, shutting down.."
for i, msg in enumerate([filter_msg, stats_msg, filter_msg]):
self.nodes[i].assert_start_raises_init_error(extra_args=self.extra_args[i], expected_msg=msg+end_msg)
diff --git a/test/functional/feature_maxuploadtarget.py b/test/functional/feature_maxuploadtarget.py
index 814eb21e6f..39cff7b738 100755
--- a/test/functional/feature_maxuploadtarget.py
+++ b/test/functional/feature_maxuploadtarget.py
@@ -81,7 +81,8 @@ class MaxUploadTest(BitcoinTestFramework):
p2p_conns = []
for _ in range(3):
- p2p_conns.append(self.nodes[0].add_p2p_connection(TestP2PConn()))
+ # Don't use v2transport in this test (too slow with the unoptimized python ChaCha20 implementation)
+ p2p_conns.append(self.nodes[0].add_p2p_connection(TestP2PConn(), supports_v2_p2p=False))
# Now mine a big block
mine_large_block(self, self.wallet, self.nodes[0])
@@ -173,7 +174,7 @@ class MaxUploadTest(BitcoinTestFramework):
self.assert_uploadtarget_state(target_reached=False, serve_historical_blocks=False)
# Reconnect to self.nodes[0]
- peer = self.nodes[0].add_p2p_connection(TestP2PConn())
+ peer = self.nodes[0].add_p2p_connection(TestP2PConn(), supports_v2_p2p=False)
# Sending mempool message shouldn't disconnect peer, as total limit isn't reached yet
peer.send_and_ping(msg_mempool())
diff --git a/test/functional/feature_proxy.py b/test/functional/feature_proxy.py
index 662007d65e..7a6f639021 100755
--- a/test/functional/feature_proxy.py
+++ b/test/functional/feature_proxy.py
@@ -17,6 +17,7 @@ Test plan:
- support no authentication (other proxy)
- support no authentication + user/pass authentication (Tor)
- proxy on IPv6
+ - proxy over unix domain sockets
- Create various proxies (as threads)
- Create nodes that connect to them
@@ -39,7 +40,9 @@ addnode connect to a CJDNS address
- Test passing unknown -onlynet
"""
+import os
import socket
+import tempfile
from test_framework.socks5 import Socks5Configuration, Socks5Command, Socks5Server, AddressType
from test_framework.test_framework import BitcoinTestFramework
@@ -47,7 +50,7 @@ from test_framework.util import (
assert_equal,
p2p_port,
)
-from test_framework.netutil import test_ipv6_local
+from test_framework.netutil import test_ipv6_local, test_unix_socket
# Networks returned by RPC getpeerinfo.
NET_UNROUTABLE = "not_publicly_routable"
@@ -60,14 +63,17 @@ NET_CJDNS = "cjdns"
# Networks returned by RPC getnetworkinfo, defined in src/rpc/net.cpp::GetNetworksInfo()
NETWORKS = frozenset({NET_IPV4, NET_IPV6, NET_ONION, NET_I2P, NET_CJDNS})
+# Use the shortest temp path possible since UNIX sockets may have as little as 92-char limit
+socket_path = tempfile.NamedTemporaryFile().name
class ProxyTest(BitcoinTestFramework):
def set_test_params(self):
- self.num_nodes = 5
+ self.num_nodes = 7
self.setup_clean_chain = True
def setup_nodes(self):
self.have_ipv6 = test_ipv6_local()
+ self.have_unix_sockets = test_unix_socket()
# Create two proxies on different ports
# ... one unauthenticated
self.conf1 = Socks5Configuration()
@@ -89,6 +95,15 @@ class ProxyTest(BitcoinTestFramework):
else:
self.log.warning("Testing without local IPv6 support")
+ if self.have_unix_sockets:
+ self.conf4 = Socks5Configuration()
+ self.conf4.af = socket.AF_UNIX
+ self.conf4.addr = socket_path
+ self.conf4.unauth = True
+ self.conf4.auth = True
+ else:
+ self.log.warning("Testing without local unix domain sockets support")
+
self.serv1 = Socks5Server(self.conf1)
self.serv1.start()
self.serv2 = Socks5Server(self.conf2)
@@ -96,6 +111,9 @@ class ProxyTest(BitcoinTestFramework):
if self.have_ipv6:
self.serv3 = Socks5Server(self.conf3)
self.serv3.start()
+ if self.have_unix_sockets:
+ self.serv4 = Socks5Server(self.conf4)
+ self.serv4.start()
# We will not try to connect to this.
self.i2p_sam = ('127.0.0.1', 7656)
@@ -109,10 +127,15 @@ class ProxyTest(BitcoinTestFramework):
['-listen', f'-proxy={self.conf2.addr[0]}:{self.conf2.addr[1]}','-proxyrandomize=1'],
[],
['-listen', f'-proxy={self.conf1.addr[0]}:{self.conf1.addr[1]}','-proxyrandomize=1',
- '-cjdnsreachable']
+ '-cjdnsreachable'],
+ [],
+ []
]
if self.have_ipv6:
args[3] = ['-listen', f'-proxy=[{self.conf3.addr[0]}]:{self.conf3.addr[1]}','-proxyrandomize=0', '-noonion']
+ if self.have_unix_sockets:
+ args[5] = ['-listen', f'-proxy=unix:{socket_path}']
+ args[6] = ['-listen', f'-onion=unix:{socket_path}']
self.add_nodes(self.num_nodes, extra_args=args)
self.start_nodes()
@@ -124,7 +147,7 @@ class ProxyTest(BitcoinTestFramework):
def node_test(self, node, *, proxies, auth, test_onion, test_cjdns):
rv = []
addr = "15.61.23.23:1234"
- self.log.debug(f"Test: outgoing IPv4 connection through node for address {addr}")
+ self.log.debug(f"Test: outgoing IPv4 connection through node {node.index} for address {addr}")
node.addnode(addr, "onetry")
cmd = proxies[0].queue.get()
assert isinstance(cmd, Socks5Command)
@@ -140,7 +163,7 @@ class ProxyTest(BitcoinTestFramework):
if self.have_ipv6:
addr = "[1233:3432:2434:2343:3234:2345:6546:4534]:5443"
- self.log.debug(f"Test: outgoing IPv6 connection through node for address {addr}")
+ self.log.debug(f"Test: outgoing IPv6 connection through node {node.index} for address {addr}")
node.addnode(addr, "onetry")
cmd = proxies[1].queue.get()
assert isinstance(cmd, Socks5Command)
@@ -156,7 +179,7 @@ class ProxyTest(BitcoinTestFramework):
if test_onion:
addr = "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion:8333"
- self.log.debug(f"Test: outgoing onion connection through node for address {addr}")
+ self.log.debug(f"Test: outgoing onion connection through node {node.index} for address {addr}")
node.addnode(addr, "onetry")
cmd = proxies[2].queue.get()
assert isinstance(cmd, Socks5Command)
@@ -171,7 +194,7 @@ class ProxyTest(BitcoinTestFramework):
if test_cjdns:
addr = "[fc00:1:2:3:4:5:6:7]:8888"
- self.log.debug(f"Test: outgoing CJDNS connection through node for address {addr}")
+ self.log.debug(f"Test: outgoing CJDNS connection through node {node.index} for address {addr}")
node.addnode(addr, "onetry")
cmd = proxies[1].queue.get()
assert isinstance(cmd, Socks5Command)
@@ -185,7 +208,7 @@ class ProxyTest(BitcoinTestFramework):
self.network_test(node, addr, network=NET_CJDNS)
addr = "node.noumenon:8333"
- self.log.debug(f"Test: outgoing DNS name connection through node for address {addr}")
+ self.log.debug(f"Test: outgoing DNS name connection through node {node.index} for address {addr}")
node.addnode(addr, "onetry")
cmd = proxies[3].queue.get()
assert isinstance(cmd, Socks5Command)
@@ -230,6 +253,12 @@ class ProxyTest(BitcoinTestFramework):
proxies=[self.serv1, self.serv1, self.serv1, self.serv1],
auth=False, test_onion=True, test_cjdns=True)
+ if self.have_unix_sockets:
+ self.node_test(self.nodes[5],
+ proxies=[self.serv4, self.serv4, self.serv4, self.serv4],
+ auth=True, test_onion=True, test_cjdns=False)
+
+
def networks_dict(d):
r = {}
for x in d['networks']:
@@ -315,6 +344,37 @@ class ProxyTest(BitcoinTestFramework):
assert_equal(n4['i2p']['reachable'], False)
assert_equal(n4['cjdns']['reachable'], True)
+ if self.have_unix_sockets:
+ n5 = networks_dict(nodes_network_info[5])
+ assert_equal(NETWORKS, n5.keys())
+ for net in NETWORKS:
+ if net == NET_I2P:
+ expected_proxy = ''
+ expected_randomize = False
+ else:
+ expected_proxy = 'unix:' + self.conf4.addr # no port number
+ expected_randomize = True
+ assert_equal(n5[net]['proxy'], expected_proxy)
+ assert_equal(n5[net]['proxy_randomize_credentials'], expected_randomize)
+ assert_equal(n5['onion']['reachable'], True)
+ assert_equal(n5['i2p']['reachable'], False)
+ assert_equal(n5['cjdns']['reachable'], False)
+
+ n6 = networks_dict(nodes_network_info[6])
+ assert_equal(NETWORKS, n6.keys())
+ for net in NETWORKS:
+ if net != NET_ONION:
+ expected_proxy = ''
+ expected_randomize = False
+ else:
+ expected_proxy = 'unix:' + self.conf4.addr # no port number
+ expected_randomize = True
+ assert_equal(n6[net]['proxy'], expected_proxy)
+ assert_equal(n6[net]['proxy_randomize_credentials'], expected_randomize)
+ assert_equal(n6['onion']['reachable'], True)
+ assert_equal(n6['i2p']['reachable'], False)
+ assert_equal(n6['cjdns']['reachable'], False)
+
self.stop_node(1)
self.log.info("Test passing invalid -proxy hostname raises expected init error")
@@ -383,6 +443,18 @@ class ProxyTest(BitcoinTestFramework):
msg = "Error: Unknown network specified in -onlynet: 'abc'"
self.nodes[1].assert_start_raises_init_error(expected_msg=msg)
+ self.log.info("Test passing too-long unix path to -proxy raises init error")
+ self.nodes[1].extra_args = [f"-proxy=unix:{'x' * 1000}"]
+ if self.have_unix_sockets:
+ msg = f"Error: Invalid -proxy address or hostname: 'unix:{'x' * 1000}'"
+ else:
+ # If unix sockets are not supported, the file path is incorrectly interpreted as host:port
+ msg = f"Error: Invalid port specified in -proxy: 'unix:{'x' * 1000}'"
+ self.nodes[1].assert_start_raises_init_error(expected_msg=msg)
+
+ # Cleanup socket path we established outside the individual test directory.
+ if self.have_unix_sockets:
+ os.unlink(socket_path)
if __name__ == '__main__':
ProxyTest().main()
diff --git a/test/functional/feature_reindex_readonly.py b/test/functional/feature_reindex_readonly.py
index dd99c3c4fa..25cff87a3b 100755
--- a/test/functional/feature_reindex_readonly.py
+++ b/test/functional/feature_reindex_readonly.py
@@ -24,6 +24,7 @@ class BlockstoreReindexTest(BitcoinTestFramework):
opreturn = "6a"
nulldata = fastprune_blockfile_size * "ff"
self.generateblock(self.nodes[0], output=f"raw({opreturn}{nulldata})", transactions=[])
+ block_count = self.nodes[0].getblockcount()
self.stop_node(0)
assert (self.nodes[0].chain_path / "blocks" / "blk00000.dat").exists()
@@ -73,10 +74,10 @@ class BlockstoreReindexTest(BitcoinTestFramework):
pass
if undo_immutable:
- self.log.info("Attempt to restart and reindex the node with the unwritable block file")
- with self.nodes[0].assert_debug_log(expected_msgs=['FlushStateToDisk', 'failed to open file'], unexpected_msgs=[]):
- self.nodes[0].assert_start_raises_init_error(extra_args=['-reindex', '-fastprune'],
- expected_msg="Error: A fatal internal error occurred, see debug.log for details")
+ self.log.debug("Attempt to restart and reindex the node with the unwritable block file")
+ with self.nodes[0].wait_for_debug_log([b"Reindexing finished"]):
+ self.start_node(0, extra_args=['-reindex', '-fastprune'])
+ assert block_count == self.nodes[0].getblockcount()
undo_immutable()
filename.chmod(0o777)
diff --git a/test/functional/feature_utxo_set_hash.py b/test/functional/feature_utxo_set_hash.py
index be154b411f..0bdcc6d83d 100755
--- a/test/functional/feature_utxo_set_hash.py
+++ b/test/functional/feature_utxo_set_hash.py
@@ -4,8 +4,6 @@
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Test UTXO set hash value calculation in gettxoutsetinfo."""
-import struct
-
from test_framework.messages import (
CBlock,
COutPoint,
@@ -58,7 +56,7 @@ class UTXOSetHashTest(BitcoinTestFramework):
continue
data = COutPoint(int(tx.rehash(), 16), n).serialize()
- data += struct.pack("<i", height * 2 + coinbase)
+ data += (height * 2 + coinbase).to_bytes(4, "little")
data += tx_out.serialize()
muhash.insert(data)
diff --git a/test/functional/interface_rest.py b/test/functional/interface_rest.py
index b81eae2506..ae8d6b226d 100755
--- a/test/functional/interface_rest.py
+++ b/test/functional/interface_rest.py
@@ -53,8 +53,7 @@ class RESTTest (BitcoinTestFramework):
self.num_nodes = 2
self.extra_args = [["-rest", "-blockfilterindex=1"], []]
# whitelist peers to speed up tx relay / mempool sync
- for args in self.extra_args:
- args.append("-whitelist=noban@127.0.0.1")
+ self.noban_tx_relay = True
self.supports_cli = False
def test_rest_request(
@@ -337,6 +336,9 @@ class RESTTest (BitcoinTestFramework):
assert_greater_than(json_obj['bytes'], 300)
mempool_info = self.nodes[0].getmempoolinfo()
+ # pop unstable unbroadcastcount before check
+ for obj in [json_obj, mempool_info]:
+ obj.pop("unbroadcastcount")
assert_equal(json_obj, mempool_info)
# Check that there are our submitted transactions in the TX memory pool
diff --git a/test/functional/interface_zmq.py b/test/functional/interface_zmq.py
index 2358dd4387..3c3ff1e4a0 100755
--- a/test/functional/interface_zmq.py
+++ b/test/functional/interface_zmq.py
@@ -5,6 +5,7 @@
"""Test the ZMQ notification interface."""
import struct
from time import sleep
+from io import BytesIO
from test_framework.address import (
ADDRESS_BCRT1_P2WSH_OP_TRUE,
@@ -17,6 +18,7 @@ from test_framework.blocktools import (
)
from test_framework.test_framework import BitcoinTestFramework
from test_framework.messages import (
+ CBlock,
hash256,
tx_from_hex,
)
@@ -104,9 +106,8 @@ class ZMQTestSetupBlock:
class ZMQTest (BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 2
- # This test isn't testing txn relay/timing, so set whitelist on the
- # peers for instant txn relay. This speeds up the test run time 2-3x.
- self.extra_args = [["-whitelist=noban@127.0.0.1"]] * self.num_nodes
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.zmq_port_base = p2p_port(self.num_nodes + 1)
def skip_test_if_missing_module(self):
@@ -138,8 +139,7 @@ class ZMQTest (BitcoinTestFramework):
socket.setsockopt(zmq.IPV6, 1)
subscribers.append(ZMQSubscriber(socket, topic.encode()))
- self.restart_node(0, [f"-zmqpub{topic}={address}" for topic, address in services] +
- self.extra_args[0])
+ self.restart_node(0, [f"-zmqpub{topic}={address}" for topic, address in services])
for i, sub in enumerate(subscribers):
sub.socket.connect(services[i][1])
@@ -203,8 +203,13 @@ class ZMQTest (BitcoinTestFramework):
assert_equal(tx.hash, txid.hex())
# Should receive the generated raw block.
- block = rawblock.receive()
- assert_equal(genhashes[x], hash256_reversed(block[:80]).hex())
+ hex = rawblock.receive()
+ block = CBlock()
+ block.deserialize(BytesIO(hex))
+ assert block.is_valid()
+ assert_equal(block.vtx[0].hash, tx.hash)
+ assert_equal(len(block.vtx), 1)
+ assert_equal(genhashes[x], hash256_reversed(hex[:80]).hex())
# Should receive the generated block hash.
hash = hashblock.receive().hex()
diff --git a/test/functional/mempool_accept.py b/test/functional/mempool_accept.py
index 8f3aec96a7..272e932fcc 100755
--- a/test/functional/mempool_accept.py
+++ b/test/functional/mempool_accept.py
@@ -90,9 +90,23 @@ class MempoolAcceptanceTest(BitcoinTestFramework):
txid_in_block = self.wallet.sendrawtransaction(from_node=node, tx_hex=raw_tx_in_block)
self.generate(node, 1)
self.mempool_size = 0
+ # Also check feerate. 1BTC/kvB fails
+ assert_raises_rpc_error(-8, "Fee rates larger than or equal to 1BTC/kvB are not accepted", lambda: self.check_mempool_result(
+ result_expected=None,
+ rawtxs=[raw_tx_in_block],
+ maxfeerate=1,
+ ))
+ # Check negative feerate
+ assert_raises_rpc_error(-3, "Amount out of range", lambda: self.check_mempool_result(
+ result_expected=None,
+ rawtxs=[raw_tx_in_block],
+ maxfeerate=-0.01,
+ ))
+ # ... 0.99 passes
self.check_mempool_result(
result_expected=[{'txid': txid_in_block, 'allowed': False, 'reject-reason': 'txn-already-known'}],
rawtxs=[raw_tx_in_block],
+ maxfeerate=0.99,
)
self.log.info('A transaction not in the mempool')
diff --git a/test/functional/mempool_accept_v3.py b/test/functional/mempool_accept_v3.py
index ca599a9993..1b55cd0a0d 100755
--- a/test/functional/mempool_accept_v3.py
+++ b/test/functional/mempool_accept_v3.py
@@ -2,6 +2,7 @@
# Copyright (c) 2024 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+from decimal import Decimal
from test_framework.messages import (
MAX_BIP125_RBF_SEQUENCE,
@@ -14,10 +15,13 @@ from test_framework.util import (
assert_raises_rpc_error,
)
from test_framework.wallet import (
+ COIN,
DEFAULT_FEE,
MiniWallet,
)
+MAX_REPLACEMENT_CANDIDATES = 100
+
def cleanup(extra_args=None):
def decorator(func):
def wrapper(self):
@@ -289,8 +293,13 @@ class MempoolAcceptV3(BitcoinTestFramework):
self.check_mempool([tx_in_mempool["txid"]])
@cleanup(extra_args=["-acceptnonstdtxn=1"])
- def test_mempool_sibling(self):
- self.log.info("Test that v3 transaction cannot have mempool siblings")
+ def test_sibling_eviction_package(self):
+ """
+ When a transaction has a mempool sibling, it may be eligible for sibling eviction.
+ However, this option is only available in single transaction acceptance. It doesn't work in
+ a multi-testmempoolaccept (where RBF is disabled) or when doing package CPFP.
+ """
+ self.log.info("Test v3 sibling eviction in submitpackage and multi-testmempoolaccept")
node = self.nodes[0]
# Add a parent + child to mempool
tx_mempool_parent = self.wallet.send_self_transfer_multi(
@@ -306,26 +315,57 @@ class MempoolAcceptV3(BitcoinTestFramework):
)
self.check_mempool([tx_mempool_parent["txid"], tx_mempool_sibling["txid"]])
- tx_has_mempool_sibling = self.wallet.create_self_transfer(
+ tx_sibling_1 = self.wallet.create_self_transfer(
utxo_to_spend=tx_mempool_parent["new_utxos"][1],
- version=3
+ version=3,
+ fee_rate=DEFAULT_FEE*100,
+ )
+ tx_has_mempool_uncle = self.wallet.create_self_transfer(utxo_to_spend=tx_sibling_1["new_utxo"], version=3)
+
+ tx_sibling_2 = self.wallet.create_self_transfer(
+ utxo_to_spend=tx_mempool_parent["new_utxos"][0],
+ version=3,
+ fee_rate=DEFAULT_FEE*200,
)
- expected_error_mempool_sibling = f"v3-rule-violation, tx {tx_mempool_parent['txid']} (wtxid={tx_mempool_parent['wtxid']}) would exceed descendant count limit"
- assert_raises_rpc_error(-26, expected_error_mempool_sibling, node.sendrawtransaction, tx_has_mempool_sibling["hex"])
- tx_has_mempool_uncle = self.wallet.create_self_transfer(utxo_to_spend=tx_has_mempool_sibling["new_utxo"], version=3)
+ tx_sibling_3 = self.wallet.create_self_transfer(
+ utxo_to_spend=tx_mempool_parent["new_utxos"][1],
+ version=3,
+ fee_rate=0,
+ )
+ tx_bumps_parent_with_sibling = self.wallet.create_self_transfer(
+ utxo_to_spend=tx_sibling_3["new_utxo"],
+ version=3,
+ fee_rate=DEFAULT_FEE*300,
+ )
- # Also fails with another non-related transaction via testmempoolaccept
+ # Fails with another non-related transaction via testmempoolaccept
tx_unrelated = self.wallet.create_self_transfer(version=3)
- result_test_unrelated = node.testmempoolaccept([tx_has_mempool_sibling["hex"], tx_unrelated["hex"]])
+ result_test_unrelated = node.testmempoolaccept([tx_sibling_1["hex"], tx_unrelated["hex"]])
assert_equal(result_test_unrelated[0]["reject-reason"], "v3-rule-violation")
- result_test_1p1c = node.testmempoolaccept([tx_has_mempool_sibling["hex"], tx_has_mempool_uncle["hex"]])
+ # Fails in a package via testmempoolaccept
+ result_test_1p1c = node.testmempoolaccept([tx_sibling_1["hex"], tx_has_mempool_uncle["hex"]])
assert_equal(result_test_1p1c[0]["reject-reason"], "v3-rule-violation")
- # Also fails with a child via submitpackage
- result_submitpackage = node.submitpackage([tx_has_mempool_sibling["hex"], tx_has_mempool_uncle["hex"]])
- assert_equal(result_submitpackage["tx-results"][tx_has_mempool_sibling['wtxid']]['error'], expected_error_mempool_sibling)
+ # Allowed when tx is submitted in a package and evaluated individually.
+ # Note that the child failed since it would be the 3rd generation.
+ result_package_indiv = node.submitpackage([tx_sibling_1["hex"], tx_has_mempool_uncle["hex"]])
+ self.check_mempool([tx_mempool_parent["txid"], tx_sibling_1["txid"]])
+ expected_error_gen3 = f"v3-rule-violation, tx {tx_has_mempool_uncle['txid']} (wtxid={tx_has_mempool_uncle['wtxid']}) would have too many ancestors"
+
+ assert_equal(result_package_indiv["tx-results"][tx_has_mempool_uncle['wtxid']]['error'], expected_error_gen3)
+
+ # Allowed when tx is submitted in a package with in-mempool parent (which is deduplicated).
+ node.submitpackage([tx_mempool_parent["hex"], tx_sibling_2["hex"]])
+ self.check_mempool([tx_mempool_parent["txid"], tx_sibling_2["txid"]])
+
+ # Child cannot pay for sibling eviction for parent, as it violates v3 topology limits
+ result_package_cpfp = node.submitpackage([tx_sibling_3["hex"], tx_bumps_parent_with_sibling["hex"]])
+ self.check_mempool([tx_mempool_parent["txid"], tx_sibling_2["txid"]])
+ expected_error_cpfp = f"v3-rule-violation, tx {tx_mempool_parent['txid']} (wtxid={tx_mempool_parent['wtxid']}) would exceed descendant count limit"
+
+ assert_equal(result_package_cpfp["tx-results"][tx_sibling_3['wtxid']]['error'], expected_error_cpfp)
@cleanup(extra_args=["-datacarriersize=1000", "-acceptnonstdtxn=1"])
@@ -397,11 +437,154 @@ class MempoolAcceptV3(BitcoinTestFramework):
test_accept_2children_with_in_mempool_parent = node.testmempoolaccept([tx_v3_child_1["hex"], tx_v3_child_2["hex"]])
assert all([result["package-error"] == expected_error_extra for result in test_accept_2children_with_in_mempool_parent])
+ @cleanup(extra_args=["-acceptnonstdtxn=1"])
+ def test_reorg_2child_rbf(self):
+ node = self.nodes[0]
+ self.log.info("Test that children of a v3 transaction can be replaced individually, even if there are multiple due to reorg")
+
+ ancestor_tx = self.wallet.send_self_transfer_multi(from_node=node, num_outputs=2, version=3)
+ self.check_mempool([ancestor_tx["txid"]])
+
+ block = self.generate(node, 1)[0]
+ self.check_mempool([])
+
+ child_1 = self.wallet.send_self_transfer(from_node=node, version=3, utxo_to_spend=ancestor_tx["new_utxos"][0])
+ child_2 = self.wallet.send_self_transfer(from_node=node, version=3, utxo_to_spend=ancestor_tx["new_utxos"][1])
+ self.check_mempool([child_1["txid"], child_2["txid"]])
+
+ self.generate(node, 1)
+ self.check_mempool([])
+
+ # Create a reorg, causing ancestor_tx to exceed the 1-child limit
+ node.invalidateblock(block)
+ self.check_mempool([ancestor_tx["txid"], child_1["txid"], child_2["txid"]])
+ assert_equal(node.getmempoolentry(ancestor_tx["txid"])["descendantcount"], 3)
+
+ # Create a replacement of child_1. It does not conflict with child_2.
+ child_1_conflict = self.wallet.send_self_transfer(from_node=node, version=3, utxo_to_spend=ancestor_tx["new_utxos"][0], fee_rate=Decimal("0.01"))
+
+ # Ensure child_1 and child_1_conflict are different transactions
+ assert (child_1_conflict["txid"] != child_1["txid"])
+ self.check_mempool([ancestor_tx["txid"], child_1_conflict["txid"], child_2["txid"]])
+ assert_equal(node.getmempoolentry(ancestor_tx["txid"])["descendantcount"], 3)
+
+ @cleanup(extra_args=["-acceptnonstdtxn=1"])
+ def test_v3_sibling_eviction(self):
+ self.log.info("Test sibling eviction for v3")
+ node = self.nodes[0]
+ tx_v3_parent = self.wallet.send_self_transfer_multi(from_node=node, num_outputs=2, version=3)
+ # This is the sibling to replace
+ tx_v3_child_1 = self.wallet.send_self_transfer(
+ from_node=node, utxo_to_spend=tx_v3_parent["new_utxos"][0], fee_rate=DEFAULT_FEE * 2, version=3
+ )
+ assert tx_v3_child_1["txid"] in node.getrawmempool()
+
+ self.log.info("Test tx must be higher feerate than sibling to evict it")
+ tx_v3_child_2_rule6 = self.wallet.create_self_transfer(
+ utxo_to_spend=tx_v3_parent["new_utxos"][1], fee_rate=DEFAULT_FEE, version=3
+ )
+ rule6_str = f"insufficient fee (including sibling eviction), rejecting replacement {tx_v3_child_2_rule6['txid']}; new feerate"
+ assert_raises_rpc_error(-26, rule6_str, node.sendrawtransaction, tx_v3_child_2_rule6["hex"])
+ self.check_mempool([tx_v3_parent['txid'], tx_v3_child_1['txid']])
+
+ self.log.info("Test tx must meet absolute fee rules to evict sibling")
+ tx_v3_child_2_rule4 = self.wallet.create_self_transfer(
+ utxo_to_spend=tx_v3_parent["new_utxos"][1], fee_rate=2 * DEFAULT_FEE + Decimal("0.00000001"), version=3
+ )
+ rule4_str = f"insufficient fee (including sibling eviction), rejecting replacement {tx_v3_child_2_rule4['txid']}, not enough additional fees to relay"
+ assert_raises_rpc_error(-26, rule4_str, node.sendrawtransaction, tx_v3_child_2_rule4["hex"])
+ self.check_mempool([tx_v3_parent['txid'], tx_v3_child_1['txid']])
+
+ self.log.info("Test tx cannot cause more than 100 evictions including RBF and sibling eviction")
+ # First add 4 groups of 25 transactions.
+ utxos_for_conflict = []
+ txids_v2_100 = []
+ for _ in range(4):
+ confirmed_utxo = self.wallet.get_utxo(confirmed_only=True)
+ utxos_for_conflict.append(confirmed_utxo)
+ # 25 is within descendant limits
+ chain_length = int(MAX_REPLACEMENT_CANDIDATES / 4)
+ chain = self.wallet.create_self_transfer_chain(chain_length=chain_length, utxo_to_spend=confirmed_utxo)
+ for item in chain:
+ txids_v2_100.append(item["txid"])
+ node.sendrawtransaction(item["hex"])
+ self.check_mempool(txids_v2_100 + [tx_v3_parent["txid"], tx_v3_child_1["txid"]])
+
+ # Replacing 100 transactions is fine
+ tx_v3_replacement_only = self.wallet.create_self_transfer_multi(utxos_to_spend=utxos_for_conflict, fee_per_output=4000000)
+ # Override maxfeerate - it costs a lot to replace these 100 transactions.
+ assert node.testmempoolaccept([tx_v3_replacement_only["hex"]], maxfeerate=0)[0]["allowed"]
+ # Adding another one exceeds the limit.
+ utxos_for_conflict.append(tx_v3_parent["new_utxos"][1])
+ tx_v3_child_2_rule5 = self.wallet.create_self_transfer_multi(utxos_to_spend=utxos_for_conflict, fee_per_output=4000000, version=3)
+ rule5_str = f"too many potential replacements (including sibling eviction), rejecting replacement {tx_v3_child_2_rule5['txid']}; too many potential replacements (101 > 100)"
+ assert_raises_rpc_error(-26, rule5_str, node.sendrawtransaction, tx_v3_child_2_rule5["hex"])
+ self.check_mempool(txids_v2_100 + [tx_v3_parent["txid"], tx_v3_child_1["txid"]])
+
+ self.log.info("Test sibling eviction is successful if it meets all RBF rules")
+ tx_v3_child_2 = self.wallet.create_self_transfer(
+ utxo_to_spend=tx_v3_parent["new_utxos"][1], fee_rate=DEFAULT_FEE*10, version=3
+ )
+ node.sendrawtransaction(tx_v3_child_2["hex"])
+ self.check_mempool(txids_v2_100 + [tx_v3_parent["txid"], tx_v3_child_2["txid"]])
+
+ self.log.info("Test that it's possible to do a sibling eviction and RBF at the same time")
+ utxo_unrelated_conflict = self.wallet.get_utxo(confirmed_only=True)
+ tx_unrelated_replacee = self.wallet.send_self_transfer(from_node=node, utxo_to_spend=utxo_unrelated_conflict)
+ assert tx_unrelated_replacee["txid"] in node.getrawmempool()
+
+ fee_to_beat_child2 = int(tx_v3_child_2["fee"] * COIN)
+
+ tx_v3_child_3 = self.wallet.create_self_transfer_multi(
+ utxos_to_spend=[tx_v3_parent["new_utxos"][0], utxo_unrelated_conflict], fee_per_output=fee_to_beat_child2*5, version=3
+ )
+ node.sendrawtransaction(tx_v3_child_3["hex"])
+ self.check_mempool(txids_v2_100 + [tx_v3_parent["txid"], tx_v3_child_3["txid"]])
+
+ @cleanup(extra_args=["-acceptnonstdtxn=1"])
+ def test_reorg_sibling_eviction_1p2c(self):
+ node = self.nodes[0]
+ self.log.info("Test that sibling eviction is not allowed when multiple siblings exist")
+
+ tx_with_multi_children = self.wallet.send_self_transfer_multi(from_node=node, num_outputs=3, version=3, confirmed_only=True)
+ self.check_mempool([tx_with_multi_children["txid"]])
+
+ block_to_disconnect = self.generate(node, 1)[0]
+ self.check_mempool([])
+
+ tx_with_sibling1 = self.wallet.send_self_transfer(from_node=node, version=3, utxo_to_spend=tx_with_multi_children["new_utxos"][0])
+ tx_with_sibling2 = self.wallet.send_self_transfer(from_node=node, version=3, utxo_to_spend=tx_with_multi_children["new_utxos"][1])
+ self.check_mempool([tx_with_sibling1["txid"], tx_with_sibling2["txid"]])
+
+ # Create a reorg, bringing tx_with_multi_children back into the mempool with a descendant count of 3.
+ node.invalidateblock(block_to_disconnect)
+ self.check_mempool([tx_with_multi_children["txid"], tx_with_sibling1["txid"], tx_with_sibling2["txid"]])
+ assert_equal(node.getmempoolentry(tx_with_multi_children["txid"])["descendantcount"], 3)
+
+ # Sibling eviction is not allowed because there are two siblings
+ tx_with_sibling3 = self.wallet.create_self_transfer(
+ version=3,
+ utxo_to_spend=tx_with_multi_children["new_utxos"][2],
+ fee_rate=DEFAULT_FEE*50
+ )
+ expected_error_2siblings = f"v3-rule-violation, tx {tx_with_multi_children['txid']} (wtxid={tx_with_multi_children['wtxid']}) would exceed descendant count limit"
+ assert_raises_rpc_error(-26, expected_error_2siblings, node.sendrawtransaction, tx_with_sibling3["hex"])
+
+ # However, an RBF (with conflicting inputs) is possible even if the resulting cluster size exceeds 2
+ tx_with_sibling3_rbf = self.wallet.send_self_transfer(
+ from_node=node,
+ version=3,
+ utxo_to_spend=tx_with_multi_children["new_utxos"][0],
+ fee_rate=DEFAULT_FEE*50
+ )
+ self.check_mempool([tx_with_multi_children["txid"], tx_with_sibling3_rbf["txid"], tx_with_sibling2["txid"]])
+
+
def run_test(self):
self.log.info("Generate blocks to create UTXOs")
node = self.nodes[0]
self.wallet = MiniWallet(node)
- self.generate(self.wallet, 110)
+ self.generate(self.wallet, 120)
self.test_v3_acceptance()
self.test_v3_replacement()
self.test_v3_bip125()
@@ -409,9 +592,12 @@ class MempoolAcceptV3(BitcoinTestFramework):
self.test_nondefault_package_limits()
self.test_v3_ancestors_package()
self.test_v3_ancestors_package_and_mempool()
- self.test_mempool_sibling()
+ self.test_sibling_eviction_package()
self.test_v3_package_inheritance()
self.test_v3_in_testmempoolaccept()
+ self.test_reorg_2child_rbf()
+ self.test_v3_sibling_eviction()
+ self.test_reorg_sibling_eviction_1p2c()
if __name__ == "__main__":
diff --git a/test/functional/mempool_packages.py b/test/functional/mempool_packages.py
index 95f7939412..dcb66b2ca1 100755
--- a/test/functional/mempool_packages.py
+++ b/test/functional/mempool_packages.py
@@ -27,10 +27,11 @@ assert CUSTOM_DESCENDANT_LIMIT >= CUSTOM_ANCESTOR_LIMIT
class MempoolPackagesTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 2
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.extra_args = [
[
"-maxorphantx=1000",
- "-whitelist=noban@127.0.0.1", # immediate tx relay
],
[
"-maxorphantx=1000",
diff --git a/test/functional/mempool_sigoplimit.py b/test/functional/mempool_sigoplimit.py
index 384423e5f5..d3fb5f9119 100755
--- a/test/functional/mempool_sigoplimit.py
+++ b/test/functional/mempool_sigoplimit.py
@@ -39,7 +39,7 @@ from test_framework.wallet import MiniWallet
from test_framework.wallet_util import generate_keypair
DEFAULT_BYTES_PER_SIGOP = 20 # default setting
-
+MAX_PUBKEYS_PER_MULTISIG = 20
class BytesPerSigOpTest(BitcoinTestFramework):
def set_test_params(self):
@@ -159,13 +159,13 @@ class BytesPerSigOpTest(BitcoinTestFramework):
# Separately, the parent tx is ok
parent_individual_testres = self.nodes[0].testmempoolaccept([tx_parent.serialize().hex()])[0]
assert parent_individual_testres["allowed"]
- # Multisig is counted as MAX_PUBKEYS_PER_MULTISIG = 20 sigops
- assert_equal(parent_individual_testres["vsize"], 5000 * 20)
+ max_multisig_vsize = MAX_PUBKEYS_PER_MULTISIG * 5000
+ assert_equal(parent_individual_testres["vsize"], max_multisig_vsize)
# But together, it's exceeding limits in the *package* context. If sigops adjusted vsize wasn't being checked
# here, it would get further in validation and give too-long-mempool-chain error instead.
packet_test = self.nodes[0].testmempoolaccept([tx_parent.serialize().hex(), tx_child.serialize().hex()])
- expected_package_error = f"package-mempool-limits, package size {2*20*5000} exceeds ancestor size limit [limit: 101000]"
+ expected_package_error = f"package-mempool-limits, package size {2*max_multisig_vsize} exceeds ancestor size limit [limit: 101000]"
assert_equal([x["package-error"] for x in packet_test], [expected_package_error] * 2)
# When we actually try to submit, the parent makes it into the mempool, but the child would exceed ancestor vsize limits
diff --git a/test/functional/p2p_block_sync.py b/test/functional/p2p_block_sync.py
index d821edc1b1..6c7f08364e 100755
--- a/test/functional/p2p_block_sync.py
+++ b/test/functional/p2p_block_sync.py
@@ -22,7 +22,7 @@ class BlockSyncTest(BitcoinTestFramework):
# node0 -> node1 -> node2
# So node1 has both an inbound and outbound peer.
# In our test, we will mine a block on node0, and ensure that it makes
- # to to both node1 and node2.
+ # to both node1 and node2.
self.connect_nodes(0, 1)
self.connect_nodes(1, 2)
diff --git a/test/functional/p2p_compactblocks.py b/test/functional/p2p_compactblocks.py
index d6c06fdeed..0950579580 100755
--- a/test/functional/p2p_compactblocks.py
+++ b/test/functional/p2p_compactblocks.py
@@ -139,7 +139,7 @@ class TestP2PConn(P2PInterface):
This is used when we want to send a message into the node that we expect
will get us disconnected, eg an invalid block."""
self.send_message(message)
- self.wait_for_disconnect(timeout)
+ self.wait_for_disconnect(timeout=timeout)
class CompactBlocksTest(BitcoinTestFramework):
def set_test_params(self):
diff --git a/test/functional/p2p_feefilter.py b/test/functional/p2p_feefilter.py
index 6b03cdf877..bcba534f9a 100755
--- a/test/functional/p2p_feefilter.py
+++ b/test/functional/p2p_feefilter.py
@@ -46,16 +46,16 @@ class TestP2PConn(P2PInterface):
class FeeFilterTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 2
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
# We lower the various required feerates for this test
# to catch a corner-case where feefilter used to slightly undercut
# mempool and wallet feerate calculation based on GetFee
# rounding down 3 places, leading to stranded transactions.
# See issue #16499
- # grant noban permission to all peers to speed up tx relay / mempool sync
self.extra_args = [[
"-minrelaytxfee=0.00000100",
- "-mintxfee=0.00000100",
- "-whitelist=noban@127.0.0.1",
+ "-mintxfee=0.00000100"
]] * self.num_nodes
def run_test(self):
diff --git a/test/functional/p2p_filter.py b/test/functional/p2p_filter.py
index 62d55cc101..7c8ed58e51 100755
--- a/test/functional/p2p_filter.py
+++ b/test/functional/p2p_filter.py
@@ -94,9 +94,10 @@ class P2PBloomFilter(P2PInterface):
class FilterTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 1
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.extra_args = [[
'-peerbloomfilters',
- '-whitelist=noban@127.0.0.1', # immediate tx relay
]]
def generatetoscriptpubkey(self, scriptpubkey):
diff --git a/test/functional/p2p_handshake.py b/test/functional/p2p_handshake.py
new file mode 100755
index 0000000000..f0b62e291d
--- /dev/null
+++ b/test/functional/p2p_handshake.py
@@ -0,0 +1,92 @@
+#!/usr/bin/env python3
+# Copyright (c) 2024 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+"""
+Test P2P behaviour during the handshake phase (VERSION, VERACK messages).
+"""
+import itertools
+import time
+
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.messages import (
+ NODE_NETWORK,
+ NODE_NETWORK_LIMITED,
+ NODE_NONE,
+ NODE_P2P_V2,
+ NODE_WITNESS,
+)
+from test_framework.p2p import P2PInterface
+
+
+# Desirable service flags for outbound non-pruned and pruned peers. Note that
+# the desirable service flags for pruned peers are dynamic and only apply if
+# 1. the peer's service flag NODE_NETWORK_LIMITED is set *and*
+# 2. the local chain is close to the tip (<24h)
+DESIRABLE_SERVICE_FLAGS_FULL = NODE_NETWORK | NODE_WITNESS
+DESIRABLE_SERVICE_FLAGS_PRUNED = NODE_NETWORK_LIMITED | NODE_WITNESS
+
+
+class P2PHandshakeTest(BitcoinTestFramework):
+ def set_test_params(self):
+ self.num_nodes = 1
+
+ def add_outbound_connection(self, node, connection_type, services, wait_for_disconnect):
+ peer = node.add_outbound_p2p_connection(
+ P2PInterface(), p2p_idx=0, wait_for_disconnect=wait_for_disconnect,
+ connection_type=connection_type, services=services,
+ supports_v2_p2p=self.options.v2transport, advertise_v2_p2p=self.options.v2transport)
+ if not wait_for_disconnect:
+ # check that connection is alive past the version handshake and disconnect manually
+ peer.sync_with_ping()
+ peer.peer_disconnect()
+ peer.wait_for_disconnect()
+
+ def test_desirable_service_flags(self, node, service_flag_tests, desirable_service_flags, expect_disconnect):
+ """Check that connecting to a peer either fails or succeeds depending on its offered
+ service flags in the VERSION message. The test is exercised for all relevant
+ outbound connection types where the desirable service flags check is done."""
+ CONNECTION_TYPES = ["outbound-full-relay", "block-relay-only", "addr-fetch"]
+ for conn_type, services in itertools.product(CONNECTION_TYPES, service_flag_tests):
+ if self.options.v2transport:
+ services |= NODE_P2P_V2
+ expected_result = "disconnect" if expect_disconnect else "connect"
+ self.log.info(f' - services 0x{services:08x}, type "{conn_type}" [{expected_result}]')
+ if expect_disconnect:
+ assert (services & desirable_service_flags) != desirable_service_flags
+ expected_debug_log = f'does not offer the expected services ' \
+ f'({services:08x} offered, {desirable_service_flags:08x} expected)'
+ with node.assert_debug_log([expected_debug_log]):
+ self.add_outbound_connection(node, conn_type, services, wait_for_disconnect=True)
+ else:
+ assert (services & desirable_service_flags) == desirable_service_flags
+ self.add_outbound_connection(node, conn_type, services, wait_for_disconnect=False)
+
+ def generate_at_mocktime(self, time):
+ self.nodes[0].setmocktime(time)
+ self.generate(self.nodes[0], 1)
+ self.nodes[0].setmocktime(0)
+
+ def run_test(self):
+ node = self.nodes[0]
+ self.log.info("Check that lacking desired service flags leads to disconnect (non-pruned peers)")
+ self.test_desirable_service_flags(node, [NODE_NONE, NODE_NETWORK, NODE_WITNESS],
+ DESIRABLE_SERVICE_FLAGS_FULL, expect_disconnect=True)
+ self.test_desirable_service_flags(node, [NODE_NETWORK | NODE_WITNESS],
+ DESIRABLE_SERVICE_FLAGS_FULL, expect_disconnect=False)
+
+ self.log.info("Check that limited peers are only desired if the local chain is close to the tip (<24h)")
+ self.generate_at_mocktime(int(time.time()) - 25 * 3600) # tip outside the 24h window, should fail
+ self.test_desirable_service_flags(node, [NODE_NETWORK_LIMITED | NODE_WITNESS],
+ DESIRABLE_SERVICE_FLAGS_FULL, expect_disconnect=True)
+ self.generate_at_mocktime(int(time.time()) - 23 * 3600) # tip inside the 24h window, should succeed
+ self.test_desirable_service_flags(node, [NODE_NETWORK_LIMITED | NODE_WITNESS],
+ DESIRABLE_SERVICE_FLAGS_PRUNED, expect_disconnect=False)
+
+ self.log.info("Check that feeler connections get disconnected immediately")
+ with node.assert_debug_log([f"feeler connection completed"]):
+ self.add_outbound_connection(node, "feeler", NODE_NONE, wait_for_disconnect=True)
+
+
+if __name__ == '__main__':
+ P2PHandshakeTest().main()
diff --git a/test/functional/p2p_i2p_ports.py b/test/functional/p2p_i2p_ports.py
index 13188b9305..20dcb50a57 100755
--- a/test/functional/p2p_i2p_ports.py
+++ b/test/functional/p2p_i2p_ports.py
@@ -6,36 +6,28 @@
Test ports handling for I2P hosts
"""
-import re
from test_framework.test_framework import BitcoinTestFramework
+PROXY = "127.0.0.1:60000"
class I2PPorts(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 1
# The test assumes that an I2P SAM proxy is not listening here.
- self.extra_args = [["-i2psam=127.0.0.1:60000"]]
+ self.extra_args = [[f"-i2psam={PROXY}"]]
def run_test(self):
node = self.nodes[0]
self.log.info("Ensure we don't try to connect if port!=0")
addr = "zsxwyo6qcn3chqzwxnseusqgsnuw3maqnztkiypyfxtya4snkoka.b32.i2p:8333"
- raised = False
- try:
- with node.assert_debug_log(expected_msgs=[f"Error connecting to {addr}"]):
- node.addnode(node=addr, command="onetry")
- except AssertionError as e:
- raised = True
- if not re.search(r"Expected messages .* does not partially match log", str(e)):
- raise AssertionError(f"Assertion raised as expected, but with an unexpected message: {str(e)}")
- if not raised:
- raise AssertionError("Assertion should have been raised")
+ with node.assert_debug_log(expected_msgs=[f"Error connecting to {addr}, connection refused due to arbitrary port 8333"]):
+ node.addnode(node=addr, command="onetry")
self.log.info("Ensure we try to connect if port=0 and get an error due to missing I2P proxy")
addr = "h3r6bkn46qxftwja53pxiykntegfyfjqtnzbm6iv6r5mungmqgmq.b32.i2p:0"
- with node.assert_debug_log(expected_msgs=[f"Error connecting to {addr}"]):
+ with node.assert_debug_log(expected_msgs=[f"Error connecting to {addr}: Cannot connect to {PROXY}"]):
node.addnode(node=addr, command="onetry")
diff --git a/test/functional/p2p_ibd_stalling.py b/test/functional/p2p_ibd_stalling.py
index 0eb37fa92f..830f374d63 100755
--- a/test/functional/p2p_ibd_stalling.py
+++ b/test/functional/p2p_ibd_stalling.py
@@ -80,7 +80,8 @@ class P2PIBDStallingTest(BitcoinTestFramework):
# Need to wait until 1023 blocks are received - the magic total bytes number is a workaround in lack of an rpc
# returning the number of downloaded (but not connected) blocks.
- self.wait_until(lambda: self.total_bytes_recv_for_blocks() == 172761)
+ bytes_recv = 172761 if not self.options.v2transport else 169692
+ self.wait_until(lambda: self.total_bytes_recv_for_blocks() == bytes_recv)
self.all_sync_send_with_ping(peers)
# If there was a peer marked for stalling, it would get disconnected
diff --git a/test/functional/p2p_invalid_block.py b/test/functional/p2p_invalid_block.py
index 806fd9c6cb..8ec62ae5ee 100755
--- a/test/functional/p2p_invalid_block.py
+++ b/test/functional/p2p_invalid_block.py
@@ -32,7 +32,8 @@ class InvalidBlockRequestTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 1
self.setup_clean_chain = True
- self.extra_args = [["-whitelist=noban@127.0.0.1"]]
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
def run_test(self):
# Add p2p connection to node0
diff --git a/test/functional/p2p_invalid_messages.py b/test/functional/p2p_invalid_messages.py
index 4916d36ab7..40a69936bc 100755
--- a/test/functional/p2p_invalid_messages.py
+++ b/test/functional/p2p_invalid_messages.py
@@ -109,6 +109,9 @@ class InvalidMessagesTest(BitcoinTestFramework):
self.nodes[0].disconnect_p2ps()
def test_magic_bytes(self):
+ # Skip with v2, magic bytes are v1-specific
+ if self.options.v2transport:
+ return
self.log.info("Test message with invalid magic bytes disconnects peer")
conn = self.nodes[0].add_p2p_connection(P2PDataStore())
with self.nodes[0].assert_debug_log(['Header error: Wrong MessageStart ffffffff received']):
@@ -120,6 +123,9 @@ class InvalidMessagesTest(BitcoinTestFramework):
self.nodes[0].disconnect_p2ps()
def test_checksum(self):
+ # Skip with v2, the checksum is v1-specific
+ if self.options.v2transport:
+ return
self.log.info("Test message with invalid checksum logs an error")
conn = self.nodes[0].add_p2p_connection(P2PDataStore())
with self.nodes[0].assert_debug_log(['Header error: Wrong checksum (badmsg, 2 bytes), expected 78df0a04 was ffffffff']):
@@ -137,7 +143,11 @@ class InvalidMessagesTest(BitcoinTestFramework):
def test_size(self):
self.log.info("Test message with oversized payload disconnects peer")
conn = self.nodes[0].add_p2p_connection(P2PDataStore())
- with self.nodes[0].assert_debug_log(['Header error: Size too large (badmsg, 4000001 bytes)']):
+ error_msg = (
+ ['V2 transport error: packet too large (4000014 bytes)'] if self.options.v2transport
+ else ['Header error: Size too large (badmsg, 4000001 bytes)']
+ )
+ with self.nodes[0].assert_debug_log(error_msg):
msg = msg_unrecognized(str_data="d" * (VALID_DATA_LIMIT + 1))
msg = conn.build_message(msg)
conn.send_raw_message(msg)
@@ -147,15 +157,26 @@ class InvalidMessagesTest(BitcoinTestFramework):
def test_msgtype(self):
self.log.info("Test message with invalid message type logs an error")
conn = self.nodes[0].add_p2p_connection(P2PDataStore())
- with self.nodes[0].assert_debug_log(['Header error: Invalid message type']):
+ if self.options.v2transport:
+ msgtype = 99 # not defined
msg = msg_unrecognized(str_data="d")
- msg = conn.build_message(msg)
- # Modify msgtype
- msg = msg[:7] + b'\x00' + msg[7 + 1:]
- conn.send_raw_message(msg)
- conn.sync_with_ping(timeout=1)
- # Check that traffic is accounted for (24 bytes header + 2 bytes payload)
- assert_equal(self.nodes[0].getpeerinfo()[0]['bytesrecv_per_msg']['*other*'], 26)
+ contents = msgtype.to_bytes(1, 'big') + msg.serialize()
+ tmsg = conn.v2_state.v2_enc_packet(contents, ignore=False)
+ with self.nodes[0].assert_debug_log(['V2 transport error: invalid message type']):
+ conn.send_raw_message(tmsg)
+ conn.sync_with_ping(timeout=1)
+ # Check that traffic is accounted for (20 bytes plus 3 bytes contents)
+ assert_equal(self.nodes[0].getpeerinfo()[0]['bytesrecv_per_msg']['*other*'], 23)
+ else:
+ with self.nodes[0].assert_debug_log(['Header error: Invalid message type']):
+ msg = msg_unrecognized(str_data="d")
+ msg = conn.build_message(msg)
+ # Modify msgtype
+ msg = msg[:7] + b'\x00' + msg[7 + 1:]
+ conn.send_raw_message(msg)
+ conn.sync_with_ping(timeout=1)
+ # Check that traffic is accounted for (24 bytes header + 2 bytes payload)
+ assert_equal(self.nodes[0].getpeerinfo()[0]['bytesrecv_per_msg']['*other*'], 26)
self.nodes[0].disconnect_p2ps()
def test_addrv2(self, label, required_log_messages, raw_addrv2):
@@ -306,8 +327,10 @@ class InvalidMessagesTest(BitcoinTestFramework):
def test_resource_exhaustion(self):
self.log.info("Test node stays up despite many large junk messages")
- conn = self.nodes[0].add_p2p_connection(P2PDataStore())
- conn2 = self.nodes[0].add_p2p_connection(P2PDataStore())
+ # Don't use v2 here - the non-optimised encryption would take too long to encrypt
+ # the large messages
+ conn = self.nodes[0].add_p2p_connection(P2PDataStore(), supports_v2_p2p=False)
+ conn2 = self.nodes[0].add_p2p_connection(P2PDataStore(), supports_v2_p2p=False)
msg_at_size = msg_unrecognized(str_data="b" * VALID_DATA_LIMIT)
assert len(msg_at_size.serialize()) == MAX_PROTOCOL_MESSAGE_LENGTH
diff --git a/test/functional/p2p_mutated_blocks.py b/test/functional/p2p_mutated_blocks.py
new file mode 100755
index 0000000000..737edaf5bf
--- /dev/null
+++ b/test/functional/p2p_mutated_blocks.py
@@ -0,0 +1,116 @@
+#!/usr/bin/env python3
+# Copyright (c) The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+"""
+Test that an attacker can't degrade compact block relay by sending unsolicited
+mutated blocks to clear in-flight blocktxn requests from other honest peers.
+"""
+
+from test_framework.p2p import P2PInterface
+from test_framework.messages import (
+ BlockTransactions,
+ msg_cmpctblock,
+ msg_block,
+ msg_blocktxn,
+ HeaderAndShortIDs,
+)
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.blocktools import (
+ COINBASE_MATURITY,
+ create_block,
+ add_witness_commitment,
+ NORMAL_GBT_REQUEST_PARAMS,
+)
+from test_framework.util import assert_equal
+from test_framework.wallet import MiniWallet
+import copy
+
+class MutatedBlocksTest(BitcoinTestFramework):
+ def set_test_params(self):
+ self.setup_clean_chain = True
+ self.num_nodes = 1
+ self.extra_args = [
+ [
+ "-testactivationheight=segwit@1", # causes unconnected headers/blocks to not have segwit considered deployed
+ ],
+ ]
+
+ def run_test(self):
+ self.wallet = MiniWallet(self.nodes[0])
+ self.generate(self.wallet, COINBASE_MATURITY)
+
+ honest_relayer = self.nodes[0].add_outbound_p2p_connection(P2PInterface(), p2p_idx=0, connection_type="outbound-full-relay")
+ attacker = self.nodes[0].add_p2p_connection(P2PInterface())
+
+ # Create new block with two transactions (coinbase + 1 self-transfer).
+ # The self-transfer transaction is needed to trigger a compact block
+ # `getblocktxn` roundtrip.
+ tx = self.wallet.create_self_transfer()["tx"]
+ block = create_block(tmpl=self.nodes[0].getblocktemplate(NORMAL_GBT_REQUEST_PARAMS), txlist=[tx])
+ add_witness_commitment(block)
+ block.solve()
+
+ # Create mutated version of the block by changing the transaction
+ # version on the self-transfer.
+ mutated_block = copy.deepcopy(block)
+ mutated_block.vtx[1].nVersion = 4
+
+ # Announce the new block via a compact block through the honest relayer
+ cmpctblock = HeaderAndShortIDs()
+ cmpctblock.initialize_from_block(block, use_witness=True)
+ honest_relayer.send_message(msg_cmpctblock(cmpctblock.to_p2p()))
+
+ # Wait for a `getblocktxn` that attempts to fetch the self-transfer
+ def self_transfer_requested():
+ if not honest_relayer.last_message.get('getblocktxn'):
+ return False
+
+ get_block_txn = honest_relayer.last_message['getblocktxn']
+ return get_block_txn.block_txn_request.blockhash == block.sha256 and \
+ get_block_txn.block_txn_request.indexes == [1]
+ honest_relayer.wait_until(self_transfer_requested, timeout=5)
+
+ # Block at height 101 should be the only one in flight from peer 0
+ peer_info_prior_to_attack = self.nodes[0].getpeerinfo()
+ assert_equal(peer_info_prior_to_attack[0]['id'], 0)
+ assert_equal([101], peer_info_prior_to_attack[0]["inflight"])
+
+ # Attempt to clear the honest relayer's download request by sending the
+ # mutated block (as the attacker).
+ with self.nodes[0].assert_debug_log(expected_msgs=["Block mutated: bad-txnmrklroot, hashMerkleRoot mismatch"]):
+ attacker.send_message(msg_block(mutated_block))
+ # Attacker should get disconnected for sending a mutated block
+ attacker.wait_for_disconnect(timeout=5)
+
+ # Block at height 101 should *still* be the only block in-flight from
+ # peer 0
+ peer_info_after_attack = self.nodes[0].getpeerinfo()
+ assert_equal(peer_info_after_attack[0]['id'], 0)
+ assert_equal([101], peer_info_after_attack[0]["inflight"])
+
+ # The honest relayer should be able to complete relaying the block by
+ # sending the blocktxn that was requested.
+ block_txn = msg_blocktxn()
+ block_txn.block_transactions = BlockTransactions(blockhash=block.sha256, transactions=[tx])
+ honest_relayer.send_and_ping(block_txn)
+ assert_equal(self.nodes[0].getbestblockhash(), block.hash)
+
+ # Check that unexpected-witness mutation check doesn't trigger on a header that doesn't connect to anything
+ assert_equal(len(self.nodes[0].getpeerinfo()), 1)
+ attacker = self.nodes[0].add_p2p_connection(P2PInterface())
+ block_missing_prev = copy.deepcopy(block)
+ block_missing_prev.hashPrevBlock = 123
+ block_missing_prev.solve()
+
+ # Attacker gets a DoS score of 10, not immediately disconnected, so we do it 10 times to get to 100
+ for _ in range(10):
+ assert_equal(len(self.nodes[0].getpeerinfo()), 2)
+ with self.nodes[0].assert_debug_log(expected_msgs=["AcceptBlock FAILED (prev-blk-not-found)"]):
+ attacker.send_message(msg_block(block_missing_prev))
+ attacker.wait_for_disconnect(timeout=5)
+
+
+if __name__ == '__main__':
+ MutatedBlocksTest().main()
diff --git a/test/functional/p2p_node_network_limited.py b/test/functional/p2p_node_network_limited.py
index 89c35e943b..8b63d8ee26 100755
--- a/test/functional/p2p_node_network_limited.py
+++ b/test/functional/p2p_node_network_limited.py
@@ -15,14 +15,17 @@ from test_framework.messages import (
NODE_P2P_V2,
NODE_WITNESS,
msg_getdata,
- msg_verack,
)
from test_framework.p2p import P2PInterface
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import (
assert_equal,
+ assert_raises_rpc_error,
+ try_rpc
)
+# Minimum blocks required to signal NODE_NETWORK_LIMITED #
+NODE_NETWORK_LIMITED_MIN_BLOCKS = 288
class P2PIgnoreInv(P2PInterface):
firstAddrnServices = 0
@@ -43,7 +46,7 @@ class NodeNetworkLimitedTest(BitcoinTestFramework):
def set_test_params(self):
self.setup_clean_chain = True
self.num_nodes = 3
- self.extra_args = [['-prune=550', '-addrmantest'], [], []]
+ self.extra_args = [['-prune=550'], [], []]
def disconnect_all(self):
self.disconnect_nodes(0, 1)
@@ -54,6 +57,64 @@ class NodeNetworkLimitedTest(BitcoinTestFramework):
self.add_nodes(self.num_nodes, self.extra_args)
self.start_nodes()
+ def test_avoid_requesting_historical_blocks(self):
+ self.log.info("Test full node does not request blocks beyond the limited peer threshold")
+ pruned_node = self.nodes[0]
+ miner = self.nodes[1]
+ full_node = self.nodes[2]
+
+ # Connect and generate block to ensure IBD=false
+ self.connect_nodes(1, 0)
+ self.connect_nodes(1, 2)
+ self.generate(miner, 1)
+
+ # Verify peers are out of IBD
+ for node in self.nodes:
+ assert not node.getblockchaininfo()['initialblockdownload']
+
+ # Isolate full_node (the node will remain out of IBD)
+ full_node.setnetworkactive(False)
+ self.wait_until(lambda: len(full_node.getpeerinfo()) == 0)
+
+ # Mine blocks and sync the pruned node. Surpass the NETWORK_NODE_LIMITED threshold.
+ # Blocks deeper than the threshold are considered "historical blocks"
+ num_historial_blocks = 12
+ self.generate(miner, NODE_NETWORK_LIMITED_MIN_BLOCKS + num_historial_blocks, sync_fun=self.no_op)
+ self.sync_blocks([miner, pruned_node])
+
+ # Connect full_node to prune_node and check peers don't disconnect right away.
+ # (they will disconnect if full_node, which is chain-wise behind, request blocks
+ # older than NODE_NETWORK_LIMITED_MIN_BLOCKS)
+ start_height_full_node = full_node.getblockcount()
+ full_node.setnetworkactive(True)
+ self.connect_nodes(2, 0)
+ assert_equal(len(full_node.getpeerinfo()), 1)
+
+ # Wait until the full_node is headers-wise sync
+ best_block_hash = pruned_node.getbestblockhash()
+ default_value = {'status': ''} # No status
+ self.wait_until(lambda: next(filter(lambda x: x['hash'] == best_block_hash, full_node.getchaintips()), default_value)['status'] == "headers-only")
+
+ # Now, since the node aims to download a window of 1024 blocks,
+ # ensure it requests the blocks below the threshold only (with a
+ # 2-block buffer). And also, ensure it does not request any
+ # historical block.
+ tip_height = pruned_node.getblockcount()
+ limit_buffer = 2
+ # Prevent races by waiting for the tip to arrive first
+ self.wait_until(lambda: not try_rpc(-1, "Block not found", full_node.getblock, pruned_node.getbestblockhash()))
+ for height in range(start_height_full_node + 1, tip_height + 1):
+ if height <= tip_height - (NODE_NETWORK_LIMITED_MIN_BLOCKS - limit_buffer):
+ assert_raises_rpc_error(-1, "Block not found on disk", full_node.getblock, pruned_node.getblockhash(height))
+ else:
+ full_node.getblock(pruned_node.getblockhash(height)) # just assert it does not throw an exception
+
+ # Lastly, ensure the full_node is not sync and verify it can get synced by
+ # establishing a connection with another full node capable of providing them.
+ assert_equal(full_node.getblockcount(), start_height_full_node)
+ self.connect_nodes(2, 1)
+ self.sync_blocks([miner, full_node])
+
def run_test(self):
node = self.nodes[0].add_p2p_connection(P2PIgnoreInv())
@@ -77,17 +138,7 @@ class NodeNetworkLimitedTest(BitcoinTestFramework):
self.log.info("Requesting block at height 2 (tip-289) must fail (ignored).")
node.send_getdata_for_block(blocks[0]) # first block outside of the 288+2 limit
- node.wait_for_disconnect(5)
-
- self.log.info("Check local address relay, do a fresh connection.")
- self.nodes[0].disconnect_p2ps()
- node1 = self.nodes[0].add_p2p_connection(P2PIgnoreInv())
- node1.send_message(msg_verack())
-
- node1.wait_for_addr()
- #must relay address with NODE_NETWORK_LIMITED
- assert_equal(node1.firstAddrnServices, expected_services)
-
+ node.wait_for_disconnect(timeout=5)
self.nodes[0].disconnect_p2ps()
# connect unsynced node 2 with pruned NODE_NETWORK_LIMITED peer
@@ -118,5 +169,7 @@ class NodeNetworkLimitedTest(BitcoinTestFramework):
# sync must be possible, node 1 is no longer in IBD and should therefore connect to node 0 (NODE_NETWORK_LIMITED)
self.sync_blocks([self.nodes[0], self.nodes[1]])
+ self.test_avoid_requesting_historical_blocks()
+
if __name__ == '__main__':
NodeNetworkLimitedTest().main()
diff --git a/test/functional/p2p_permissions.py b/test/functional/p2p_permissions.py
index 6153e4a156..80a27943fd 100755
--- a/test/functional/p2p_permissions.py
+++ b/test/functional/p2p_permissions.py
@@ -83,7 +83,14 @@ class P2PPermissionsTests(BitcoinTestFramework):
["-whitelist=all@127.0.0.1"],
["forcerelay", "noban", "mempool", "bloomfilter", "relay", "download", "addr"])
+ for flag, permissions in [(["-whitelist=noban,out@127.0.0.1"], ["noban", "download"]), (["-whitelist=noban@127.0.0.1"], [])]:
+ self.restart_node(0, flag)
+ self.connect_nodes(0, 1)
+ peerinfo = self.nodes[0].getpeerinfo()[0]
+ assert_equal(peerinfo['permissions'], permissions)
+
self.stop_node(1)
+ self.nodes[1].assert_start_raises_init_error(["-whitelist=in,out@127.0.0.1"], "Only direction was set, no permissions", match=ErrorMatch.PARTIAL_REGEX)
self.nodes[1].assert_start_raises_init_error(["-whitelist=oopsie@127.0.0.1"], "Invalid P2P permission", match=ErrorMatch.PARTIAL_REGEX)
self.nodes[1].assert_start_raises_init_error(["-whitelist=noban@127.0.0.1:230"], "Invalid netmask specified in", match=ErrorMatch.PARTIAL_REGEX)
self.nodes[1].assert_start_raises_init_error(["-whitebind=noban@127.0.0.1/10"], "Cannot resolve -whitebind address", match=ErrorMatch.PARTIAL_REGEX)
diff --git a/test/functional/p2p_segwit.py b/test/functional/p2p_segwit.py
index d316c4b602..af47c6d9f0 100755
--- a/test/functional/p2p_segwit.py
+++ b/test/functional/p2p_segwit.py
@@ -198,24 +198,26 @@ class TestP2PConn(P2PInterface):
self.send_message(msg)
else:
self.send_message(msg_inv(inv=[CInv(MSG_BLOCK, block.sha256)]))
- self.wait_for_getheaders()
+ self.wait_for_getheaders(timeout=timeout)
self.send_message(msg)
- self.wait_for_getdata([block.sha256])
+ self.wait_for_getdata([block.sha256], timeout=timeout)
def request_block(self, blockhash, inv_type, timeout=60):
with p2p_lock:
self.last_message.pop("block", None)
self.send_message(msg_getdata(inv=[CInv(inv_type, blockhash)]))
- self.wait_for_block(blockhash, timeout)
+ self.wait_for_block(blockhash, timeout=timeout)
return self.last_message["block"].block
class SegWitTest(BitcoinTestFramework):
def set_test_params(self):
self.setup_clean_chain = True
self.num_nodes = 2
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
# This test tests SegWit both pre and post-activation, so use the normal BIP9 activation.
self.extra_args = [
- ["-acceptnonstdtxn=1", f"-testactivationheight=segwit@{SEGWIT_HEIGHT}", "-whitelist=noban@127.0.0.1", "-par=1"],
+ ["-acceptnonstdtxn=1", f"-testactivationheight=segwit@{SEGWIT_HEIGHT}", "-par=1"],
["-acceptnonstdtxn=0", f"-testactivationheight=segwit@{SEGWIT_HEIGHT}"],
]
self.supports_cli = False
@@ -2054,7 +2056,7 @@ class SegWitTest(BitcoinTestFramework):
test_transaction_acceptance(self.nodes[0], self.wtx_node, tx2, with_witness=True, accepted=False)
# Expect a request for parent (tx) by txid despite use of WTX peer
- self.wtx_node.wait_for_getdata([tx.sha256], 60)
+ self.wtx_node.wait_for_getdata([tx.sha256], timeout=60)
with p2p_lock:
lgd = self.wtx_node.lastgetdata[:]
assert_equal(lgd, [CInv(MSG_WITNESS_TX, tx.sha256)])
diff --git a/test/functional/p2p_timeouts.py b/test/functional/p2p_timeouts.py
index b4fa5099d8..80d7b6e9ae 100755
--- a/test/functional/p2p_timeouts.py
+++ b/test/functional/p2p_timeouts.py
@@ -69,11 +69,8 @@ class TimeoutsTest(BitcoinTestFramework):
with self.nodes[0].assert_debug_log(['Unsupported message "ping" prior to verack from peer=0']):
no_verack_node.send_message(msg_ping())
- # With v2, non-version messages before the handshake would be interpreted as part of the key exchange.
- # Therefore, don't execute this part of the test if v2transport is chosen.
- if not self.options.v2transport:
- with self.nodes[0].assert_debug_log(['non-version message before version handshake. Message "ping" from peer=1']):
- no_version_node.send_message(msg_ping())
+ with self.nodes[0].assert_debug_log(['non-version message before version handshake. Message "ping" from peer=1']):
+ no_version_node.send_message(msg_ping())
self.mock_forward(1)
assert "version" in no_verack_node.last_message
@@ -83,14 +80,20 @@ class TimeoutsTest(BitcoinTestFramework):
assert no_send_node.is_connected
no_verack_node.send_message(msg_ping())
- if not self.options.v2transport:
- no_version_node.send_message(msg_ping())
-
- expected_timeout_logs = [
- "version handshake timeout peer=0",
- f"socket no message in first 3 seconds, {'0' if self.options.v2transport else '1'} 0 peer=1",
- "socket no message in first 3 seconds, 0 0 peer=2",
- ]
+ no_version_node.send_message(msg_ping())
+
+ if self.options.v2transport:
+ expected_timeout_logs = [
+ "version handshake timeout peer=0",
+ "version handshake timeout peer=1",
+ "version handshake timeout peer=2",
+ ]
+ else:
+ expected_timeout_logs = [
+ "version handshake timeout peer=0",
+ "socket no message in first 3 seconds, 1 0 peer=1",
+ "socket no message in first 3 seconds, 0 0 peer=2",
+ ]
with self.nodes[0].assert_debug_log(expected_msgs=expected_timeout_logs):
self.mock_forward(2)
diff --git a/test/functional/p2p_v2_earlykeyresponse.py b/test/functional/p2p_v2_earlykeyresponse.py
index 1f570e6010..32d2e1148a 100755
--- a/test/functional/p2p_v2_earlykeyresponse.py
+++ b/test/functional/p2p_v2_earlykeyresponse.py
@@ -75,7 +75,7 @@ class P2PEarlyKey(BitcoinTestFramework):
self.log.info('Sending first 4 bytes of ellswift which match network magic')
self.log.info('If a response is received, assertion failure would happen in our custom data_received() function')
# send happens in `initiate_v2_handshake()` in `connection_made()`
- peer1 = node0.add_p2p_connection(PeerEarlyKey(), wait_for_verack=False, send_version=False, supports_v2_p2p=True)
+ peer1 = node0.add_p2p_connection(PeerEarlyKey(), wait_for_verack=False, send_version=False, supports_v2_p2p=True, wait_for_v2_handshake=False)
self.wait_until(lambda: peer1.connection_opened)
self.log.info('Sending remaining ellswift and garbage which are different from V1_PREFIX. Since a response is')
self.log.info('expected now, our custom data_received() function wouldn\'t result in assertion failure')
diff --git a/test/functional/p2p_v2_transport.py b/test/functional/p2p_v2_transport.py
index ec43fc5a97..fe2449124d 100755
--- a/test/functional/p2p_v2_transport.py
+++ b/test/functional/p2p_v2_transport.py
@@ -12,6 +12,7 @@ from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import (
assert_equal,
p2p_port,
+ assert_raises_rpc_error
)
@@ -59,6 +60,11 @@ class V2TransportTest(BitcoinTestFramework):
# V1 nodes can sync with each other
assert_equal(self.nodes[2].getblockcount(), 0)
assert_equal(self.nodes[3].getblockcount(), 0)
+
+ # addnode rpc error when v2transport requested but not enabled
+ ip_port = "127.0.0.1:{}".format(p2p_port(3))
+ assert_raises_rpc_error(-8, "Error: v2transport requested but not enabled (see -v2transport)", self.nodes[2].addnode, node=ip_port, command='add', v2transport=True)
+
with self.nodes[2].assert_debug_log(expected_msgs=[],
unexpected_msgs=[sending_handshake, downgrading_to_v1]):
self.connect_nodes(2, 3, peer_advertises_v2=False)
diff --git a/test/functional/rpc_net.py b/test/functional/rpc_net.py
index afb75ab208..2701d2471d 100755
--- a/test/functional/rpc_net.py
+++ b/test/functional/rpc_net.py
@@ -13,7 +13,6 @@ import platform
import time
import test_framework.messages
-from test_framework.netutil import ADDRMAN_NEW_BUCKET_COUNT, ADDRMAN_TRIED_BUCKET_COUNT, ADDRMAN_BUCKET_SIZE
from test_framework.p2p import (
P2PInterface,
P2P_SERVICES,
@@ -42,6 +41,24 @@ def assert_net_servicesnames(servicesflag, servicenames):
assert servicesflag_generated == servicesflag
+def seed_addrman(node):
+ """ Populate the addrman with addresses from different networks.
+ Here 2 ipv4, 2 ipv6, 1 cjdns, 2 onion and 1 i2p addresses are added.
+ """
+ # These addresses currently don't collide with a deterministic addrman.
+ # If the addrman positioning/bucketing is changed, these might collide
+ # and adding them fails.
+ success = { "success": True }
+ assert_equal(node.addpeeraddress(address="1.2.3.4", tried=True, port=8333), success)
+ assert_equal(node.addpeeraddress(address="2.0.0.0", port=8333), success)
+ assert_equal(node.addpeeraddress(address="1233:3432:2434:2343:3234:2345:6546:4534", tried=True, port=8333), success)
+ assert_equal(node.addpeeraddress(address="2803:0:1234:abcd::1", port=45324), success)
+ assert_equal(node.addpeeraddress(address="fc00:1:2:3:4:5:6:7", port=8333), success)
+ assert_equal(node.addpeeraddress(address="pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion", tried=True, port=8333), success)
+ assert_equal(node.addpeeraddress(address="nrfj6inpyf73gpkyool35hcmne5zwfmse3jl3aw23vk7chdemalyaqad.onion", port=45324, tried=True), success)
+ assert_equal(node.addpeeraddress(address="c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p", port=8333), success)
+
+
class NetTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 2
@@ -113,10 +130,15 @@ class NetTest(BitcoinTestFramework):
self.nodes[0].setmocktime(no_version_peer_conntime)
with self.nodes[0].wait_for_new_peer():
no_version_peer = self.nodes[0].add_p2p_connection(P2PInterface(), send_version=False, wait_for_verack=False)
+ if self.options.v2transport:
+ self.wait_until(lambda: self.nodes[0].getpeerinfo()[no_version_peer_id]["transport_protocol_type"] == "v2")
self.nodes[0].setmocktime(0)
peer_info = self.nodes[0].getpeerinfo()[no_version_peer_id]
peer_info.pop("addr")
peer_info.pop("addrbind")
+ # The next two fields will vary for v2 connections because we send a rng-based number of decoy messages
+ peer_info.pop("bytesrecv")
+ peer_info.pop("bytessent")
assert_equal(
peer_info,
{
@@ -125,9 +147,7 @@ class NetTest(BitcoinTestFramework):
"addr_relay_enabled": False,
"bip152_hb_from": False,
"bip152_hb_to": False,
- "bytesrecv": 0,
"bytesrecv_per_msg": {},
- "bytessent": 0,
"bytessent_per_msg": {},
"connection_type": "inbound",
"conntime": no_version_peer_conntime,
@@ -136,8 +156,8 @@ class NetTest(BitcoinTestFramework):
"inflight": [],
"last_block": 0,
"last_transaction": 0,
- "lastrecv": 0,
- "lastsend": 0,
+ "lastrecv": 0 if not self.options.v2transport else no_version_peer_conntime,
+ "lastsend": 0 if not self.options.v2transport else no_version_peer_conntime,
"minfeefilter": Decimal("0E-8"),
"network": "not_publicly_routable",
"permissions": [],
@@ -145,13 +165,13 @@ class NetTest(BitcoinTestFramework):
"relaytxes": False,
"services": "0000000000000000",
"servicesnames": [],
- "session_id": "",
+ "session_id": "" if not self.options.v2transport else no_version_peer.v2_state.peer['session_id'].hex(),
"startingheight": -1,
"subver": "",
"synced_blocks": -1,
"synced_headers": -1,
"timeoffset": 0,
- "transport_protocol_type": "v1" if not self.options.v2transport else "detecting",
+ "transport_protocol_type": "v1" if not self.options.v2transport else "v2",
"version": 0,
},
)
@@ -302,22 +322,16 @@ class NetTest(BitcoinTestFramework):
assert_raises_rpc_error(-8, "Network not recognized: Foo", self.nodes[0].getnodeaddresses, 1, "Foo")
def test_addpeeraddress(self):
- """RPC addpeeraddress sets the source address equal to the destination address.
- If an address with the same /16 as an existing new entry is passed, it will be
- placed in the same new bucket and have a 1/64 chance of the bucket positions
- colliding (depending on the value of nKey in the addrman), in which case the
- new address won't be added. The probability of collision can be reduced to
- 1/2^16 = 1/65536 by using an address from a different /16. We avoid this here
- by first testing adding a tried table entry before testing adding a new table one.
- """
self.log.info("Test addpeeraddress")
- self.restart_node(1, ["-checkaddrman=1"])
+ # The node has an existing, non-deterministic addrman from a previous test.
+ # Clear it to have a deterministic addrman.
+ self.restart_node(1, ["-checkaddrman=1", "-test=addrman"], clear_addrman=True)
node = self.nodes[1]
- self.log.debug("Test that addpeerinfo is a hidden RPC")
+ self.log.debug("Test that addpeeraddress is a hidden RPC")
# It is hidden from general help, but its detailed help may be called directly.
- assert "addpeerinfo" not in node.help()
- assert "addpeerinfo" in node.help("addpeerinfo")
+ assert "addpeeraddress" not in node.help()
+ assert "unknown command: addpeeraddress" not in node.help("addpeeraddress")
self.log.debug("Test that adding an empty address fails")
assert_equal(node.addpeeraddress(address="", port=8333), {"success": False})
@@ -330,26 +344,50 @@ class NetTest(BitcoinTestFramework):
assert_raises_rpc_error(-1, "JSON integer out of range", self.nodes[0].addpeeraddress, address="1.2.3.4", port=-1)
assert_raises_rpc_error(-1, "JSON integer out of range", self.nodes[0].addpeeraddress, address="1.2.3.4", port=65536)
+ self.log.debug("Test that adding a valid address to the new table succeeds")
+ assert_equal(node.addpeeraddress(address="1.0.0.0", tried=False, port=8333), {"success": True})
+ addrman = node.getrawaddrman()
+ assert_equal(len(addrman["tried"]), 0)
+ new_table = list(addrman["new"].values())
+ assert_equal(len(new_table), 1)
+ assert_equal(new_table[0]["address"], "1.0.0.0")
+ assert_equal(new_table[0]["port"], 8333)
+
+ self.log.debug("Test that adding an already-present new address to the new and tried tables fails")
+ for value in [True, False]:
+ assert_equal(node.addpeeraddress(address="1.0.0.0", tried=value, port=8333), {"success": False, "error": "failed-adding-to-new"})
+ assert_equal(len(node.getnodeaddresses(count=0)), 1)
+
self.log.debug("Test that adding a valid address to the tried table succeeds")
- self.addr_time = int(time.time())
- node.setmocktime(self.addr_time)
assert_equal(node.addpeeraddress(address="1.2.3.4", tried=True, port=8333), {"success": True})
- with node.assert_debug_log(expected_msgs=["CheckAddrman: new 0, tried 1, total 1 started"]):
- addrs = node.getnodeaddresses(count=0) # getnodeaddresses re-runs the addrman checks
- assert_equal(len(addrs), 1)
- assert_equal(addrs[0]["address"], "1.2.3.4")
- assert_equal(addrs[0]["port"], 8333)
+ addrman = node.getrawaddrman()
+ assert_equal(len(addrman["new"]), 1)
+ tried_table = list(addrman["tried"].values())
+ assert_equal(len(tried_table), 1)
+ assert_equal(tried_table[0]["address"], "1.2.3.4")
+ assert_equal(tried_table[0]["port"], 8333)
+ node.getnodeaddresses(count=0) # getnodeaddresses re-runs the addrman checks
self.log.debug("Test that adding an already-present tried address to the new and tried tables fails")
for value in [True, False]:
- assert_equal(node.addpeeraddress(address="1.2.3.4", tried=value, port=8333), {"success": False})
- assert_equal(len(node.getnodeaddresses(count=0)), 1)
-
- self.log.debug("Test that adding a second address, this time to the new table, succeeds")
+ assert_equal(node.addpeeraddress(address="1.2.3.4", tried=value, port=8333), {"success": False, "error": "failed-adding-to-new"})
+ assert_equal(len(node.getnodeaddresses(count=0)), 2)
+
+ self.log.debug("Test that adding an address, which collides with the address in tried table, fails")
+ colliding_address = "1.2.5.45" # grinded address that produces a tried-table collision
+ assert_equal(node.addpeeraddress(address=colliding_address, tried=True, port=8333), {"success": False, "error": "failed-adding-to-tried"})
+ # When adding an address to the tried table, it's first added to the new table.
+ # As we fail to move it to the tried table, it remains in the new table.
+ addrman_info = node.getaddrmaninfo()
+ assert_equal(addrman_info["all_networks"]["tried"], 1)
+ assert_equal(addrman_info["all_networks"]["new"], 2)
+
+ self.log.debug("Test that adding an another address to the new table succeeds")
assert_equal(node.addpeeraddress(address="2.0.0.0", port=8333), {"success": True})
- with node.assert_debug_log(expected_msgs=["CheckAddrman: new 1, tried 1, total 2 started"]):
- addrs = node.getnodeaddresses(count=0) # getnodeaddresses re-runs the addrman checks
- assert_equal(len(addrs), 2)
+ addrman_info = node.getaddrmaninfo()
+ assert_equal(addrman_info["all_networks"]["tried"], 1)
+ assert_equal(addrman_info["all_networks"]["new"], 3)
+ node.getnodeaddresses(count=0) # getnodeaddresses re-runs the addrman checks
def test_sendmsgtopeer(self):
node = self.nodes[0]
@@ -387,30 +425,38 @@ class NetTest(BitcoinTestFramework):
def test_getaddrmaninfo(self):
self.log.info("Test getaddrmaninfo")
+ self.restart_node(1, extra_args=["-cjdnsreachable", "-test=addrman"], clear_addrman=True)
node = self.nodes[1]
+ seed_addrman(node)
+
+ expected_network_count = {
+ 'all_networks': {'new': 4, 'tried': 4, 'total': 8},
+ 'ipv4': {'new': 1, 'tried': 1, 'total': 2},
+ 'ipv6': {'new': 1, 'tried': 1, 'total': 2},
+ 'onion': {'new': 0, 'tried': 2, 'total': 2},
+ 'i2p': {'new': 1, 'tried': 0, 'total': 1},
+ 'cjdns': {'new': 1, 'tried': 0, 'total': 1},
+ }
- # current count of ipv4 addresses in addrman is {'new':1, 'tried':1}
- self.log.info("Test that count of addresses in addrman match expected values")
+ self.log.debug("Test that count of addresses in addrman match expected values")
res = node.getaddrmaninfo()
- assert_equal(res["ipv4"]["new"], 1)
- assert_equal(res["ipv4"]["tried"], 1)
- assert_equal(res["ipv4"]["total"], 2)
- assert_equal(res["all_networks"]["new"], 1)
- assert_equal(res["all_networks"]["tried"], 1)
- assert_equal(res["all_networks"]["total"], 2)
- for net in ["ipv6", "onion", "i2p", "cjdns"]:
- assert_equal(res[net]["new"], 0)
- assert_equal(res[net]["tried"], 0)
- assert_equal(res[net]["total"], 0)
+ for network, count in expected_network_count.items():
+ assert_equal(res[network]['new'], count['new'])
+ assert_equal(res[network]['tried'], count['tried'])
+ assert_equal(res[network]['total'], count['total'])
def test_getrawaddrman(self):
self.log.info("Test getrawaddrman")
+ self.restart_node(1, extra_args=["-cjdnsreachable", "-test=addrman"], clear_addrman=True)
node = self.nodes[1]
+ self.addr_time = int(time.time())
+ node.setmocktime(self.addr_time)
+ seed_addrman(node)
self.log.debug("Test that getrawaddrman is a hidden RPC")
# It is hidden from general help, but its detailed help may be called directly.
assert "getrawaddrman" not in node.help()
- assert "getrawaddrman" in node.help("getrawaddrman")
+ assert "unknown command: getrawaddrman" not in node.help("getrawaddrman")
def check_addr_information(result, expected):
"""Utility to compare a getrawaddrman result entry with an expected entry"""
@@ -427,88 +473,96 @@ class NetTest(BitcoinTestFramework):
getrawaddrman = node.getrawaddrman()
getaddrmaninfo = node.getaddrmaninfo()
for (table_name, table_info) in expected.items():
- assert_equal(len(getrawaddrman[table_name]), len(table_info["entries"]))
+ assert_equal(len(getrawaddrman[table_name]), len(table_info))
assert_equal(len(getrawaddrman[table_name]), getaddrmaninfo["all_networks"][table_name])
for bucket_position in getrawaddrman[table_name].keys():
- bucket = int(bucket_position.split("/")[0])
- position = int(bucket_position.split("/")[1])
-
- # bucket and position only be sanity checked here as the
- # test-addrman isn't deterministic
- assert 0 <= int(bucket) < table_info["bucket_count"]
- assert 0 <= int(position) < ADDRMAN_BUCKET_SIZE
-
entry = getrawaddrman[table_name][bucket_position]
- expected_entry = list(filter(lambda e: e["address"] == entry["address"], table_info["entries"]))[0]
+ expected_entry = list(filter(lambda e: e["address"] == entry["address"], table_info))[0]
+ assert bucket_position == expected_entry["bucket_position"]
check_addr_information(entry, expected_entry)
- # we expect one addrman new and tried table entry, which were added in a previous test
+ # we expect 4 new and 4 tried table entries in the addrman which were added using seed_addrman()
expected = {
- "new": {
- "bucket_count": ADDRMAN_NEW_BUCKET_COUNT,
- "entries": [
+ "new": [
{
+ "bucket_position": "82/8",
"address": "2.0.0.0",
"port": 8333,
"services": 9,
"network": "ipv4",
"source": "2.0.0.0",
"source_network": "ipv4",
+ },
+ {
+ "bucket_position": "336/24",
+ "address": "fc00:1:2:3:4:5:6:7",
+ "port": 8333,
+ "services": 9,
+ "network": "cjdns",
+ "source": "fc00:1:2:3:4:5:6:7",
+ "source_network": "cjdns",
+ },
+ {
+ "bucket_position": "963/46",
+ "address": "c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p",
+ "port": 8333,
+ "services": 9,
+ "network": "i2p",
+ "source": "c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p",
+ "source_network": "i2p",
+ },
+ {
+ "bucket_position": "613/6",
+ "address": "2803:0:1234:abcd::1",
+ "services": 9,
+ "network": "ipv6",
+ "source": "2803:0:1234:abcd::1",
+ "source_network": "ipv6",
+ "port": 45324,
}
- ]
- },
- "tried": {
- "bucket_count": ADDRMAN_TRIED_BUCKET_COUNT,
- "entries": [
+ ],
+ "tried": [
{
+ "bucket_position": "6/33",
"address": "1.2.3.4",
"port": 8333,
"services": 9,
"network": "ipv4",
"source": "1.2.3.4",
"source_network": "ipv4",
+ },
+ {
+ "bucket_position": "197/34",
+ "address": "1233:3432:2434:2343:3234:2345:6546:4534",
+ "port": 8333,
+ "services": 9,
+ "network": "ipv6",
+ "source": "1233:3432:2434:2343:3234:2345:6546:4534",
+ "source_network": "ipv6",
+ },
+ {
+ "bucket_position": "72/61",
+ "address": "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion",
+ "port": 8333,
+ "services": 9,
+ "network": "onion",
+ "source": "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion",
+ "source_network": "onion"
+ },
+ {
+ "bucket_position": "139/46",
+ "address": "nrfj6inpyf73gpkyool35hcmne5zwfmse3jl3aw23vk7chdemalyaqad.onion",
+ "services": 9,
+ "network": "onion",
+ "source": "nrfj6inpyf73gpkyool35hcmne5zwfmse3jl3aw23vk7chdemalyaqad.onion",
+ "source_network": "onion",
+ "port": 45324,
}
- ]
- }
+ ]
}
- self.log.debug("Test that the getrawaddrman contains information about the addresses added in a previous test")
- check_getrawaddrman_entries(expected)
-
- self.log.debug("Add one new address to each addrman table")
- expected["new"]["entries"].append({
- "address": "2803:0:1234:abcd::1",
- "services": 9,
- "network": "ipv6",
- "source": "2803:0:1234:abcd::1",
- "source_network": "ipv6",
- "port": -1, # set once addpeeraddress is successful
- })
- expected["tried"]["entries"].append({
- "address": "nrfj6inpyf73gpkyool35hcmne5zwfmse3jl3aw23vk7chdemalyaqad.onion",
- "services": 9,
- "network": "onion",
- "source": "nrfj6inpyf73gpkyool35hcmne5zwfmse3jl3aw23vk7chdemalyaqad.onion",
- "source_network": "onion",
- "port": -1, # set once addpeeraddress is successful
- })
-
- port = 0
- for (table_name, table_info) in expected.items():
- # There's a slight chance that the to-be-added address collides with an already
- # present table entry. To avoid this, we increment the port until an address has been
- # added. Incrementing the port changes the position in the new table bucket (bucket
- # stays the same) and changes both the bucket and the position in the tried table.
- while True:
- if node.addpeeraddress(address=table_info["entries"][1]["address"], port=port, tried=table_name == "tried")["success"]:
- table_info["entries"][1]["port"] = port
- self.log.debug(f"Added {table_info['entries'][1]['address']} to {table_name} table")
- break
- else:
- port += 1
-
- self.log.debug("Test that the newly added addresses appear in getrawaddrman")
+ self.log.debug("Test that getrawaddrman contains information about newly added addresses in each addrman table")
check_getrawaddrman_entries(expected)
diff --git a/test/functional/rpc_packages.py b/test/functional/rpc_packages.py
index 664f2df3f1..029e368166 100755
--- a/test/functional/rpc_packages.py
+++ b/test/functional/rpc_packages.py
@@ -29,7 +29,8 @@ class RPCPackagesTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 1
self.setup_clean_chain = True
- self.extra_args = [["-whitelist=noban@127.0.0.1"]] # noban speeds up tx relay
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
def assert_testres_equal(self, package_hex, testres_expected):
"""Shuffle package_hex and assert that the testmempoolaccept result matches testres_expected. This should only
@@ -81,6 +82,7 @@ class RPCPackagesTest(BitcoinTestFramework):
self.test_conflicting()
self.test_rbf()
self.test_submitpackage()
+ self.test_maxfeerate_maxburn_submitpackage()
def test_independent(self, coin):
self.log.info("Test multiple independent transactions in a package")
@@ -356,5 +358,34 @@ class RPCPackagesTest(BitcoinTestFramework):
assert_equal(res["tx-results"][sec_wtxid]["error"], "version")
peer.wait_for_broadcast([first_wtxid])
+ def test_maxfeerate_maxburn_submitpackage(self):
+ node = self.nodes[0]
+ # clear mempool
+ deterministic_address = node.get_deterministic_priv_key().address
+ self.generatetoaddress(node, 1, deterministic_address)
+
+ self.log.info("Submitpackage maxfeerate arg testing")
+ chained_txns = self.wallet.create_self_transfer_chain(chain_length=2)
+ minrate_btc_kvb = min([chained_txn["fee"] / chained_txn["tx"].get_vsize() * 1000 for chained_txn in chained_txns])
+ chain_hex = [t["hex"] for t in chained_txns]
+ pkg_result = node.submitpackage(chain_hex, maxfeerate=minrate_btc_kvb - Decimal("0.00000001"))
+ assert_equal(pkg_result["tx-results"][chained_txns[0]["wtxid"]]["error"], "max feerate exceeded")
+ assert_equal(pkg_result["tx-results"][chained_txns[1]["wtxid"]]["error"], "bad-txns-inputs-missingorspent")
+ assert_equal(node.getrawmempool(), [])
+
+ self.log.info("Submitpackage maxburnamount arg testing")
+ tx = tx_from_hex(chain_hex[1])
+ tx.vout[-1].scriptPubKey = b'a' * 10001 # scriptPubKey bigger than 10k IsUnspendable
+ chain_hex = [chain_hex[0], tx.serialize().hex()]
+ # burn test is run before any package evaluation; nothing makes it in and we get broader exception
+ assert_raises_rpc_error(-25, "Unspendable output exceeds maximum configured by user", node.submitpackage, chain_hex, 0, chained_txns[1]["new_utxo"]["value"] - Decimal("0.00000001"))
+ assert_equal(node.getrawmempool(), [])
+
+ # Relax the restrictions for both and send it; parent gets through as own subpackage
+ pkg_result = node.submitpackage(chain_hex, maxfeerate=minrate_btc_kvb, maxburnamount=chained_txns[1]["new_utxo"]["value"])
+ assert "error" not in pkg_result["tx-results"][chained_txns[0]["wtxid"]]
+ assert_equal(pkg_result["tx-results"][tx.getwtxid()]["error"], "scriptpubkey")
+ assert_equal(node.getrawmempool(), [chained_txns[0]["txid"]])
+
if __name__ == "__main__":
RPCPackagesTest().main()
diff --git a/test/functional/rpc_psbt.py b/test/functional/rpc_psbt.py
index 1fd938d18a..016aa3ba11 100755
--- a/test/functional/rpc_psbt.py
+++ b/test/functional/rpc_psbt.py
@@ -753,11 +753,16 @@ class PSBTTest(BitcoinTestFramework):
break
psbt_in = dec["inputs"][input_idx]
# Calculate the input weight
- # (prevout + sequence + length of scriptSig + scriptsig + 1 byte buffer) * WITNESS_SCALE_FACTOR + num scriptWitness stack items + (length of stack item + stack item) * N stack items + 1 byte buffer
+ # (prevout + sequence + length of scriptSig + scriptsig) * WITNESS_SCALE_FACTOR + len of num scriptWitness stack items + (length of stack item + stack item) * N stack items
+ # Note that occasionally this weight estimate may be slightly larger or smaller than the real weight
+ # as sometimes ECDSA signatures are one byte shorter than expected with a probability of 1/128
len_scriptsig = len(psbt_in["final_scriptSig"]["hex"]) // 2 if "final_scriptSig" in psbt_in else 0
- len_scriptsig += len(ser_compact_size(len_scriptsig)) + 1
- len_scriptwitness = (sum([(len(x) // 2) + len(ser_compact_size(len(x) // 2)) for x in psbt_in["final_scriptwitness"]]) + len(psbt_in["final_scriptwitness"]) + 1) if "final_scriptwitness" in psbt_in else 0
- input_weight = ((40 + len_scriptsig) * WITNESS_SCALE_FACTOR) + len_scriptwitness
+ len_scriptsig += len(ser_compact_size(len_scriptsig))
+ len_scriptwitness = (sum([(len(x) // 2) + len(ser_compact_size(len(x) // 2)) for x in psbt_in["final_scriptwitness"]]) + len(ser_compact_size(len(psbt_in["final_scriptwitness"])))) if "final_scriptwitness" in psbt_in else 0
+ len_prevout_txid = 32
+ len_prevout_index = 4
+ len_sequence = 4
+ input_weight = ((len_prevout_txid + len_prevout_index + len_sequence + len_scriptsig) * WITNESS_SCALE_FACTOR) + len_scriptwitness
low_input_weight = input_weight // 2
high_input_weight = input_weight * 2
diff --git a/test/functional/rpc_rawtransaction.py b/test/functional/rpc_rawtransaction.py
index c12865b5e3..12697e9d0c 100755
--- a/test/functional/rpc_rawtransaction.py
+++ b/test/functional/rpc_rawtransaction.py
@@ -73,9 +73,8 @@ class RawTransactionsTest(BitcoinTestFramework):
["-txindex"],
["-fastprune", "-prune=1"],
]
- # whitelist all peers to speed up tx relay / mempool sync
- for args in self.extra_args:
- args.append("-whitelist=noban@127.0.0.1")
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.supports_cli = False
def setup_network(self):
diff --git a/test/functional/test_framework/crypto/bip324_cipher.py b/test/functional/test_framework/crypto/bip324_cipher.py
index 56190647f2..c9f0fa0151 100644
--- a/test/functional/test_framework/crypto/bip324_cipher.py
+++ b/test/functional/test_framework/crypto/bip324_cipher.py
@@ -25,6 +25,8 @@ def pad16(x):
def aead_chacha20_poly1305_encrypt(key, nonce, aad, plaintext):
"""Encrypt a plaintext using ChaCha20Poly1305."""
+ if plaintext is None:
+ return None
ret = bytearray()
msg_len = len(plaintext)
for i in range((msg_len + 63) // 64):
@@ -42,7 +44,7 @@ def aead_chacha20_poly1305_encrypt(key, nonce, aad, plaintext):
def aead_chacha20_poly1305_decrypt(key, nonce, aad, ciphertext):
"""Decrypt a ChaCha20Poly1305 ciphertext."""
- if len(ciphertext) < 16:
+ if ciphertext is None or len(ciphertext) < 16:
return None
msg_len = len(ciphertext) - 16
poly1305 = Poly1305(chacha20_block(key, nonce, 0)[:32])
@@ -191,11 +193,11 @@ class TestFrameworkAEAD(unittest.TestCase):
dec_aead = FSChaCha20Poly1305(key)
for _ in range(msg_idx):
- enc_aead.encrypt(b"", b"")
+ enc_aead.encrypt(b"", None)
ciphertext = enc_aead.encrypt(aad, plain)
self.assertEqual(hex_cipher, ciphertext.hex())
for _ in range(msg_idx):
- dec_aead.decrypt(b"", bytes(16))
+ dec_aead.decrypt(b"", None)
plaintext = dec_aead.decrypt(aad, ciphertext)
self.assertEqual(plain, plaintext)
diff --git a/test/functional/test_framework/messages.py b/test/functional/test_framework/messages.py
index 1780678de1..4e496a9275 100755
--- a/test/functional/test_framework/messages.py
+++ b/test/functional/test_framework/messages.py
@@ -46,6 +46,7 @@ MAX_PROTOCOL_MESSAGE_LENGTH = 4000000 # Maximum length of incoming protocol mes
MAX_HEADERS_RESULTS = 2000 # Number of headers sent in one getheaders result
MAX_INV_SIZE = 50000 # Maximum number of entries in an 'inv' protocol message
+NODE_NONE = 0
NODE_NETWORK = (1 << 0)
NODE_BLOOM = (1 << 2)
NODE_WITNESS = (1 << 3)
diff --git a/test/functional/test_framework/netutil.py b/test/functional/test_framework/netutil.py
index 838f40fcaa..08d41fe97f 100644
--- a/test/functional/test_framework/netutil.py
+++ b/test/functional/test_framework/netutil.py
@@ -4,7 +4,7 @@
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Linux network utilities.
-Roughly based on http://voorloopnul.com/blog/a-python-netstat-in-less-than-100-lines-of-code/ by Ricardo Pascal
+Roughly based on https://web.archive.org/web/20190424172231/http://voorloopnul.com/blog/a-python-netstat-in-less-than-100-lines-of-code/ by Ricardo Pascal
"""
import sys
@@ -158,3 +158,12 @@ def test_ipv6_local():
except socket.error:
have_ipv6 = False
return have_ipv6
+
+def test_unix_socket():
+ '''Return True if UNIX sockets are available on this platform.'''
+ try:
+ socket.AF_UNIX
+ except AttributeError:
+ return False
+ else:
+ return True
diff --git a/test/functional/test_framework/p2p.py b/test/functional/test_framework/p2p.py
index dc04696114..ce76008c46 100755
--- a/test/functional/test_framework/p2p.py
+++ b/test/functional/test_framework/p2p.py
@@ -585,22 +585,22 @@ class P2PInterface(P2PConnection):
wait_until_helper_internal(test_function, timeout=timeout, lock=p2p_lock, timeout_factor=self.timeout_factor)
- def wait_for_connect(self, timeout=60):
+ def wait_for_connect(self, *, timeout=60):
test_function = lambda: self.is_connected
self.wait_until(test_function, timeout=timeout, check_connected=False)
- def wait_for_disconnect(self, timeout=60):
+ def wait_for_disconnect(self, *, timeout=60):
test_function = lambda: not self.is_connected
self.wait_until(test_function, timeout=timeout, check_connected=False)
- def wait_for_reconnect(self, timeout=60):
+ def wait_for_reconnect(self, *, timeout=60):
def test_function():
return self.is_connected and self.last_message.get('version') and not self.supports_v2_p2p
self.wait_until(test_function, timeout=timeout, check_connected=False)
# Message receiving helper methods
- def wait_for_tx(self, txid, timeout=60):
+ def wait_for_tx(self, txid, *, timeout=60):
def test_function():
if not self.last_message.get('tx'):
return False
@@ -608,13 +608,13 @@ class P2PInterface(P2PConnection):
self.wait_until(test_function, timeout=timeout)
- def wait_for_block(self, blockhash, timeout=60):
+ def wait_for_block(self, blockhash, *, timeout=60):
def test_function():
return self.last_message.get("block") and self.last_message["block"].block.rehash() == blockhash
self.wait_until(test_function, timeout=timeout)
- def wait_for_header(self, blockhash, timeout=60):
+ def wait_for_header(self, blockhash, *, timeout=60):
def test_function():
last_headers = self.last_message.get('headers')
if not last_headers:
@@ -623,7 +623,7 @@ class P2PInterface(P2PConnection):
self.wait_until(test_function, timeout=timeout)
- def wait_for_merkleblock(self, blockhash, timeout=60):
+ def wait_for_merkleblock(self, blockhash, *, timeout=60):
def test_function():
last_filtered_block = self.last_message.get('merkleblock')
if not last_filtered_block:
@@ -632,7 +632,7 @@ class P2PInterface(P2PConnection):
self.wait_until(test_function, timeout=timeout)
- def wait_for_getdata(self, hash_list, timeout=60):
+ def wait_for_getdata(self, hash_list, *, timeout=60):
"""Waits for a getdata message.
The object hashes in the inventory vector must match the provided hash_list."""
@@ -644,7 +644,7 @@ class P2PInterface(P2PConnection):
self.wait_until(test_function, timeout=timeout)
- def wait_for_getheaders(self, timeout=60):
+ def wait_for_getheaders(self, *, timeout=60):
"""Waits for a getheaders message.
Receiving any getheaders message will satisfy the predicate. the last_message["getheaders"]
@@ -656,7 +656,7 @@ class P2PInterface(P2PConnection):
self.wait_until(test_function, timeout=timeout)
- def wait_for_inv(self, expected_inv, timeout=60):
+ def wait_for_inv(self, expected_inv, *, timeout=60):
"""Waits for an INV message and checks that the first inv object in the message was as expected."""
if len(expected_inv) > 1:
raise NotImplementedError("wait_for_inv() will only verify the first inv object")
@@ -668,7 +668,7 @@ class P2PInterface(P2PConnection):
self.wait_until(test_function, timeout=timeout)
- def wait_for_verack(self, timeout=60):
+ def wait_for_verack(self, *, timeout=60):
def test_function():
return "verack" in self.last_message
@@ -681,11 +681,11 @@ class P2PInterface(P2PConnection):
self.send_message(self.on_connection_send_msg)
self.on_connection_send_msg = None # Never used again
- def send_and_ping(self, message, timeout=60):
+ def send_and_ping(self, message, *, timeout=60):
self.send_message(message)
self.sync_with_ping(timeout=timeout)
- def sync_with_ping(self, timeout=60):
+ def sync_with_ping(self, *, timeout=60):
"""Ensure ProcessMessages and SendMessages is called on this connection"""
# Sending two pings back-to-back, requires that the node calls
# `ProcessMessage` twice, and thus ensures `SendMessages` must have
@@ -726,7 +726,7 @@ class NetworkThread(threading.Thread):
"""Start the network thread."""
self.network_event_loop.run_forever()
- def close(self, timeout=10):
+ def close(self, *, timeout=10):
"""Close the connections and network event loop."""
self.network_event_loop.call_soon_threadsafe(self.network_event_loop.stop)
wait_until_helper_internal(lambda: not self.network_event_loop.is_running(), timeout=timeout)
@@ -933,7 +933,7 @@ class P2PTxInvStore(P2PInterface):
with p2p_lock:
return list(self.tx_invs_received.keys())
- def wait_for_broadcast(self, txns, timeout=60):
+ def wait_for_broadcast(self, txns, *, timeout=60):
"""Waits for the txns (list of txids) to complete initial broadcast.
The mempool should mark unbroadcast=False for these transactions.
"""
diff --git a/test/functional/test_framework/script.py b/test/functional/test_framework/script.py
index 78d8580794..3275517888 100644
--- a/test/functional/test_framework/script.py
+++ b/test/functional/test_framework/script.py
@@ -747,7 +747,7 @@ def SegwitV0SignatureMsg(script, txTo, inIdx, hashtype, amount):
ss += struct.pack("<q", amount)
ss += struct.pack("<I", txTo.vin[inIdx].nSequence)
ss += ser_uint256(hashOutputs)
- ss += struct.pack("<i", txTo.nLockTime)
+ ss += txTo.nLockTime.to_bytes(4, "little")
ss += struct.pack("<I", hashtype)
return ss
diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py
index d8ae20981d..c3884270da 100755
--- a/test/functional/test_framework/test_framework.py
+++ b/test/functional/test_framework/test_framework.py
@@ -96,6 +96,7 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
"""Sets test framework defaults. Do not override this method. Instead, override the set_test_params() method"""
self.chain: str = 'regtest'
self.setup_clean_chain: bool = False
+ self.noban_tx_relay: bool = False
self.nodes: list[TestNode] = []
self.extra_args = None
self.network_thread = None
@@ -191,6 +192,8 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
parser.add_argument("--timeout-factor", dest="timeout_factor", type=float, help="adjust test timeouts by a factor. Setting it to 0 disables all timeouts")
parser.add_argument("--v2transport", dest="v2transport", default=False, action="store_true",
help="use BIP324 v2 connections between all nodes by default")
+ parser.add_argument("--v1transport", dest="v1transport", default=False, action="store_true",
+ help="Explicitly use v1 transport (can be used to overwrite global --v2transport option)")
self.add_options(parser)
# Running TestShell in a Jupyter notebook causes an additional -f argument
@@ -206,6 +209,8 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
config = configparser.ConfigParser()
config.read_file(open(self.options.configfile))
self.config = config
+ if self.options.v1transport:
+ self.options.v2transport=False
if "descriptors" not in self.options:
# Wallet is not required by the test at all and the value of self.options.descriptors won't matter.
@@ -494,6 +499,10 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
extra_confs = [[]] * num_nodes
if extra_args is None:
extra_args = [[]] * num_nodes
+ # Whitelist peers to speed up tx relay / mempool sync. Don't use it if testing tx relay or timing.
+ if self.noban_tx_relay:
+ for i in range(len(extra_args)):
+ extra_args[i] = extra_args[i] + ["-whitelist=noban,in,out@127.0.0.1"]
if versions is None:
versions = [None] * num_nodes
if binary is None:
@@ -577,10 +586,16 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
# Wait for nodes to stop
node.wait_until_stopped()
- def restart_node(self, i, extra_args=None):
+ def restart_node(self, i, extra_args=None, clear_addrman=False):
"""Stop and start a test node"""
self.stop_node(i)
- self.start_node(i, extra_args)
+ if clear_addrman:
+ peers_dat = self.nodes[i].chain_path / "peers.dat"
+ os.remove(peers_dat)
+ with self.nodes[i].assert_debug_log(expected_msgs=[f'Creating peers.dat because the file was not found ("{peers_dat}")']):
+ self.start_node(i, extra_args)
+ else:
+ self.start_node(i, extra_args)
def wait_for_node_exit(self, i, timeout):
self.nodes[i].process.wait(timeout)
diff --git a/test/functional/test_framework/test_node.py b/test/functional/test_framework/test_node.py
index 838dcba141..67e0be5280 100755
--- a/test/functional/test_framework/test_node.py
+++ b/test/functional/test_framework/test_node.py
@@ -136,9 +136,7 @@ class TestNode():
self.args.append("-v2transport=1")
else:
self.args.append("-v2transport=0")
- else:
- # v2transport requested but not supported for node
- assert not v2transport
+ # if v2transport is requested via global flag but not supported for node version, ignore it
self.cli = TestNodeCLI(bitcoin_cli, self.datadir_path)
self.use_cli = use_cli
@@ -667,7 +665,7 @@ class TestNode():
assert_msg += "with expected error " + expected_msg
self._raise_assertion_error(assert_msg)
- def add_p2p_connection(self, p2p_conn, *, wait_for_verack=True, send_version=True, supports_v2_p2p=False, **kwargs):
+ def add_p2p_connection(self, p2p_conn, *, wait_for_verack=True, send_version=True, supports_v2_p2p=None, wait_for_v2_handshake=True, **kwargs):
"""Add an inbound p2p connection to the node.
This method adds the p2p connection to the self.p2ps list and also
@@ -684,6 +682,9 @@ class TestNode():
kwargs['dstport'] = p2p_port(self.index)
if 'dstaddr' not in kwargs:
kwargs['dstaddr'] = '127.0.0.1'
+ if supports_v2_p2p is None:
+ supports_v2_p2p = self.use_v2transport
+
p2p_conn.p2p_connected_to_node = True
if self.use_v2transport:
@@ -693,6 +694,8 @@ class TestNode():
self.p2ps.append(p2p_conn)
p2p_conn.wait_until(lambda: p2p_conn.is_connected, check_connected=False)
+ if supports_v2_p2p and wait_for_v2_handshake:
+ p2p_conn.wait_until(lambda: p2p_conn.v2_state.tried_v2_handshake)
if send_version:
p2p_conn.wait_until(lambda: not p2p_conn.on_connection_send_msg)
if wait_for_verack:
@@ -721,7 +724,7 @@ class TestNode():
return p2p_conn
- def add_outbound_p2p_connection(self, p2p_conn, *, wait_for_verack=True, p2p_idx, connection_type="outbound-full-relay", supports_v2_p2p=False, advertise_v2_p2p=False, **kwargs):
+ def add_outbound_p2p_connection(self, p2p_conn, *, wait_for_verack=True, wait_for_disconnect=False, p2p_idx, connection_type="outbound-full-relay", supports_v2_p2p=None, advertise_v2_p2p=None, **kwargs):
"""Add an outbound p2p connection from node. Must be an
"outbound-full-relay", "block-relay-only", "addr-fetch" or "feeler" connection.
@@ -749,6 +752,11 @@ class TestNode():
self.addconnection('%s:%d' % (address, port), connection_type, advertise_v2_p2p)
p2p_conn.p2p_connected_to_node = False
+ if supports_v2_p2p is None:
+ supports_v2_p2p = self.use_v2transport
+ if advertise_v2_p2p is None:
+ advertise_v2_p2p = self.use_v2transport
+
if advertise_v2_p2p:
kwargs['services'] = kwargs.get('services', P2P_SERVICES) | NODE_P2P_V2
assert self.use_v2transport # only a v2 TestNode could make a v2 outbound connection
@@ -763,7 +771,7 @@ class TestNode():
if reconnect:
p2p_conn.wait_for_reconnect()
- if connection_type == "feeler":
+ if connection_type == "feeler" or wait_for_disconnect:
# feeler connections are closed as soon as the node receives a `version` message
p2p_conn.wait_until(lambda: p2p_conn.message_count["version"] == 1, check_connected=False)
p2p_conn.wait_until(lambda: not p2p_conn.is_connected, check_connected=False)
@@ -771,6 +779,8 @@ class TestNode():
p2p_conn.wait_for_connect()
self.p2ps.append(p2p_conn)
+ if supports_v2_p2p:
+ p2p_conn.wait_until(lambda: p2p_conn.v2_state.tried_v2_handshake)
p2p_conn.wait_until(lambda: not p2p_conn.on_connection_send_msg)
if wait_for_verack:
p2p_conn.wait_for_verack()
diff --git a/test/functional/test_framework/util.py b/test/functional/test_framework/util.py
index b4b05b1597..c5b69a3954 100644
--- a/test/functional/test_framework/util.py
+++ b/test/functional/test_framework/util.py
@@ -52,7 +52,24 @@ def assert_fee_amount(fee, tx_size, feerate_BTC_kvB):
raise AssertionError("Fee of %s BTC too high! (Should be %s BTC)" % (str(fee), str(target_fee)))
+def summarise_dict_differences(thing1, thing2):
+ if not isinstance(thing1, dict) or not isinstance(thing2, dict):
+ return thing1, thing2
+ d1, d2 = {}, {}
+ for k in sorted(thing1.keys()):
+ if k not in thing2:
+ d1[k] = thing1[k]
+ elif thing1[k] != thing2[k]:
+ d1[k], d2[k] = summarise_dict_differences(thing1[k], thing2[k])
+ for k in sorted(thing2.keys()):
+ if k not in thing1:
+ d2[k] = thing2[k]
+ return d1, d2
+
def assert_equal(thing1, thing2, *args):
+ if thing1 != thing2 and not args and isinstance(thing1, dict) and isinstance(thing2, dict):
+ d1,d2 = summarise_dict_differences(thing1, thing2)
+ raise AssertionError("not(%s == %s)\n in particular not(%s == %s)" % (thing1, thing2, d1, d2))
if thing1 != thing2 or any(thing1 != arg for arg in args):
raise AssertionError("not(%s)" % " == ".join(str(arg) for arg in (thing1, thing2) + args))
diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py
index e438a60edc..3f6e47d410 100755
--- a/test/functional/test_runner.py
+++ b/test/functional/test_runner.py
@@ -120,7 +120,7 @@ BASE_SCRIPTS = [
'wallet_backup.py --legacy-wallet',
'wallet_backup.py --descriptors',
'feature_segwit.py --legacy-wallet',
- 'feature_segwit.py --descriptors',
+ 'feature_segwit.py --descriptors --v1transport',
'feature_segwit.py --descriptors --v2transport',
'p2p_tx_download.py',
'wallet_avoidreuse.py --legacy-wallet',
@@ -156,7 +156,7 @@ BASE_SCRIPTS = [
# vv Tests less than 30s vv
'p2p_invalid_messages.py',
'rpc_createmultisig.py',
- 'p2p_timeouts.py',
+ 'p2p_timeouts.py --v1transport',
'p2p_timeouts.py --v2transport',
'wallet_dump.py --legacy-wallet',
'rpc_signer.py',
@@ -181,6 +181,8 @@ BASE_SCRIPTS = [
'wallet_keypool_topup.py --legacy-wallet',
'wallet_keypool_topup.py --descriptors',
'wallet_fast_rescan.py --descriptors',
+ 'wallet_gethdkeys.py --descriptors',
+ 'wallet_createwalletdescriptor.py --descriptors',
'interface_zmq.py',
'rpc_invalid_address_message.py',
'rpc_validateaddress.py',
@@ -201,7 +203,7 @@ BASE_SCRIPTS = [
'mempool_spend_coinbase.py',
'wallet_avoid_mixing_output_types.py --descriptors',
'mempool_reorg.py',
- 'p2p_block_sync.py',
+ 'p2p_block_sync.py --v1transport',
'p2p_block_sync.py --v2transport',
'wallet_createwallet.py --legacy-wallet',
'wallet_createwallet.py --usecli',
@@ -230,13 +232,13 @@ BASE_SCRIPTS = [
'wallet_transactiontime_rescan.py --descriptors',
'wallet_transactiontime_rescan.py --legacy-wallet',
'p2p_addrv2_relay.py',
- 'p2p_compactblocks_hb.py',
+ 'p2p_compactblocks_hb.py --v1transport',
'p2p_compactblocks_hb.py --v2transport',
- 'p2p_disconnect_ban.py',
+ 'p2p_disconnect_ban.py --v1transport',
'p2p_disconnect_ban.py --v2transport',
'feature_posix_fs_permissions.py',
'rpc_decodescript.py',
- 'rpc_blockchain.py',
+ 'rpc_blockchain.py --v1transport',
'rpc_blockchain.py --v2transport',
'rpc_deprecated.py',
'wallet_disable.py',
@@ -246,21 +248,21 @@ BASE_SCRIPTS = [
'p2p_getaddr_caching.py',
'p2p_getdata.py',
'p2p_addrfetch.py',
- 'rpc_net.py',
+ 'rpc_net.py --v1transport',
'rpc_net.py --v2transport',
'wallet_keypool.py --legacy-wallet',
'wallet_keypool.py --descriptors',
'wallet_descriptor.py --descriptors',
'p2p_nobloomfilter_messages.py',
'p2p_filter.py',
- 'rpc_setban.py',
+ 'rpc_setban.py --v1transport',
'rpc_setban.py --v2transport',
'p2p_blocksonly.py',
'mining_prioritisetransaction.py',
'p2p_invalid_locator.py',
- 'p2p_invalid_block.py',
+ 'p2p_invalid_block.py --v1transport',
'p2p_invalid_block.py --v2transport',
- 'p2p_invalid_tx.py',
+ 'p2p_invalid_tx.py --v1transport',
'p2p_invalid_tx.py --v2transport',
'p2p_v2_transport.py',
'p2p_v2_encrypted.py',
@@ -286,12 +288,12 @@ BASE_SCRIPTS = [
'rpc_preciousblock.py',
'wallet_importprunedfunds.py --legacy-wallet',
'wallet_importprunedfunds.py --descriptors',
- 'p2p_leak_tx.py',
+ 'p2p_leak_tx.py --v1transport',
'p2p_leak_tx.py --v2transport',
'p2p_eviction.py',
- 'p2p_ibd_stalling.py',
+ 'p2p_ibd_stalling.py --v1transport',
'p2p_ibd_stalling.py --v2transport',
- 'p2p_net_deadlock.py',
+ 'p2p_net_deadlock.py --v1transport',
'p2p_net_deadlock.py --v2transport',
'wallet_signmessagewithaddress.py',
'rpc_signmessagewithprivkey.py',
@@ -308,6 +310,7 @@ BASE_SCRIPTS = [
'wallet_crosschain.py',
'mining_basic.py',
'feature_signet.py',
+ 'p2p_mutated_blocks.py',
'wallet_implicitsegwit.py --legacy-wallet',
'rpc_named_arguments.py',
'feature_startupnotify.py',
@@ -380,7 +383,7 @@ BASE_SCRIPTS = [
'feature_coinstatsindex.py',
'wallet_orphanedreward.py',
'wallet_timelock.py',
- 'p2p_node_network_limited.py',
+ 'p2p_node_network_limited.py --v1transport',
'p2p_node_network_limited.py --v2transport',
'p2p_permissions.py',
'feature_blocksdir.py',
@@ -394,6 +397,8 @@ BASE_SCRIPTS = [
'rpc_getdescriptorinfo.py',
'rpc_mempool_info.py',
'rpc_help.py',
+ 'p2p_handshake.py',
+ 'p2p_handshake.py --v2transport',
'feature_dirsymlinks.py',
'feature_help.py',
'feature_shutdown.py',
@@ -434,6 +439,8 @@ def main():
parser.add_argument('--tmpdirprefix', '-t', default=tempfile.gettempdir(), help="Root directory for datadirs")
parser.add_argument('--failfast', '-F', action='store_true', help='stop execution after the first test failure')
parser.add_argument('--filter', help='filter scripts to run by regular expression')
+ parser.add_argument('--skipunit', '-u', action='store_true', help='skip unit tests for the test framework')
+
args, unknown_args = parser.parse_known_args()
if not args.ansi:
@@ -470,7 +477,7 @@ def main():
if not enable_bitcoind:
print("No functional tests to run.")
print("Rerun ./configure with --with-daemon and then make")
- sys.exit(0)
+ sys.exit(1)
# Build list of tests
test_list = []
@@ -519,7 +526,7 @@ def main():
if not test_list:
print("No valid test scripts specified. Check that your test is in one "
"of the test lists in test_runner.py, or run test_runner.py with no arguments to run all tests")
- sys.exit(0)
+ sys.exit(1)
if args.help:
# Print help for test_runner.py, then print help of the first script (with args removed) and exit.
@@ -544,9 +551,10 @@ def main():
combined_logs_len=args.combinedlogslen,
failfast=args.failfast,
use_term_control=args.ansi,
+ skipunit=args.skipunit,
)
-def run_tests(*, test_list, src_dir, build_dir, tmpdir, jobs=1, enable_coverage=False, args=None, combined_logs_len=0, failfast=False, use_term_control):
+def run_tests(*, test_list, src_dir, build_dir, tmpdir, jobs=1, enable_coverage=False, args=None, combined_logs_len=0, failfast=False, use_term_control, skipunit=False):
args = args or []
# Warn if bitcoind is already running
@@ -563,20 +571,20 @@ def run_tests(*, test_list, src_dir, build_dir, tmpdir, jobs=1, enable_coverage=
if os.path.isdir(cache_dir):
print("%sWARNING!%s There is a cache directory here: %s. If tests fail unexpectedly, try deleting the cache directory." % (BOLD[1], BOLD[0], cache_dir))
- # Test Framework Tests
- print("Running Unit Tests for Test Framework Modules")
tests_dir = src_dir + '/test/functional/'
# This allows `test_runner.py` to work from an out-of-source build directory using a symlink,
# a hard link or a copy on any platform. See https://github.com/bitcoin/bitcoin/pull/27561.
sys.path.append(tests_dir)
- test_framework_tests = unittest.TestSuite()
- for module in TEST_FRAMEWORK_MODULES:
- test_framework_tests.addTest(unittest.TestLoader().loadTestsFromName("test_framework.{}".format(module)))
- result = unittest.TextTestRunner(verbosity=1, failfast=True).run(test_framework_tests)
- if not result.wasSuccessful():
- sys.exit("Early exiting after failure in TestFramework unit tests")
+ if not skipunit:
+ print("Running Unit Tests for Test Framework Modules")
+ test_framework_tests = unittest.TestSuite()
+ for module in TEST_FRAMEWORK_MODULES:
+ test_framework_tests.addTest(unittest.TestLoader().loadTestsFromName("test_framework.{}".format(module)))
+ result = unittest.TextTestRunner(verbosity=1, failfast=True).run(test_framework_tests)
+ if not result.wasSuccessful():
+ sys.exit("Early exiting after failure in TestFramework unit tests")
flags = ['--cachedir={}'.format(cache_dir)] + args
@@ -610,14 +618,12 @@ def run_tests(*, test_list, src_dir, build_dir, tmpdir, jobs=1, enable_coverage=
max_len_name = len(max(test_list, key=len))
test_count = len(test_list)
all_passed = True
- i = 0
- while i < test_count:
+ while not job_queue.done():
if failfast and not all_passed:
break
for test_result, testdir, stdout, stderr, skip_reason in job_queue.get_next():
test_results.append(test_result)
- i += 1
- done_str = "{}/{} - {}{}{}".format(i, test_count, BOLD[1], test_result.name, BOLD[0])
+ done_str = f"{len(test_results)}/{test_count} - {BOLD[1]}{test_result.name}{BOLD[0]}"
if test_result.status == "Passed":
logging.debug("%s passed, Duration: %s s" % (done_str, test_result.time))
elif test_result.status == "Skipped":
@@ -702,14 +708,15 @@ class TestHandler:
self.tmpdir = tmpdir
self.test_list = test_list
self.flags = flags
- self.num_running = 0
self.jobs = []
self.use_term_control = use_term_control
+ def done(self):
+ return not (self.jobs or self.test_list)
+
def get_next(self):
- while self.num_running < self.num_jobs and self.test_list:
+ while len(self.jobs) < self.num_jobs and self.test_list:
# Add tests
- self.num_running += 1
test = self.test_list.pop(0)
portseed = len(self.test_list)
portseed_arg = ["--portseed={}".format(portseed)]
@@ -753,7 +760,6 @@ class TestHandler:
skip_reason = re.search(r"Test Skipped: (.*)", stdout).group(1)
else:
status = "Failed"
- self.num_running -= 1
self.jobs.remove(job)
if self.use_term_control:
clearline = '\r' + (' ' * dot_count) + '\r'
diff --git a/test/functional/wallet_abandonconflict.py b/test/functional/wallet_abandonconflict.py
index 2691507773..dda48aae1b 100755
--- a/test/functional/wallet_abandonconflict.py
+++ b/test/functional/wallet_abandonconflict.py
@@ -28,8 +28,7 @@ class AbandonConflictTest(BitcoinTestFramework):
self.num_nodes = 2
self.extra_args = [["-minrelaytxfee=0.00001"], []]
# whitelist peers to speed up tx relay / mempool sync
- for args in self.extra_args:
- args.append("-whitelist=noban@127.0.0.1")
+ self.noban_tx_relay = True
def skip_test_if_missing_module(self):
self.skip_if_no_wallet()
@@ -232,7 +231,11 @@ class AbandonConflictTest(BitcoinTestFramework):
balance = newbalance
# Invalidate the block with the double spend. B & C's 10 BTC outputs should no longer be available
- self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash())
+ blk = self.nodes[0].getbestblockhash()
+ # mine 10 blocks so that when the blk is invalidated, the transactions are not
+ # returned to the mempool
+ self.generate(self.nodes[1], 10)
+ self.nodes[0].invalidateblock(blk)
assert_equal(alice.gettransaction(txAB1)["confirmations"], 0)
newbalance = alice.getbalance()
assert_equal(newbalance, balance - Decimal("20"))
diff --git a/test/functional/wallet_address_types.py b/test/functional/wallet_address_types.py
index be5b3ebadb..6b27b32dea 100755
--- a/test/functional/wallet_address_types.py
+++ b/test/functional/wallet_address_types.py
@@ -79,9 +79,8 @@ class AddressTypeTest(BitcoinTestFramework):
["-changetype=p2sh-segwit"],
[],
]
- # whitelist all peers to speed up tx relay / mempool sync
- for args in self.extra_args:
- args.append("-whitelist=noban@127.0.0.1")
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.supports_cli = False
def skip_test_if_missing_module(self):
diff --git a/test/functional/wallet_assumeutxo.py b/test/functional/wallet_assumeutxo.py
index 3c1a997bd1..30396da015 100755
--- a/test/functional/wallet_assumeutxo.py
+++ b/test/functional/wallet_assumeutxo.py
@@ -62,8 +62,6 @@ class AssumeutxoTest(BitcoinTestFramework):
for n in self.nodes:
n.setmocktime(n.getblockheader(n.getbestblockhash())['time'])
- self.sync_blocks()
-
n0.createwallet('w')
w = n0.get_wallet_rpc("w")
diff --git a/test/functional/wallet_avoid_mixing_output_types.py b/test/functional/wallet_avoid_mixing_output_types.py
index 861765f452..66fbf780e5 100755
--- a/test/functional/wallet_avoid_mixing_output_types.py
+++ b/test/functional/wallet_avoid_mixing_output_types.py
@@ -112,15 +112,15 @@ class AddressInputTypeGrouping(BitcoinTestFramework):
def set_test_params(self):
self.setup_clean_chain = True
self.num_nodes = 2
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.extra_args = [
[
"-addresstype=bech32",
- "-whitelist=noban@127.0.0.1",
"-txindex",
],
[
"-addresstype=p2sh-segwit",
- "-whitelist=noban@127.0.0.1",
"-txindex",
],
]
diff --git a/test/functional/wallet_avoidreuse.py b/test/functional/wallet_avoidreuse.py
index 9d3c55d6b6..4983bfda7f 100755
--- a/test/functional/wallet_avoidreuse.py
+++ b/test/functional/wallet_avoidreuse.py
@@ -69,9 +69,8 @@ class AvoidReuseTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 2
- # This test isn't testing txn relay/timing, so set whitelist on the
- # peers for instant txn relay. This speeds up the test run time 2-3x.
- self.extra_args = [["-whitelist=noban@127.0.0.1"]] * self.num_nodes
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
def skip_test_if_missing_module(self):
self.skip_if_no_wallet()
diff --git a/test/functional/wallet_backup.py b/test/functional/wallet_backup.py
index eb3e0ae728..d03b08bcc4 100755
--- a/test/functional/wallet_backup.py
+++ b/test/functional/wallet_backup.py
@@ -50,13 +50,14 @@ class WalletBackupTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 4
self.setup_clean_chain = True
- # nodes 1, 2,3 are spenders, let's give them a keypool=100
- # whitelist all peers to speed up tx relay / mempool sync
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
+ # nodes 1, 2, 3 are spenders, let's give them a keypool=100
self.extra_args = [
- ["-whitelist=noban@127.0.0.1", "-keypool=100"],
- ["-whitelist=noban@127.0.0.1", "-keypool=100"],
- ["-whitelist=noban@127.0.0.1", "-keypool=100"],
- ["-whitelist=noban@127.0.0.1"],
+ ["-keypool=100"],
+ ["-keypool=100"],
+ ["-keypool=100"],
+ [],
]
self.rpc_timeout = 120
diff --git a/test/functional/wallet_backwards_compatibility.py b/test/functional/wallet_backwards_compatibility.py
index 4d6e6024c5..ab008a40cd 100755
--- a/test/functional/wallet_backwards_compatibility.py
+++ b/test/functional/wallet_backwards_compatibility.py
@@ -355,6 +355,25 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
down_wallet_name = f"re_down_{node.version}"
down_backup_path = os.path.join(self.options.tmpdir, f"{down_wallet_name}.dat")
wallet.backupwallet(down_backup_path)
+
+ # Check that taproot descriptors can be added to 0.21 wallets
+ # This must be done after the backup is created so that 0.21 can still load
+ # the backup
+ if self.options.descriptors and self.major_version_equals(node, 21):
+ assert_raises_rpc_error(-12, "No bech32m addresses available", wallet.getnewaddress, address_type="bech32m")
+ xpubs = wallet.gethdkeys(active_only=True)
+ assert_equal(len(xpubs), 1)
+ assert_equal(len(xpubs[0]["descriptors"]), 6)
+ wallet.createwalletdescriptor("bech32m")
+ xpubs = wallet.gethdkeys(active_only=True)
+ assert_equal(len(xpubs), 1)
+ assert_equal(len(xpubs[0]["descriptors"]), 8)
+ tr_descs = [desc["desc"] for desc in xpubs[0]["descriptors"] if desc["desc"].startswith("tr(")]
+ assert_equal(len(tr_descs), 2)
+ for desc in tr_descs:
+ assert info["hdmasterfingerprint"] in desc
+ wallet.getnewaddress(address_type="bech32m")
+
wallet.unloadwallet()
# Check that no automatic upgrade broke the downgrading the wallet
diff --git a/test/functional/wallet_balance.py b/test/functional/wallet_balance.py
index af9270a321..c322ae52c1 100755
--- a/test/functional/wallet_balance.py
+++ b/test/functional/wallet_balance.py
@@ -53,15 +53,14 @@ class WalletTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 2
self.setup_clean_chain = True
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.extra_args = [
# Limit mempool descendants as a hack to have wallet txs rejected from the mempool.
# Set walletrejectlongchains=0 so the wallet still creates the transactions.
['-limitdescendantcount=3', '-walletrejectlongchains=0'],
[],
]
- # whitelist peers to speed up tx relay / mempool sync
- for args in self.extra_args:
- args.append("-whitelist=noban@127.0.0.1")
def skip_test_if_missing_module(self):
self.skip_if_no_wallet()
diff --git a/test/functional/wallet_basic.py b/test/functional/wallet_basic.py
index f798eee365..56228d2bad 100755
--- a/test/functional/wallet_basic.py
+++ b/test/functional/wallet_basic.py
@@ -32,8 +32,10 @@ class WalletTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 4
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.extra_args = [[
- "-dustrelayfee=0", "-walletrejectlongchains=0", "-whitelist=noban@127.0.0.1"
+ "-dustrelayfee=0", "-walletrejectlongchains=0"
]] * self.num_nodes
self.setup_clean_chain = True
self.supports_cli = False
@@ -679,7 +681,7 @@ class WalletTest(BitcoinTestFramework):
"category": baz["category"],
"vout": baz["vout"]}
expected_fields = frozenset({'amount', 'bip125-replaceable', 'confirmations', 'details', 'fee',
- 'hex', 'lastprocessedblock', 'time', 'timereceived', 'trusted', 'txid', 'wtxid', 'walletconflicts'})
+ 'hex', 'lastprocessedblock', 'time', 'timereceived', 'trusted', 'txid', 'wtxid', 'walletconflicts', 'mempoolconflicts'})
verbose_field = "decoded"
expected_verbose_fields = expected_fields | {verbose_field}
diff --git a/test/functional/wallet_bumpfee.py b/test/functional/wallet_bumpfee.py
index fea933a93b..5b7db55f45 100755
--- a/test/functional/wallet_bumpfee.py
+++ b/test/functional/wallet_bumpfee.py
@@ -55,11 +55,12 @@ class BumpFeeTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 2
self.setup_clean_chain = True
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.extra_args = [[
"-walletrbf={}".format(i),
"-mintxfee=0.00002",
"-addresstype=bech32",
- "-whitelist=noban@127.0.0.1",
] for i in range(self.num_nodes)]
def skip_test_if_missing_module(self):
diff --git a/test/functional/wallet_conflicts.py b/test/functional/wallet_conflicts.py
index 802b718cd5..e5739a6a59 100755
--- a/test/functional/wallet_conflicts.py
+++ b/test/functional/wallet_conflicts.py
@@ -9,6 +9,7 @@ Test that wallet correctly tracks transactions that have been conflicted by bloc
from decimal import Decimal
+from test_framework.blocktools import COINBASE_MATURITY
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import (
assert_equal,
@@ -28,6 +29,20 @@ class TxConflicts(BitcoinTestFramework):
return next(tx_out["vout"] for tx_out in self.nodes[0].gettransaction(from_tx_id)["details"] if tx_out["amount"] == Decimal(f"{search_value}"))
def run_test(self):
+ """
+ The following tests check the behavior of the wallet when
+ transaction conflicts are created. These conflicts are created
+ using raw transaction RPCs that double-spend UTXOs and have more
+ fees, replacing the original transaction.
+ """
+
+ self.test_block_conflicts()
+ self.generatetoaddress(self.nodes[0], COINBASE_MATURITY + 7, self.nodes[2].getnewaddress())
+ self.test_mempool_conflict()
+ self.test_mempool_and_block_conflicts()
+ self.test_descendants_with_mempool_conflicts()
+
+ def test_block_conflicts(self):
self.log.info("Send tx from which to conflict outputs later")
txid_conflict_from_1 = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), Decimal("10"))
txid_conflict_from_2 = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), Decimal("10"))
@@ -123,5 +138,291 @@ class TxConflicts(BitcoinTestFramework):
assert_equal(former_conflicted["confirmations"], 1)
assert_equal(former_conflicted["blockheight"], 217)
+ def test_mempool_conflict(self):
+ self.nodes[0].createwallet("alice")
+ alice = self.nodes[0].get_wallet_rpc("alice")
+
+ bob = self.nodes[1]
+
+ self.nodes[2].send(outputs=[{alice.getnewaddress() : 25} for _ in range(3)])
+ self.generate(self.nodes[2], 1)
+
+ self.log.info("Test a scenario where a transaction has a mempool conflict")
+
+ unspents = alice.listunspent()
+ assert_equal(len(unspents), 3)
+ assert all([tx["amount"] == 25 for tx in unspents])
+
+ # tx1 spends unspent[0] and unspent[1]
+ raw_tx = alice.createrawtransaction(inputs=[unspents[0], unspents[1]], outputs=[{bob.getnewaddress() : 49.9999}])
+ tx1 = alice.signrawtransactionwithwallet(raw_tx)['hex']
+
+ # tx2 spends unspent[1] and unspent[2], conflicts with tx1
+ raw_tx = alice.createrawtransaction(inputs=[unspents[1], unspents[2]], outputs=[{bob.getnewaddress() : 49.99}])
+ tx2 = alice.signrawtransactionwithwallet(raw_tx)['hex']
+
+ # tx3 spends unspent[2], conflicts with tx2
+ raw_tx = alice.createrawtransaction(inputs=[unspents[2]], outputs=[{bob.getnewaddress() : 24.9899}])
+ tx3 = alice.signrawtransactionwithwallet(raw_tx)['hex']
+
+ # broadcast tx1
+ tx1_txid = alice.sendrawtransaction(tx1)
+
+ assert_equal(alice.listunspent(), [unspents[2]])
+ assert_equal(alice.getbalance(), 25)
+
+ # broadcast tx2, replaces tx1 in mempool
+ tx2_txid = alice.sendrawtransaction(tx2)
+
+ # Check that unspent[0] is now available because the transaction spending it has been replaced in the mempool
+ assert_equal(alice.listunspent(), [unspents[0]])
+ assert_equal(alice.getbalance(), 25)
+
+ assert_equal(alice.gettransaction(tx1_txid)["mempoolconflicts"], [tx2_txid])
+
+ self.log.info("Test scenario where a mempool conflict is removed")
+
+ # broadcast tx3, replaces tx2 in mempool
+ # Now that tx1's conflict has been removed, tx1 is now
+ # not conflicted, and instead is inactive until it is
+ # rebroadcasted. Now unspent[0] is not available, because
+ # tx1 is no longer conflicted.
+ alice.sendrawtransaction(tx3)
+
+ assert_equal(alice.gettransaction(tx1_txid)["mempoolconflicts"], [])
+ assert tx1_txid not in self.nodes[0].getrawmempool()
+
+ # now all of alice's outputs should be considered spent
+ # unspent[0]: spent by inactive tx1
+ # unspent[1]: spent by inactive tx1
+ # unspent[2]: spent by active tx3
+ assert_equal(alice.listunspent(), [])
+ assert_equal(alice.getbalance(), 0)
+
+ # Clean up for next test
+ bob.sendall([self.nodes[2].getnewaddress()])
+ self.generate(self.nodes[2], 1)
+
+ alice.unloadwallet()
+
+ def test_mempool_and_block_conflicts(self):
+ self.nodes[0].createwallet("alice_2")
+ alice = self.nodes[0].get_wallet_rpc("alice_2")
+ bob = self.nodes[1]
+
+ self.nodes[2].send(outputs=[{alice.getnewaddress() : 25} for _ in range(3)])
+ self.generate(self.nodes[2], 1)
+
+ self.log.info("Test a scenario where a transaction has both a block conflict and a mempool conflict")
+ unspents = [{"txid" : element["txid"], "vout" : element["vout"]} for element in alice.listunspent()]
+
+ assert_equal(bob.getbalances()["mine"]["untrusted_pending"], 0)
+
+ # alice and bob nodes are disconnected so that transactions can be
+ # created by alice, but broadcasted from bob so that alice's wallet
+ # doesn't know about them
+ self.disconnect_nodes(0, 1)
+
+ # Sends funds to bob
+ raw_tx = alice.createrawtransaction(inputs=[unspents[0]], outputs=[{bob.getnewaddress() : 24.99999}])
+ raw_tx1 = alice.signrawtransactionwithwallet(raw_tx)['hex']
+ tx1_txid = bob.sendrawtransaction(raw_tx1) # broadcast original tx spending unspents[0] only to bob
+
+ # create a conflict to previous tx (also spends unspents[0]), but don't broadcast, sends funds back to alice
+ raw_tx = alice.createrawtransaction(inputs=[unspents[0], unspents[2]], outputs=[{alice.getnewaddress() : 49.999}])
+ tx1_conflict = alice.signrawtransactionwithwallet(raw_tx)['hex']
+
+ # Sends funds to bob
+ raw_tx = alice.createrawtransaction(inputs=[unspents[1]], outputs=[{bob.getnewaddress() : 24.9999}])
+ raw_tx2 = alice.signrawtransactionwithwallet(raw_tx)['hex']
+ tx2_txid = bob.sendrawtransaction(raw_tx2) # broadcast another original tx spending unspents[1] only to bob
+
+ # create a conflict to previous tx (also spends unspents[1]), but don't broadcast, sends funds to alice
+ raw_tx = alice.createrawtransaction(inputs=[unspents[1]], outputs=[{alice.getnewaddress() : 24.9999}])
+ tx2_conflict = alice.signrawtransactionwithwallet(raw_tx)['hex']
+
+ bob_unspents = [{"txid" : element, "vout" : 0} for element in [tx1_txid, tx2_txid]]
+
+ # tx1 and tx2 are now in bob's mempool, and they are unconflicted, so bob has these funds
+ assert_equal(bob.getbalances()["mine"]["untrusted_pending"], Decimal("49.99989000"))
+
+ # spend both of bob's unspents, child tx of tx1 and tx2
+ raw_tx = bob.createrawtransaction(inputs=[bob_unspents[0], bob_unspents[1]], outputs=[{bob.getnewaddress() : 49.999}])
+ raw_tx3 = bob.signrawtransactionwithwallet(raw_tx)['hex']
+ tx3_txid = bob.sendrawtransaction(raw_tx3) # broadcast tx only to bob
+
+ # alice knows about 0 txs, bob knows about 3
+ assert_equal(len(alice.getrawmempool()), 0)
+ assert_equal(len(bob.getrawmempool()), 3)
+
+ assert_equal(bob.getbalances()["mine"]["untrusted_pending"], Decimal("49.99900000"))
+
+ # bob broadcasts tx_1 conflict
+ tx1_conflict_txid = bob.sendrawtransaction(tx1_conflict)
+ assert_equal(len(alice.getrawmempool()), 0)
+ assert_equal(len(bob.getrawmempool()), 2) # tx1_conflict kicks out both tx1, and its child tx3
+
+ assert tx2_txid in bob.getrawmempool()
+ assert tx1_conflict_txid in bob.getrawmempool()
+
+ assert_equal(bob.gettransaction(tx1_txid)["mempoolconflicts"], [tx1_conflict_txid])
+ assert_equal(bob.gettransaction(tx2_txid)["mempoolconflicts"], [])
+ assert_equal(bob.gettransaction(tx3_txid)["mempoolconflicts"], [tx1_conflict_txid])
+
+ # check that tx3 is now conflicted, so the output from tx2 can now be spent
+ assert_equal(bob.getbalances()["mine"]["untrusted_pending"], Decimal("24.99990000"))
+
+ # we will be disconnecting this block in the future
+ alice.sendrawtransaction(tx2_conflict)
+ assert_equal(len(alice.getrawmempool()), 1) # currently alice's mempool is only aware of tx2_conflict
+ # 11 blocks are mined so that when they are invalidated, tx_2
+ # does not get put back into the mempool
+ blk = self.generate(self.nodes[0], 11, sync_fun=self.no_op)[0]
+ assert_equal(len(alice.getrawmempool()), 0) # tx2_conflict is now mined
+
+ self.connect_nodes(0, 1)
+ self.sync_blocks()
+ assert_equal(alice.getbestblockhash(), bob.getbestblockhash())
+
+ # now that tx2 has a block conflict, tx1_conflict should be the only tx in bob's mempool
+ assert tx1_conflict_txid in bob.getrawmempool()
+ assert_equal(len(bob.getrawmempool()), 1)
+
+ # tx3 should now also be block-conflicted by tx2_conflict
+ assert_equal(bob.gettransaction(tx3_txid)["confirmations"], -11)
+ # bob has no pending funds, since tx1, tx2, and tx3 are all conflicted
+ assert_equal(bob.getbalances()["mine"]["untrusted_pending"], 0)
+ bob.invalidateblock(blk) # remove tx2_conflict
+ # bob should still have no pending funds because tx1 and tx3 are still conflicted, and tx2 has not been re-broadcast
+ assert_equal(bob.getbalances()["mine"]["untrusted_pending"], 0)
+ assert_equal(len(bob.getrawmempool()), 1)
+ # check that tx3 is no longer block-conflicted
+ assert_equal(bob.gettransaction(tx3_txid)["confirmations"], 0)
+
+ bob.sendrawtransaction(raw_tx2)
+ assert_equal(bob.getbalances()["mine"]["untrusted_pending"], Decimal("24.99990000"))
+
+ # create a conflict to previous tx (also spends unspents[2]), but don't broadcast, sends funds back to alice
+ raw_tx = alice.createrawtransaction(inputs=[unspents[2]], outputs=[{alice.getnewaddress() : 24.99}])
+ tx1_conflict_conflict = alice.signrawtransactionwithwallet(raw_tx)['hex']
+
+ bob.sendrawtransaction(tx1_conflict_conflict) # kick tx1_conflict out of the mempool
+ bob.sendrawtransaction(raw_tx1) #re-broadcast tx1 because it is no longer conflicted
+
+ # Now bob has no pending funds because tx1 and tx2 are spent by tx3, which hasn't been re-broadcast yet
+ assert_equal(bob.getbalances()["mine"]["untrusted_pending"], 0)
+
+ bob.sendrawtransaction(raw_tx3)
+ assert_equal(len(bob.getrawmempool()), 4) # The mempool contains: tx1, tx2, tx1_conflict_conflict, tx3
+ assert_equal(bob.getbalances()["mine"]["untrusted_pending"], Decimal("49.99900000"))
+
+ # Clean up for next test
+ bob.reconsiderblock(blk)
+ assert_equal(alice.getbestblockhash(), bob.getbestblockhash())
+ self.sync_mempools()
+ self.generate(self.nodes[2], 1)
+
+ alice.unloadwallet()
+
+ def test_descendants_with_mempool_conflicts(self):
+ self.nodes[0].createwallet("alice_3")
+ alice = self.nodes[0].get_wallet_rpc("alice_3")
+
+ self.nodes[2].send(outputs=[{alice.getnewaddress() : 25} for _ in range(2)])
+ self.generate(self.nodes[2], 1)
+
+ self.nodes[1].createwallet("bob_1")
+ bob = self.nodes[1].get_wallet_rpc("bob_1")
+
+ self.nodes[2].createwallet("carol")
+ carol = self.nodes[2].get_wallet_rpc("carol")
+
+ self.log.info("Test a scenario where a transaction's parent has a mempool conflict")
+
+ unspents = alice.listunspent()
+ assert_equal(len(unspents), 2)
+ assert all([tx["amount"] == 25 for tx in unspents])
+
+ assert_equal(alice.getrawmempool(), [])
+
+ # Alice spends first utxo to bob in tx1
+ raw_tx = alice.createrawtransaction(inputs=[unspents[0]], outputs=[{bob.getnewaddress() : 24.9999}])
+ tx1 = alice.signrawtransactionwithwallet(raw_tx)['hex']
+ tx1_txid = alice.sendrawtransaction(tx1)
+
+ self.sync_mempools()
+
+ assert_equal(alice.getbalance(), 25)
+ assert_equal(bob.getbalances()["mine"]["untrusted_pending"], Decimal("24.99990000"))
+
+ assert_equal(bob.gettransaction(tx1_txid)["mempoolconflicts"], [])
+
+ raw_tx = bob.createrawtransaction(inputs=[bob.listunspent(minconf=0)[0]], outputs=[{carol.getnewaddress() : 24.999}])
+ # Bob creates a child to tx1
+ tx1_child = bob.signrawtransactionwithwallet(raw_tx)['hex']
+ tx1_child_txid = bob.sendrawtransaction(tx1_child)
+
+ self.sync_mempools()
+
+ # Currently neither tx1 nor tx1_child should have any conflicts
+ assert_equal(bob.gettransaction(tx1_txid)["mempoolconflicts"], [])
+ assert_equal(bob.gettransaction(tx1_child_txid)["mempoolconflicts"], [])
+ assert tx1_txid in bob.getrawmempool()
+ assert tx1_child_txid in bob.getrawmempool()
+ assert_equal(len(bob.getrawmempool()), 2)
+
+ assert_equal(bob.getbalances()["mine"]["untrusted_pending"], 0)
+ assert_equal(carol.getbalances()["mine"]["untrusted_pending"], Decimal("24.99900000"))
+
+ # Alice spends first unspent again, conflicting with tx1
+ raw_tx = alice.createrawtransaction(inputs=[unspents[0], unspents[1]], outputs=[{carol.getnewaddress() : 49.99}])
+ tx1_conflict = alice.signrawtransactionwithwallet(raw_tx)['hex']
+ tx1_conflict_txid = alice.sendrawtransaction(tx1_conflict)
+
+ self.sync_mempools()
+
+ assert_equal(bob.getbalances()["mine"]["untrusted_pending"], 0)
+ assert_equal(carol.getbalances()["mine"]["untrusted_pending"], Decimal("49.99000000"))
+
+ assert tx1_txid not in bob.getrawmempool()
+ assert tx1_child_txid not in bob.getrawmempool()
+ assert tx1_conflict_txid in bob.getrawmempool()
+ assert_equal(len(bob.getrawmempool()), 1)
+
+ # Now both tx1 and tx1_child are conflicted by tx1_conflict
+ assert_equal(bob.gettransaction(tx1_txid)["mempoolconflicts"], [tx1_conflict_txid])
+ assert_equal(bob.gettransaction(tx1_child_txid)["mempoolconflicts"], [tx1_conflict_txid])
+
+ # Now create a conflict to tx1_conflict, so that it gets kicked out of the mempool
+ raw_tx = alice.createrawtransaction(inputs=[unspents[1]], outputs=[{carol.getnewaddress() : 24.9895}])
+ tx1_conflict_conflict = alice.signrawtransactionwithwallet(raw_tx)['hex']
+ tx1_conflict_conflict_txid = alice.sendrawtransaction(tx1_conflict_conflict)
+
+ self.sync_mempools()
+
+ # Now that tx1_conflict has been removed, both tx1 and tx1_child
+ assert_equal(bob.gettransaction(tx1_txid)["mempoolconflicts"], [])
+ assert_equal(bob.gettransaction(tx1_child_txid)["mempoolconflicts"], [])
+
+ # Both tx1 and tx1_child are still not in the mempool because they have not be re-broadcasted
+ assert tx1_txid not in bob.getrawmempool()
+ assert tx1_child_txid not in bob.getrawmempool()
+ assert tx1_conflict_txid not in bob.getrawmempool()
+ assert tx1_conflict_conflict_txid in bob.getrawmempool()
+ assert_equal(len(bob.getrawmempool()), 1)
+
+ assert_equal(alice.getbalance(), 0)
+ assert_equal(bob.getbalances()["mine"]["untrusted_pending"], 0)
+ assert_equal(carol.getbalances()["mine"]["untrusted_pending"], Decimal("24.98950000"))
+
+ # Both tx1 and tx1_child can now be re-broadcasted
+ bob.sendrawtransaction(tx1)
+ bob.sendrawtransaction(tx1_child)
+ assert_equal(len(bob.getrawmempool()), 3)
+
+ alice.unloadwallet()
+ bob.unloadwallet()
+ carol.unloadwallet()
+
if __name__ == '__main__':
TxConflicts().main()
diff --git a/test/functional/wallet_createwalletdescriptor.py b/test/functional/wallet_createwalletdescriptor.py
new file mode 100755
index 0000000000..18e1703da3
--- /dev/null
+++ b/test/functional/wallet_createwalletdescriptor.py
@@ -0,0 +1,123 @@
+#!/usr/bin/env python3
+# Copyright (c) 2023 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+"""Test wallet createwalletdescriptor RPC."""
+
+from test_framework.descriptors import descsum_create
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import (
+ assert_equal,
+ assert_raises_rpc_error,
+)
+from test_framework.wallet_util import WalletUnlock
+
+
+class WalletCreateDescriptorTest(BitcoinTestFramework):
+ def add_options(self, parser):
+ self.add_wallet_options(parser, descriptors=True, legacy=False)
+
+ def set_test_params(self):
+ self.setup_clean_chain = True
+ self.num_nodes = 1
+
+ def skip_test_if_missing_module(self):
+ self.skip_if_no_wallet()
+
+ def run_test(self):
+ self.test_basic()
+ self.test_imported_other_keys()
+ self.test_encrypted()
+
+ def test_basic(self):
+ def_wallet = self.nodes[0].get_wallet_rpc(self.default_wallet_name)
+ self.nodes[0].createwallet("blank", blank=True)
+ wallet = self.nodes[0].get_wallet_rpc("blank")
+
+ xpub_info = def_wallet.gethdkeys(private=True)
+ xpub = xpub_info[0]["xpub"]
+ xprv = xpub_info[0]["xprv"]
+ expected_descs = []
+ for desc in def_wallet.listdescriptors()["descriptors"]:
+ if desc["desc"].startswith("wpkh("):
+ expected_descs.append(desc["desc"])
+
+ assert_raises_rpc_error(-5, "Unable to determine which HD key to use from active descriptors. Please specify with 'hdkey'", wallet.createwalletdescriptor, "bech32")
+ assert_raises_rpc_error(-5, f"Private key for {xpub} is not known", wallet.createwalletdescriptor, type="bech32", hdkey=xpub)
+
+ self.log.info("Test createwalletdescriptor after importing active descriptor to blank wallet")
+ # Import one active descriptor
+ assert_equal(wallet.importdescriptors([{"desc": descsum_create(f"pkh({xprv}/44h/2h/0h/0/0/*)"), "timestamp": "now", "active": True}])[0]["success"], True)
+ assert_equal(len(wallet.listdescriptors()["descriptors"]), 1)
+ assert_equal(len(wallet.gethdkeys()), 1)
+
+ new_descs = wallet.createwalletdescriptor("bech32")["descs"]
+ assert_equal(len(new_descs), 2)
+ assert_equal(len(wallet.gethdkeys()), 1)
+ assert_equal(new_descs, expected_descs)
+
+ self.log.info("Test descriptor creation options")
+ old_descs = set([(d["desc"], d["active"], d["internal"]) for d in wallet.listdescriptors(private=True)["descriptors"]])
+ wallet.createwalletdescriptor(type="bech32m", internal=False)
+ curr_descs = set([(d["desc"], d["active"], d["internal"]) for d in wallet.listdescriptors(private=True)["descriptors"]])
+ new_descs = list(curr_descs - old_descs)
+ assert_equal(len(new_descs), 1)
+ assert_equal(len(wallet.gethdkeys()), 1)
+ assert_equal(new_descs[0][0], descsum_create(f"tr({xprv}/86h/1h/0h/0/*)"))
+ assert_equal(new_descs[0][1], True)
+ assert_equal(new_descs[0][2], False)
+
+ old_descs = curr_descs
+ wallet.createwalletdescriptor(type="bech32m", internal=True)
+ curr_descs = set([(d["desc"], d["active"], d["internal"]) for d in wallet.listdescriptors(private=True)["descriptors"]])
+ new_descs = list(curr_descs - old_descs)
+ assert_equal(len(new_descs), 1)
+ assert_equal(len(wallet.gethdkeys()), 1)
+ assert_equal(new_descs[0][0], descsum_create(f"tr({xprv}/86h/1h/0h/1/*)"))
+ assert_equal(new_descs[0][1], True)
+ assert_equal(new_descs[0][2], True)
+
+ def test_imported_other_keys(self):
+ self.log.info("Test createwalletdescriptor with multiple keys in active descriptors")
+ def_wallet = self.nodes[0].get_wallet_rpc(self.default_wallet_name)
+ self.nodes[0].createwallet("multiple_keys")
+ wallet = self.nodes[0].get_wallet_rpc("multiple_keys")
+
+ wallet_xpub = wallet.gethdkeys()[0]["xpub"]
+
+ xpub_info = def_wallet.gethdkeys(private=True)
+ xpub = xpub_info[0]["xpub"]
+ xprv = xpub_info[0]["xprv"]
+
+ assert_equal(wallet.importdescriptors([{"desc": descsum_create(f"wpkh({xprv}/0/0/*)"), "timestamp": "now", "active": True}])[0]["success"], True)
+ assert_equal(len(wallet.gethdkeys()), 2)
+
+ assert_raises_rpc_error(-5, "Unable to determine which HD key to use from active descriptors. Please specify with 'hdkey'", wallet.createwalletdescriptor, "bech32")
+ assert_raises_rpc_error(-4, "Descriptor already exists", wallet.createwalletdescriptor, type="bech32m", hdkey=wallet_xpub)
+ assert_raises_rpc_error(-5, "Unable to parse HD key. Please provide a valid xpub", wallet.createwalletdescriptor, type="bech32m", hdkey=xprv)
+
+ # Able to replace tr() descriptor with other hd key
+ wallet.createwalletdescriptor(type="bech32m", hdkey=xpub)
+
+ def test_encrypted(self):
+ self.log.info("Test createwalletdescriptor with encrypted wallets")
+ def_wallet = self.nodes[0].get_wallet_rpc(self.default_wallet_name)
+ self.nodes[0].createwallet("encrypted", blank=True, passphrase="pass")
+ wallet = self.nodes[0].get_wallet_rpc("encrypted")
+
+ xpub_info = def_wallet.gethdkeys(private=True)
+ xprv = xpub_info[0]["xprv"]
+
+ with WalletUnlock(wallet, "pass"):
+ assert_equal(wallet.importdescriptors([{"desc": descsum_create(f"wpkh({xprv}/0/0/*)"), "timestamp": "now", "active": True}])[0]["success"], True)
+ assert_equal(len(wallet.gethdkeys()), 1)
+
+ assert_raises_rpc_error(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.", wallet.createwalletdescriptor, type="bech32m")
+
+ with WalletUnlock(wallet, "pass"):
+ wallet.createwalletdescriptor(type="bech32m")
+
+
+
+if __name__ == '__main__':
+ WalletCreateDescriptorTest().main()
diff --git a/test/functional/wallet_fundrawtransaction.py b/test/functional/wallet_fundrawtransaction.py
index d886a59ac1..ff4648e638 100755
--- a/test/functional/wallet_fundrawtransaction.py
+++ b/test/functional/wallet_fundrawtransaction.py
@@ -45,9 +45,8 @@ class RawTransactionsTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 4
self.setup_clean_chain = True
- # This test isn't testing tx relay. Set whitelist on the peers for
- # instant tx relay.
- self.extra_args = [['-whitelist=noban@127.0.0.1']] * self.num_nodes
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.rpc_timeout = 90 # to prevent timeouts in `test_transaction_too_large`
def skip_test_if_missing_module(self):
diff --git a/test/functional/wallet_gethdkeys.py b/test/functional/wallet_gethdkeys.py
new file mode 100755
index 0000000000..f09b8c875a
--- /dev/null
+++ b/test/functional/wallet_gethdkeys.py
@@ -0,0 +1,185 @@
+#!/usr/bin/env python3
+# Copyright (c) 2023 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+"""Test wallet gethdkeys RPC."""
+
+from test_framework.descriptors import descsum_create
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import (
+ assert_equal,
+ assert_raises_rpc_error,
+)
+from test_framework.wallet_util import WalletUnlock
+
+
+class WalletGetHDKeyTest(BitcoinTestFramework):
+ def add_options(self, parser):
+ self.add_wallet_options(parser, descriptors=True, legacy=False)
+
+ def set_test_params(self):
+ self.setup_clean_chain = True
+ self.num_nodes = 1
+
+ def skip_test_if_missing_module(self):
+ self.skip_if_no_wallet()
+
+ def run_test(self):
+ self.test_basic_gethdkeys()
+ self.test_ranged_imports()
+ self.test_lone_key_imports()
+ self.test_ranged_multisig()
+ self.test_mixed_multisig()
+
+ def test_basic_gethdkeys(self):
+ self.log.info("Test gethdkeys basics")
+ self.nodes[0].createwallet("basic")
+ wallet = self.nodes[0].get_wallet_rpc("basic")
+ xpub_info = wallet.gethdkeys()
+ assert_equal(len(xpub_info), 1)
+ assert_equal(xpub_info[0]["has_private"], True)
+
+ assert "xprv" not in xpub_info[0]
+ xpub = xpub_info[0]["xpub"]
+
+ xpub_info = wallet.gethdkeys(private=True)
+ xprv = xpub_info[0]["xprv"]
+ assert_equal(xpub_info[0]["xpub"], xpub)
+ assert_equal(xpub_info[0]["has_private"], True)
+
+ descs = wallet.listdescriptors(True)
+ for desc in descs["descriptors"]:
+ assert xprv in desc["desc"]
+
+ self.log.info("HD pubkey can be retrieved from encrypted wallets")
+ prev_xprv = xprv
+ wallet.encryptwallet("pass")
+ # HD key is rotated on encryption, there should now be 2 HD keys
+ assert_equal(len(wallet.gethdkeys()), 2)
+ # New key is active, should be able to get only that one and its descriptors
+ xpub_info = wallet.gethdkeys(active_only=True)
+ assert_equal(len(xpub_info), 1)
+ assert xpub_info[0]["xpub"] != xpub
+ assert "xprv" not in xpub_info[0]
+ assert_equal(xpub_info[0]["has_private"], True)
+
+ self.log.info("HD privkey can be retrieved from encrypted wallets")
+ assert_raises_rpc_error(-13, "Error: Please enter the wallet passphrase with walletpassphrase first", wallet.gethdkeys, private=True)
+ with WalletUnlock(wallet, "pass"):
+ xpub_info = wallet.gethdkeys(active_only=True, private=True)[0]
+ assert xpub_info["xprv"] != xprv
+ for desc in wallet.listdescriptors(True)["descriptors"]:
+ if desc["active"]:
+ # After encrypting, HD key was rotated and should appear in all active descriptors
+ assert xpub_info["xprv"] in desc["desc"]
+ else:
+ # Inactive descriptors should have the previous HD key
+ assert prev_xprv in desc["desc"]
+
+ def test_ranged_imports(self):
+ self.log.info("Keys of imported ranged descriptors appear in gethdkeys")
+ def_wallet = self.nodes[0].get_wallet_rpc(self.default_wallet_name)
+ self.nodes[0].createwallet("imports")
+ wallet = self.nodes[0].get_wallet_rpc("imports")
+
+ xpub_info = wallet.gethdkeys()
+ assert_equal(len(xpub_info), 1)
+ active_xpub = xpub_info[0]["xpub"]
+
+ import_xpub = def_wallet.gethdkeys(active_only=True)[0]["xpub"]
+ desc_import = def_wallet.listdescriptors(True)["descriptors"]
+ for desc in desc_import:
+ desc["active"] = False
+ wallet.importdescriptors(desc_import)
+ assert_equal(wallet.gethdkeys(active_only=True), xpub_info)
+
+ xpub_info = wallet.gethdkeys()
+ assert_equal(len(xpub_info), 2)
+ for x in xpub_info:
+ if x["xpub"] == active_xpub:
+ for desc in x["descriptors"]:
+ assert_equal(desc["active"], True)
+ elif x["xpub"] == import_xpub:
+ for desc in x["descriptors"]:
+ assert_equal(desc["active"], False)
+ else:
+ assert False
+
+
+ def test_lone_key_imports(self):
+ self.log.info("Non-HD keys do not appear in gethdkeys")
+ self.nodes[0].createwallet("lonekey", blank=True)
+ wallet = self.nodes[0].get_wallet_rpc("lonekey")
+
+ assert_equal(wallet.gethdkeys(), [])
+ wallet.importdescriptors([{"desc": descsum_create("wpkh(cTe1f5rdT8A8DFgVWTjyPwACsDPJM9ff4QngFxUixCSvvbg1x6sh)"), "timestamp": "now"}])
+ assert_equal(wallet.gethdkeys(), [])
+
+ self.log.info("HD keys of non-ranged descriptors should appear in gethdkeys")
+ def_wallet = self.nodes[0].get_wallet_rpc(self.default_wallet_name)
+ xpub_info = def_wallet.gethdkeys(private=True)
+ xpub = xpub_info[0]["xpub"]
+ xprv = xpub_info[0]["xprv"]
+ prv_desc = descsum_create(f"wpkh({xprv})")
+ pub_desc = descsum_create(f"wpkh({xpub})")
+ assert_equal(wallet.importdescriptors([{"desc": prv_desc, "timestamp": "now"}])[0]["success"], True)
+ xpub_info = wallet.gethdkeys()
+ assert_equal(len(xpub_info), 1)
+ assert_equal(xpub_info[0]["xpub"], xpub)
+ assert_equal(len(xpub_info[0]["descriptors"]), 1)
+ assert_equal(xpub_info[0]["descriptors"][0]["desc"], pub_desc)
+ assert_equal(xpub_info[0]["descriptors"][0]["active"], False)
+
+ def test_ranged_multisig(self):
+ self.log.info("HD keys of a multisig appear in gethdkeys")
+ def_wallet = self.nodes[0].get_wallet_rpc(self.default_wallet_name)
+ self.nodes[0].createwallet("ranged_multisig")
+ wallet = self.nodes[0].get_wallet_rpc("ranged_multisig")
+
+ xpub1 = wallet.gethdkeys()[0]["xpub"]
+ xprv1 = wallet.gethdkeys(private=True)[0]["xprv"]
+ xpub2 = def_wallet.gethdkeys()[0]["xpub"]
+
+ prv_multi_desc = descsum_create(f"wsh(multi(2,{xprv1}/*,{xpub2}/*))")
+ pub_multi_desc = descsum_create(f"wsh(multi(2,{xpub1}/*,{xpub2}/*))")
+ assert_equal(wallet.importdescriptors([{"desc": prv_multi_desc, "timestamp": "now"}])[0]["success"], True)
+
+ xpub_info = wallet.gethdkeys()
+ assert_equal(len(xpub_info), 2)
+ for x in xpub_info:
+ if x["xpub"] == xpub1:
+ found_desc = next((d for d in xpub_info[0]["descriptors"] if d["desc"] == pub_multi_desc), None)
+ assert found_desc is not None
+ assert_equal(found_desc["active"], False)
+ elif x["xpub"] == xpub2:
+ assert_equal(len(x["descriptors"]), 1)
+ assert_equal(x["descriptors"][0]["desc"], pub_multi_desc)
+ assert_equal(x["descriptors"][0]["active"], False)
+ else:
+ assert False
+
+ def test_mixed_multisig(self):
+ self.log.info("Non-HD keys of a multisig do not appear in gethdkeys")
+ def_wallet = self.nodes[0].get_wallet_rpc(self.default_wallet_name)
+ self.nodes[0].createwallet("single_multisig")
+ wallet = self.nodes[0].get_wallet_rpc("single_multisig")
+
+ xpub = wallet.gethdkeys()[0]["xpub"]
+ xprv = wallet.gethdkeys(private=True)[0]["xprv"]
+ pub = def_wallet.getaddressinfo(def_wallet.getnewaddress())["pubkey"]
+
+ prv_multi_desc = descsum_create(f"wsh(multi(2,{xprv},{pub}))")
+ pub_multi_desc = descsum_create(f"wsh(multi(2,{xpub},{pub}))")
+ import_res = wallet.importdescriptors([{"desc": prv_multi_desc, "timestamp": "now"}])
+ assert_equal(import_res[0]["success"], True)
+
+ xpub_info = wallet.gethdkeys()
+ assert_equal(len(xpub_info), 1)
+ assert_equal(xpub_info[0]["xpub"], xpub)
+ found_desc = next((d for d in xpub_info[0]["descriptors"] if d["desc"] == pub_multi_desc), None)
+ assert found_desc is not None
+ assert_equal(found_desc["active"], False)
+
+
+if __name__ == '__main__':
+ WalletGetHDKeyTest().main()
diff --git a/test/functional/wallet_groups.py b/test/functional/wallet_groups.py
index bdb9081261..3b407c285d 100755
--- a/test/functional/wallet_groups.py
+++ b/test/functional/wallet_groups.py
@@ -22,6 +22,8 @@ class WalletGroupTest(BitcoinTestFramework):
def set_test_params(self):
self.setup_clean_chain = True
self.num_nodes = 5
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.extra_args = [
[],
[],
@@ -31,7 +33,6 @@ class WalletGroupTest(BitcoinTestFramework):
]
for args in self.extra_args:
- args.append("-whitelist=noban@127.0.0.1") # whitelist peers to speed up tx relay / mempool sync
args.append(f"-paytxfee={20 * 1e3 / 1e8}") # apply feerate of 20 sats/vB across all nodes
self.rpc_timeout = 480
diff --git a/test/functional/wallet_hd.py b/test/functional/wallet_hd.py
index 0f4b7cfcb1..52161043ea 100755
--- a/test/functional/wallet_hd.py
+++ b/test/functional/wallet_hd.py
@@ -23,8 +23,7 @@ class WalletHDTest(BitcoinTestFramework):
self.num_nodes = 2
self.extra_args = [[], ['-keypool=0']]
# whitelist peers to speed up tx relay / mempool sync
- for args in self.extra_args:
- args.append("-whitelist=noban@127.0.0.1")
+ self.noban_tx_relay = True
self.supports_cli = False
diff --git a/test/functional/wallet_import_rescan.py b/test/functional/wallet_import_rescan.py
index e647fb2d5c..2a9435b370 100755
--- a/test/functional/wallet_import_rescan.py
+++ b/test/functional/wallet_import_rescan.py
@@ -160,6 +160,8 @@ class ImportRescanTest(BitcoinTestFramework):
self.num_nodes = 2 + len(IMPORT_NODES)
self.supports_cli = False
self.rpc_timeout = 120
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
def skip_test_if_missing_module(self):
self.skip_if_no_wallet()
@@ -177,7 +179,7 @@ class ImportRescanTest(BitcoinTestFramework):
self.import_deterministic_coinbase_privkeys()
self.stop_nodes()
- self.start_nodes(extra_args=[["-whitelist=noban@127.0.0.1"]] * self.num_nodes)
+ self.start_nodes()
for i in range(1, self.num_nodes):
self.connect_nodes(i, 0)
diff --git a/test/functional/wallet_importdescriptors.py b/test/functional/wallet_importdescriptors.py
index 1f1f92589c..420bdffc49 100755
--- a/test/functional/wallet_importdescriptors.py
+++ b/test/functional/wallet_importdescriptors.py
@@ -36,12 +36,11 @@ class ImportDescriptorsTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 2
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.extra_args = [["-addresstype=legacy"],
["-addresstype=bech32", "-keypool=5"]
]
- # whitelist peers to speed up tx relay / mempool sync
- for args in self.extra_args:
- args.append("-whitelist=noban@127.0.0.1")
self.setup_clean_chain = True
self.wallet_names = []
diff --git a/test/functional/wallet_importprunedfunds.py b/test/functional/wallet_importprunedfunds.py
index 5fe7c4b591..b3ae22cc44 100755
--- a/test/functional/wallet_importprunedfunds.py
+++ b/test/functional/wallet_importprunedfunds.py
@@ -120,7 +120,7 @@ class ImportPrunedFundsTest(BitcoinTestFramework):
assert_equal(address_info['ismine'], True)
# Remove transactions
- assert_raises_rpc_error(-8, "Transaction does not exist in wallet.", w1.removeprunedfunds, txnid1)
+ assert_raises_rpc_error(-4, f'Transaction {txnid1} does not belong to this wallet', w1.removeprunedfunds, txnid1)
assert not [tx for tx in w1.listtransactions(include_watchonly=True) if tx['txid'] == txnid1]
wwatch.removeprunedfunds(txnid2)
diff --git a/test/functional/wallet_keypool.py b/test/functional/wallet_keypool.py
index d2341fb12e..6ed8572347 100755
--- a/test/functional/wallet_keypool.py
+++ b/test/functional/wallet_keypool.py
@@ -103,11 +103,18 @@ class KeyPoolTest(BitcoinTestFramework):
nodes[0].getrawchangeaddress()
nodes[0].getrawchangeaddress()
nodes[0].getrawchangeaddress()
- addr = set()
+ # remember keypool sizes
+ wi = nodes[0].getwalletinfo()
+ kp_size_before = [wi['keypoolsize_hd_internal'], wi['keypoolsize']]
# the next one should fail
assert_raises_rpc_error(-12, "Keypool ran out", nodes[0].getrawchangeaddress)
+ # check that keypool sizes did not change
+ wi = nodes[0].getwalletinfo()
+ kp_size_after = [wi['keypoolsize_hd_internal'], wi['keypoolsize']]
+ assert_equal(kp_size_before, kp_size_after)
# drain the external keys
+ addr = set()
addr.add(nodes[0].getnewaddress(address_type="bech32"))
addr.add(nodes[0].getnewaddress(address_type="bech32"))
addr.add(nodes[0].getnewaddress(address_type="bech32"))
@@ -115,8 +122,15 @@ class KeyPoolTest(BitcoinTestFramework):
addr.add(nodes[0].getnewaddress(address_type="bech32"))
addr.add(nodes[0].getnewaddress(address_type="bech32"))
assert len(addr) == 6
+ # remember keypool sizes
+ wi = nodes[0].getwalletinfo()
+ kp_size_before = [wi['keypoolsize_hd_internal'], wi['keypoolsize']]
# the next one should fail
assert_raises_rpc_error(-12, "Error: Keypool ran out, please call keypoolrefill first", nodes[0].getnewaddress)
+ # check that keypool sizes did not change
+ wi = nodes[0].getwalletinfo()
+ kp_size_after = [wi['keypoolsize_hd_internal'], wi['keypoolsize']]
+ assert_equal(kp_size_before, kp_size_after)
# refill keypool with three new addresses
nodes[0].walletpassphrase('test', 1)
diff --git a/test/functional/wallet_keypool_topup.py b/test/functional/wallet_keypool_topup.py
index 48180e8294..e1bd85d8a9 100755
--- a/test/functional/wallet_keypool_topup.py
+++ b/test/functional/wallet_keypool_topup.py
@@ -25,8 +25,10 @@ class KeypoolRestoreTest(BitcoinTestFramework):
def set_test_params(self):
self.setup_clean_chain = True
- self.num_nodes = 4
- self.extra_args = [[], ['-keypool=100'], ['-keypool=100'], ['-keypool=100']]
+ self.num_nodes = 5
+ self.extra_args = [[]]
+ for _ in range(self.num_nodes - 1):
+ self.extra_args.append(['-keypool=100'])
def skip_test_if_missing_module(self):
self.skip_if_no_wallet()
@@ -40,12 +42,13 @@ class KeypoolRestoreTest(BitcoinTestFramework):
self.stop_node(1)
shutil.copyfile(wallet_path, wallet_backup_path)
self.start_node(1, self.extra_args[1])
- self.connect_nodes(0, 1)
- self.connect_nodes(0, 2)
- self.connect_nodes(0, 3)
-
- for i, output_type in enumerate(["legacy", "p2sh-segwit", "bech32"]):
+ for i in [1, 2, 3, 4]:
+ self.connect_nodes(0, i)
+ output_types = ["legacy", "p2sh-segwit", "bech32"]
+ if self.options.descriptors:
+ output_types.append("bech32m")
+ for i, output_type in enumerate(output_types):
self.log.info("Generate keys for wallet with address type: {}".format(output_type))
idx = i+1
for _ in range(90):
@@ -59,9 +62,10 @@ class KeypoolRestoreTest(BitcoinTestFramework):
assert not address_details["isscript"] and not address_details["iswitness"]
elif i == 1:
assert address_details["isscript"] and not address_details["iswitness"]
- else:
+ elif i == 2:
assert not address_details["isscript"] and address_details["iswitness"]
-
+ elif i == 3:
+ assert address_details["isscript"] and address_details["iswitness"]
self.log.info("Send funds to wallet")
self.nodes[0].sendtoaddress(addr_oldpool, 10)
@@ -87,6 +91,8 @@ class KeypoolRestoreTest(BitcoinTestFramework):
assert_equal(self.nodes[idx].getaddressinfo(self.nodes[idx].getnewaddress(address_type=output_type))['hdkeypath'], "m/49h/1h/0h/0/110")
elif output_type == 'bech32':
assert_equal(self.nodes[idx].getaddressinfo(self.nodes[idx].getnewaddress(address_type=output_type))['hdkeypath'], "m/84h/1h/0h/0/110")
+ elif output_type == 'bech32m':
+ assert_equal(self.nodes[idx].getaddressinfo(self.nodes[idx].getnewaddress(address_type=output_type))['hdkeypath'], "m/86h/1h/0h/0/110")
else:
assert_equal(self.nodes[idx].getaddressinfo(self.nodes[idx].getnewaddress(address_type=output_type))['hdkeypath'], "m/0'/0'/110'")
diff --git a/test/functional/wallet_listreceivedby.py b/test/functional/wallet_listreceivedby.py
index 8ec21484d1..d0f1336a5e 100755
--- a/test/functional/wallet_listreceivedby.py
+++ b/test/functional/wallet_listreceivedby.py
@@ -22,7 +22,7 @@ class ReceivedByTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 2
# whitelist peers to speed up tx relay / mempool sync
- self.extra_args = [["-whitelist=noban@127.0.0.1"]] * self.num_nodes
+ self.noban_tx_relay = True
def skip_test_if_missing_module(self):
self.skip_if_no_wallet()
diff --git a/test/functional/wallet_listsinceblock.py b/test/functional/wallet_listsinceblock.py
index a19a3ac2cb..fd586d546e 100755
--- a/test/functional/wallet_listsinceblock.py
+++ b/test/functional/wallet_listsinceblock.py
@@ -26,7 +26,7 @@ class ListSinceBlockTest(BitcoinTestFramework):
self.num_nodes = 4
self.setup_clean_chain = True
# whitelist peers to speed up tx relay / mempool sync
- self.extra_args = [["-whitelist=noban@127.0.0.1"]] * self.num_nodes
+ self.noban_tx_relay = True
def skip_test_if_missing_module(self):
self.skip_if_no_wallet()
diff --git a/test/functional/wallet_listtransactions.py b/test/functional/wallet_listtransactions.py
index 064ce12108..c820eaa6f6 100755
--- a/test/functional/wallet_listtransactions.py
+++ b/test/functional/wallet_listtransactions.py
@@ -26,9 +26,9 @@ class ListTransactionsTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 3
- # This test isn't testing txn relay/timing, so set whitelist on the
- # peers for instant txn relay. This speeds up the test run time 2-3x.
- self.extra_args = [["-whitelist=noban@127.0.0.1", "-walletrbf=0"]] * self.num_nodes
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
+ self.extra_args = [["-walletrbf=0"]] * self.num_nodes
def skip_test_if_missing_module(self):
self.skip_if_no_wallet()
diff --git a/test/functional/wallet_migration.py b/test/functional/wallet_migration.py
index f9919716be..890b6a5c1b 100755
--- a/test/functional/wallet_migration.py
+++ b/test/functional/wallet_migration.py
@@ -529,11 +529,20 @@ class WalletMigrationTest(BitcoinTestFramework):
self.log.info("Test migration of the wallet named as the empty string")
wallet = self.create_legacy_wallet("")
- self.migrate_wallet(wallet)
+ # Set time to verify backup existence later
+ curr_time = int(time.time())
+ wallet.setmocktime(curr_time)
+
+ res = self.migrate_wallet(wallet)
info = wallet.getwalletinfo()
assert_equal(info["descriptors"], True)
assert_equal(info["format"], "sqlite")
+ # Check backup existence and its non-empty wallet filename
+ backup_path = self.nodes[0].wallets_path / f'default_wallet_{curr_time}.legacy.bak'
+ assert backup_path.exists()
+ assert_equal(str(backup_path), res['backup_path'])
+
def test_direct_file(self):
self.log.info("Test migration of a wallet that is not in a wallet directory")
wallet = self.create_legacy_wallet("plainfile")
diff --git a/test/functional/wallet_reorgsrestore.py b/test/functional/wallet_reorgsrestore.py
index 86a2905c72..4271f3e481 100755
--- a/test/functional/wallet_reorgsrestore.py
+++ b/test/functional/wallet_reorgsrestore.py
@@ -45,6 +45,7 @@ class ReorgsRestoreTest(BitcoinTestFramework):
txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), Decimal("10"))
tx = self.nodes[0].gettransaction(txid)
self.generate(self.nodes[0], 4, sync_fun=self.no_op)
+ self.sync_blocks([self.nodes[0], self.nodes[2]])
tx_before_reorg = self.nodes[0].gettransaction(txid)
assert_equal(tx_before_reorg["confirmations"], 4)
diff --git a/test/functional/wallet_send.py b/test/functional/wallet_send.py
index 6ce2a56bfc..e4ca341b49 100755
--- a/test/functional/wallet_send.py
+++ b/test/functional/wallet_send.py
@@ -30,10 +30,11 @@ class WalletSendTest(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 2
- # whitelist all peers to speed up tx relay / mempool sync
+ # whitelist peers to speed up tx relay / mempool sync
+ self.noban_tx_relay = True
self.extra_args = [
- ["-whitelist=127.0.0.1","-walletrbf=1"],
- ["-whitelist=127.0.0.1","-walletrbf=1"],
+ ["-walletrbf=1"],
+ ["-walletrbf=1"]
]
getcontext().prec = 8 # Satoshi precision for Decimal
@@ -543,11 +544,16 @@ class WalletSendTest(BitcoinTestFramework):
break
psbt_in = dec["inputs"][input_idx]
# Calculate the input weight
- # (prevout + sequence + length of scriptSig + scriptsig + 1 byte buffer) * WITNESS_SCALE_FACTOR + num scriptWitness stack items + (length of stack item + stack item) * N stack items + 1 byte buffer
+ # (prevout + sequence + length of scriptSig + scriptsig) * WITNESS_SCALE_FACTOR + len of num scriptWitness stack items + (length of stack item + stack item) * N stack items
+ # Note that occasionally this weight estimate may be slightly larger or smaller than the real weight
+ # as sometimes ECDSA signatures are one byte shorter than expected with a probability of 1/128
len_scriptsig = len(psbt_in["final_scriptSig"]["hex"]) // 2 if "final_scriptSig" in psbt_in else 0
- len_scriptsig += len(ser_compact_size(len_scriptsig)) + 1
- len_scriptwitness = (sum([(len(x) // 2) + len(ser_compact_size(len(x) // 2)) for x in psbt_in["final_scriptwitness"]]) + len(psbt_in["final_scriptwitness"]) + 1) if "final_scriptwitness" in psbt_in else 0
- input_weight = ((40 + len_scriptsig) * WITNESS_SCALE_FACTOR) + len_scriptwitness
+ len_scriptsig += len(ser_compact_size(len_scriptsig))
+ len_scriptwitness = (sum([(len(x) // 2) + len(ser_compact_size(len(x) // 2)) for x in psbt_in["final_scriptwitness"]]) + len(ser_compact_size(len(psbt_in["final_scriptwitness"])))) if "final_scriptwitness" in psbt_in else 0
+ len_prevout_txid = 32
+ len_prevout_index = 4
+ len_sequence = 4
+ input_weight = ((len_prevout_txid + len_prevout_index + len_sequence + len_scriptsig) * WITNESS_SCALE_FACTOR) + len_scriptwitness
# Input weight error conditions
assert_raises_rpc_error(
@@ -558,6 +564,7 @@ class WalletSendTest(BitcoinTestFramework):
options={"inputs": [ext_utxo], "input_weights": [{"txid": ext_utxo["txid"], "vout": ext_utxo["vout"], "weight": 1000}]}
)
+ target_fee_rate_sat_vb = 10
# Funding should also work when input weights are provided
res = self.test_send(
from_wallet=ext_wallet,
@@ -567,14 +574,17 @@ class WalletSendTest(BitcoinTestFramework):
add_inputs=True,
psbt=True,
include_watching=True,
- fee_rate=10
+ fee_rate=target_fee_rate_sat_vb
)
signed = ext_wallet.walletprocesspsbt(res["psbt"])
signed = ext_fund.walletprocesspsbt(res["psbt"])
assert signed["complete"]
testres = self.nodes[0].testmempoolaccept([signed["hex"]])[0]
assert_equal(testres["allowed"], True)
- assert_fee_amount(testres["fees"]["base"], testres["vsize"], Decimal(0.0001))
+ actual_fee_rate_sat_vb = Decimal(testres["fees"]["base"]) * Decimal(1e8) / Decimal(testres["vsize"])
+ # Due to ECDSA signatures not always being the same length, the actual fee rate may be slightly different
+ # but rounded to nearest integer, it should be the same as the target fee rate
+ assert_equal(round(actual_fee_rate_sat_vb), target_fee_rate_sat_vb)
if __name__ == '__main__':
WalletSendTest().main()
diff --git a/test/fuzz/test_runner.py b/test/fuzz/test_runner.py
index 4e24c07699..b3edb0e253 100755
--- a/test/fuzz/test_runner.py
+++ b/test/fuzz/test_runner.py
@@ -11,6 +11,7 @@ import argparse
import configparser
import logging
import os
+import random
import subprocess
import sys
@@ -104,7 +105,10 @@ def main():
sys.exit(1)
# Build list of tests
- test_list_all = parse_test_list(fuzz_bin=os.path.join(config["environment"]["BUILDDIR"], 'src', 'test', 'fuzz', 'fuzz'))
+ test_list_all = parse_test_list(
+ fuzz_bin=os.path.join(config["environment"]["BUILDDIR"], 'src', 'test', 'fuzz', 'fuzz'),
+ source_dir=config['environment']['SRCDIR'],
+ )
if not test_list_all:
logging.error("No fuzz targets found")
@@ -264,9 +268,13 @@ def generate_corpus(*, fuzz_pool, src_dir, build_dir, corpus_dir, targets):
for target, t_env in targets:
target_corpus_dir = corpus_dir / target
os.makedirs(target_corpus_dir, exist_ok=True)
+ use_value_profile = int(random.random() < .3)
command = [
os.path.join(build_dir, 'src', 'test', 'fuzz', 'fuzz'),
- "-runs=100000",
+ "-rss_limit_mb=8000",
+ "-max_total_time=6000",
+ "-reload=0",
+ f"-use_value_profile={use_value_profile}",
target_corpus_dir,
]
futures.append(fuzz_pool.submit(job, command, target, t_env))
@@ -378,11 +386,12 @@ def run_once(*, fuzz_pool, corpus, test_list, src_dir, build_dir, using_libfuzze
print(f"{t}{s}")
-def parse_test_list(*, fuzz_bin):
+def parse_test_list(*, fuzz_bin, source_dir):
test_list_all = subprocess.run(
fuzz_bin,
env={
- 'PRINT_ALL_FUZZ_TARGETS_AND_ABORT': ''
+ 'PRINT_ALL_FUZZ_TARGETS_AND_ABORT': '',
+ **get_fuzz_env(target="", source_dir=source_dir)
},
stdout=subprocess.PIPE,
text=True,
diff --git a/test/lint/README.md b/test/lint/README.md
index 1fba41d9ea..9d167bac72 100644
--- a/test/lint/README.md
+++ b/test/lint/README.md
@@ -16,10 +16,14 @@ result is cached and it prevents issues when the image changes.
test runner
===========
-To run all the lint checks in the test runner outside the docker, use:
+To run all the lint checks in the test runner outside the docker you first need
+to install the rust toolchain using your package manager of choice or
+[rustup](https://www.rust-lang.org/tools/install).
+
+Then you can use:
```sh
-( cd ./test/lint/test_runner/ && cargo fmt && cargo clippy && cargo run )
+( cd ./test/lint/test_runner/ && cargo fmt && cargo clippy && RUST_BACKTRACE=1 cargo run )
```
#### Dependencies
@@ -34,7 +38,7 @@ To run all the lint checks in the test runner outside the docker, use:
| [`lint-shell.py`](lint/lint-shell.py) | [ShellCheck](https://github.com/koalaman/shellcheck)
| [`lint-spelling.py`](lint/lint-spelling.py) | [codespell](https://github.com/codespell-project/codespell)
-In use versions and install instructions are available in the [CI setup](../ci/lint/04_install.sh).
+In use versions and install instructions are available in the [CI setup](../../ci/lint/04_install.sh).
Please be aware that on Linux distributions all dependencies are usually available as packages, but could be outdated.
@@ -83,3 +87,7 @@ To do so, add the upstream repository as remote:
```
git remote add --fetch secp256k1 https://github.com/bitcoin-core/secp256k1.git
```
+
+lint_ignore_dirs.py
+===================
+Add list of common directories to ignore when running tests
diff --git a/test/lint/lint-git-commit-check.py b/test/lint/lint-git-commit-check.py
index 5897a17e70..5dc30cc755 100755
--- a/test/lint/lint-git-commit-check.py
+++ b/test/lint/lint-git-commit-check.py
@@ -23,31 +23,18 @@ def parse_args():
""",
epilog=f"""
You can manually set the commit-range with the COMMIT_RANGE
- environment variable (e.g. "COMMIT_RANGE='47ba2c3...ee50c9e'
- {sys.argv[0]}"). Defaults to current merge base when neither
- prev-commits nor the environment variable is set.
+ environment variable (e.g. "COMMIT_RANGE='HEAD~n..HEAD'
+ {sys.argv[0]}") for the last 'n' commits.
""")
-
- parser.add_argument("--prev-commits", "-p", required=False, help="The previous n commits to check")
-
return parser.parse_args()
def main():
- args = parse_args()
+ parse_args()
exit_code = 0
- if not os.getenv("COMMIT_RANGE"):
- if args.prev_commits:
- commit_range = "HEAD~" + args.prev_commits + "...HEAD"
- else:
- # This assumes that the target branch of the pull request will be master.
- merge_base = check_output(["git", "merge-base", "HEAD", "master"], text=True, encoding="utf8").rstrip("\n")
- commit_range = merge_base + "..HEAD"
- else:
- commit_range = os.getenv("COMMIT_RANGE")
- if commit_range == "SKIP_EMPTY_NOT_A_PR":
- sys.exit(0)
+ assert os.getenv("COMMIT_RANGE") # E.g. COMMIT_RANGE='HEAD~n..HEAD'
+ commit_range = os.getenv("COMMIT_RANGE")
commit_hashes = check_output(["git", "log", commit_range, "--format=%H"], text=True, encoding="utf8").splitlines()
diff --git a/test/lint/lint-include-guards.py b/test/lint/lint-include-guards.py
index 291e528c1d..77af05c1c2 100755
--- a/test/lint/lint-include-guards.py
+++ b/test/lint/lint-include-guards.py
@@ -12,19 +12,17 @@ import re
import sys
from subprocess import check_output
+from lint_ignore_dirs import SHARED_EXCLUDED_SUBTREES
+
HEADER_ID_PREFIX = 'BITCOIN_'
HEADER_ID_SUFFIX = '_H'
EXCLUDE_FILES_WITH_PREFIX = ['contrib/devtools/bitcoin-tidy',
'src/crypto/ctaes',
- 'src/leveldb',
- 'src/crc32c',
- 'src/secp256k1',
- 'src/minisketch',
'src/tinyformat.h',
'src/bench/nanobench.h',
- 'src/test/fuzz/FuzzedDataProvider.h']
+ 'src/test/fuzz/FuzzedDataProvider.h'] + SHARED_EXCLUDED_SUBTREES
def _get_header_file_lst() -> list[str]:
diff --git a/test/lint/lint-includes.py b/test/lint/lint-includes.py
index 6386a92c0f..81ed4c0840 100755
--- a/test/lint/lint-includes.py
+++ b/test/lint/lint-includes.py
@@ -14,13 +14,11 @@ import sys
from subprocess import check_output, CalledProcessError
+from lint_ignore_dirs import SHARED_EXCLUDED_SUBTREES
+
EXCLUDED_DIRS = ["contrib/devtools/bitcoin-tidy/",
- "src/leveldb/",
- "src/crc32c/",
- "src/secp256k1/",
- "src/minisketch/",
- ]
+ ] + SHARED_EXCLUDED_SUBTREES
EXPECTED_BOOST_INCLUDES = ["boost/date_time/posix_time/posix_time.hpp",
"boost/multi_index/detail/hash_index_iterator.hpp",
diff --git a/test/lint/lint-spelling.py b/test/lint/lint-spelling.py
index ac0bddeaa6..3e578b218f 100755
--- a/test/lint/lint-spelling.py
+++ b/test/lint/lint-spelling.py
@@ -11,8 +11,11 @@ Note: Will exit successfully regardless of spelling errors.
from subprocess import check_output, STDOUT, CalledProcessError
+from lint_ignore_dirs import SHARED_EXCLUDED_SUBTREES
+
IGNORE_WORDS_FILE = 'test/lint/spelling.ignore-words.txt'
-FILES_ARGS = ['git', 'ls-files', '--', ":(exclude)build-aux/m4/", ":(exclude)contrib/seeds/*.txt", ":(exclude)depends/", ":(exclude)doc/release-notes/", ":(exclude)src/leveldb/", ":(exclude)src/crc32c/", ":(exclude)src/qt/locale/", ":(exclude)src/qt/*.qrc", ":(exclude)src/secp256k1/", ":(exclude)src/minisketch/", ":(exclude)contrib/guix/patches"]
+FILES_ARGS = ['git', 'ls-files', '--', ":(exclude)build-aux/m4/", ":(exclude)contrib/seeds/*.txt", ":(exclude)depends/", ":(exclude)doc/release-notes/", ":(exclude)src/qt/locale/", ":(exclude)src/qt/*.qrc", ":(exclude)contrib/guix/patches"]
+FILES_ARGS += [f":(exclude){dir}" for dir in SHARED_EXCLUDED_SUBTREES]
def check_codespell_install():
diff --git a/test/lint/lint-whitespace.py b/test/lint/lint-whitespace.py
deleted file mode 100755
index f5e4a776d0..0000000000
--- a/test/lint/lint-whitespace.py
+++ /dev/null
@@ -1,136 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2017-2022 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#
-# Check for new lines in diff that introduce trailing whitespace or
-# tab characters instead of spaces.
-
-# We can't run this check unless we know the commit range for the PR.
-
-import argparse
-import os
-import re
-import sys
-
-from subprocess import check_output
-
-EXCLUDED_DIRS = ["depends/patches/",
- "contrib/guix/patches/",
- "src/leveldb/",
- "src/crc32c/",
- "src/secp256k1/",
- "src/minisketch/",
- "doc/release-notes/",
- "src/qt/locale"]
-
-def parse_args():
- """Parse command line arguments."""
- parser = argparse.ArgumentParser(
- description="""
- Check for new lines in diff that introduce trailing whitespace
- or tab characters instead of spaces in unstaged changes, the
- previous n commits, or a commit-range.
- """,
- epilog=f"""
- You can manually set the commit-range with the COMMIT_RANGE
- environment variable (e.g. "COMMIT_RANGE='47ba2c3...ee50c9e'
- {sys.argv[0]}"). Defaults to current merge base when neither
- prev-commits nor the environment variable is set.
- """)
-
- parser.add_argument("--prev-commits", "-p", required=False, help="The previous n commits to check")
-
- return parser.parse_args()
-
-
-def report_diff(selection):
- filename = ""
- seen = False
- seenln = False
-
- print("The following changes were suspected:")
-
- for line in selection:
- if re.match(r"^diff", line):
- filename = line
- seen = False
- elif re.match(r"^@@", line):
- linenumber = line
- seenln = False
- else:
- if not seen:
- # The first time a file is seen with trailing whitespace or a tab character, we print the
- # filename (preceded by a newline).
- print("")
- print(filename)
- seen = True
- if not seenln:
- print(linenumber)
- seenln = True
- print(line)
-
-
-def get_diff(commit_range, check_only_code):
- exclude_args = [":(exclude)" + dir for dir in EXCLUDED_DIRS]
-
- if check_only_code:
- what_files = ["*.cpp", "*.h", "*.md", "*.py", "*.sh"]
- else:
- what_files = ["."]
-
- diff = check_output(["git", "diff", "-U0", commit_range, "--"] + what_files + exclude_args, text=True, encoding="utf8")
-
- return diff
-
-
-def main():
- args = parse_args()
-
- if not os.getenv("COMMIT_RANGE"):
- if args.prev_commits:
- commit_range = "HEAD~" + args.prev_commits + "...HEAD"
- else:
- # This assumes that the target branch of the pull request will be master.
- merge_base = check_output(["git", "merge-base", "HEAD", "master"], text=True, encoding="utf8").rstrip("\n")
- commit_range = merge_base + "..HEAD"
- else:
- commit_range = os.getenv("COMMIT_RANGE")
- if commit_range == "SKIP_EMPTY_NOT_A_PR":
- sys.exit(0)
-
- whitespace_selection = []
- tab_selection = []
-
- # Check if trailing whitespace was found in the diff.
- for line in get_diff(commit_range, check_only_code=False).splitlines():
- if re.match(r"^(diff --git|\@@|^\+.*\s+$)", line):
- whitespace_selection.append(line)
-
- whitespace_additions = [i for i in whitespace_selection if i.startswith("+")]
-
- # Check if tab characters were found in the diff.
- for line in get_diff(commit_range, check_only_code=True).splitlines():
- if re.match(r"^(diff --git|\@@|^\+.*\t)", line):
- tab_selection.append(line)
-
- tab_additions = [i for i in tab_selection if i.startswith("+")]
-
- ret = 0
-
- if len(whitespace_additions) > 0:
- print("This diff appears to have added new lines with trailing whitespace.")
- report_diff(whitespace_selection)
- ret = 1
-
- if len(tab_additions) > 0:
- print("This diff appears to have added new lines with tab characters instead of spaces.")
- report_diff(tab_selection)
- ret = 1
-
- sys.exit(ret)
-
-
-if __name__ == "__main__":
- main()
diff --git a/test/lint/lint_ignore_dirs.py b/test/lint/lint_ignore_dirs.py
new file mode 100644
index 0000000000..af9ee7ef6b
--- /dev/null
+++ b/test/lint/lint_ignore_dirs.py
@@ -0,0 +1,5 @@
+SHARED_EXCLUDED_SUBTREES = ["src/leveldb/",
+ "src/crc32c/",
+ "src/secp256k1/",
+ "src/minisketch/",
+ ]
diff --git a/test/lint/test_runner/src/main.rs b/test/lint/test_runner/src/main.rs
index 1dc79e97bd..e22e047e4b 100644
--- a/test/lint/test_runner/src/main.rs
+++ b/test/lint/test_runner/src/main.rs
@@ -4,7 +4,7 @@
use std::env;
use std::fs;
-use std::path::PathBuf;
+use std::path::{Path, PathBuf};
use std::process::Command;
use std::process::ExitCode;
@@ -14,7 +14,9 @@ type LintFn = fn() -> LintResult;
/// Return the git command
fn git() -> Command {
- Command::new("git")
+ let mut git = Command::new("git");
+ git.arg("--no-pager");
+ git
}
/// Return stdout
@@ -34,17 +36,30 @@ fn get_git_root() -> PathBuf {
PathBuf::from(check_output(git().args(["rev-parse", "--show-toplevel"])).unwrap())
}
+/// Return all subtree paths
+fn get_subtrees() -> Vec<&'static str> {
+ vec![
+ "src/crc32c",
+ "src/crypto/ctaes",
+ "src/leveldb",
+ "src/minisketch",
+ "src/secp256k1",
+ ]
+}
+
+/// Return the pathspecs to exclude all subtrees
+fn get_pathspecs_exclude_subtrees() -> Vec<String> {
+ get_subtrees()
+ .iter()
+ .map(|s| format!(":(exclude){}", s))
+ .collect()
+}
+
fn lint_subtree() -> LintResult {
// This only checks that the trees are pure subtrees, it is not doing a full
// check with -r to not have to fetch all the remotes.
let mut good = true;
- for subtree in [
- "src/crypto/ctaes",
- "src/secp256k1",
- "src/minisketch",
- "src/leveldb",
- "src/crc32c",
- ] {
+ for subtree in get_subtrees() {
good &= Command::new("test/lint/git-subtree-check.sh")
.arg(subtree)
.status()
@@ -82,6 +97,181 @@ fs:: namespace, which has unsafe filesystem functions marked as deleted.
}
}
+/// Return the pathspecs for whitespace related excludes
+fn get_pathspecs_exclude_whitespace() -> Vec<String> {
+ let mut list = get_pathspecs_exclude_subtrees();
+ list.extend(
+ [
+ // Permanent excludes
+ "*.patch",
+ "src/qt/locale",
+ "contrib/windeploy/win-codesign.cert",
+ "doc/README_windows.txt",
+ // Temporary excludes, or existing violations
+ "doc/release-notes/release-notes-0.*",
+ "contrib/init/bitcoind.openrc",
+ "contrib/macdeploy/macdeployqtplus",
+ "src/crypto/sha256_sse4.cpp",
+ "src/qt/res/src/*.svg",
+ "test/functional/test_framework/crypto/ellswift_decode_test_vectors.csv",
+ "test/functional/test_framework/crypto/xswiftec_inv_test_vectors.csv",
+ "contrib/qos/tc.sh",
+ "contrib/verify-commits/gpg.sh",
+ "src/univalue/include/univalue_escapes.h",
+ "src/univalue/test/object.cpp",
+ "test/lint/git-subtree-check.sh",
+ ]
+ .iter()
+ .map(|s| format!(":(exclude){}", s)),
+ );
+ list
+}
+
+fn lint_trailing_whitespace() -> LintResult {
+ let trailing_space = git()
+ .args(["grep", "-I", "--line-number", "\\s$", "--"])
+ .args(get_pathspecs_exclude_whitespace())
+ .status()
+ .expect("command error")
+ .success();
+ if trailing_space {
+ Err(r#"
+^^^
+Trailing whitespace is problematic, because git may warn about it, or editors may remove it by
+default, forcing developers in the future to either undo the changes manually or spend time on
+review.
+
+Thus, it is best to remove the trailing space now.
+
+Please add any false positives, such as subtrees, Windows-related files, patch files, or externally
+sourced files to the exclude list.
+ "#
+ .to_string())
+ } else {
+ Ok(())
+ }
+}
+
+fn lint_tabs_whitespace() -> LintResult {
+ let tabs = git()
+ .args(["grep", "-I", "--line-number", "--perl-regexp", "^\\t", "--"])
+ .args(["*.cpp", "*.h", "*.md", "*.py", "*.sh"])
+ .args(get_pathspecs_exclude_whitespace())
+ .status()
+ .expect("command error")
+ .success();
+ if tabs {
+ Err(r#"
+^^^
+Use of tabs in this codebase is problematic, because existing code uses spaces and tabs will cause
+display issues and conflict with editor settings.
+
+Please remove the tabs.
+
+Please add any false positives, such as subtrees, or externally sourced files to the exclude list.
+ "#
+ .to_string())
+ } else {
+ Ok(())
+ }
+}
+
+fn lint_includes_build_config() -> LintResult {
+ let config_path = "./src/config/bitcoin-config.h.in";
+ let include_directive = "#include <config/bitcoin-config.h>";
+ if !Path::new(config_path).is_file() {
+ assert!(Command::new("./autogen.sh")
+ .status()
+ .expect("command error")
+ .success());
+ }
+ let defines_regex = format!(
+ r"^\s*(?!//).*({})",
+ check_output(Command::new("grep").args(["undef ", "--", config_path]))
+ .expect("grep failed")
+ .lines()
+ .map(|line| {
+ line.split("undef ")
+ .nth(1)
+ .unwrap_or_else(|| panic!("Could not extract name in line: {line}"))
+ })
+ .collect::<Vec<_>>()
+ .join("|")
+ );
+ let print_affected_files = |mode: bool| {
+ // * mode==true: Print files which use the define, but lack the include
+ // * mode==false: Print files which lack the define, but use the include
+ let defines_files = check_output(
+ git()
+ .args([
+ "grep",
+ "--perl-regexp",
+ if mode {
+ "--files-with-matches"
+ } else {
+ "--files-without-match"
+ },
+ &defines_regex,
+ "--",
+ "*.cpp",
+ "*.h",
+ ])
+ .args(get_pathspecs_exclude_subtrees())
+ .args([
+ // These are exceptions which don't use bitcoin-config.h, rather the Makefile.am adds
+ // these cppflags manually.
+ ":(exclude)src/crypto/sha256_arm_shani.cpp",
+ ":(exclude)src/crypto/sha256_avx2.cpp",
+ ":(exclude)src/crypto/sha256_sse41.cpp",
+ ":(exclude)src/crypto/sha256_x86_shani.cpp",
+ ]),
+ )
+ .expect("grep failed");
+ git()
+ .args([
+ "grep",
+ if mode {
+ "--files-without-match"
+ } else {
+ "--files-with-matches"
+ },
+ include_directive,
+ "--",
+ ])
+ .args(defines_files.lines())
+ .status()
+ .expect("command error")
+ .success()
+ };
+ let missing = print_affected_files(true);
+ if missing {
+ return Err(format!(
+ r#"
+^^^
+One or more files use a symbol declared in the bitcoin-config.h header. However, they are not
+including the header. This is problematic, because the header may or may not be indirectly
+included. If the indirect include were to be intentionally or accidentally removed, the build could
+still succeed, but silently be buggy. For example, a slower fallback algorithm could be picked,
+even though bitcoin-config.h indicates that a faster feature is available and should be used.
+
+If you are unsure which symbol is used, you can find it with this command:
+git grep --perl-regexp '{}' -- file_name
+ "#,
+ defines_regex
+ ));
+ }
+ let redundant = print_affected_files(false);
+ if redundant {
+ return Err(r#"
+^^^
+None of the files use a symbol declared in the bitcoin-config.h header. However, they are including
+the header. Consider removing the unused include.
+ "#
+ .to_string());
+ }
+ Ok(())
+}
+
fn lint_doc() -> LintResult {
if Command::new("test/lint/check-doc.py")
.status()
@@ -123,6 +313,9 @@ fn main() -> ExitCode {
let test_list: Vec<(&str, LintFn)> = vec![
("subtree check", lint_subtree),
("std::filesystem check", lint_std_filesystem),
+ ("trailing whitespace check", lint_trailing_whitespace),
+ ("no-tabs check", lint_tabs_whitespace),
+ ("build config includes check", lint_includes_build_config),
("-help=1 documentation check", lint_doc),
("lint-*.py scripts", lint_all),
];
@@ -134,7 +327,7 @@ fn main() -> ExitCode {
// chdir to root before each lint test
env::set_current_dir(&git_root).unwrap();
if let Err(err) = lint_fn() {
- println!("{err}\n^---- Failure generated from {lint_name}!");
+ println!("{err}\n^---- ⚠️ Failure generated from {lint_name}!");
test_failed = true;
}
}
diff --git a/test/sanitizer_suppressions/ubsan b/test/sanitizer_suppressions/ubsan
index dadbe8c4f6..482667a26a 100644
--- a/test/sanitizer_suppressions/ubsan
+++ b/test/sanitizer_suppressions/ubsan
@@ -51,16 +51,18 @@ unsigned-integer-overflow:CCoinsViewCache::Uncache
unsigned-integer-overflow:CompressAmount
unsigned-integer-overflow:DecompressAmount
unsigned-integer-overflow:crypto/
+unsigned-integer-overflow:getchaintxstats*
unsigned-integer-overflow:MurmurHash3
unsigned-integer-overflow:CBlockPolicyEstimator::processBlockTx
unsigned-integer-overflow:TxConfirmStats::EstimateMedianVal
unsigned-integer-overflow:prevector.h
-unsigned-integer-overflow:script/interpreter.cpp
+unsigned-integer-overflow:EvalScript
unsigned-integer-overflow:xoroshiro128plusplus.h
implicit-integer-sign-change:CBlockPolicyEstimator::processBlockTx
implicit-integer-sign-change:SetStdinEcho
implicit-integer-sign-change:compressor.h
implicit-integer-sign-change:crypto/
+implicit-integer-sign-change:getchaintxstats*
implicit-integer-sign-change:TxConfirmStats::removeTx
implicit-integer-sign-change:prevector.h
implicit-integer-sign-change:verify_flags