Merge #6432: [v22.0.x] backport: release v22.0.0-rc2

8b88ff7ed6 Merge #6414: chore: bump seeds for v22 (pasta)
02ad523a22 Merge #6411: chore: update nMinimumChainWork, defaultAssumeValid, checkpointData, chainTxData for mainnet and testnet (pasta)
3bbcd3d4f8 Merge #6393: docs: mention building for some HOSTs only in `release-process.md` (pasta)
18f636f9a4 Merge #6426: fix: respect SENDDSQUEUE message, move DSQ relay into net processing / peerman (pasta)
9fed4564f4 Merge #6407: fix: dataraces (pasta)
86105daab3 Merge #6408: refactor: removed pre-MN_RR logic of validation of CL (pasta)
a1f7e96025 Merge #6406: ci: use `actions/cache` to manage depends cache (pasta)
90a3807903 Merge #6402: ci: cache built (pasta)
66f67879dc Merge #6401: ci: deduplicate depends building (pasta)
7ca56632cf Merge #6397: ci: add powerpc64 to GH Guix job matrix (pasta)

Pull request description:

  ## What was done?
  See commits for each particular change

  ## How Has This Been Tested?
  To be deployed on testnet

  ## Breaking Changes
  N/A

  ## Checklist:
  - [ ] I have performed a self-review of my own code
  - [ ] I have commented my code, particularly in hard-to-understand areas
  - [ ] I have added or updated relevant unit/integration/functional/e2e tests
  - [ ] I have made corresponding changes to the documentation
  - [x] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_

ACKs for top commit:
  UdjinM6:
    utACK 8b88ff7ed6
  PastaPastaPasta:
    utACK 8b88ff7ed6

Tree-SHA512: f7fac62996873503e7de875cc96d9cdf5675674345f1bb1df4a16bf19bddc17bc395a80cc761363a0121022d42c46fb313b0973b9cc71f568ef55c6b3d9e29d8
This commit is contained in:
pasta 2024-11-26 12:41:11 -06:00
commit a6ee72576f
No known key found for this signature in database
GPG Key ID: E2F3D7916E722D38
19 changed files with 498 additions and 333 deletions

View File

@ -25,7 +25,6 @@ jobs:
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
- name: Prepare - name: Prepare
id: prepare id: prepare
run: | run: |
@ -68,18 +67,6 @@ jobs:
host: arm-linux-gnueabihf host: arm-linux-gnueabihf
- build_target: linux64 - build_target: linux64
host: x86_64-pc-linux-gnu host: x86_64-pc-linux-gnu
- build_target: linux64_tsan
host: x86_64-pc-linux-gnu
- build_target: linux64_ubsan
host: x86_64-pc-linux-gnu
- build_target: linux64_fuzz
host: x86_64-pc-linux-gnu
- build_target: linux64_cxx20
host: x86_64-pc-linux-gnu
- build_target: linux64_sqlite
host: x86_64-pc-linux-gnu
- build_target: linux64_nowallet
host: x86_64-pc-linux-gnu
container: container:
image: ghcr.io/${{ needs.build-image.outputs.repo-name }}/dashcore-ci-runner:${{ needs.build-image.outputs.image-tag }} image: ghcr.io/${{ needs.build-image.outputs.repo-name }}/dashcore-ci-runner:${{ needs.build-image.outputs.image-tag }}
@ -90,7 +77,6 @@ jobs:
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
- name: Cache depends sources - name: Cache depends sources
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
@ -100,17 +86,18 @@ jobs:
restore-keys: | restore-keys: |
depends-sources- depends-sources-
- name: Cache dependencies - name: Cache depends
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: | path: |
depends/built
depends/${{ matrix.host }} depends/${{ matrix.host }}
key: ${{ runner.os }}-depends-${{ matrix.build_target }}-${{ hashFiles('depends/packages/*') }} key: ${{ runner.os }}-depends-${{ matrix.build_target }}-${{ hashFiles('depends/packages/*') }}
restore-keys: | restore-keys: |
${{ runner.os }}-depends-${{ matrix.build_target }}-${{ hashFiles('depends/packages/*') }} ${{ runner.os }}-depends-${{ matrix.build_target }}-${{ hashFiles('depends/packages/*') }}
${{ runner.os }}-depends-${{ matrix.build_target }} ${{ runner.os }}-depends-${{ matrix.build_target }}
- name: Build dependencies - name: Build depends
run: make -j$(nproc) -C depends HOST=${{ matrix.host }} run: make -j$(nproc) -C depends HOST=${{ matrix.host }}
build: build:
@ -123,20 +110,28 @@ jobs:
include: include:
- build_target: arm-linux - build_target: arm-linux
host: arm-linux-gnueabihf host: arm-linux-gnueabihf
depends_on: arm-linux
- build_target: linux64 - build_target: linux64
host: x86_64-pc-linux-gnu host: x86_64-pc-linux-gnu
depends_on: linux64
- build_target: linux64_tsan - build_target: linux64_tsan
host: x86_64-pc-linux-gnu host: x86_64-pc-linux-gnu
depends_on: linux64
- build_target: linux64_ubsan - build_target: linux64_ubsan
host: x86_64-pc-linux-gnu host: x86_64-pc-linux-gnu
depends_on: linux64
- build_target: linux64_fuzz - build_target: linux64_fuzz
host: x86_64-pc-linux-gnu host: x86_64-pc-linux-gnu
depends_on: linux64
- build_target: linux64_cxx20 - build_target: linux64_cxx20
host: x86_64-pc-linux-gnu host: x86_64-pc-linux-gnu
depends_on: linux64
- build_target: linux64_sqlite - build_target: linux64_sqlite
host: x86_64-pc-linux-gnu host: x86_64-pc-linux-gnu
depends_on: linux64
- build_target: linux64_nowallet - build_target: linux64_nowallet
host: x86_64-pc-linux-gnu host: x86_64-pc-linux-gnu
depends_on: linux64
container: container:
image: ghcr.io/${{ needs.build-image.outputs.repo-name }}/dashcore-ci-runner:${{ needs.build-image.outputs.image-tag }} image: ghcr.io/${{ needs.build-image.outputs.repo-name }}/dashcore-ci-runner:${{ needs.build-image.outputs.image-tag }}
options: --user root options: --user root
@ -146,16 +141,13 @@ jobs:
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
- name: Restore depends cache
- name: Restore Cache dependencies
uses: actions/cache/restore@v4 uses: actions/cache/restore@v4
with: with:
path: | path: |
depends/built
depends/${{ matrix.host }} depends/${{ matrix.host }}
key: ${{ runner.os }}-depends-${{ matrix.build_target }}-${{ hashFiles('depends/packages/*') }} key: ${{ runner.os }}-depends-${{ matrix.depends_on }}-${{ hashFiles('depends/packages/*') }}
restore-keys: |
${{ runner.os }}-depends-${{ matrix.build_target }}-${{ hashFiles('depends/packages/*') }}
${{ runner.os }}-depends-${{ matrix.build_target }}
- name: Determine PR Base SHA - name: Determine PR Base SHA
id: vars id: vars
@ -192,32 +184,3 @@ jobs:
name: build-artifacts-${{ matrix.build_target }} name: build-artifacts-${{ matrix.build_target }}
path: | path: |
/output /output
# Come back to this later and implement tests :)
# test:
# name: Test
# needs: [build-image, build]
# runs-on: ubuntu-22.04
# container:
# image: ghcr.io/${{ needs.build-image.outputs.repo-name }}/dashcore-ci-runner:${{ needs.build-image.outputs.image-tag }}
# options: --user root
# steps:
# - name: Checkout code
# uses: actions/checkout@v4
# with:
# ref: ${{ github.event.pull_request.head.sha }}
#
# - name: Download build artifacts
# uses: actions/download-artifact@v4
# with:
# name: build-artifacts
# path: src/
#
## - name: Setup environment
## run: |
## echo "BUILD_TARGET=${{ needs.build.matrix.build_target }}"
## source ./ci/dash/matrix.sh
#
# - name: Run integration tests
# run: ./ci/dash/test_integrationtests.sh --extended --exclude feature_pruning,feature_dbcrash

View File

@ -68,7 +68,7 @@ jobs:
# if: ${{ contains(github.event.pull_request.labels.*.name, 'guix-build') }} # if: ${{ contains(github.event.pull_request.labels.*.name, 'guix-build') }}
strategy: strategy:
matrix: matrix:
build_target: [x86_64-linux-gnu, arm-linux-gnueabihf, aarch64-linux-gnu, riscv64-linux-gnu, x86_64-w64-mingw32, x86_64-apple-darwin, arm64-apple-darwin] build_target: [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]
timeout-minutes: 480 timeout-minutes: 480
steps: steps:

View File

@ -1,170 +1,248 @@
zmkohnwhp67nxtaspaudwvbac3r3oab4j36kxoo7ofk636wcd2bflxad.onion:9999 xmbwpdsrsn2gdamvofesyy5zrgqcswsoorrh25jx7qy4w2gftttga7ad.onion:9999
yvcukkjk6vsjliszrlhh3f4qal76w6n2hoi4hl4edp6b5zyifhcixoyd.onion:9999 xjn2wouhpr2jrqtqa3itkccjxfvrpvjgehgkrqltggnei5wl2535eiyd.onion:9999
v7ttoiov7rc5aut64nfomyfwxt424ihufwvr5ilf7moeg3fwibjpjcqd.onion:9999 wzf6u7feqa65kyd5ooyyvw3rxozurmuzgzr4r3qrigne3xlj5tazwnyd.onion:9999
wtby3fkid4eqaknfvmakg6vofvpda4ukhuec7k52no76n6szxcvf7pid.onion:9999
uf3otvrjnj7grwm7skwslf6ltibo24hkolrwuyxyx7yzlalwnupw4bid.onion:9999
tuzjyti6guw32smcxgswmt2fkjlkyxnt47rtspvmqerbalzdeyguczyd.onion:9999 tuzjyti6guw32smcxgswmt2fkjlkyxnt47rtspvmqerbalzdeyguczyd.onion:9999
snu2xaql3crh2b4t6g2wxemgrpzmaxfxla4tua63bnp2phhxwr6hzzid.onion:9999 snu2xaql3crh2b4t6g2wxemgrpzmaxfxla4tua63bnp2phhxwr6hzzid.onion:9999
rwl447roxllklmqkmbp5aq2bxj4vwzomx6ellodoguc5vegnrr6v3yyd.onion:9999
qkcdtz6ejiycge6i3g6uyf6m4ivby7t77syt7yezlwwhtmbsk37u74yd.onion:9999 qkcdtz6ejiycge6i3g6uyf6m4ivby7t77syt7yezlwwhtmbsk37u74yd.onion:9999
qbqa37m7uiie63723muhzgl4swqjvs6oddzhtzw5ke32t47am6lq5mad.onion:9999
qaocy2qaktafiuzyd3i4apyukvr2hr6fwjet625cqwbwq5yr4qqocbid.onion:9999
pcabrbxdlxgybiyykuiccajsfzazmigvc7cemqbzpqw5du27iqaihmyd.onion:9999 pcabrbxdlxgybiyykuiccajsfzazmigvc7cemqbzpqw5du27iqaihmyd.onion:9999
nl7j4rwrb2yemyn5meu64jfbfj5pkeuyo73afihtjdytsh6fpiibkrad.onion:9999 p2d6rg6vh5f3mjrb75l2ppxtbbpjbf45vteyp3c4u3nxfonwpezaq4ad.onion:9999
njmniixuv2ji4an6lfqol6d3bqbijt7cko6wpfgc2wyxe2jg5htwoiad.onion:9999 mj5zq3oeodlwselk5bnx5lhiuhwuuz6xgmijx4kbnpnhamkf5t7aqcqd.onion:9999
mn3zcamezyz5fryftzvmenv4vtbv5ki2eodxugq5gjwka7fft7po4uid.onion:9999 lqg6nfbek54fbsgdycq6rej7edqcg4ps6mqmvsqr645iecbt7cz7e5qd.onion:9999
l2ae5ngumxbcoqwpaxquxq7p6fwtvgfqbokrm7vqiaho4rkijd4ssmyd.onion:9999
k6bzqtkhtzyziethin3kkys342rlzcmqkrs5ibashqclcu23ehuz6oqd.onion:9999 k6bzqtkhtzyziethin3kkys342rlzcmqkrs5ibashqclcu23ehuz6oqd.onion:9999
k5gdngvamlwymwh2an6qlazpgvlhkrukaso6nv56d35pentpfhimvayd.onion:9999
k532fqvgzqotj6epfw3rfc377elrj3td47ztad2tkn6vwnw6nhxacrqd.onion:9999 k532fqvgzqotj6epfw3rfc377elrj3td47ztad2tkn6vwnw6nhxacrqd.onion:9999
jqssjynvlqwfiordnux2vqt6glnr3fypypfwasrizbpwhbj2lvtuzqqd.onion:9999
jjjhwysk4t3i7nrjyxyrf4yjjqmole4doowga7nnkyjih3hmi7q2jsad.onion:9999
iy6wzfp65f5peehquqchqperx5r4qsybfmvvdjhe2ak3ig6pt3a452yd.onion:9999
itkatc2gpfkuvbmjflxgranktjrsokc7wcunu25mq7ptqms7fwex6jyd.onion:9999 itkatc2gpfkuvbmjflxgranktjrsokc7wcunu25mq7ptqms7fwex6jyd.onion:9999
iekgzhetngwhhf7rfxglb3mdwajtoikpcvg3e3etpx4ylku6chr6jrqd.onion:9999 iddbcb6xzrbrjpzwbozhe3pztgrhkwjo76o4wkrpi43p5jya6jv6m7qd.onion:9999
i75yxbzhzkk6q55oig6xeidcexswpgcbquhjuxkkwehy6rvjq6sjxmad.onion:9999 i75yxbzhzkk6q55oig6xeidcexswpgcbquhjuxkkwehy6rvjq6sjxmad.onion:9999
hu43stbffzpgfixmzgx4ae2sp65nrjui6kagzrhkpqhmgsk2kbnfs6id.onion:9999
hsq4dkpmgc3yeirpiufopkonabxq62kl43vkzry65vhp7ctlyl3ngayd.onion:9999
h4rycn3lgltahxvfxte6rzuyu3ooa3f3a5pcgzhkvh5baqei7s3w6yid.onion:9999
h2cpqmjd3rqehro52stehi4vnyofxymfqdsexchhf7dpbbkoqkmjjiyd.onion:9999 h2cpqmjd3rqehro52stehi4vnyofxymfqdsexchhf7dpbbkoqkmjjiyd.onion:9999
ggyyhg4yr2cv4cbjedcs43ag3vh3qvynaptmlg6yzono5hhgjqif37yd.onion:9999
gbg2wd4uwc5k7w5j3w46zre6r5ioezulgjriketxv4qekybzg2zwdnid.onion:9999 gbg2wd4uwc5k7w5j3w46zre6r5ioezulgjriketxv4qekybzg2zwdnid.onion:9999
g6qaacqm3z6xup6kmprb2uvb5wtv3a4isflh4aege2yfgpuvaozfnkad.onion:9999 g62ldh5nedukfk5hvokn6ztbhmql6q7qegrq6dbzyvzir72xerqba6yd.onion:9999
fzo6z4dcjtfg5eg7absrzsskznto5ivgsqty23hmcvf6bjeg4mq2m6yd.onion:9999
etiufki5csbodchyyoqv4bv4qm2xzaljidnst4khl632xkdrsiihulad.onion:9999
eee7cdynbju7pax44vm3bo7aazi72qbqgwktpvk37hoxg7jkqez2kcad.onion:9999 eee7cdynbju7pax44vm3bo7aazi72qbqgwktpvk37hoxg7jkqez2kcad.onion:9999
dw4u6agw6gktz7ykmgxn7m3fmgnnybhhlnish3lvnuylcb5wcwzutdqd.onion:9999
cmhr5r3lqhy7ic2ebeil66ftcz5u62zq5qhbfdz53l6sqxljh7zxntyd.onion:9999 cmhr5r3lqhy7ic2ebeil66ftcz5u62zq5qhbfdz53l6sqxljh7zxntyd.onion:9999
c5qhh5xrwnonmtniag5r7bftfweniwt2f6fdixq37c7gnunbjzgx26qd.onion:9999
buo3et3xvzdjqkpx6iscjz4oexyurhpbpl3is46d653kfitl2gdzm6yd.onion:9999 buo3et3xvzdjqkpx6iscjz4oexyurhpbpl3is46d653kfitl2gdzm6yd.onion:9999
ayhwwpjq4rg3bslbtt7yejqyhucyaqsbb7tn45blh4r7xj62wfonryqd.onion:9999
5v5lgddolcidtt2qmhmvyka2ewht4mkmmj73tfwuimlckgmqb5lthtid.onion:9999 5v5lgddolcidtt2qmhmvyka2ewht4mkmmj73tfwuimlckgmqb5lthtid.onion:9999
467ho3bhmndzbktbqd3nxf64isib54umiis5xc5n2xnt35u2ofhs5gid.onion:9999 5gnyyuxpkwsqv6sm2ee2k6uaiuq5ayaipjm33n5pwe22uit37yozrcid.onion:9999
2h6yzlqtogqkaj4yhrofsccntpjyafpjxwutti65dkpqliuzah3is7ad.onion:9999 542grzvty3cnbtzc3sjatubkmnhw22x5gfvnj2lromdparwlc4j7o4qd.onion:9999
4da4s6fvz2wt672kxxqgra4iurots4jnzzmeplbdt7abix655fjn23qd.onion:9999
3uvcjymiixi6n6m2p6fsgyjxkx2ceaesd7eopi3p7jn364i5z646koid.onion:9999
3cova3snmiydrdaqrszj5krnujpwgkueh2kjodun4hvixk3y5l5zmgid.onion:9999
2br37z5ilg3i3rawwkznmh6lhczboql5zdrfgmkaxns4tpfrxmu6s5yd.onion:9999
216.250.97.52:9999 216.250.97.52:9999
216.238.75.46:9999 216.238.75.46:9999
216.230.232.125:9999 216.230.232.125:9999
216.189.154.8:9999 213.218.209.34:9999
216.189.154.7:9999 213.199.34.250:9999
213.168.249.174:9999 213.171.15.125:9999
213.159.77.221:9999
212.52.0.210:9999
212.24.110.128:9999 212.24.110.128:9999
212.24.107.223:9999 209.145.48.154:9999
209.141.36.206:9999
209.58.164.42:9999
208.87.102.91:9999
207.244.247.40:9999 207.244.247.40:9999
206.189.132.224:9999 202.5.16.33:9999
206.168.213.108:9999 198.7.115.48:9999
206.168.212.226:9999 195.181.211.64:9999
206.168.212.178:9999 195.98.95.210:9999
206.168.212.144:9999
194.158.71.228:9999
194.135.81.214:9999 194.135.81.214:9999
193.164.149.50:9999 194.5.157.214:9999
193.31.30.55:9999 192.169.6.87:9999
188.208.196.183:9999 188.127.237.243:9999
188.127.230.40:9999 188.127.230.40:9999
188.68.223.94:9999 188.40.178.67:9999
185.243.115.219:9999 185.243.115.219:9999
185.228.83.156:9999
185.217.127.139:9999
185.213.24.34:9999 185.213.24.34:9999
185.198.234.54:9999
185.198.234.33:9999
185.198.234.25:9999
185.198.234.17:9999
185.185.40.171:9999
185.185.40.104:9999
185.166.217.154:9999
185.165.171.117:9999 185.165.171.117:9999
185.164.163.218:9999 185.164.163.218:9999
185.164.163.85:9999 185.164.163.85:9999
185.135.80.200:9999 185.158.107.124:9999
185.155.99.34:9999
185.142.212.144:9999
185.112.249.49:9999
185.87.149.61:9999 185.87.149.61:9999
178.208.87.226:9999 178.208.87.226:9999
178.208.87.213:9999 178.208.87.213:9999
178.157.91.179:9999 178.159.2.12:9999
178.157.91.176:9999 178.157.91.184:9999
178.157.91.126:9999 178.157.91.178:9999
178.157.91.177:9999
178.63.121.129:9999 178.63.121.129:9999
176.126.127.16:9999 176.102.65.145:9999
176.126.127.15:9999 174.34.233.212:9999
174.34.233.207:9999 174.34.233.211:9999
174.34.233.206:9999 174.34.233.209:9999
174.34.233.205:9999 174.34.233.204:9999
174.34.233.202:9999 172.104.145.166:9999
173.249.21.122:9999
172.104.90.249:9999 172.104.90.249:9999
170.75.167.244:9999
170.75.162.212:9999
168.119.80.4:9999 168.119.80.4:9999
167.88.169.16:9999 167.88.169.16:9999
167.88.165.175:9999
165.22.234.135:9999 165.22.234.135:9999
159.89.124.102:9999 163.172.66.41:9999
155.133.23.221:9999 163.172.20.210:9999
163.172.20.209:9999
163.172.20.205:9999
162.250.191.31:9999
162.246.17.248:9999
159.75.121.163:9999
157.173.202.14:9999
157.66.81.162:9999
157.10.199.82:9999
157.10.199.79:9999
157.10.199.77:9999
154.127.57.63:9999
150.158.48.6:9999 150.158.48.6:9999
145.239.20.176:9999 147.45.183.128:9999
144.91.127.166:9999 147.45.103.99:9999
142.202.205.95:9999 146.190.230.104:9999
139.59.100.103:9999 146.103.48.209:9999
146.103.48.203:9999
146.59.45.235:9999
139.162.131.197:9999
135.181.53.130:9999
134.255.182.186:9999
133.18.228.84:9999 133.18.228.84:9999
130.162.233.186:9999 130.162.233.186:9999
130.61.120.252:9999
123.193.64.166:9999 123.193.64.166:9999
109.235.70.100:9999 109.235.69.82:9999
109.235.69.170:9999 109.173.240.233:9999
109.235.65.226:9999 107.189.3.74:9999
109.235.65.95:9999 107.170.254.160:9999
106.55.9.22:9999 106.55.9.22:9999
104.238.35.116:9999 104.225.159.232:9999
104.200.67.251:9999
104.200.24.196:9999 104.200.24.196:9999
103.160.95.219:9999
95.211.196.46:9999 95.211.196.46:9999
95.211.196.34:9999
95.211.196.32:9999 95.211.196.32:9999
95.211.196.8:9999 95.211.196.8:9999
95.183.53.44:9999
95.183.51.141:9999 95.183.51.141:9999
95.171.21.131:9999
95.169.181.71:9999
94.172.109.161:9999
93.21.76.185:9999 93.21.76.185:9999
92.63.176.202:9999
91.234.35.132:9999
91.222.237.98:9999
91.199.149.177:9999
89.179.73.96:9999 89.179.73.96:9999
89.117.19.10:9999 89.117.19.10:9999
89.40.13.80:9999
89.40.10.45:9999
89.40.8.160:9999
89.40.0.109:9999
89.35.131.61:9999
87.228.24.64:9999
87.209.245.227:9999
86.107.168.47:9999
86.107.168.46:9999
86.107.168.43:9999
86.107.168.29:9999
85.215.107.202:9999 85.215.107.202:9999
85.209.241.190:9999 85.209.241.185:9999
85.209.241.188:9999 85.209.241.86:9999
85.209.241.71:9999 85.209.241.71:9999
85.209.241.35:9999 85.209.241.35:9999
84.242.179.204:9999
84.9.50.17:9999
83.239.99.40:9999
82.211.25.193:9999 82.211.25.193:9999
82.211.25.105:9999 82.211.25.105:9999
82.211.21.179:9999 82.211.21.179:9999
82.211.21.23:9999 82.211.21.23:9999
82.202.230.83:9999 82.202.230.83:9999
81.227.250.51:9999 81.227.250.51:9999
80.249.147.8:9999
80.240.132.231:9999
80.209.234.170:9999 80.209.234.170:9999
78.83.19.0:9999 78.83.19.0:9999
77.232.132.89:9999
77.232.132.4:9999
77.223.99.4:9999 77.223.99.4:9999
77.221.148.204:9999
74.50.90.113:9999
69.61.107.215:9999
66.245.196.52:9999
66.244.243.70:9999 66.244.243.70:9999
66.244.243.69:9999 66.244.243.69:9999
58.110.224.166:9999 52.36.102.91:9999
54.37.234.121:9999
52.33.9.172:9999 52.33.9.172:9999
51.158.243.250:9999 51.38.142.66:9999
51.158.169.237:9999 51.38.142.62:9999
51.79.160.197:9999 51.38.142.61:9999
51.68.155.64:9999 47.110.184.170:9999
51.15.117.42:9999 46.254.241.9:9999
51.15.96.206:9999 46.254.241.8:9999
47.109.109.166:9999 46.254.241.7:9999
46.254.241.21:9999
46.254.241.4:9999 46.254.241.4:9999
46.36.40.242:9999 46.36.40.242:9999
46.30.189.251:9999
46.30.189.214:9999 46.30.189.214:9999
46.30.189.213:9999
46.30.189.116:9999 46.30.189.116:9999
46.4.162.127:9999 45.153.186.100:9999
45.140.19.201:9999 45.140.19.201:9999
45.93.139.117:9999 45.135.180.79:9999
45.91.94.217:9999 45.91.94.217:9999
45.85.117.169:9999
45.85.117.40:9999
45.83.122.122:9999 45.83.122.122:9999
45.79.18.106:9999
45.76.83.91:9999 45.76.83.91:9999
45.71.159.104:9999 45.71.159.104:9999
45.71.158.108:9999 45.71.158.108:9999
45.71.158.58:9999 45.71.158.58:9999
45.63.107.90:9999 45.61.186.121:9999
45.58.56.221:9999 45.58.56.79:9999
45.32.159.48:9999 45.32.159.48:9999
45.11.182.64:9999 45.11.182.64:9999
45.8.250.154:9999
44.240.99.214:9999 44.240.99.214:9999
37.77.104.166:9999 43.229.77.46:9999
43.167.244.109:9999
43.167.240.90:9999
43.163.251.51:9999
43.128.72.114:9999
38.99.82.230:9999
38.99.82.21:9999
38.91.101.92:9999
38.91.100.202:9999
38.88.125.51:9999
38.88.125.50:9999
37.97.227.21:9999
35.174.217.98:9999
34.246.176.25:9999
31.148.99.104:9999 31.148.99.104:9999
31.57.190.188:9999
31.57.190.31:9999
31.10.97.36:9999 31.10.97.36:9999
23.163.0.203:9999 5.255.106.192:9999
23.163.0.175:9999
13.251.11.55:9999
5.252.21.24:9999
5.189.253.252:9999
5.189.239.52:9999
5.189.145.80:9999
5.181.202.15:9999
5.161.110.79:9999 5.161.110.79:9999
5.79.109.243:9999 5.35.103.26:9999
5.78.74.118:9999 5.35.103.25:9999
5.35.103.111:9999 5.35.103.19:9999
5.35.103.74:9999
5.35.103.64:9999
5.35.103.58:9999
5.9.237.34:9999
5.2.73.58:9999 5.2.73.58:9999
3.35.224.65:9999 2.233.120.35:9999
2.56.213.221:9999

View File

@ -1,25 +1,46 @@
cmhr5r3lqhy7ic2ebeil66ftcz5u62zq5qhbfdz53l6sqxljh7zxntyd.onion:9999 cmhr5r3lqhy7ic2ebeil66ftcz5u62zq5qhbfdz53l6sqxljh7zxntyd.onion:9999
k532fqvgzqotj6epfw3rfc377elrj3td47ztad2tkn6vwnw6nhxacrqd.onion:9999 k532fqvgzqotj6epfw3rfc377elrj3td47ztad2tkn6vwnw6nhxacrqd.onion:9999
v7ttoiov7rc5aut64nfomyfwxt424ihufwvr5ilf7moeg3fwibjpjcqd.onion:9999
snu2xaql3crh2b4t6g2wxemgrpzmaxfxla4tua63bnp2phhxwr6hzzid.onion:9999 snu2xaql3crh2b4t6g2wxemgrpzmaxfxla4tua63bnp2phhxwr6hzzid.onion:9999
5v5lgddolcidtt2qmhmvyka2ewht4mkmmj73tfwuimlckgmqb5lthtid.onion:9999 5v5lgddolcidtt2qmhmvyka2ewht4mkmmj73tfwuimlckgmqb5lthtid.onion:9999
yvcukkjk6vsjliszrlhh3f4qal76w6n2hoi4hl4edp6b5zyifhcixoyd.onion:9999
k6bzqtkhtzyziethin3kkys342rlzcmqkrs5ibashqclcu23ehuz6oqd.onion:9999 k6bzqtkhtzyziethin3kkys342rlzcmqkrs5ibashqclcu23ehuz6oqd.onion:9999
2h6yzlqtogqkaj4yhrofsccntpjyafpjxwutti65dkpqliuzah3is7ad.onion:9999
tuzjyti6guw32smcxgswmt2fkjlkyxnt47rtspvmqerbalzdeyguczyd.onion:9999 tuzjyti6guw32smcxgswmt2fkjlkyxnt47rtspvmqerbalzdeyguczyd.onion:9999
467ho3bhmndzbktbqd3nxf64isib54umiis5xc5n2xnt35u2ofhs5gid.onion:9999
h2cpqmjd3rqehro52stehi4vnyofxymfqdsexchhf7dpbbkoqkmjjiyd.onion:9999 h2cpqmjd3rqehro52stehi4vnyofxymfqdsexchhf7dpbbkoqkmjjiyd.onion:9999
l2ae5ngumxbcoqwpaxquxq7p6fwtvgfqbokrm7vqiaho4rkijd4ssmyd.onion:9999
eee7cdynbju7pax44vm3bo7aazi72qbqgwktpvk37hoxg7jkqez2kcad.onion:9999 eee7cdynbju7pax44vm3bo7aazi72qbqgwktpvk37hoxg7jkqez2kcad.onion:9999
qkcdtz6ejiycge6i3g6uyf6m4ivby7t77syt7yezlwwhtmbsk37u74yd.onion:9999 qkcdtz6ejiycge6i3g6uyf6m4ivby7t77syt7yezlwwhtmbsk37u74yd.onion:9999
g6qaacqm3z6xup6kmprb2uvb5wtv3a4isflh4aege2yfgpuvaozfnkad.onion:9999
buo3et3xvzdjqkpx6iscjz4oexyurhpbpl3is46d653kfitl2gdzm6yd.onion:9999 buo3et3xvzdjqkpx6iscjz4oexyurhpbpl3is46d653kfitl2gdzm6yd.onion:9999
iekgzhetngwhhf7rfxglb3mdwajtoikpcvg3e3etpx4ylku6chr6jrqd.onion:9999
nl7j4rwrb2yemyn5meu64jfbfj5pkeuyo73afihtjdytsh6fpiibkrad.onion:9999
gbg2wd4uwc5k7w5j3w46zre6r5ioezulgjriketxv4qekybzg2zwdnid.onion:9999 gbg2wd4uwc5k7w5j3w46zre6r5ioezulgjriketxv4qekybzg2zwdnid.onion:9999
pcabrbxdlxgybiyykuiccajsfzazmigvc7cemqbzpqw5du27iqaihmyd.onion:9999 pcabrbxdlxgybiyykuiccajsfzazmigvc7cemqbzpqw5du27iqaihmyd.onion:9999
mn3zcamezyz5fryftzvmenv4vtbv5ki2eodxugq5gjwka7fft7po4uid.onion:9999
itkatc2gpfkuvbmjflxgranktjrsokc7wcunu25mq7ptqms7fwex6jyd.onion:9999 itkatc2gpfkuvbmjflxgranktjrsokc7wcunu25mq7ptqms7fwex6jyd.onion:9999
zmkohnwhp67nxtaspaudwvbac3r3oab4j36kxoo7ofk636wcd2bflxad.onion:9999
njmniixuv2ji4an6lfqol6d3bqbijt7cko6wpfgc2wyxe2jg5htwoiad.onion:9999
i75yxbzhzkk6q55oig6xeidcexswpgcbquhjuxkkwehy6rvjq6sjxmad.onion:9999 i75yxbzhzkk6q55oig6xeidcexswpgcbquhjuxkkwehy6rvjq6sjxmad.onion:9999
ggyyhg4yr2cv4cbjedcs43ag3vh3qvynaptmlg6yzono5hhgjqif37yd.onion:9999
g62ldh5nedukfk5hvokn6ztbhmql6q7qegrq6dbzyvzir72xerqba6yd.onion:9999
5gnyyuxpkwsqv6sm2ee2k6uaiuq5ayaipjm33n5pwe22uit37yozrcid.onion:9999
xmbwpdsrsn2gdamvofesyy5zrgqcswsoorrh25jx7qy4w2gftttga7ad.onion:9999
qaocy2qaktafiuzyd3i4apyukvr2hr6fwjet625cqwbwq5yr4qqocbid.onion:9999
2br37z5ilg3i3rawwkznmh6lhczboql5zdrfgmkaxns4tpfrxmu6s5yd.onion:9999
3cova3snmiydrdaqrszj5krnujpwgkueh2kjodun4hvixk3y5l5zmgid.onion:9999
iy6wzfp65f5peehquqchqperx5r4qsybfmvvdjhe2ak3ig6pt3a452yd.onion:9999
k5gdngvamlwymwh2an6qlazpgvlhkrukaso6nv56d35pentpfhimvayd.onion:9999
4da4s6fvz2wt672kxxqgra4iurots4jnzzmeplbdt7abix655fjn23qd.onion:9999
uf3otvrjnj7grwm7skwslf6ltibo24hkolrwuyxyx7yzlalwnupw4bid.onion:9999
dw4u6agw6gktz7ykmgxn7m3fmgnnybhhlnish3lvnuylcb5wcwzutdqd.onion:9999
c5qhh5xrwnonmtniag5r7bftfweniwt2f6fdixq37c7gnunbjzgx26qd.onion:9999
h4rycn3lgltahxvfxte6rzuyu3ooa3f3a5pcgzhkvh5baqei7s3w6yid.onion:9999
mj5zq3oeodlwselk5bnx5lhiuhwuuz6xgmijx4kbnpnhamkf5t7aqcqd.onion:9999
fzo6z4dcjtfg5eg7absrzsskznto5ivgsqty23hmcvf6bjeg4mq2m6yd.onion:9999
3uvcjymiixi6n6m2p6fsgyjxkx2ceaesd7eopi3p7jn364i5z646koid.onion:9999
wzf6u7feqa65kyd5ooyyvw3rxozurmuzgzr4r3qrigne3xlj5tazwnyd.onion:9999
hu43stbffzpgfixmzgx4ae2sp65nrjui6kagzrhkpqhmgsk2kbnfs6id.onion:9999
xjn2wouhpr2jrqtqa3itkccjxfvrpvjgehgkrqltggnei5wl2535eiyd.onion:9999
hsq4dkpmgc3yeirpiufopkonabxq62kl43vkzry65vhp7ctlyl3ngayd.onion:9999
ayhwwpjq4rg3bslbtt7yejqyhucyaqsbb7tn45blh4r7xj62wfonryqd.onion:9999
iddbcb6xzrbrjpzwbozhe3pztgrhkwjo76o4wkrpi43p5jya6jv6m7qd.onion:9999
542grzvty3cnbtzc3sjatubkmnhw22x5gfvnj2lromdparwlc4j7o4qd.onion:9999
qbqa37m7uiie63723muhzgl4swqjvs6oddzhtzw5ke32t47am6lq5mad.onion:9999
etiufki5csbodchyyoqv4bv4qm2xzaljidnst4khl632xkdrsiihulad.onion:9999
lqg6nfbek54fbsgdycq6rej7edqcg4ps6mqmvsqr645iecbt7cz7e5qd.onion:9999
rwl447roxllklmqkmbp5aq2bxj4vwzomx6ellodoguc5vegnrr6v3yyd.onion:9999
p2d6rg6vh5f3mjrb75l2ppxtbbpjbf45vteyp3c4u3nxfonwpezaq4ad.onion:9999
jqssjynvlqwfiordnux2vqt6glnr3fypypfwasrizbpwhbj2lvtuzqqd.onion:9999
jjjhwysk4t3i7nrjyxyrf4yjjqmole4doowga7nnkyjih3hmi7q2jsad.onion:9999
wtby3fkid4eqaknfvmakg6vofvpda4ukhuec7k52no76n6szxcvf7pid.onion:9999

View File

@ -97,6 +97,8 @@ Follow the relevant Guix README.md sections:
- [Building](/contrib/guix/README.md#building) - [Building](/contrib/guix/README.md#building)
- [Attesting to build outputs](/contrib/guix/README.md#attesting-to-build-outputs) - [Attesting to build outputs](/contrib/guix/README.md#attesting-to-build-outputs)
_Note: we ship releases for only some supported HOSTs so consider providing limited `HOSTS` variable or run `./contrib/containers/guix/scripts/guix-start` instead of `./contrib/guix/guix-build` when building binaries for quicker builds that exclude the supported but not shipped HOSTs_
### Verify other builders' signatures to your own. (Optional) ### Verify other builders' signatures to your own. (Optional)
Add other builders keys to your gpg keyring, and/or refresh keys: See `../dash/contrib/builder-keys/README.md`. Add other builders keys to your gpg keyring, and/or refresh keys: See `../dash/contrib/builder-keys/README.md`.

View File

@ -219,10 +219,10 @@ public:
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].useEHF = true; consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].useEHF = true;
// The best chain should have at least this much work. // The best chain should have at least this much work.
consensus.nMinimumChainWork = uint256S("0x00000000000000000000000000000000000000000000988117deadb0db9cd5b8"); // 2109672 consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000009eb0f1d7fefc8750aebb"); // 2175051
// By default assume that the signatures in ancestors of this block are valid. // By default assume that the signatures in ancestors of this block are valid.
consensus.defaultAssumeValid = uint256S("0x000000000000001889bd33ef019065e250d32bd46911f4003d3fdd8128b5358d"); // 2109672 consensus.defaultAssumeValid = uint256S("0x000000000000001cf26547602d982dcaa909231bbcd1e70c0eb3c65de25473ba"); // 2175051
/** /**
* The message start string is designed to be unlikely to occur in normal data. * The message start string is designed to be unlikely to occur in normal data.
@ -332,6 +332,7 @@ public:
{1969000, uint256S("0x000000000000000c8b7a3bdcd8b9f516462122314529c8342244c685a4c899bf")}, {1969000, uint256S("0x000000000000000c8b7a3bdcd8b9f516462122314529c8342244c685a4c899bf")},
{2029000, uint256S("0x0000000000000020d5e38b6aef5bc8e430029444d7977b46f710c7d281ef1281")}, {2029000, uint256S("0x0000000000000020d5e38b6aef5bc8e430029444d7977b46f710c7d281ef1281")},
{2109672, uint256S("0x000000000000001889bd33ef019065e250d32bd46911f4003d3fdd8128b5358d")}, {2109672, uint256S("0x000000000000001889bd33ef019065e250d32bd46911f4003d3fdd8128b5358d")},
{2175051, uint256S("0x000000000000001cf26547602d982dcaa909231bbcd1e70c0eb3c65de25473ba")},
} }
}; };
@ -339,12 +340,12 @@ public:
// TODO to be specified in a future patch. // TODO to be specified in a future patch.
}; };
// getchaintxstats 17280 000000000000001889bd33ef019065e250d32bd46911f4003d3fdd8128b5358d // getchaintxstats 17280 000000000000001cf26547602d982dcaa909231bbcd1e70c0eb3c65de25473ba
chainTxData = ChainTxData{ chainTxData = ChainTxData{
1721769714, // * UNIX timestamp of last known number of transactions (Block 1969000) 1732068694, // * UNIX timestamp of last known number of transactions (Block 1969000)
53767892, // * total number of transactions between genesis and that timestamp 55191134, // * total number of transactions between genesis and that timestamp
// (the tx=... number in the ChainStateFlushed debug.log lines) // (the tx=... number in the ChainStateFlushed debug.log lines)
0.1580795981751139, // * estimated number of transactions per second after that timestamp 0.1528060985790164, // * estimated number of transactions per second after that timestamp
}; };
} }
}; };
@ -416,10 +417,10 @@ public:
consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].useEHF = true; consensus.vDeployments[Consensus::DEPLOYMENT_WITHDRAWALS].useEHF = true;
// The best chain should have at least this much work. // The best chain should have at least this much work.
consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000000031779704a0f54b4"); // 1069875 consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000000031ee38bc0876cef"); // 1143608
// By default assume that the signatures in ancestors of this block are valid. // By default assume that the signatures in ancestors of this block are valid.
consensus.defaultAssumeValid = uint256S("0x00000034bfeb926662ba547c0b8dd4ba8cbb6e0c581f4e7d1bddce8f9ca3a608"); // 1069875 consensus.defaultAssumeValid = uint256S("0x000000eef20eb0062abd4e799967e98bdebb165dd1c567ab4118c1c86c6e948f"); // 1143608
pchMessageStart[0] = 0xce; pchMessageStart[0] = 0xce;
pchMessageStart[1] = 0xe2; pchMessageStart[1] = 0xe2;
@ -505,6 +506,7 @@ public:
{905100, uint256S("0x0000020c5e0f86f385cbf8e90210de9a9fd63633f01433bf47a6b3227a2851fd")}, {905100, uint256S("0x0000020c5e0f86f385cbf8e90210de9a9fd63633f01433bf47a6b3227a2851fd")},
{960000, uint256S("0x0000000386cf5061ea16404c66deb83eb67892fa4f79b9e58e5eaab097ec2bd6")}, {960000, uint256S("0x0000000386cf5061ea16404c66deb83eb67892fa4f79b9e58e5eaab097ec2bd6")},
{1069875, uint256S("0x00000034bfeb926662ba547c0b8dd4ba8cbb6e0c581f4e7d1bddce8f9ca3a608")}, {1069875, uint256S("0x00000034bfeb926662ba547c0b8dd4ba8cbb6e0c581f4e7d1bddce8f9ca3a608")},
{1143608, uint256S("0x000000eef20eb0062abd4e799967e98bdebb165dd1c567ab4118c1c86c6e948f")},
} }
}; };
@ -512,12 +514,12 @@ public:
// TODO to be specified in a future patch. // TODO to be specified in a future patch.
}; };
// getchaintxstats 17280 00000034bfeb926662ba547c0b8dd4ba8cbb6e0c581f4e7d1bddce8f9ca3a608 // getchaintxstats 17280 000000eef20eb0062abd4e799967e98bdebb165dd1c567ab4118c1c86c6e948f
chainTxData = ChainTxData{ chainTxData = ChainTxData{
1721770009, // * UNIX timestamp of last known number of transactions (Block 905100) 1732068833, // * UNIX timestamp of last known number of transactions (Block 905100)
6548039, // * total number of transactions between genesis and that timestamp 6701197, // * total number of transactions between genesis and that timestamp
// (the tx=... number in the ChainStateFlushed debug.log lines) // (the tx=... number in the ChainStateFlushed debug.log lines)
0.0152605485140752, // * estimated number of transactions per second after that timestamp 0.01528131540752872, // * estimated number of transactions per second after that timestamp
}; };
} }
}; };

View File

@ -7,176 +7,254 @@
* Each line contains a BIP155 serialized (networkID, addr, port) tuple. * Each line contains a BIP155 serialized (networkID, addr, port) tuple.
*/ */
static const uint8_t chainparams_seed_main[] = { static const uint8_t chainparams_seed_main[] = {
0x04,0x20,0xcb,0x14,0xe3,0xb6,0xc7,0x7f,0xbe,0xdb,0xcc,0x12,0x78,0x28,0x3b,0x54,0x20,0x16,0xe3,0xb7,0x00,0x3c,0x4e,0xfc,0xab,0xb9,0xdf,0x71,0x55,0xed,0xfa,0xc2,0x1e,0x82,0x27,0x0f, 0x04,0x20,0xbb,0x03,0x67,0x8e,0x51,0x93,0x74,0x61,0x81,0x95,0x71,0x49,0x2c,0x63,0xb9,0x89,0xa0,0x29,0x5a,0x4e,0x74,0x62,0x7d,0x75,0x37,0xfc,0x31,0xcb,0x68,0xc5,0x9c,0xe6,0x27,0x0f,
0x04,0x20,0xc5,0x45,0x45,0x29,0x2a,0xf5,0x64,0x95,0xa2,0x59,0x8a,0xce,0x7d,0x97,0x90,0x02,0xff,0xeb,0x79,0xba,0x3b,0x91,0xc3,0xaf,0x84,0x1b,0xfc,0x1e,0xe7,0x08,0x29,0xc4,0x27,0x0f, 0x04,0x20,0xba,0x5b,0xab,0x3a,0x87,0x7c,0x74,0x98,0xc2,0x70,0x06,0xd1,0x35,0x08,0x49,0xb9,0x6b,0x17,0xd5,0x26,0x21,0xcc,0xa8,0xc1,0x73,0x31,0x9a,0x44,0x76,0xcb,0xd7,0x77,0x27,0x0f,
0x04,0x20,0xaf,0xe7,0x37,0x21,0xd5,0xfc,0x45,0xd0,0x52,0x7e,0xe3,0x4a,0xe6,0x60,0xb6,0xbc,0xf9,0xae,0x20,0xf4,0x2d,0xab,0x1e,0xa1,0x65,0xfb,0x1c,0x43,0x6c,0xb6,0x40,0x52,0x27,0x0f, 0x04,0x20,0xb6,0x4b,0xea,0x7c,0xa4,0x80,0x3d,0xd5,0x60,0x7d,0x73,0xb1,0x8a,0xdb,0x71,0xbb,0xb3,0x48,0xb2,0x99,0x36,0x63,0xc8,0xee,0x11,0x41,0x9a,0x4d,0xdd,0x69,0xec,0xc1,0x27,0x0f,
0x04,0x20,0xb4,0xc3,0x8d,0x95,0x48,0x1f,0x09,0x00,0x29,0xa5,0xab,0x00,0xa3,0x7a,0xae,0x2d,0x5e,0x30,0x72,0x8a,0x3d,0x08,0x2f,0xab,0xba,0x6b,0xbf,0xe6,0xfa,0x59,0xb8,0xaa,0x27,0x0f,
0x04,0x20,0xa1,0x76,0xe9,0xd6,0x29,0x6a,0x7e,0x68,0xd9,0x9f,0x92,0xad,0x25,0x97,0xcb,0x9a,0x02,0xed,0x70,0xea,0x72,0xe3,0x6a,0x62,0xf8,0xbf,0xf1,0x95,0x81,0x76,0x6d,0x1f,0x27,0x0f,
0x04,0x20,0x9d,0x32,0x9c,0x4d,0x1e,0x35,0x2d,0xbd,0x49,0x82,0xb9,0xa5,0x66,0x4f,0x45,0x52,0x56,0xac,0x5d,0xb3,0xe7,0xe3,0x39,0x3e,0xac,0x81,0x22,0x10,0x2f,0x23,0x26,0x0d,0x27,0x0f, 0x04,0x20,0x9d,0x32,0x9c,0x4d,0x1e,0x35,0x2d,0xbd,0x49,0x82,0xb9,0xa5,0x66,0x4f,0x45,0x52,0x56,0xac,0x5d,0xb3,0xe7,0xe3,0x39,0x3e,0xac,0x81,0x22,0x10,0x2f,0x23,0x26,0x0d,0x27,0x0f,
0x04,0x20,0x93,0x69,0xab,0x82,0x0b,0xd8,0xa2,0x7d,0x07,0x93,0xf1,0xb5,0x6b,0x91,0x86,0x8b,0xf2,0xc0,0x5c,0xb7,0x58,0x39,0x3a,0x03,0xdb,0x0b,0x5f,0xa7,0x9c,0xf7,0xb4,0x7c,0x27,0x0f, 0x04,0x20,0x93,0x69,0xab,0x82,0x0b,0xd8,0xa2,0x7d,0x07,0x93,0xf1,0xb5,0x6b,0x91,0x86,0x8b,0xf2,0xc0,0x5c,0xb7,0x58,0x39,0x3a,0x03,0xdb,0x0b,0x5f,0xa7,0x9c,0xf7,0xb4,0x7c,0x27,0x0f,
0x04,0x20,0x8d,0x97,0xce,0x7e,0x2e,0xba,0xd6,0xa5,0xb2,0x0a,0x60,0x5f,0xd0,0x43,0x41,0xba,0x79,0x5b,0x65,0xcc,0xbf,0x88,0xb5,0xb8,0x6e,0x35,0x05,0xda,0x90,0xcd,0x8c,0x7d,0x27,0x0f,
0x04,0x20,0x82,0x84,0x39,0xe7,0xc4,0x4a,0x30,0x23,0x13,0xc8,0xd9,0xbd,0x4c,0x17,0xcc,0xe2,0x2a,0x1c,0x7e,0x7f,0xfc,0xb1,0x3f,0xe0,0x99,0x5d,0xac,0x79,0xb0,0x32,0x56,0xff,0x27,0x0f, 0x04,0x20,0x82,0x84,0x39,0xe7,0xc4,0x4a,0x30,0x23,0x13,0xc8,0xd9,0xbd,0x4c,0x17,0xcc,0xe2,0x2a,0x1c,0x7e,0x7f,0xfc,0xb1,0x3f,0xe0,0x99,0x5d,0xac,0x79,0xb0,0x32,0x56,0xff,0x27,0x0f,
0x04,0x20,0x80,0x60,0x0d,0xfd,0x9f,0xa2,0x10,0x4f,0x6f,0xfa,0xdb,0x28,0x7c,0x99,0x7c,0x95,0xa0,0x9a,0xcb,0xce,0x18,0xf2,0x79,0xe6,0xdd,0x51,0x37,0xa9,0xf3,0xe0,0x67,0x97,0x27,0x0f,
0x04,0x20,0x80,0x1c,0x2c,0x6a,0x00,0x54,0xc0,0x54,0x53,0x38,0x1e,0xd1,0xc0,0x3f,0x14,0x55,0x63,0xa3,0xc7,0xc5,0xb2,0x49,0x3f,0x6b,0xa2,0x85,0x83,0x68,0x77,0x11,0xe4,0x20,0x27,0x0f,
0x04,0x20,0x78,0x80,0x18,0x86,0xe3,0x5d,0xcd,0x80,0xa3,0x18,0x55,0x10,0x21,0x01,0x32,0x2e,0x41,0x96,0x20,0xd5,0x17,0xc4,0x46,0x40,0x39,0x7c,0x2d,0xd1,0xd3,0x5f,0x44,0x00,0x27,0x0f, 0x04,0x20,0x78,0x80,0x18,0x86,0xe3,0x5d,0xcd,0x80,0xa3,0x18,0x55,0x10,0x21,0x01,0x32,0x2e,0x41,0x96,0x20,0xd5,0x17,0xc4,0x46,0x40,0x39,0x7c,0x2d,0xd1,0xd3,0x5f,0x44,0x00,0x27,0x0f,
0x04,0x20,0x6a,0xfe,0x9e,0x46,0xd1,0x0e,0xb0,0x46,0x61,0xbd,0x61,0x29,0xee,0x24,0xa1,0x2a,0x7a,0xf5,0x12,0x98,0x77,0xf6,0x02,0xa0,0xf3,0x48,0xf1,0x39,0x1f,0xc5,0x7a,0x10,0x27,0x0f, 0x04,0x20,0x7e,0x87,0xe8,0x9b,0xd5,0x3f,0x4b,0xb6,0x26,0x21,0xff,0x57,0xa7,0xbe,0xf3,0x08,0x5e,0x90,0x97,0x9d,0xac,0xc9,0x87,0xec,0x5c,0xa6,0xdb,0x72,0xb9,0xb6,0x79,0x32,0x27,0x0f,
0x04,0x20,0x6a,0x58,0xd4,0x22,0xf4,0xae,0x92,0x8e,0x01,0xbe,0x59,0x60,0xe5,0xf8,0x7b,0x0c,0x02,0x84,0xcf,0xe2,0x53,0xbd,0x67,0x94,0xc2,0xd5,0xb1,0x72,0x69,0x26,0xe9,0xe7,0x27,0x0f, 0x04,0x20,0x62,0x7b,0x98,0x6d,0xc4,0x70,0xd7,0x69,0x11,0x6a,0xe8,0x5b,0x7e,0xac,0xe8,0xa1,0xed,0x4a,0x67,0xd7,0x33,0x10,0x9b,0xf1,0x41,0x6b,0xda,0x70,0x31,0x45,0xec,0xfe,0x27,0x0f,
0x04,0x20,0x63,0x77,0x91,0x01,0x84,0xce,0x33,0xd2,0xc7,0x05,0x9e,0x6a,0xc2,0x36,0xbc,0xac,0xc3,0x5e,0xa9,0x1a,0x23,0x87,0x7a,0x1a,0x1d,0x32,0x6c,0xa0,0x7c,0xa5,0x9f,0xde,0x27,0x0f, 0x04,0x20,0x5c,0x0d,0xe6,0x94,0x24,0x57,0x78,0x50,0xc8,0xc3,0xc0,0xa1,0xe8,0x91,0x3f,0x20,0xe0,0x23,0x71,0xf2,0xf3,0x20,0xca,0xca,0x11,0xf7,0x3a,0x82,0x08,0x33,0xf8,0xb3,0x27,0x0f,
0x04,0x20,0x5e,0x80,0x4e,0xb4,0xd4,0x65,0xc2,0x27,0x42,0xcf,0x05,0xe1,0x4b,0xc3,0xef,0xf1,0x6d,0x3a,0x98,0xb0,0x0b,0x95,0x16,0x7e,0xb0,0x40,0x0e,0xee,0x45,0x48,0x48,0xf9,0x27,0x0f,
0x04,0x20,0x57,0x83,0x98,0x4d,0x47,0x9e,0x71,0x94,0x12,0x67,0x43,0x76,0xa5,0x62,0x5b,0xe6,0xa2,0xbc,0x89,0x90,0x54,0x65,0xd4,0x04,0x12,0x3c,0x04,0xb1,0x53,0x5b,0x21,0xe9,0x27,0x0f, 0x04,0x20,0x57,0x83,0x98,0x4d,0x47,0x9e,0x71,0x94,0x12,0x67,0x43,0x76,0xa5,0x62,0x5b,0xe6,0xa2,0xbc,0x89,0x90,0x54,0x65,0xd4,0x04,0x12,0x3c,0x04,0xb1,0x53,0x5b,0x21,0xe9,0x27,0x0f,
0x04,0x20,0x57,0x4c,0x36,0x9a,0xa0,0x62,0xed,0x86,0x58,0xfa,0x03,0x7d,0x05,0x83,0x2f,0x35,0x56,0x75,0x46,0x8a,0x04,0x9d,0xe6,0xd7,0xbe,0x1e,0xfa,0xf2,0x36,0x6f,0x29,0xd0,0x27,0x0f,
0x04,0x20,0x57,0x77,0xa2,0xc2,0xa6,0xcc,0x1d,0x34,0xf8,0x8f,0x2d,0xb7,0x12,0x8b,0x7f,0xf9,0x17,0x14,0xee,0x63,0xe7,0xf3,0x30,0x0f,0x53,0x53,0x7d,0x5b,0x36,0xde,0x69,0xee,0x27,0x0f, 0x04,0x20,0x57,0x77,0xa2,0xc2,0xa6,0xcc,0x1d,0x34,0xf8,0x8f,0x2d,0xb7,0x12,0x8b,0x7f,0xf9,0x17,0x14,0xee,0x63,0xe7,0xf3,0x30,0x0f,0x53,0x53,0x7d,0x5b,0x36,0xde,0x69,0xee,0x27,0x0f,
0x04,0x20,0x4c,0x25,0x24,0xe1,0xb5,0x5c,0x2c,0x54,0x3a,0x23,0x6d,0x2f,0xaa,0xc2,0x7e,0x32,0xdb,0x1d,0x97,0x0f,0xc3,0xcb,0x60,0x4a,0x28,0xc8,0x5f,0x63,0x85,0x3a,0x5d,0x67,0x27,0x0f,
0x04,0x20,0x4a,0x52,0x7b,0x62,0x4a,0xe4,0xf6,0x8f,0xb6,0x29,0xc5,0xf1,0x12,0xf3,0x09,0x4c,0x18,0xe5,0x93,0x83,0x73,0xac,0x60,0x7d,0xad,0x56,0x12,0x83,0xec,0xec,0x47,0xe1,0x27,0x0f,
0x04,0x20,0x46,0x3d,0x6c,0x95,0xfe,0xe9,0x7a,0xf2,0x10,0xf0,0xa4,0x04,0x78,0x3c,0x91,0xbf,0x63,0xc8,0x4b,0x01,0x2b,0x2b,0x51,0xa4,0xe4,0xd0,0x15,0xb4,0x1b,0xcf,0x9e,0xc1,0x27,0x0f,
0x04,0x20,0x44,0xd4,0x09,0x8b,0x46,0x79,0x55,0x4a,0x85,0x89,0x2a,0xee,0x68,0x81,0xaa,0x9a,0x63,0x27,0x28,0x5f,0xb0,0xa8,0xda,0x6b,0xac,0x87,0xdf,0x38,0x32,0x5f,0x2d,0x89,0x27,0x0f, 0x04,0x20,0x44,0xd4,0x09,0x8b,0x46,0x79,0x55,0x4a,0x85,0x89,0x2a,0xee,0x68,0x81,0xaa,0x9a,0x63,0x27,0x28,0x5f,0xb0,0xa8,0xda,0x6b,0xac,0x87,0xdf,0x38,0x32,0x5f,0x2d,0x89,0x27,0x0f,
0x04,0x20,0x41,0x14,0x6c,0x9c,0x93,0x69,0xac,0x73,0x97,0xf1,0x2d,0xcc,0xb0,0xed,0x83,0xb0,0x13,0x37,0x21,0x4f,0x15,0x4d,0xb2,0x6c,0x93,0x7d,0xf9,0x85,0xaa,0x9e,0x11,0xe3,0x27,0x0f, 0x04,0x20,0x40,0xc6,0x11,0x07,0xd7,0xcc,0x43,0x14,0xbf,0x36,0x0b,0xb2,0x72,0x6d,0xf9,0x99,0xa2,0x75,0x59,0x2e,0xff,0x9d,0xcb,0x2a,0x2f,0x47,0x36,0xfe,0xa7,0x00,0xf2,0x6b,0x27,0x0f,
0x04,0x20,0x47,0xfb,0x8b,0x87,0x27,0xca,0x95,0xe8,0x77,0xae,0x41,0xbd,0x72,0x20,0x62,0x25,0xe5,0x67,0x98,0x41,0x85,0x0e,0x9a,0x5d,0x4a,0xb1,0x0f,0x8f,0x46,0xa9,0x87,0xa4,0x27,0x0f, 0x04,0x20,0x47,0xfb,0x8b,0x87,0x27,0xca,0x95,0xe8,0x77,0xae,0x41,0xbd,0x72,0x20,0x62,0x25,0xe5,0x67,0x98,0x41,0x85,0x0e,0x9a,0x5d,0x4a,0xb1,0x0f,0x8f,0x46,0xa9,0x87,0xa4,0x27,0x0f,
0x04,0x20,0x3d,0x39,0xb9,0x4c,0x25,0x2e,0x5e,0x62,0xa2,0xec,0xc9,0xaf,0xc0,0x13,0x52,0x7f,0xba,0xd8,0xa6,0x88,0xf2,0x80,0x6c,0xc4,0xea,0x7c,0x0e,0xc3,0x49,0x5a,0x50,0x5a,0x27,0x0f,
0x04,0x20,0x3c,0xa1,0xc1,0xa9,0xec,0x30,0xb7,0x82,0x22,0x2f,0x45,0x0a,0xe7,0xa9,0xcd,0x00,0x6f,0x0f,0x69,0x4b,0xe6,0xea,0xac,0xc7,0x1e,0xed,0x4e,0xff,0x8a,0x6b,0xc2,0xf6,0x27,0x0f,
0x04,0x20,0x3f,0x23,0x81,0x37,0x6b,0x32,0xe6,0x03,0xde,0xa5,0xbc,0xc9,0xe8,0xe6,0x98,0xa6,0xdc,0xe0,0x6c,0xbb,0x07,0x5e,0x23,0x64,0xea,0xa9,0xfa,0x10,0x40,0x88,0xfc,0xb7,0x27,0x0f,
0x04,0x20,0x3e,0x84,0xf8,0x31,0x23,0xdc,0x60,0x43,0xc5,0xdd,0xd4,0xa6,0x43,0xa3,0x95,0x6e,0x1c,0x5b,0xe1,0x85,0x80,0xe4,0x4b,0x88,0xe7,0x2f,0xc6,0xf0,0x85,0x4e,0x82,0x98,0x27,0x0f, 0x04,0x20,0x3e,0x84,0xf8,0x31,0x23,0xdc,0x60,0x43,0xc5,0xdd,0xd4,0xa6,0x43,0xa3,0x95,0x6e,0x1c,0x5b,0xe1,0x85,0x80,0xe4,0x4b,0x88,0xe7,0x2f,0xc6,0xf0,0x85,0x4e,0x82,0x98,0x27,0x0f,
0x04,0x20,0x31,0xb1,0x83,0x9b,0x98,0x8e,0x85,0x5e,0x08,0x29,0x20,0xc5,0x2e,0x6c,0x06,0xdd,0x4f,0xb8,0x57,0x0d,0x03,0xe6,0xc5,0x9b,0xd8,0xcb,0x9a,0xee,0x9c,0xe6,0x4c,0x10,0x27,0x0f,
0x04,0x20,0x30,0x4d,0xab,0x0f,0x94,0xb0,0xba,0xaf,0xdb,0xa9,0xdd,0xb9,0xec,0xc4,0x9e,0x8f,0x50,0xe2,0x66,0x8b,0x32,0x62,0x85,0x12,0x77,0xaf,0x20,0x45,0x60,0x39,0x36,0xb3,0x27,0x0f, 0x04,0x20,0x30,0x4d,0xab,0x0f,0x94,0xb0,0xba,0xaf,0xdb,0xa9,0xdd,0xb9,0xec,0xc4,0x9e,0x8f,0x50,0xe2,0x66,0x8b,0x32,0x62,0x85,0x12,0x77,0xaf,0x20,0x45,0x60,0x39,0x36,0xb3,0x27,0x0f,
0x04,0x20,0x37,0xa0,0x00,0x0a,0x0c,0xde,0x7d,0x7a,0x3f,0xca,0x63,0xe2,0x1d,0x52,0xa1,0xed,0xa7,0x5d,0x83,0x88,0x91,0x56,0x7e,0x00,0x86,0x26,0xb0,0x53,0x3e,0x95,0x03,0xb2,0x27,0x0f, 0x04,0x20,0x37,0xb4,0xb1,0x9f,0xad,0x20,0xe8,0xa2,0xab,0xa7,0xab,0x94,0xdf,0x66,0x61,0x3b,0x20,0xbf,0x43,0xf0,0x21,0xa3,0x0f,0x0c,0x39,0xc5,0x72,0x88,0xff,0x57,0x24,0x60,0x27,0x0f,
0x04,0x20,0x2e,0x5d,0xec,0xf0,0x62,0x4c,0xca,0x6e,0x90,0xdf,0x00,0x65,0x1c,0xca,0x4a,0xcb,0x66,0xee,0xa2,0xa6,0x94,0x27,0x8d,0x6c,0xec,0x15,0x4b,0xe0,0xa4,0x86,0xe3,0x21,0x27,0x0f,
0x04,0x20,0x24,0xd1,0x42,0xa9,0x1d,0x14,0x82,0xe1,0x88,0xf8,0xc3,0xa1,0x5e,0x06,0xbc,0x83,0x35,0x7c,0x81,0x69,0x40,0xdb,0x29,0xf1,0x47,0x5f,0xb7,0xab,0xa8,0x71,0x92,0x10,0x27,0x0f,
0x04,0x20,0x21,0x09,0xf1,0x0f,0x0d,0x0a,0x69,0xf7,0x82,0xfc,0xe5,0x59,0xb0,0xbb,0xe0,0x06,0x51,0xfd,0x40,0x30,0x35,0x95,0x37,0xd5,0x5b,0xf9,0xdd,0x73,0x7d,0x2a,0x81,0x33,0x27,0x0f, 0x04,0x20,0x21,0x09,0xf1,0x0f,0x0d,0x0a,0x69,0xf7,0x82,0xfc,0xe5,0x59,0xb0,0xbb,0xe0,0x06,0x51,0xfd,0x40,0x30,0x35,0x95,0x37,0xd5,0x5b,0xf9,0xdd,0x73,0x7d,0x2a,0x81,0x33,0x27,0x0f,
0x04,0x20,0x1d,0xb9,0x4f,0x00,0xd6,0xf1,0x95,0x3c,0xff,0x0a,0x61,0xae,0xdf,0xb3,0x65,0x61,0x9a,0xdc,0x04,0xe7,0x5b,0x51,0x23,0xed,0x75,0x6d,0x30,0xb1,0x07,0xb6,0x15,0xb3,0x27,0x0f,
0x04,0x20,0x13,0x0f,0x1e,0xc7,0x6b,0x81,0xf1,0xf4,0x0b,0x44,0x09,0x10,0xbf,0x78,0xb3,0x16,0x7b,0x4f,0x6b,0x30,0xec,0x0e,0x12,0x8f,0x3d,0xda,0xfd,0x28,0x5d,0x69,0x3f,0xf3,0x27,0x0f, 0x04,0x20,0x13,0x0f,0x1e,0xc7,0x6b,0x81,0xf1,0xf4,0x0b,0x44,0x09,0x10,0xbf,0x78,0xb3,0x16,0x7b,0x4f,0x6b,0x30,0xec,0x0e,0x12,0x8f,0x3d,0xda,0xfd,0x28,0x5d,0x69,0x3f,0xf3,0x27,0x0f,
0x04,0x20,0x17,0x60,0x73,0xf6,0xf1,0xb3,0x5c,0xd6,0x4d,0xa8,0x01,0xbb,0x1f,0x84,0xb3,0x2d,0x88,0xd4,0x5a,0x7a,0x2f,0x8a,0x34,0x5e,0x1b,0xf8,0xbe,0x66,0xd1,0xa1,0x4e,0x4d,0x27,0x0f,
0x04,0x20,0x0d,0x1d,0xb2,0x4f,0x77,0xae,0x46,0x98,0x29,0xf7,0xf2,0x24,0x24,0xe7,0x8e,0x25,0xf1,0x48,0x9d,0xe1,0x7a,0xf6,0x89,0x73,0xc3,0xf7,0x76,0xa2,0xa2,0x6b,0xd1,0x87,0x27,0x0f, 0x04,0x20,0x0d,0x1d,0xb2,0x4f,0x77,0xae,0x46,0x98,0x29,0xf7,0xf2,0x24,0x24,0xe7,0x8e,0x25,0xf1,0x48,0x9d,0xe1,0x7a,0xf6,0x89,0x73,0xc3,0xf7,0x76,0xa2,0xa2,0x6b,0xd1,0x87,0x27,0x0f,
0x04,0x20,0x06,0x0f,0x6b,0x3d,0x30,0xe4,0x4d,0xb0,0xc9,0x61,0x9c,0xff,0x82,0x26,0x18,0x3d,0x05,0x80,0x42,0x41,0x0f,0xe6,0xde,0x74,0x2b,0x3f,0x23,0xfb,0xa7,0xda,0xb1,0x5c,0x27,0x0f,
0x04,0x20,0xed,0x7a,0xb3,0x0c,0x6e,0x58,0x90,0x39,0xcf,0x50,0x61,0xd9,0x5c,0x28,0x1a,0x25,0x8f,0x3e,0x31,0x4c,0x62,0x7f,0xb9,0x96,0xd4,0x43,0x16,0x25,0x19,0x90,0x0f,0x57,0x27,0x0f, 0x04,0x20,0xed,0x7a,0xb3,0x0c,0x6e,0x58,0x90,0x39,0xcf,0x50,0x61,0xd9,0x5c,0x28,0x1a,0x25,0x8f,0x3e,0x31,0x4c,0x62,0x7f,0xb9,0x96,0xd4,0x43,0x16,0x25,0x19,0x90,0x0f,0x57,0x27,0x0f,
0x04,0x20,0xe7,0xbe,0x77,0x6c,0x27,0x63,0x47,0x90,0xaa,0x61,0x80,0xf6,0xdb,0x97,0xdc,0x44,0x90,0x1e,0xf2,0x8c,0x42,0x25,0xdb,0x8b,0xad,0xd5,0xdb,0x3d,0xf6,0x9a,0x71,0x4f,0x27,0x0f, 0x04,0x20,0xe9,0x9b,0x8c,0x52,0xef,0x55,0xa5,0x0a,0xfa,0x4c,0xd1,0x09,0xa5,0x7a,0x80,0x45,0x21,0xd0,0x60,0x08,0x7a,0x59,0xbd,0xb7,0xaf,0xb1,0x35,0xaa,0x22,0x7b,0xfe,0x1d,0x27,0x0f,
0x04,0x20,0xd1,0xfd,0x8c,0xae,0x13,0x71,0xa0,0xa0,0x27,0x98,0x3c,0x5c,0x59,0x08,0x4d,0x9b,0xd3,0x80,0x15,0xe9,0xbd,0xa9,0x39,0xa3,0xdd,0x1a,0x9f,0x05,0xa2,0x99,0x01,0xf6,0x27,0x0f, 0x04,0x20,0xef,0x34,0x68,0xe6,0xb3,0xc6,0xc4,0xd0,0xcf,0x22,0xdc,0x92,0x09,0xd0,0x2a,0x63,0x4f,0x6d,0x6a,0xfd,0x31,0x6a,0xd4,0xe9,0x71,0x73,0x06,0xf0,0x46,0xcb,0x17,0x13,0x27,0x0f,
0x04,0x20,0xe0,0xc1,0xc9,0x78,0xb5,0xce,0xad,0x3f,0x7f,0x4a,0xbd,0xe0,0x68,0x83,0x88,0xa4,0x5d,0x39,0x71,0x2d,0xce,0x58,0x47,0xac,0x23,0x9f,0xc0,0x14,0x5f,0xdd,0xe9,0x52,0x27,0x0f,
0x04,0x20,0xdd,0x2a,0x24,0xe1,0x88,0x45,0xd1,0xe6,0xf9,0x9a,0x7f,0x8b,0x23,0x61,0x37,0x55,0xf4,0x22,0x00,0x92,0x1f,0xc8,0xe7,0xa3,0x6f,0xfa,0x5b,0xbf,0x71,0x1d,0xcf,0xb9,0x27,0x0f,
0x04,0x20,0xd8,0x9d,0x50,0x6e,0x4d,0x62,0x30,0x38,0x8c,0x10,0x8c,0xb2,0x9e,0xaa,0x2d,0xa2,0x5f,0x63,0x2a,0x84,0x3e,0x94,0x97,0x0e,0x8d,0xe1,0xea,0x8b,0xab,0x78,0xea,0xfb,0x27,0x0f,
0x04,0x20,0xd0,0x63,0xbf,0xe7,0xa8,0x59,0xb6,0x8d,0xc4,0x16,0xb2,0xb2,0xd6,0x1f,0xcb,0x38,0xb2,0x17,0x41,0x7d,0xc8,0xe2,0x53,0x31,0x40,0xbb,0x65,0xc9,0xbc,0xb1,0xbb,0x29,0x27,0x0f,
0x01,0x04,0xd8,0xfa,0x61,0x34,0x27,0x0f, 0x01,0x04,0xd8,0xfa,0x61,0x34,0x27,0x0f,
0x01,0x04,0xd8,0xee,0x4b,0x2e,0x27,0x0f, 0x01,0x04,0xd8,0xee,0x4b,0x2e,0x27,0x0f,
0x01,0x04,0xd8,0xe6,0xe8,0x7d,0x27,0x0f, 0x01,0x04,0xd8,0xe6,0xe8,0x7d,0x27,0x0f,
0x01,0x04,0xd8,0xbd,0x9a,0x08,0x27,0x0f, 0x01,0x04,0xd5,0xda,0xd1,0x22,0x27,0x0f,
0x01,0x04,0xd8,0xbd,0x9a,0x07,0x27,0x0f, 0x01,0x04,0xd5,0xc7,0x22,0xfa,0x27,0x0f,
0x01,0x04,0xd5,0xa8,0xf9,0xae,0x27,0x0f, 0x01,0x04,0xd5,0xab,0x0f,0x7d,0x27,0x0f,
0x01,0x04,0xd5,0x9f,0x4d,0xdd,0x27,0x0f,
0x01,0x04,0xd4,0x34,0x00,0xd2,0x27,0x0f,
0x01,0x04,0xd4,0x18,0x6e,0x80,0x27,0x0f, 0x01,0x04,0xd4,0x18,0x6e,0x80,0x27,0x0f,
0x01,0x04,0xd4,0x18,0x6b,0xdf,0x27,0x0f, 0x01,0x04,0xd1,0x91,0x30,0x9a,0x27,0x0f,
0x01,0x04,0xd1,0x8d,0x24,0xce,0x27,0x0f,
0x01,0x04,0xd1,0x3a,0xa4,0x2a,0x27,0x0f,
0x01,0x04,0xd0,0x57,0x66,0x5b,0x27,0x0f,
0x01,0x04,0xcf,0xf4,0xf7,0x28,0x27,0x0f, 0x01,0x04,0xcf,0xf4,0xf7,0x28,0x27,0x0f,
0x01,0x04,0xce,0xbd,0x84,0xe0,0x27,0x0f, 0x01,0x04,0xca,0x05,0x10,0x21,0x27,0x0f,
0x01,0x04,0xce,0xa8,0xd5,0x6c,0x27,0x0f, 0x01,0x04,0xc6,0x07,0x73,0x30,0x27,0x0f,
0x01,0x04,0xce,0xa8,0xd4,0xe2,0x27,0x0f, 0x01,0x04,0xc3,0xb5,0xd3,0x40,0x27,0x0f,
0x01,0x04,0xce,0xa8,0xd4,0xb2,0x27,0x0f, 0x01,0x04,0xc3,0x62,0x5f,0xd2,0x27,0x0f,
0x01,0x04,0xce,0xa8,0xd4,0x90,0x27,0x0f,
0x01,0x04,0xc2,0x9e,0x47,0xe4,0x27,0x0f,
0x01,0x04,0xc2,0x87,0x51,0xd6,0x27,0x0f, 0x01,0x04,0xc2,0x87,0x51,0xd6,0x27,0x0f,
0x01,0x04,0xc1,0xa4,0x95,0x32,0x27,0x0f, 0x01,0x04,0xc2,0x05,0x9d,0xd6,0x27,0x0f,
0x01,0x04,0xc1,0x1f,0x1e,0x37,0x27,0x0f, 0x01,0x04,0xc0,0xa9,0x06,0x57,0x27,0x0f,
0x01,0x04,0xbc,0xd0,0xc4,0xb7,0x27,0x0f, 0x01,0x04,0xbc,0x7f,0xed,0xf3,0x27,0x0f,
0x01,0x04,0xbc,0x7f,0xe6,0x28,0x27,0x0f, 0x01,0x04,0xbc,0x7f,0xe6,0x28,0x27,0x0f,
0x01,0x04,0xbc,0x44,0xdf,0x5e,0x27,0x0f, 0x01,0x04,0xbc,0x28,0xb2,0x43,0x27,0x0f,
0x01,0x04,0xb9,0xf3,0x73,0xdb,0x27,0x0f, 0x01,0x04,0xb9,0xf3,0x73,0xdb,0x27,0x0f,
0x01,0x04,0xb9,0xe4,0x53,0x9c,0x27,0x0f,
0x01,0x04,0xb9,0xd9,0x7f,0x8b,0x27,0x0f,
0x01,0x04,0xb9,0xd5,0x18,0x22,0x27,0x0f, 0x01,0x04,0xb9,0xd5,0x18,0x22,0x27,0x0f,
0x01,0x04,0xb9,0xc6,0xea,0x36,0x27,0x0f,
0x01,0x04,0xb9,0xc6,0xea,0x21,0x27,0x0f,
0x01,0x04,0xb9,0xc6,0xea,0x19,0x27,0x0f,
0x01,0x04,0xb9,0xc6,0xea,0x11,0x27,0x0f,
0x01,0x04,0xb9,0xb9,0x28,0xab,0x27,0x0f,
0x01,0x04,0xb9,0xb9,0x28,0x68,0x27,0x0f,
0x01,0x04,0xb9,0xa6,0xd9,0x9a,0x27,0x0f,
0x01,0x04,0xb9,0xa5,0xab,0x75,0x27,0x0f, 0x01,0x04,0xb9,0xa5,0xab,0x75,0x27,0x0f,
0x01,0x04,0xb9,0xa4,0xa3,0xda,0x27,0x0f, 0x01,0x04,0xb9,0xa4,0xa3,0xda,0x27,0x0f,
0x01,0x04,0xb9,0xa4,0xa3,0x55,0x27,0x0f, 0x01,0x04,0xb9,0xa4,0xa3,0x55,0x27,0x0f,
0x01,0x04,0xb9,0x87,0x50,0xc8,0x27,0x0f, 0x01,0x04,0xb9,0x9e,0x6b,0x7c,0x27,0x0f,
0x01,0x04,0xb9,0x9b,0x63,0x22,0x27,0x0f,
0x01,0x04,0xb9,0x8e,0xd4,0x90,0x27,0x0f,
0x01,0x04,0xb9,0x70,0xf9,0x31,0x27,0x0f,
0x01,0x04,0xb9,0x57,0x95,0x3d,0x27,0x0f, 0x01,0x04,0xb9,0x57,0x95,0x3d,0x27,0x0f,
0x01,0x04,0xb2,0xd0,0x57,0xe2,0x27,0x0f, 0x01,0x04,0xb2,0xd0,0x57,0xe2,0x27,0x0f,
0x01,0x04,0xb2,0xd0,0x57,0xd5,0x27,0x0f, 0x01,0x04,0xb2,0xd0,0x57,0xd5,0x27,0x0f,
0x01,0x04,0xb2,0x9d,0x5b,0xb3,0x27,0x0f, 0x01,0x04,0xb2,0x9f,0x02,0x0c,0x27,0x0f,
0x01,0x04,0xb2,0x9d,0x5b,0xb0,0x27,0x0f, 0x01,0x04,0xb2,0x9d,0x5b,0xb8,0x27,0x0f,
0x01,0x04,0xb2,0x9d,0x5b,0x7e,0x27,0x0f, 0x01,0x04,0xb2,0x9d,0x5b,0xb2,0x27,0x0f,
0x01,0x04,0xb2,0x9d,0x5b,0xb1,0x27,0x0f,
0x01,0x04,0xb2,0x3f,0x79,0x81,0x27,0x0f, 0x01,0x04,0xb2,0x3f,0x79,0x81,0x27,0x0f,
0x01,0x04,0xb0,0x7e,0x7f,0x10,0x27,0x0f, 0x01,0x04,0xb0,0x66,0x41,0x91,0x27,0x0f,
0x01,0x04,0xb0,0x7e,0x7f,0x0f,0x27,0x0f, 0x01,0x04,0xae,0x22,0xe9,0xd4,0x27,0x0f,
0x01,0x04,0xae,0x22,0xe9,0xcf,0x27,0x0f, 0x01,0x04,0xae,0x22,0xe9,0xd3,0x27,0x0f,
0x01,0x04,0xae,0x22,0xe9,0xce,0x27,0x0f, 0x01,0x04,0xae,0x22,0xe9,0xd1,0x27,0x0f,
0x01,0x04,0xae,0x22,0xe9,0xcd,0x27,0x0f, 0x01,0x04,0xae,0x22,0xe9,0xcc,0x27,0x0f,
0x01,0x04,0xae,0x22,0xe9,0xca,0x27,0x0f, 0x01,0x04,0xac,0x68,0x91,0xa6,0x27,0x0f,
0x01,0x04,0xad,0xf9,0x15,0x7a,0x27,0x0f,
0x01,0x04,0xac,0x68,0x5a,0xf9,0x27,0x0f, 0x01,0x04,0xac,0x68,0x5a,0xf9,0x27,0x0f,
0x01,0x04,0xaa,0x4b,0xa7,0xf4,0x27,0x0f,
0x01,0x04,0xaa,0x4b,0xa2,0xd4,0x27,0x0f,
0x01,0x04,0xa8,0x77,0x50,0x04,0x27,0x0f, 0x01,0x04,0xa8,0x77,0x50,0x04,0x27,0x0f,
0x01,0x04,0xa7,0x58,0xa9,0x10,0x27,0x0f, 0x01,0x04,0xa7,0x58,0xa9,0x10,0x27,0x0f,
0x01,0x04,0xa7,0x58,0xa5,0xaf,0x27,0x0f,
0x01,0x04,0xa5,0x16,0xea,0x87,0x27,0x0f, 0x01,0x04,0xa5,0x16,0xea,0x87,0x27,0x0f,
0x01,0x04,0x9f,0x59,0x7c,0x66,0x27,0x0f, 0x01,0x04,0xa3,0xac,0x42,0x29,0x27,0x0f,
0x01,0x04,0x9b,0x85,0x17,0xdd,0x27,0x0f, 0x01,0x04,0xa3,0xac,0x14,0xd2,0x27,0x0f,
0x01,0x04,0xa3,0xac,0x14,0xd1,0x27,0x0f,
0x01,0x04,0xa3,0xac,0x14,0xcd,0x27,0x0f,
0x01,0x04,0xa2,0xfa,0xbf,0x1f,0x27,0x0f,
0x01,0x04,0xa2,0xf6,0x11,0xf8,0x27,0x0f,
0x01,0x04,0x9f,0x4b,0x79,0xa3,0x27,0x0f,
0x01,0x04,0x9d,0xad,0xca,0x0e,0x27,0x0f,
0x01,0x04,0x9d,0x42,0x51,0xa2,0x27,0x0f,
0x01,0x04,0x9d,0x0a,0xc7,0x52,0x27,0x0f,
0x01,0x04,0x9d,0x0a,0xc7,0x4f,0x27,0x0f,
0x01,0x04,0x9d,0x0a,0xc7,0x4d,0x27,0x0f,
0x01,0x04,0x9a,0x7f,0x39,0x3f,0x27,0x0f,
0x01,0x04,0x96,0x9e,0x30,0x06,0x27,0x0f, 0x01,0x04,0x96,0x9e,0x30,0x06,0x27,0x0f,
0x01,0x04,0x91,0xef,0x14,0xb0,0x27,0x0f, 0x01,0x04,0x93,0x2d,0xb7,0x80,0x27,0x0f,
0x01,0x04,0x90,0x5b,0x7f,0xa6,0x27,0x0f, 0x01,0x04,0x93,0x2d,0x67,0x63,0x27,0x0f,
0x01,0x04,0x8e,0xca,0xcd,0x5f,0x27,0x0f, 0x01,0x04,0x92,0xbe,0xe6,0x68,0x27,0x0f,
0x01,0x04,0x8b,0x3b,0x64,0x67,0x27,0x0f, 0x01,0x04,0x92,0x67,0x30,0xd1,0x27,0x0f,
0x01,0x04,0x92,0x67,0x30,0xcb,0x27,0x0f,
0x01,0x04,0x92,0x3b,0x2d,0xeb,0x27,0x0f,
0x01,0x04,0x8b,0xa2,0x83,0xc5,0x27,0x0f,
0x01,0x04,0x87,0xb5,0x35,0x82,0x27,0x0f,
0x01,0x04,0x86,0xff,0xb6,0xba,0x27,0x0f,
0x01,0x04,0x85,0x12,0xe4,0x54,0x27,0x0f, 0x01,0x04,0x85,0x12,0xe4,0x54,0x27,0x0f,
0x01,0x04,0x82,0xa2,0xe9,0xba,0x27,0x0f, 0x01,0x04,0x82,0xa2,0xe9,0xba,0x27,0x0f,
0x01,0x04,0x82,0x3d,0x78,0xfc,0x27,0x0f,
0x01,0x04,0x7b,0xc1,0x40,0xa6,0x27,0x0f, 0x01,0x04,0x7b,0xc1,0x40,0xa6,0x27,0x0f,
0x01,0x04,0x6d,0xeb,0x46,0x64,0x27,0x0f, 0x01,0x04,0x6d,0xeb,0x45,0x52,0x27,0x0f,
0x01,0x04,0x6d,0xeb,0x45,0xaa,0x27,0x0f, 0x01,0x04,0x6d,0xad,0xf0,0xe9,0x27,0x0f,
0x01,0x04,0x6d,0xeb,0x41,0xe2,0x27,0x0f, 0x01,0x04,0x6b,0xbd,0x03,0x4a,0x27,0x0f,
0x01,0x04,0x6d,0xeb,0x41,0x5f,0x27,0x0f, 0x01,0x04,0x6b,0xaa,0xfe,0xa0,0x27,0x0f,
0x01,0x04,0x6a,0x37,0x09,0x16,0x27,0x0f, 0x01,0x04,0x6a,0x37,0x09,0x16,0x27,0x0f,
0x01,0x04,0x68,0xee,0x23,0x74,0x27,0x0f, 0x01,0x04,0x68,0xe1,0x9f,0xe8,0x27,0x0f,
0x01,0x04,0x68,0xc8,0x43,0xfb,0x27,0x0f,
0x01,0x04,0x68,0xc8,0x18,0xc4,0x27,0x0f, 0x01,0x04,0x68,0xc8,0x18,0xc4,0x27,0x0f,
0x01,0x04,0x67,0xa0,0x5f,0xdb,0x27,0x0f,
0x01,0x04,0x5f,0xd3,0xc4,0x2e,0x27,0x0f, 0x01,0x04,0x5f,0xd3,0xc4,0x2e,0x27,0x0f,
0x01,0x04,0x5f,0xd3,0xc4,0x22,0x27,0x0f,
0x01,0x04,0x5f,0xd3,0xc4,0x20,0x27,0x0f, 0x01,0x04,0x5f,0xd3,0xc4,0x20,0x27,0x0f,
0x01,0x04,0x5f,0xd3,0xc4,0x08,0x27,0x0f, 0x01,0x04,0x5f,0xd3,0xc4,0x08,0x27,0x0f,
0x01,0x04,0x5f,0xb7,0x35,0x2c,0x27,0x0f,
0x01,0x04,0x5f,0xb7,0x33,0x8d,0x27,0x0f, 0x01,0x04,0x5f,0xb7,0x33,0x8d,0x27,0x0f,
0x01,0x04,0x5f,0xab,0x15,0x83,0x27,0x0f,
0x01,0x04,0x5f,0xa9,0xb5,0x47,0x27,0x0f,
0x01,0x04,0x5e,0xac,0x6d,0xa1,0x27,0x0f,
0x01,0x04,0x5d,0x15,0x4c,0xb9,0x27,0x0f, 0x01,0x04,0x5d,0x15,0x4c,0xb9,0x27,0x0f,
0x01,0x04,0x5c,0x3f,0xb0,0xca,0x27,0x0f,
0x01,0x04,0x5b,0xea,0x23,0x84,0x27,0x0f,
0x01,0x04,0x5b,0xde,0xed,0x62,0x27,0x0f,
0x01,0x04,0x5b,0xc7,0x95,0xb1,0x27,0x0f,
0x01,0x04,0x59,0xb3,0x49,0x60,0x27,0x0f, 0x01,0x04,0x59,0xb3,0x49,0x60,0x27,0x0f,
0x01,0x04,0x59,0x75,0x13,0x0a,0x27,0x0f, 0x01,0x04,0x59,0x75,0x13,0x0a,0x27,0x0f,
0x01,0x04,0x59,0x28,0x0d,0x50,0x27,0x0f,
0x01,0x04,0x59,0x28,0x0a,0x2d,0x27,0x0f,
0x01,0x04,0x59,0x28,0x08,0xa0,0x27,0x0f,
0x01,0x04,0x59,0x28,0x00,0x6d,0x27,0x0f,
0x01,0x04,0x59,0x23,0x83,0x3d,0x27,0x0f,
0x01,0x04,0x57,0xe4,0x18,0x40,0x27,0x0f,
0x01,0x04,0x57,0xd1,0xf5,0xe3,0x27,0x0f,
0x01,0x04,0x56,0x6b,0xa8,0x2f,0x27,0x0f,
0x01,0x04,0x56,0x6b,0xa8,0x2e,0x27,0x0f,
0x01,0x04,0x56,0x6b,0xa8,0x2b,0x27,0x0f,
0x01,0x04,0x56,0x6b,0xa8,0x1d,0x27,0x0f,
0x01,0x04,0x55,0xd7,0x6b,0xca,0x27,0x0f, 0x01,0x04,0x55,0xd7,0x6b,0xca,0x27,0x0f,
0x01,0x04,0x55,0xd1,0xf1,0xbe,0x27,0x0f, 0x01,0x04,0x55,0xd1,0xf1,0xb9,0x27,0x0f,
0x01,0x04,0x55,0xd1,0xf1,0xbc,0x27,0x0f, 0x01,0x04,0x55,0xd1,0xf1,0x56,0x27,0x0f,
0x01,0x04,0x55,0xd1,0xf1,0x47,0x27,0x0f, 0x01,0x04,0x55,0xd1,0xf1,0x47,0x27,0x0f,
0x01,0x04,0x55,0xd1,0xf1,0x23,0x27,0x0f, 0x01,0x04,0x55,0xd1,0xf1,0x23,0x27,0x0f,
0x01,0x04,0x54,0xf2,0xb3,0xcc,0x27,0x0f,
0x01,0x04,0x54,0x09,0x32,0x11,0x27,0x0f,
0x01,0x04,0x53,0xef,0x63,0x28,0x27,0x0f,
0x01,0x04,0x52,0xd3,0x19,0xc1,0x27,0x0f, 0x01,0x04,0x52,0xd3,0x19,0xc1,0x27,0x0f,
0x01,0x04,0x52,0xd3,0x19,0x69,0x27,0x0f, 0x01,0x04,0x52,0xd3,0x19,0x69,0x27,0x0f,
0x01,0x04,0x52,0xd3,0x15,0xb3,0x27,0x0f, 0x01,0x04,0x52,0xd3,0x15,0xb3,0x27,0x0f,
0x01,0x04,0x52,0xd3,0x15,0x17,0x27,0x0f, 0x01,0x04,0x52,0xd3,0x15,0x17,0x27,0x0f,
0x01,0x04,0x52,0xca,0xe6,0x53,0x27,0x0f, 0x01,0x04,0x52,0xca,0xe6,0x53,0x27,0x0f,
0x01,0x04,0x51,0xe3,0xfa,0x33,0x27,0x0f, 0x01,0x04,0x51,0xe3,0xfa,0x33,0x27,0x0f,
0x01,0x04,0x50,0xf9,0x93,0x08,0x27,0x0f,
0x01,0x04,0x50,0xf0,0x84,0xe7,0x27,0x0f,
0x01,0x04,0x50,0xd1,0xea,0xaa,0x27,0x0f, 0x01,0x04,0x50,0xd1,0xea,0xaa,0x27,0x0f,
0x01,0x04,0x4e,0x53,0x13,0x00,0x27,0x0f, 0x01,0x04,0x4e,0x53,0x13,0x00,0x27,0x0f,
0x01,0x04,0x4d,0xe8,0x84,0x59,0x27,0x0f,
0x01,0x04,0x4d,0xe8,0x84,0x04,0x27,0x0f,
0x01,0x04,0x4d,0xdf,0x63,0x04,0x27,0x0f, 0x01,0x04,0x4d,0xdf,0x63,0x04,0x27,0x0f,
0x01,0x04,0x4d,0xdd,0x94,0xcc,0x27,0x0f,
0x01,0x04,0x4a,0x32,0x5a,0x71,0x27,0x0f,
0x01,0x04,0x45,0x3d,0x6b,0xd7,0x27,0x0f,
0x01,0x04,0x42,0xf5,0xc4,0x34,0x27,0x0f,
0x01,0x04,0x42,0xf4,0xf3,0x46,0x27,0x0f, 0x01,0x04,0x42,0xf4,0xf3,0x46,0x27,0x0f,
0x01,0x04,0x42,0xf4,0xf3,0x45,0x27,0x0f, 0x01,0x04,0x42,0xf4,0xf3,0x45,0x27,0x0f,
0x01,0x04,0x3a,0x6e,0xe0,0xa6,0x27,0x0f, 0x01,0x04,0x34,0x24,0x66,0x5b,0x27,0x0f,
0x01,0x04,0x36,0x25,0xea,0x79,0x27,0x0f,
0x01,0x04,0x34,0x21,0x09,0xac,0x27,0x0f, 0x01,0x04,0x34,0x21,0x09,0xac,0x27,0x0f,
0x01,0x04,0x33,0x9e,0xf3,0xfa,0x27,0x0f, 0x01,0x04,0x33,0x26,0x8e,0x42,0x27,0x0f,
0x01,0x04,0x33,0x9e,0xa9,0xed,0x27,0x0f, 0x01,0x04,0x33,0x26,0x8e,0x3e,0x27,0x0f,
0x01,0x04,0x33,0x4f,0xa0,0xc5,0x27,0x0f, 0x01,0x04,0x33,0x26,0x8e,0x3d,0x27,0x0f,
0x01,0x04,0x33,0x44,0x9b,0x40,0x27,0x0f, 0x01,0x04,0x2f,0x6e,0xb8,0xaa,0x27,0x0f,
0x01,0x04,0x33,0x0f,0x75,0x2a,0x27,0x0f, 0x01,0x04,0x2e,0xfe,0xf1,0x09,0x27,0x0f,
0x01,0x04,0x33,0x0f,0x60,0xce,0x27,0x0f, 0x01,0x04,0x2e,0xfe,0xf1,0x08,0x27,0x0f,
0x01,0x04,0x2f,0x6d,0x6d,0xa6,0x27,0x0f, 0x01,0x04,0x2e,0xfe,0xf1,0x07,0x27,0x0f,
0x01,0x04,0x2e,0xfe,0xf1,0x15,0x27,0x0f,
0x01,0x04,0x2e,0xfe,0xf1,0x04,0x27,0x0f, 0x01,0x04,0x2e,0xfe,0xf1,0x04,0x27,0x0f,
0x01,0x04,0x2e,0x24,0x28,0xf2,0x27,0x0f, 0x01,0x04,0x2e,0x24,0x28,0xf2,0x27,0x0f,
0x01,0x04,0x2e,0x1e,0xbd,0xfb,0x27,0x0f,
0x01,0x04,0x2e,0x1e,0xbd,0xd6,0x27,0x0f, 0x01,0x04,0x2e,0x1e,0xbd,0xd6,0x27,0x0f,
0x01,0x04,0x2e,0x1e,0xbd,0xd5,0x27,0x0f,
0x01,0x04,0x2e,0x1e,0xbd,0x74,0x27,0x0f, 0x01,0x04,0x2e,0x1e,0xbd,0x74,0x27,0x0f,
0x01,0x04,0x2e,0x04,0xa2,0x7f,0x27,0x0f, 0x01,0x04,0x2d,0x99,0xba,0x64,0x27,0x0f,
0x01,0x04,0x2d,0x8c,0x13,0xc9,0x27,0x0f, 0x01,0x04,0x2d,0x8c,0x13,0xc9,0x27,0x0f,
0x01,0x04,0x2d,0x5d,0x8b,0x75,0x27,0x0f, 0x01,0x04,0x2d,0x87,0xb4,0x4f,0x27,0x0f,
0x01,0x04,0x2d,0x5b,0x5e,0xd9,0x27,0x0f, 0x01,0x04,0x2d,0x5b,0x5e,0xd9,0x27,0x0f,
0x01,0x04,0x2d,0x55,0x75,0xa9,0x27,0x0f,
0x01,0x04,0x2d,0x55,0x75,0x28,0x27,0x0f,
0x01,0x04,0x2d,0x53,0x7a,0x7a,0x27,0x0f, 0x01,0x04,0x2d,0x53,0x7a,0x7a,0x27,0x0f,
0x01,0x04,0x2d,0x4f,0x12,0x6a,0x27,0x0f,
0x01,0x04,0x2d,0x4c,0x53,0x5b,0x27,0x0f, 0x01,0x04,0x2d,0x4c,0x53,0x5b,0x27,0x0f,
0x01,0x04,0x2d,0x47,0x9f,0x68,0x27,0x0f, 0x01,0x04,0x2d,0x47,0x9f,0x68,0x27,0x0f,
0x01,0x04,0x2d,0x47,0x9e,0x6c,0x27,0x0f, 0x01,0x04,0x2d,0x47,0x9e,0x6c,0x27,0x0f,
0x01,0x04,0x2d,0x47,0x9e,0x3a,0x27,0x0f, 0x01,0x04,0x2d,0x47,0x9e,0x3a,0x27,0x0f,
0x01,0x04,0x2d,0x3f,0x6b,0x5a,0x27,0x0f, 0x01,0x04,0x2d,0x3d,0xba,0x79,0x27,0x0f,
0x01,0x04,0x2d,0x3a,0x38,0xdd,0x27,0x0f, 0x01,0x04,0x2d,0x3a,0x38,0x4f,0x27,0x0f,
0x01,0x04,0x2d,0x20,0x9f,0x30,0x27,0x0f, 0x01,0x04,0x2d,0x20,0x9f,0x30,0x27,0x0f,
0x01,0x04,0x2d,0x0b,0xb6,0x40,0x27,0x0f, 0x01,0x04,0x2d,0x0b,0xb6,0x40,0x27,0x0f,
0x01,0x04,0x2d,0x08,0xfa,0x9a,0x27,0x0f,
0x01,0x04,0x2c,0xf0,0x63,0xd6,0x27,0x0f, 0x01,0x04,0x2c,0xf0,0x63,0xd6,0x27,0x0f,
0x01,0x04,0x25,0x4d,0x68,0xa6,0x27,0x0f, 0x01,0x04,0x2b,0xe5,0x4d,0x2e,0x27,0x0f,
0x01,0x04,0x2b,0xa7,0xf4,0x6d,0x27,0x0f,
0x01,0x04,0x2b,0xa7,0xf0,0x5a,0x27,0x0f,
0x01,0x04,0x2b,0xa3,0xfb,0x33,0x27,0x0f,
0x01,0x04,0x2b,0x80,0x48,0x72,0x27,0x0f,
0x01,0x04,0x26,0x63,0x52,0xe6,0x27,0x0f,
0x01,0x04,0x26,0x63,0x52,0x15,0x27,0x0f,
0x01,0x04,0x26,0x5b,0x65,0x5c,0x27,0x0f,
0x01,0x04,0x26,0x5b,0x64,0xca,0x27,0x0f,
0x01,0x04,0x26,0x58,0x7d,0x33,0x27,0x0f,
0x01,0x04,0x26,0x58,0x7d,0x32,0x27,0x0f,
0x01,0x04,0x25,0x61,0xe3,0x15,0x27,0x0f,
0x01,0x04,0x23,0xae,0xd9,0x62,0x27,0x0f,
0x01,0x04,0x22,0xf6,0xb0,0x19,0x27,0x0f,
0x01,0x04,0x1f,0x94,0x63,0x68,0x27,0x0f, 0x01,0x04,0x1f,0x94,0x63,0x68,0x27,0x0f,
0x01,0x04,0x1f,0x39,0xbe,0xbc,0x27,0x0f,
0x01,0x04,0x1f,0x39,0xbe,0x1f,0x27,0x0f,
0x01,0x04,0x1f,0x0a,0x61,0x24,0x27,0x0f, 0x01,0x04,0x1f,0x0a,0x61,0x24,0x27,0x0f,
0x01,0x04,0x17,0xa3,0x00,0xcb,0x27,0x0f, 0x01,0x04,0x05,0xff,0x6a,0xc0,0x27,0x0f,
0x01,0x04,0x17,0xa3,0x00,0xaf,0x27,0x0f,
0x01,0x04,0x0d,0xfb,0x0b,0x37,0x27,0x0f,
0x01,0x04,0x05,0xfc,0x15,0x18,0x27,0x0f,
0x01,0x04,0x05,0xbd,0xfd,0xfc,0x27,0x0f,
0x01,0x04,0x05,0xbd,0xef,0x34,0x27,0x0f,
0x01,0x04,0x05,0xbd,0x91,0x50,0x27,0x0f,
0x01,0x04,0x05,0xb5,0xca,0x0f,0x27,0x0f,
0x01,0x04,0x05,0xa1,0x6e,0x4f,0x27,0x0f, 0x01,0x04,0x05,0xa1,0x6e,0x4f,0x27,0x0f,
0x01,0x04,0x05,0x4f,0x6d,0xf3,0x27,0x0f, 0x01,0x04,0x05,0x23,0x67,0x1a,0x27,0x0f,
0x01,0x04,0x05,0x4e,0x4a,0x76,0x27,0x0f, 0x01,0x04,0x05,0x23,0x67,0x19,0x27,0x0f,
0x01,0x04,0x05,0x23,0x67,0x6f,0x27,0x0f, 0x01,0x04,0x05,0x23,0x67,0x13,0x27,0x0f,
0x01,0x04,0x05,0x23,0x67,0x4a,0x27,0x0f,
0x01,0x04,0x05,0x23,0x67,0x40,0x27,0x0f,
0x01,0x04,0x05,0x23,0x67,0x3a,0x27,0x0f,
0x01,0x04,0x05,0x09,0xed,0x22,0x27,0x0f,
0x01,0x04,0x05,0x02,0x49,0x3a,0x27,0x0f, 0x01,0x04,0x05,0x02,0x49,0x3a,0x27,0x0f,
0x01,0x04,0x03,0x23,0xe0,0x41,0x27,0x0f, 0x01,0x04,0x02,0xe9,0x78,0x23,0x27,0x0f,
0x01,0x04,0x02,0x38,0xd5,0xdd,0x27,0x0f,
}; };
static const uint8_t chainparams_seed_test[] = { static const uint8_t chainparams_seed_test[] = {

View File

@ -132,7 +132,7 @@ PeerMsgRet CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, CDataS
WITH_LOCK(cs_vecqueue, vecCoinJoinQueue.push_back(dsq)); WITH_LOCK(cs_vecqueue, vecCoinJoinQueue.push_back(dsq));
} }
} // cs_ProcessDSQueue } // cs_ProcessDSQueue
dsq.Relay(connman, *peerman); peerman->RelayDSQ(dsq);
return {}; return {};
} }

View File

@ -28,6 +28,7 @@ class CMasternodeSync;
class CNode; class CNode;
class CoinJoinWalletManager; class CoinJoinWalletManager;
class CTxMemPool; class CTxMemPool;
class PeerManager;
class UniValue; class UniValue;

View File

@ -14,7 +14,6 @@
#include <masternode/node.h> #include <masternode/node.h>
#include <masternode/sync.h> #include <masternode/sync.h>
#include <messagesigner.h> #include <messagesigner.h>
#include <net_processing.h>
#include <netmessagemaker.h> #include <netmessagemaker.h>
#include <txmempool.h> #include <txmempool.h>
#include <util/moneystr.h> #include <util/moneystr.h>
@ -71,19 +70,6 @@ bool CCoinJoinQueue::CheckSignature(const CBLSPublicKey& blsPubKey) const
return true; return true;
} }
bool CCoinJoinQueue::Relay(CConnman& connman, PeerManager& peerman)
{
CInv inv(MSG_DSQ, GetHash());
peerman.RelayInv(inv, DSQ_INV_VERSION);
connman.ForEachNode([&connman, this](CNode* pnode) {
CNetMsgMaker msgMaker(pnode->GetCommonVersion());
if (pnode->fSendDSQueue && pnode->nVersion < DSQ_INV_VERSION) {
connman.PushMessage(pnode, msgMaker.Make(NetMsgType::DSQUEUE, (*this)));
}
});
return true;
}
bool CCoinJoinQueue::IsTimeOutOfBounds(int64_t current_time) const bool CCoinJoinQueue::IsTimeOutOfBounds(int64_t current_time) const
{ {
return current_time - nTime > COINJOIN_QUEUE_TIMEOUT || return current_time - nTime > COINJOIN_QUEUE_TIMEOUT ||

View File

@ -24,14 +24,12 @@
class CActiveMasternodeManager; class CActiveMasternodeManager;
class CChainState; class CChainState;
class CConnman;
class CBLSPublicKey; class CBLSPublicKey;
class CBlockIndex; class CBlockIndex;
class ChainstateManager; class ChainstateManager;
class CMasternodeSync; class CMasternodeSync;
class CTxMemPool; class CTxMemPool;
class TxValidationState; class TxValidationState;
class PeerManager;
namespace llmq { namespace llmq {
class CChainLocksHandler; class CChainLocksHandler;
@ -221,8 +219,6 @@ public:
/// Check if we have a valid Masternode address /// Check if we have a valid Masternode address
[[nodiscard]] bool CheckSignature(const CBLSPublicKey& blsPubKey) const; [[nodiscard]] bool CheckSignature(const CBLSPublicKey& blsPubKey) const;
bool Relay(CConnman& connman, PeerManager& peerman);
/// Check if a queue is too old or too far into the future /// Check if a queue is too old or too far into the future
[[nodiscard]] bool IsTimeOutOfBounds(int64_t current_time = GetAdjustedTime()) const; [[nodiscard]] bool IsTimeOutOfBounds(int64_t current_time = GetAdjustedTime()) const;

View File

@ -186,7 +186,7 @@ PeerMsgRet CCoinJoinServer::ProcessDSQUEUE(const CNode& peer, CDataStream& vRecv
TRY_LOCK(cs_vecqueue, lockRecv); TRY_LOCK(cs_vecqueue, lockRecv);
if (!lockRecv) return {}; if (!lockRecv) return {};
vecCoinJoinQueue.push_back(dsq); vecCoinJoinQueue.push_back(dsq);
dsq.Relay(connman, *m_peerman); m_peerman->RelayDSQ(dsq);
} }
return {}; return {};
} }
@ -519,7 +519,7 @@ void CCoinJoinServer::CheckForCompleteQueue()
LogPrint(BCLog::COINJOIN, "CCoinJoinServer::CheckForCompleteQueue -- queue is ready, signing and relaying (%s) " /* Continued */ LogPrint(BCLog::COINJOIN, "CCoinJoinServer::CheckForCompleteQueue -- queue is ready, signing and relaying (%s) " /* Continued */
"with %d participants\n", dsq.ToString(), vecSessionCollaterals.size()); "with %d participants\n", dsq.ToString(), vecSessionCollaterals.size());
dsq.Sign(*m_mn_activeman); dsq.Sign(*m_mn_activeman);
dsq.Relay(connman, *m_peerman); m_peerman->RelayDSQ(dsq);
} }
} }
@ -732,7 +732,7 @@ bool CCoinJoinServer::CreateNewSession(const CCoinJoinAccept& dsa, PoolMessage&
GetAdjustedTime(), false); GetAdjustedTime(), false);
LogPrint(BCLog::COINJOIN, "CCoinJoinServer::CreateNewSession -- signing and relaying new queue: %s\n", dsq.ToString()); LogPrint(BCLog::COINJOIN, "CCoinJoinServer::CreateNewSession -- signing and relaying new queue: %s\n", dsq.ToString());
dsq.Sign(*m_mn_activeman); dsq.Sign(*m_mn_activeman);
dsq.Relay(connman, *m_peerman); m_peerman->RelayDSQ(dsq);
LOCK(cs_vecqueue); LOCK(cs_vecqueue);
vecCoinJoinQueue.push_back(dsq); vecCoinJoinQueue.push_back(dsq);
} }

View File

@ -11,6 +11,7 @@
class CActiveMasternodeManager; class CActiveMasternodeManager;
class CCoinJoinServer; class CCoinJoinServer;
class CConnman;
class CDataStream; class CDataStream;
class CDeterministicMNManager; class CDeterministicMNManager;
class CDSTXManager; class CDSTXManager;

View File

@ -332,7 +332,7 @@ bool CalcCbTxMerkleRootQuorums(const CBlock& block, const CBlockIndex* pindexPre
} }
bool CheckCbTxBestChainlock(const CBlock& block, const CBlockIndex* pindex, bool CheckCbTxBestChainlock(const CBlock& block, const CBlockIndex* pindex,
const llmq::CChainLocksHandler& chainlock_handler, BlockValidationState& state, const bool check_clhdiff) const llmq::CChainLocksHandler& chainlock_handler, BlockValidationState& state)
{ {
if (block.vtx[0]->nType != TRANSACTION_COINBASE) { if (block.vtx[0]->nType != TRANSACTION_COINBASE) {
return true; return true;
@ -342,44 +342,43 @@ bool CheckCbTxBestChainlock(const CBlock& block, const CBlockIndex* pindex,
if (!opt_cbTx) { if (!opt_cbTx) {
return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cbtx-payload"); return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cbtx-payload");
} }
const auto& cbTx = *opt_cbTx;
if (opt_cbTx->nVersion < CCbTx::Version::CLSIG_AND_BALANCE) { if (cbTx.nVersion < CCbTx::Version::CLSIG_AND_BALANCE) {
return true; return true;
} }
auto best_clsig = chainlock_handler.GetBestChainLock(); auto best_clsig = chainlock_handler.GetBestChainLock();
if (best_clsig.getHeight() == pindex->nHeight - 1 && opt_cbTx->bestCLHeightDiff == 0 && opt_cbTx->bestCLSignature == best_clsig.getSig()) { if (best_clsig.getHeight() == pindex->nHeight - 1 && cbTx.bestCLHeightDiff == 0 && cbTx.bestCLSignature == best_clsig.getSig()) {
// matches our best clsig which still hold values for the previous block // matches our best clsig which still hold values for the previous block
return true; return true;
} }
if (check_clhdiff) { const auto prevBlockCoinbaseChainlock = GetNonNullCoinbaseChainlock(pindex->pprev);
auto prevBlockCoinbaseChainlock = GetNonNullCoinbaseChainlock(pindex->pprev); // If std::optional prevBlockCoinbaseChainlock is empty, then up to the previous block, coinbase Chainlock is null.
// If std::optional prevBlockCoinbaseChainlock is empty, then up to the previous block, coinbase Chainlock is null. if (prevBlockCoinbaseChainlock.has_value()) {
if (prevBlockCoinbaseChainlock.has_value()) { // Previous block Coinbase has a non-null Chainlock: current block's Chainlock must be non-null and at least as new as the previous one
// Previous block Coinbase has a non-null Chainlock: current block's Chainlock must be non-null and at least as new as the previous one if (!cbTx.bestCLSignature.IsValid()) {
if (!opt_cbTx->bestCLSignature.IsValid()) { // IsNull() doesn't exist for CBLSSignature: we assume that a non valid BLS sig is null
// IsNull() doesn't exist for CBLSSignature: we assume that a non valid BLS sig is null return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cbtx-null-clsig");
return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cbtx-null-clsig"); }
} if (cbTx.bestCLHeightDiff > prevBlockCoinbaseChainlock.value().second + 1) {
if (opt_cbTx->bestCLHeightDiff > prevBlockCoinbaseChainlock.value().second + 1) { return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cbtx-older-clsig");
return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cbtx-older-clsig");
}
} }
} }
// IsNull() doesn't exist for CBLSSignature: we assume that a valid BLS sig is non-null // IsNull() doesn't exist for CBLSSignature: we assume that a valid BLS sig is non-null
if (opt_cbTx->bestCLSignature.IsValid()) { if (cbTx.bestCLSignature.IsValid()) {
int curBlockCoinbaseCLHeight = pindex->nHeight - static_cast<int>(opt_cbTx->bestCLHeightDiff) - 1; int curBlockCoinbaseCLHeight = pindex->nHeight - static_cast<int>(cbTx.bestCLHeightDiff) - 1;
if (best_clsig.getHeight() == curBlockCoinbaseCLHeight && best_clsig.getSig() == opt_cbTx->bestCLSignature) { if (best_clsig.getHeight() == curBlockCoinbaseCLHeight && best_clsig.getSig() == cbTx.bestCLSignature) {
// matches our best (but outdated) clsig, no need to verify it again // matches our best (but outdated) clsig, no need to verify it again
return true; return true;
} }
uint256 curBlockCoinbaseCLBlockHash = pindex->GetAncestor(curBlockCoinbaseCLHeight)->GetBlockHash(); uint256 curBlockCoinbaseCLBlockHash = pindex->GetAncestor(curBlockCoinbaseCLHeight)->GetBlockHash();
if (chainlock_handler.VerifyChainLock(llmq::CChainLockSig(curBlockCoinbaseCLHeight, curBlockCoinbaseCLBlockHash, opt_cbTx->bestCLSignature)) != llmq::VerifyRecSigStatus::Valid) { if (chainlock_handler.VerifyChainLock(llmq::CChainLockSig(curBlockCoinbaseCLHeight, curBlockCoinbaseCLBlockHash, cbTx.bestCLSignature)) != llmq::VerifyRecSigStatus::Valid) {
return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cbtx-invalid-clsig"); return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cbtx-invalid-clsig");
} }
} else if (opt_cbTx->bestCLHeightDiff != 0) { } else if (cbTx.bestCLHeightDiff != 0) {
// Null bestCLSignature is allowed only with bestCLHeightDiff = 0 // Null bestCLSignature is allowed only with bestCLHeightDiff = 0
return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cbtx-cldiff"); return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-cbtx-cldiff");
} }

View File

@ -96,7 +96,7 @@ bool CalcCbTxMerkleRootQuorums(const CBlock& block, const CBlockIndex* pindexPre
BlockValidationState& state); BlockValidationState& state);
bool CheckCbTxBestChainlock(const CBlock& block, const CBlockIndex* pindexPrev, bool CheckCbTxBestChainlock(const CBlock& block, const CBlockIndex* pindexPrev,
const llmq::CChainLocksHandler& chainlock_handler, BlockValidationState& state, const bool check_clhdiff); const llmq::CChainLocksHandler& chainlock_handler, BlockValidationState& state);
bool CalcCbTxBestChainlock(const llmq::CChainLocksHandler& chainlock_handler, const CBlockIndex* pindexPrev, bool CalcCbTxBestChainlock(const llmq::CChainLocksHandler& chainlock_handler, const CBlockIndex* pindexPrev,
uint32_t& bestCLHeightDiff, CBLSSignature& bestCLSignature); uint32_t& bestCLHeightDiff, CBLSSignature& bestCLSignature);

View File

@ -188,7 +188,7 @@ bool CSpecialTxProcessor::ProcessSpecialTxsInBlock(const CBlock& block, const CB
nTimeMerkle += nTime5 - nTime4; nTimeMerkle += nTime5 - nTime4;
LogPrint(BCLog::BENCHMARK, " - CheckCbTxMerkleRoots: %.2fms [%.2fs]\n", 0.001 * (nTime5 - nTime4), nTimeMerkle * 0.000001); LogPrint(BCLog::BENCHMARK, " - CheckCbTxMerkleRoots: %.2fms [%.2fs]\n", 0.001 * (nTime5 - nTime4), nTimeMerkle * 0.000001);
if (fCheckCbTxMerkleRoots && !CheckCbTxBestChainlock(block, pindex, m_clhandler, state, DeploymentActiveAt(*pindex, m_consensus_params, Consensus::DEPLOYMENT_MN_RR))) { if (fCheckCbTxMerkleRoots && !CheckCbTxBestChainlock(block, pindex, m_clhandler, state)) {
// pass the state returned by the function above // pass the state returned by the function above
return false; return false;
} }

View File

@ -309,21 +309,23 @@ struct Peer {
/** /**
* (Bitcoin) Initializes a TxRelay struct for this peer. Can be called at most once for a peer. * (Bitcoin) Initializes a TxRelay struct for this peer. Can be called at most once for a peer.
* (Dash) Enables the flag that allows GetTxRelay() to return m_tx_relay */ * (Dash) Enables the flag that allows GetTxRelay() to return m_tx_relay */
TxRelay* SetTxRelay() TxRelay* SetTxRelay() LOCKS_EXCLUDED(m_tx_relay_mutex)
{ {
LOCK(m_tx_relay_mutex);
Assume(!m_can_tx_relay); Assume(!m_can_tx_relay);
m_can_tx_relay = true; m_can_tx_relay = true;
return WITH_LOCK(m_tx_relay_mutex, return m_tx_relay.get()); return m_tx_relay.get();
}; };
TxRelay* GetInvRelay() TxRelay* GetInvRelay() LOCKS_EXCLUDED(m_tx_relay_mutex)
{ {
return WITH_LOCK(m_tx_relay_mutex, return m_tx_relay.get()); return WITH_LOCK(m_tx_relay_mutex, return m_tx_relay.get());
} }
TxRelay* GetTxRelay() TxRelay* GetTxRelay() LOCKS_EXCLUDED(m_tx_relay_mutex)
{ {
return m_can_tx_relay ? WITH_LOCK(m_tx_relay_mutex, return m_tx_relay.get()) : nullptr; LOCK(m_tx_relay_mutex);
return m_can_tx_relay ? m_tx_relay.get() : nullptr;
}; };
/** A vector of addresses to send to the peer, limited to MAX_ADDR_TO_SEND. */ /** A vector of addresses to send to the peer, limited to MAX_ADDR_TO_SEND. */
@ -353,8 +355,6 @@ struct Peer {
* This field must correlate with whether m_addr_known has been * This field must correlate with whether m_addr_known has been
* initialized.*/ * initialized.*/
std::atomic_bool m_addr_relay_enabled{false}; std::atomic_bool m_addr_relay_enabled{false};
/** Whether a peer can relay transactions */
bool m_can_tx_relay{false};
/** Whether a getaddr request to this peer is outstanding. */ /** Whether a getaddr request to this peer is outstanding. */
bool m_getaddr_sent GUARDED_BY(NetEventsInterface::g_msgproc_mutex){false}; bool m_getaddr_sent GUARDED_BY(NetEventsInterface::g_msgproc_mutex){false};
/** Guards address sending timers. */ /** Guards address sending timers. */
@ -366,6 +366,15 @@ struct Peer {
/** Whether the peer has signaled support for receiving ADDRv2 (BIP155) /** Whether the peer has signaled support for receiving ADDRv2 (BIP155)
* messages, indicating a preference to receive ADDRv2 instead of ADDR ones. */ * messages, indicating a preference to receive ADDRv2 instead of ADDR ones. */
std::atomic_bool m_wants_addrv2{false}; std::atomic_bool m_wants_addrv2{false};
enum class WantsDSQ {
NONE, // Peer doesn't want DSQs
INV, // Peer will be notified of DSQs over Inventory System (see: DSQ_INV_VERSION)
ALL, // Peer will be notified of all DSQs, by simply sending them the DSQ
};
std::atomic<WantsDSQ> m_wants_dsq{WantsDSQ::NONE};
/** Whether this peer has already sent us a getaddr message. */ /** Whether this peer has already sent us a getaddr message. */
bool m_getaddr_recvd GUARDED_BY(NetEventsInterface::g_msgproc_mutex){false}; bool m_getaddr_recvd GUARDED_BY(NetEventsInterface::g_msgproc_mutex){false};
/** Number of addresses that can be processed from this peer. Start at 1 to /** Number of addresses that can be processed from this peer. Start at 1 to
@ -406,6 +415,8 @@ private:
* (non-transaction relay should use GetInvRelay(), which will provide * (non-transaction relay should use GetInvRelay(), which will provide
* unconditional access) */ * unconditional access) */
std::unique_ptr<TxRelay> m_tx_relay GUARDED_BY(m_tx_relay_mutex){std::make_unique<TxRelay>()}; std::unique_ptr<TxRelay> m_tx_relay GUARDED_BY(m_tx_relay_mutex){std::make_unique<TxRelay>()};
/** Whether a peer can relay transactions */
bool m_can_tx_relay GUARDED_BY(m_tx_relay_mutex) {false};
}; };
using PeerRef = std::shared_ptr<Peer>; using PeerRef = std::shared_ptr<Peer>;
@ -605,6 +616,7 @@ public:
void RelayInvFiltered(CInv &inv, const CTransaction &relatedTx, const int minProtoVersion) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex); void RelayInvFiltered(CInv &inv, const CTransaction &relatedTx, const int minProtoVersion) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void RelayInvFiltered(CInv &inv, const uint256 &relatedTxHash, const int minProtoVersion) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex); void RelayInvFiltered(CInv &inv, const uint256 &relatedTxHash, const int minProtoVersion) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void RelayTransaction(const uint256& txid) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex); void RelayTransaction(const uint256& txid) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void RelayDSQ(const CCoinJoinQueue& queue) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void SetBestHeight(int height) override { m_best_height = height; }; void SetBestHeight(int height) override { m_best_height = height; };
void Misbehaving(const NodeId pnode, const int howmuch, const std::string& message = "") override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex); void Misbehaving(const NodeId pnode, const int howmuch, const std::string& message = "") override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv, void ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv,
@ -2274,6 +2286,34 @@ void PeerManagerImpl::RelayInv(CInv &inv, const int minProtoVersion)
}); });
} }
void PeerManagerImpl::RelayDSQ(const CCoinJoinQueue& queue)
{
CInv inv{MSG_DSQ, queue.GetHash()};
std::vector<NodeId> nodes_send_all;
{
LOCK(m_peer_mutex);
for (const auto& [nodeid, peer] : m_peer_map) {
switch (peer->m_wants_dsq) {
case Peer::WantsDSQ::NONE:
break;
case Peer::WantsDSQ::INV:
PushInv(*peer, inv);
break;
case Peer::WantsDSQ::ALL:
nodes_send_all.push_back(nodeid);
break;
}
}
}
for (auto nodeId : nodes_send_all) {
m_connman.ForNode(nodeId, [&](CNode* pnode) -> bool {
CNetMsgMaker msgMaker(pnode->GetCommonVersion());
m_connman.PushMessage(pnode, msgMaker.Make(NetMsgType::DSQUEUE, queue));
return true;
});
}
}
void PeerManagerImpl::RelayInvFiltered(CInv &inv, const CTransaction& relatedTx, const int minProtoVersion) void PeerManagerImpl::RelayInvFiltered(CInv &inv, const CTransaction& relatedTx, const int minProtoVersion)
{ {
// TODO: Migrate to iteration through m_peer_map // TODO: Migrate to iteration through m_peer_map
@ -3938,7 +3978,13 @@ void PeerManagerImpl::ProcessMessage(
{ {
bool b; bool b;
vRecv >> b; vRecv >> b;
pfrom.fSendDSQueue = b; if (!b) {
peer->m_wants_dsq = Peer::WantsDSQ::NONE;
} else if (pfrom.GetCommonVersion() < DSQ_INV_VERSION) {
peer->m_wants_dsq = Peer::WantsDSQ::ALL;
} else {
peer->m_wants_dsq = Peer::WantsDSQ::INV;
}
return; return;
} }

View File

@ -16,6 +16,7 @@
class CActiveMasternodeManager; class CActiveMasternodeManager;
class AddrMan; class AddrMan;
class CTxMemPool; class CTxMemPool;
class CCoinJoinQueue;
class CDeterministicMNManager; class CDeterministicMNManager;
class CMasternodeMetaMan; class CMasternodeMetaMan;
class CMasternodeSync; class CMasternodeSync;
@ -93,6 +94,9 @@ public:
/** Broadcast inventory message to a specific peer. */ /** Broadcast inventory message to a specific peer. */
virtual void PushInventory(NodeId nodeid, const CInv& inv) = 0; virtual void PushInventory(NodeId nodeid, const CInv& inv) = 0;
/** Relay DSQ based on peer preference */
virtual void RelayDSQ(const CCoinJoinQueue& queue) = 0;
/** Relay inventories to all peers */ /** Relay inventories to all peers */
virtual void RelayInv(CInv &inv, const int minProtoVersion = MIN_PEER_PROTO_VERSION) = 0; virtual void RelayInv(CInv &inv, const int minProtoVersion = MIN_PEER_PROTO_VERSION) = 0;
virtual void RelayInvFiltered(CInv &inv, const CTransaction &relatedTx, virtual void RelayInvFiltered(CInv &inv, const CTransaction &relatedTx,

View File

@ -15,12 +15,12 @@ from io import BytesIO
from test_framework.messages import CBlock, CCbTx from test_framework.messages import CBlock, CCbTx
from test_framework.test_framework import DashTestFramework from test_framework.test_framework import DashTestFramework
from test_framework.util import assert_equal, assert_raises_rpc_error, force_finish_mnsync, softfork_active from test_framework.util import assert_equal, assert_raises_rpc_error, force_finish_mnsync
class LLMQChainLocksTest(DashTestFramework): class LLMQChainLocksTest(DashTestFramework):
def set_test_params(self): def set_test_params(self):
self.set_dash_test_params(5, 4, [["-testactivationheight=mn_rr@1100"]] * 5) self.set_dash_test_params(5, 4)
def run_test(self): def run_test(self):
# Connect all nodes to node1 so that we always have the whole network connected # Connect all nodes to node1 so that we always have the whole network connected
@ -31,8 +31,8 @@ class LLMQChainLocksTest(DashTestFramework):
self.test_coinbase_best_cl(self.nodes[0], expected_cl_in_cb=False) self.test_coinbase_best_cl(self.nodes[0], expected_cl_in_cb=False)
self.activate_v20(expected_activation_height=900) self.activate_mn_rr(expected_activation_height=900)
self.log.info("Activated v20 at height:" + str(self.nodes[0].getblockcount())) self.log.info("Activated MN_RR at height:" + str(self.nodes[0].getblockcount()))
# v20 is active for the next block, not for the tip # v20 is active for the next block, not for the tip
self.test_coinbase_best_cl(self.nodes[0], expected_cl_in_cb=False) self.test_coinbase_best_cl(self.nodes[0], expected_cl_in_cb=False)
@ -56,11 +56,10 @@ class LLMQChainLocksTest(DashTestFramework):
self.move_to_next_cycle() self.move_to_next_cycle()
self.log.info("Cycle H+2C height:" + str(self.nodes[0].getblockcount())) self.log.info("Cycle H+2C height:" + str(self.nodes[0].getblockcount()))
self.mine_cycle_quorum(llmq_type_name="llmq_test_dip0024", llmq_type=103) self.mine_cycle_quorum(llmq_type_name="llmq_test_dip0024", llmq_type=103)
self.log.info("Mine single block, wait for chainlock")
self.generate(self.nodes[0], 1, sync_fun=self.no_op)
self.wait_for_chainlocked_block_all_nodes(self.nodes[0].getbestblockhash()) self.wait_for_chainlocked_block_all_nodes(self.nodes[0].getbestblockhash())
self.log.info("Mine single block, ensure it includes latest chainlock")
self.generate(self.nodes[0], 1, sync_fun=self.sync_blocks)
self.test_coinbase_best_cl(self.nodes[0]) self.test_coinbase_best_cl(self.nodes[0])
# ChainLock locks all the blocks below it so nocl_block_hash should be locked too # ChainLock locks all the blocks below it so nocl_block_hash should be locked too
@ -243,14 +242,8 @@ class LLMQChainLocksTest(DashTestFramework):
assert_equal(tip_1['cbTx']['bestCLSignature'], tip_0['cbTx']['bestCLSignature']) assert_equal(tip_1['cbTx']['bestCLSignature'], tip_0['cbTx']['bestCLSignature'])
assert_equal(tip_1['cbTx']['bestCLHeightDiff'], tip_0['cbTx']['bestCLHeightDiff'] + 1) assert_equal(tip_1['cbTx']['bestCLHeightDiff'], tip_0['cbTx']['bestCLHeightDiff'] + 1)
self.log.info("Test that bestCLHeightDiff conditions are relaxed before mn_rr") self.log.info("Test bestCLHeightDiff restrictions")
self.test_bestCLHeightDiff(False) self.test_bestCLHeightDiff()
self.activate_mn_rr(expected_activation_height=1100)
self.log.info("Activated mn_rr at height:" + str(self.nodes[0].getblockcount()))
self.log.info("Test that bestCLHeightDiff conditions are stricter after mn_rr")
self.test_bestCLHeightDiff(True)
def create_chained_txs(self, node, amount): def create_chained_txs(self, node, amount):
txid = node.sendtoaddress(node.getnewaddress(), amount) txid = node.sendtoaddress(node.getnewaddress(), amount)
@ -293,11 +286,10 @@ class LLMQChainLocksTest(DashTestFramework):
else: else:
assert "bestCLHeightDiff" not in cbtx and "bestCLSignature" not in cbtx assert "bestCLHeightDiff" not in cbtx and "bestCLSignature" not in cbtx
def test_bestCLHeightDiff(self, mn_rr_active): def test_bestCLHeightDiff(self):
# We need 2 blocks we can grab clsigs from # We need 2 blocks we can grab clsigs from
for _ in range(2): for _ in range(2):
self.wait_for_chainlocked_block_all_nodes(self.generate(self.nodes[0], 1, sync_fun=self.no_op)[0]) self.wait_for_chainlocked_block_all_nodes(self.generate(self.nodes[0], 1, sync_fun=self.no_op)[0])
assert_equal(softfork_active(self.nodes[1], "mn_rr"), mn_rr_active)
tip1_hash = self.nodes[1].getbestblockhash() tip1_hash = self.nodes[1].getbestblockhash()
self.isolate_node(1) self.isolate_node(1)
@ -339,10 +331,10 @@ class LLMQChainLocksTest(DashTestFramework):
mal_block.hashMerkleRoot = mal_block.calc_merkle_root() mal_block.hashMerkleRoot = mal_block.calc_merkle_root()
mal_block.solve() mal_block.solve()
result = self.nodes[1].submitblock(mal_block.serialize().hex()) result = self.nodes[1].submitblock(mal_block.serialize().hex())
assert_equal(result, "bad-cbtx-older-clsig" if mn_rr_active else "bad-cbtx-invalid-clsig") assert_equal(result, "bad-cbtx-older-clsig")
assert_equal(self.nodes[1].getbestblockhash(), tip1_hash) assert_equal(self.nodes[1].getbestblockhash(), tip1_hash)
# Update the sig too and it should pass now when mn_rr is not active and fail otherwise # Update the sig too and it should fail
old_blockhash = self.nodes[1].getblockhash(self.nodes[1].getblockcount() - 1) old_blockhash = self.nodes[1].getblockhash(self.nodes[1].getblockcount() - 1)
cbtx.bestCLSignature = bytes.fromhex(self.nodes[1].getblock(old_blockhash, 2)["tx"][0]["cbTx"]["bestCLSignature"]) cbtx.bestCLSignature = bytes.fromhex(self.nodes[1].getblock(old_blockhash, 2)["tx"][0]["cbTx"]["bestCLSignature"])
mal_block.vtx[0].vExtraPayload = cbtx.serialize() mal_block.vtx[0].vExtraPayload = cbtx.serialize()
@ -350,12 +342,8 @@ class LLMQChainLocksTest(DashTestFramework):
mal_block.hashMerkleRoot = mal_block.calc_merkle_root() mal_block.hashMerkleRoot = mal_block.calc_merkle_root()
mal_block.solve() mal_block.solve()
result = self.nodes[1].submitblock(mal_block.serialize().hex()) result = self.nodes[1].submitblock(mal_block.serialize().hex())
if mn_rr_active: assert_equal(result, "bad-cbtx-older-clsig")
assert_equal(result, "bad-cbtx-older-clsig") assert_equal(self.nodes[1].getbestblockhash(), tip1_hash)
assert_equal(self.nodes[1].getbestblockhash(), tip1_hash)
else:
assert_equal(result, None)
assert not self.nodes[1].getbestblockhash() == tip1_hash
self.reconnect_isolated_node(1, 0) self.reconnect_isolated_node(1, 0)
self.sync_all() self.sync_all()