]> Git Repo - VerusCoin.git/blame - patches
Test
[VerusCoin.git] / patches
CommitLineData
21ecc387 1diff -crB ./configure.ac ../../komodo-jl777/configure.ac
2*** ./configure.ac 2017-01-03 10:40:50.155326332 +0000
3--- ../../komodo-jl777/configure.ac 2017-01-03 09:49:08.848505929 +0000
4***************
5*** 2,8 ****
6 AC_PREREQ([2.60])
7 define(_CLIENT_VERSION_MAJOR, 1)
8 define(_CLIENT_VERSION_MINOR, 0)
9! define(_CLIENT_VERSION_REVISION, 0)
10 define(_CLIENT_VERSION_BUILD, 50)
11 define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50)))
12 define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1)))
13--- 2,8 ----
14 AC_PREREQ([2.60])
15 define(_CLIENT_VERSION_MAJOR, 1)
16 define(_CLIENT_VERSION_MINOR, 0)
17! define(_CLIENT_VERSION_REVISION, 3)
18 define(_CLIENT_VERSION_BUILD, 50)
19 define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50)))
20 define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1)))
21Only in ../../komodo-jl777/contrib: bitcoin-cli.bash-completion
22diff -crB ./contrib/bitcoind.bash-completion ../../komodo-jl777/contrib/bitcoind.bash-completion
23*** ./contrib/bitcoind.bash-completion 2017-01-03 10:40:50.159326534 +0000
24--- ../../komodo-jl777/contrib/bitcoind.bash-completion 2017-01-03 09:49:08.848505929 +0000
25***************
26*** 1,102 ****
27! # bash programmable completion for bitcoind(1) and bitcoin-cli(1)
28! # Copyright (c) 2012,2014 Christian von Roques <[email protected]>
29 # Distributed under the MIT software license, see the accompanying
30 # file COPYING or http://www.opensource.org/licenses/mit-license.php.
31
32! have bitcoind && {
33!
34! # call $bitcoind for RPC
35! _bitcoin_rpc() {
36! # determine already specified args necessary for RPC
37! local rpcargs=()
38! for i in ${COMP_LINE}; do
39! case "$i" in
40! -conf=*|-proxy*|-rpc*)
41! rpcargs=( "${rpcargs[@]}" "$i" )
42! ;;
43! esac
44! done
45! $bitcoind "${rpcargs[@]}" "$@"
46! }
47!
48! # Add bitcoin accounts to COMPREPLY
49! _bitcoin_accounts() {
50! local accounts
51! accounts=$(_bitcoin_rpc listaccounts | awk '/".*"/ { a=$1; gsub(/"/, "", a); print a}')
52! COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "$accounts" -- "$cur" ) )
53! }
54!
55! _bitcoind() {
56 local cur prev words=() cword
57 local bitcoind
58
59! # save and use original argument to invoke bitcoind
60! # bitcoind might not be in $PATH
61 bitcoind="$1"
62
63 COMPREPLY=()
64 _get_comp_words_by_ref -n = cur prev words cword
65
66- if ((cword > 4)); then
67- case ${words[cword-4]} in
68- listtransactions)
69- COMPREPLY=( $( compgen -W "true false" -- "$cur" ) )
70- return 0
71- ;;
72- signrawtransaction)
73- COMPREPLY=( $( compgen -W "ALL NONE SINGLE ALL|ANYONECANPAY NONE|ANYONECANPAY SINGLE|ANYONECANPAY" -- "$cur" ) )
74- return 0
75- ;;
76- esac
77- fi
78-
79- if ((cword > 3)); then
80- case ${words[cword-3]} in
81- addmultisigaddress)
82- _bitcoin_accounts
83- return 0
84- ;;
85- getbalance|gettxout|importaddress|importprivkey|listreceivedbyaccount|listreceivedbyaddress|listsinceblock)
86- COMPREPLY=( $( compgen -W "true false" -- "$cur" ) )
87- return 0
88- ;;
89- esac
90- fi
91-
92- if ((cword > 2)); then
93- case ${words[cword-2]} in
94- addnode)
95- COMPREPLY=( $( compgen -W "add remove onetry" -- "$cur" ) )
96- return 0
97- ;;
98- getblock|getrawtransaction|gettransaction|listaccounts|listreceivedbyaccount|listreceivedbyaddress|sendrawtransaction)
99- COMPREPLY=( $( compgen -W "true false" -- "$cur" ) )
100- return 0
101- ;;
102- move|setaccount)
103- _bitcoin_accounts
104- return 0
105- ;;
106- esac
107- fi
108-
109- case "$prev" in
110- backupwallet|dumpwallet|importwallet)
111- _filedir
112- return 0
113- ;;
114- getmempool|lockunspent|setgenerate)
115- COMPREPLY=( $( compgen -W "true false" -- "$cur" ) )
116- return 0
117- ;;
118- getaccountaddress|getaddressesbyaccount|getbalance|getnewaddress|getreceivedbyaccount|listtransactions|move|sendfrom|sendmany)
119- _bitcoin_accounts
120- return 0
121- ;;
122- esac
123-
124 case "$cur" in
125! -conf=*|-pid=*|-loadblock=*|-wallet=*|-rpcsslcertificatechainfile=*|-rpcsslprivatekeyfile=*)
126 cur="${cur#*=}"
127 _filedir
128 return 0
129--- 1,21 ----
130! # bash programmable completion for bitcoind(1) and bitcoin-qt(1)
131! # Copyright (c) 2012-2016 The Bitcoin Core developers
132 # Distributed under the MIT software license, see the accompanying
133 # file COPYING or http://www.opensource.org/licenses/mit-license.php.
134
135! _zcashd() {
136 local cur prev words=() cword
137 local bitcoind
138
139! # save and use original argument to invoke bitcoind for -help
140! # it might not be in $PATH
141 bitcoind="$1"
142
143 COMPREPLY=()
144 _get_comp_words_by_ref -n = cur prev words cword
145
146 case "$cur" in
147! -conf=*|-pid=*|-loadblock=*|-rootcertificates=*|-rpccookiefile=*|-wallet=*|-rpcsslcertificatechainfile=*|-rpcsslprivatekeyfile=*)
148 cur="${cur#*=}"
149 _filedir
150 return 0
151***************
152*** 110,129 ****
153 return 0
154 ;;
155 *)
156- local helpopts commands
157
158! # only parse --help if senseful
159 if [[ -z "$cur" || "$cur" =~ ^- ]]; then
160! helpopts=$($bitcoind --help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' )
161 fi
162
163- # only parse help if senseful
164- if [[ -z "$cur" || "$cur" =~ ^[a-z] ]]; then
165- commands=$(_bitcoin_rpc help 2>/dev/null | awk '$1 ~ /^[a-z]/ { print $1; }')
166- fi
167-
168- COMPREPLY=( $( compgen -W "$helpopts $commands" -- "$cur" ) )
169-
170 # Prevent space if an argument is desired
171 if [[ $COMPREPLY == *= ]]; then
172 compopt -o nospace
173--- 29,42 ----
174 return 0
175 ;;
176 *)
177
178! # only parse -help if senseful
179 if [[ -z "$cur" || "$cur" =~ ^- ]]; then
180! local helpopts
181! helpopts=$($bitcoind -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' )
182! COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) )
183 fi
184
185 # Prevent space if an argument is desired
186 if [[ $COMPREPLY == *= ]]; then
187 compopt -o nospace
188***************
189*** 131,140 ****
190 return 0
191 ;;
192 esac
193! }
194!
195! complete -F _bitcoind bitcoind bitcoin-cli
196! }
197
198 # Local variables:
199 # mode: shell-script
200--- 44,51 ----
201 return 0
202 ;;
203 esac
204! } &&
205! complete -F _zcashd zcashd
206
207 # Local variables:
208 # mode: shell-script
209Only in ../../komodo-jl777/contrib: bitcoin-tx.bash-completion
210diff -crB ./contrib/DEBIAN/changelog ../../komodo-jl777/contrib/DEBIAN/changelog
211*** ./contrib/DEBIAN/changelog 2017-01-03 10:40:50.155326332 +0000
212--- ../../komodo-jl777/contrib/DEBIAN/changelog 2017-01-03 09:49:08.848505929 +0000
213***************
214*** 1,3 ****
215--- 1,21 ----
216+ zcash (1.0.3) jessie; urgency=medium
217+
218+ * 1.0.3 release.
219+
220+ -- Zcash Company <[email protected]> Wed, 17 Nov 2016 15:56:00 -0700
221+
222+ zcash (1.0.2) jessie; urgency=medium
223+
224+ * 1.0.2 release.
225+
226+ -- Zcash Company <[email protected]> Mon, 07 Nov 2016 19:01:35 -0600
227+
228+ zcash (1.0.1) jessie; urgency=medium
229+
230+ * 1.0.1 release.
231+
232+ -- Zcash Company <[email protected]> Thu, 03 Nov 2016 23:21:09 -0500
233+
234 zcash (1.0.0-sprout) jessie; urgency=medium
235
236 * 1.0.0 release.
237diff -crB ./contrib/DEBIAN/control ../../komodo-jl777/contrib/DEBIAN/control
238*** ./contrib/DEBIAN/control 2017-01-03 10:40:50.155326332 +0000
239--- ../../komodo-jl777/contrib/DEBIAN/control 2017-01-03 09:49:08.848505929 +0000
240***************
241*** 10,16 ****
242 Vcs-Git: https://github.com/zcash/zcash.git
243 Vcs-Browser: https://github.com/zcash/zcash
244 Package: zcash
245! Version: 1.0.0-sprout
246 Architecture: amd64
247 Depends: libgomp1
248 Description: An implementation of the "Zerocash" protocol.
249--- 10,16 ----
250 Vcs-Git: https://github.com/zcash/zcash.git
251 Vcs-Browser: https://github.com/zcash/zcash
252 Package: zcash
253! Version: 1.0.3
254 Architecture: amd64
255 Depends: libgomp1
256 Description: An implementation of the "Zerocash" protocol.
257diff -crB ./contrib/DEBIAN/manpages/zcash-cli.1 ../../komodo-jl777/contrib/DEBIAN/manpages/zcash-cli.1
258*** ./contrib/DEBIAN/manpages/zcash-cli.1 2017-01-03 10:40:50.155326332 +0000
259--- ../../komodo-jl777/contrib/DEBIAN/manpages/zcash-cli.1 2017-01-03 09:49:08.848505929 +0000
260***************
261*** 1,9 ****
262 .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3.
263! .TH ZCASH-CLI "1" "October 2016" "Zcash RPC client version v1.0.0-409dcb7" "User Commands"
264 .SH NAME
265 zcash-cli \- RPC client for the Zcash daemon
266 .SH DESCRIPTION
267! Zcash RPC client version v1.0.0
268 .SS "Usage:"
269 .TP
270 zcash\-cli [options] <command> [params]
271--- 1,9 ----
272 .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3.
273! .TH ZCASH-CLI "1" "November 2016" "Zcash RPC client version v1.0.3" "User Commands"
274 .SH NAME
275 zcash-cli \- RPC client for the Zcash daemon
276 .SH DESCRIPTION
277! Zcash RPC client version v1.0.3
278 .SS "Usage:"
279 .TP
280 zcash\-cli [options] <command> [params]
281diff -crB ./contrib/DEBIAN/manpages/zcashd.1 ../../komodo-jl777/contrib/DEBIAN/manpages/zcashd.1
282*** ./contrib/DEBIAN/manpages/zcashd.1 2017-01-03 10:40:50.155326332 +0000
283--- ../../komodo-jl777/contrib/DEBIAN/manpages/zcashd.1 2017-01-03 09:49:08.848505929 +0000
284***************
285*** 1,9 ****
286 .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3.
287! .TH ZCASHD "1" "October 2016" "Zcash Daemon version v1.0.0-409dcb7" "User Commands"
288 .SH NAME
289 zcashd \- Network daemon for interacting with the Zcash blockchain
290 .SH DESCRIPTION
291! Zcash Daemon version v1.0.0
292 .SS "Usage:"
293 .TP
294 zcashd [options]
295--- 1,9 ----
296 .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3.
297! .TH ZCASHD "1" "November 2016" "Zcash Daemon version v1.0.3" "User Commands"
298 .SH NAME
299 zcashd \- Network daemon for interacting with the Zcash blockchain
300 .SH DESCRIPTION
301! Zcash Daemon version v1.0.3
302 .SS "Usage:"
303 .TP
304 zcashd [options]
305***************
306*** 62,68 ****
307 .HP
308 \fB\-par=\fR<n>
309 .IP
310! Set the number of script verification threads (\fB\-4\fR to 16, 0 = auto, <0 =
311 leave that many cores free, default: 0)
312 .HP
313 \fB\-pid=\fR<file>
314--- 62,68 ----
315 .HP
316 \fB\-par=\fR<n>
317 .IP
318! Set the number of script verification threads (\fB\-8\fR to 16, 0 = auto, <0 =
319 leave that many cores free, default: 0)
320 .HP
321 \fB\-pid=\fR<file>
322diff -crB ./contrib/gitian-descriptors/gitian-linux.yml ../../komodo-jl777/contrib/gitian-descriptors/gitian-linux.yml
323*** ./contrib/gitian-descriptors/gitian-linux.yml 2017-01-03 10:40:50.159326534 +0000
324--- ../../komodo-jl777/contrib/gitian-descriptors/gitian-linux.yml 2017-01-03 09:49:08.848505929 +0000
325***************
326*** 1,5 ****
327 ---
328! name: "zcash-1.0.0"
329 enable_cache: true
330 distro: "debian"
331 suites:
332--- 1,5 ----
333 ---
334! name: "zcash-1.0.3"
335 enable_cache: true
336 distro: "debian"
337 suites:
338diff -crB ./depends/packages/miniupnpc.mk ../../komodo-jl777/depends/packages/miniupnpc.mk
339*** ./depends/packages/miniupnpc.mk 2017-01-03 10:40:50.179327547 +0000
340--- ../../komodo-jl777/depends/packages/miniupnpc.mk 2017-01-03 09:49:08.848505929 +0000
341***************
342*** 3,8 ****
343--- 3,9 ----
344 $(package)_download_path=http://miniupnp.free.fr/files
345 $(package)_file_name=$(package)-$($(package)_version).tar.gz
346 $(package)_sha256_hash=d434ceb8986efbe199c5ca53f90ed53eab290b1e6d0530b717eb6fa49d61f93b
347+ $(package)_patches=fix-solaris-compilation.patch strlen-before-memcmp.patch patch-strlen-patch.patch
348
349 define $(package)_set_vars
350 $(package)_build_opts=CC="$($(package)_cc)"
351***************
352*** 14,20 ****
353 define $(package)_preprocess_cmds
354 mkdir dll && \
355 sed -e 's|MINIUPNPC_VERSION_STRING \"version\"|MINIUPNPC_VERSION_STRING \"$($(package)_version)\"|' -e 's|OS/version|$(host)|' miniupnpcstrings.h.in > miniupnpcstrings.h && \
356! sed -i.old "s|miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings|miniupnpcstrings.h: miniupnpcstrings.h.in|" Makefile.mingw
357 endef
358
359 define $(package)_build_cmds
360--- 15,24 ----
361 define $(package)_preprocess_cmds
362 mkdir dll && \
363 sed -e 's|MINIUPNPC_VERSION_STRING \"version\"|MINIUPNPC_VERSION_STRING \"$($(package)_version)\"|' -e 's|OS/version|$(host)|' miniupnpcstrings.h.in > miniupnpcstrings.h && \
364! sed -i.old "s|miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings|miniupnpcstrings.h: miniupnpcstrings.h.in|" Makefile.mingw && \
365! patch -p2 < $($(package)_patch_dir)/fix-solaris-compilation.patch && \
366! patch -p2 < $($(package)_patch_dir)/strlen-before-memcmp.patch && \
367! patch -p2 < $($(package)_patch_dir)/patch-strlen-patch.patch
368 endef
369
370 define $(package)_build_cmds
371Only in ../../komodo-jl777/depends/patches: miniupnpc
372Only in ../../komodo-jl777/doc: authors.md
373diff -crB ./doc/developer-notes.md ../../komodo-jl777/doc/developer-notes.md
374*** ./doc/developer-notes.md 2017-01-03 10:40:50.191328153 +0000
375--- ../../komodo-jl777/doc/developer-notes.md 2017-01-03 09:49:08.848505929 +0000
376***************
377*** 102,108 ****
378 If the code is behaving strangely, take a look in the debug.log file in the data directory;
379 error and debugging messages are written there.
380
381! The -debug=... command-line option controls debugging; running with just -debug will turn
382 on all categories (and give you a very large debug.log file).
383
384 The Qt code routes qDebug() output to debug.log under category "qt": run with -debug=qt
385--- 102,108 ----
386 If the code is behaving strangely, take a look in the debug.log file in the data directory;
387 error and debugging messages are written there.
388
389! The -debug=... command-line option controls debugging; running with just -debug or -debug=1 will turn
390 on all categories (and give you a very large debug.log file).
391
392 The Qt code routes qDebug() output to debug.log under category "qt": run with -debug=qt
393diff -crB ./doc/payment-api.md ../../komodo-jl777/doc/payment-api.md
394*** ./doc/payment-api.md 2017-01-03 10:40:50.191328153 +0000
395--- ../../komodo-jl777/doc/payment-api.md 2017-01-03 09:49:08.848505929 +0000
396***************
397*** 29,35 ****
398 RPC calls by category:
399
400 * Accounting: z_getbalance, z_gettotalbalance
401! * Addresses : z_getnewaddress, z_listaddresses
402 * Keys : z_exportkey, z_importkey, z_exportwallet, z_importwallet
403 * Operation: z_getoperationresult, z_getoperationstatus, z_listoperationids
404 * Payment : z_listreceivedbyaddress, z_sendmany
405--- 29,35 ----
406 RPC calls by category:
407
408 * Accounting: z_getbalance, z_gettotalbalance
409! * Addresses : z_getnewaddress, z_listaddresses, z_validateaddress
410 * Keys : z_exportkey, z_importkey, z_exportwallet, z_importwallet
411 * Operation: z_getoperationresult, z_getoperationstatus, z_listoperationids
412 * Payment : z_listreceivedbyaddress, z_sendmany
413***************
414*** 55,60 ****
415--- 55,61 ----
416 --- | --- | ---
417 z_getnewaddress | | Return a new zaddr for sending and receiving payments. The spending key for this zaddr will be added to the node’s wallet.<br><br>Output:<br>zN68D8hSs3...
418 z_listaddresses | | Returns a list of all the zaddrs in this node’s wallet for which you have a spending key.<br><br>Output:<br>{ [“z123…”, “z456...”, “z789...”] }
419+ z_validateaddress | | Return information about a given zaddr.<br><br>Output:<br>{"isvalid" : true,<br>"address" : "zcWsmq...",<br>"payingkey" : "f5bb3c...",<br>"transmissionkey" : "7a58c7...",<br>"ismine" : true}
420
421 ### Key Management
422
423***************
424*** 70,76 ****
425 Command | Parameters | Description
426 --- | --- | ---
427 z_listreceivedbyaddress<br> | zaddr [minconf=1] | Return a list of amounts received by a zaddr belonging to the node’s wallet.<br><br>Optionally set the minimum number of confirmations which a received amount must have in order to be included in the result. Use 0 to count unconfirmed transactions.<br><br>Output:<br>[{<br>“txid”: “4a0f…”,<br>“amount”: 0.54,<br>“memo”:”F0FF…”,}, {...}, {...}<br>]
428! z_sendmany<br> | fromaddress amounts [minconf=1] | _This is an Asynchronous RPC call_<br><br>Send funds from an address to multiple outputs. The address can be either a taddr or a zaddr.<br><br>Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay. Each output address can be in taddr or zaddr format.<br><br>When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.<br><br>**NOTE:**When sending coinbase funds to a zaddr, the node's wallet does not allow any change. Put another way, spending a partial amount of a coinbase utxo is not allowed. This is not a consensus rule but a local wallet rule due to the current implementation of z_sendmany. In future, this rule may be removed.<br><br>Example of Outputs parameter:<br>[{“address”:”t123…”, “amount”:0.005},<br>,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]<br><br>Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input.<br><br>The transaction fee will be determined by the node’s wallet. Any transparent change will be sent to a new transparent address. Any private change will be sent back to the zaddr being used as the source of funds.<br><br>Returns an operationid. You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid.
429
430 ### Operations
431
432--- 71,77 ----
433 Command | Parameters | Description
434 --- | --- | ---
435 z_listreceivedbyaddress<br> | zaddr [minconf=1] | Return a list of amounts received by a zaddr belonging to the node’s wallet.<br><br>Optionally set the minimum number of confirmations which a received amount must have in order to be included in the result. Use 0 to count unconfirmed transactions.<br><br>Output:<br>[{<br>“txid”: “4a0f…”,<br>“amount”: 0.54,<br>“memo”:”F0FF…”,}, {...}, {...}<br>]
436! z_sendmany<br> | fromaddress amounts [minconf=1] [fee=0.0001] | _This is an Asynchronous RPC call_<br><br>Send funds from an address to multiple outputs. The address can be either a taddr or a zaddr.<br><br>Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay. Each output address can be in taddr or zaddr format.<br><br>When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.<br><br>**NOTE:**When sending coinbase funds to a zaddr, the node's wallet does not allow any change. Put another way, spending a partial amount of a coinbase utxo is not allowed. This is not a consensus rule but a local wallet rule due to the current implementation of z_sendmany. In future, this rule may be removed.<br><br>Example of Outputs parameter:<br>[{“address”:”t123…”, “amount”:0.005},<br>,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]<br><br>Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input.<br><br>Optionally set a transaction fee, which by default is 0.0001 ZEC.<br><br>Any transparent change will be sent to a new transparent address. Any private change will be sent back to the zaddr being used as the source of funds.<br><br>Returns an operationid. You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid.
437
438 ### Operations
439
440***************
441*** 97,99 ****
442--- 98,168 ----
443 z_getoperationresult <br>| [operationids] | Return OperationStatus JSON objects for all completed operations the node is currently aware of, and then remove the operation from memory.<br><br>Operationids is an optional array to filter which operations you want to receive status objects for.<br><br>Output is a list of operation status objects, where the status is either "failed", "cancelled" or "success".<br>[<br>{“operationid”: “opid-11ee…”,<br>“status”: “cancelled”},<br>{“operationid”: “opid-9876”, “status”: ”failed”},<br>{“operationid”: “opid-0e0e”,<br>“status”:”success”,<br>“execution_time”:”25”,<br>“result”: {“txid”:”af3887654…”,...}<br>},<br>]
444 z_getoperationstatus <br>| [operationids] | Return OperationStatus JSON objects for all operations the node is currently aware of.<br><br>Operationids is an optional array to filter which operations you want to receive status objects for.<br><br>Output is a list of operation status objects.<br>[<br>{“operationid”: “opid-12ee…”,<br>“status”: “queued”},<br>{“operationid”: “opd-098a…”, “status”: ”executing”},<br>{“operationid”: “opid-9876”, “status”: ”failed”}<br>]<br><br>When the operation succeeds, the status object will also include the result.<br><br>{“operationid”: “opid-0e0e”,<br>“status”:”success”,<br>“execution_time”:”25”,<br>“result”: {“txid”:”af3887654…”,...}<br>}
445 z_listoperationids <br>| [state] | Return a list of operationids for all operations which the node is currently aware of.<br><br>State is an optional string parameter to filter the operations you want listed by their state. Acceptable parameter values are ‘queued’, ‘executing’, ‘success’, ‘failed’, ‘cancelled’.<br><br>[“opid-0e0e…”, “opid-1af4…”, … ]
446+
447+ ## Asynchronous RPC call Error Codes
448+
449+ Zcash error codes are defined in https://github.com/zcash/zcash/blob/master/src/rpcprotocol.h
450+
451+ ### z_sendmany error codes
452+
453+ RPC_INVALID_PARAMETER (-8) | _Invalid, missing or duplicate parameter_
454+ ---------------------------| -------------------------------------------------
455+ "Minconf cannot be negative" | Cannot accept negative minimum confirmation number.
456+ "Minimum number of confirmations cannot be less than 0" | Cannot accept negative minimum confirmation number.
457+ "From address parameter missing" | Missing an address to send funds from.
458+ "No recipients" | Missing recipient addresses.
459+ "Memo must be in hexadecimal format" | Encrypted memo field data must be in hexadecimal format.
460+ "Memo size of __ is too big, maximum allowed is __ " | Encrypted memo field data exceeds maximum size of 512 bytes.
461+ "From address does not belong to this node, zaddr spending key not found." | Sender address spending key not found.
462+ "Invalid parameter, expected object" | Expected object.
463+ "Invalid parameter, unknown key: __" | Unknown key.
464+ "Invalid parameter, expected valid size" | Invalid size.
465+ "Invalid parameter, expected hex txid" | Invalid txid.
466+ "Invalid parameter, vout must be positive" | Invalid vout.
467+ "Invalid parameter, duplicated address" | Address is duplicated.
468+ "Invalid parameter, amounts array is empty" | Amounts array is empty.
469+ "Invalid parameter, unknown key" | Key not found.
470+ "Invalid parameter, unknown address format" | Unknown address format.
471+ "Invalid parameter, size of memo" | Invalid memo field size.
472+ "Invalid parameter, amount must be positive" | Invalid or negative amount.
473+ "Invalid parameter, too many zaddr outputs" | z_address outputs exceed maximum allowed.
474+ "Invalid parameter, expected memo data in hexadecimal format" | Encrypted memo field is not in hexadecimal format.
475+ "Invalid parameter, size of memo is larger than maximum allowed __ " | Encrypted memo field data exceeds maximum size of 512 bytes.
476+
477+
478+ RPC_INVALID_ADDRESS_OR_KEY (-5) | _Invalid address or key_
479+ --------------------------------| ---------------------------
480+ "Invalid from address, no spending key found for zaddr" | z_address spending key not found.
481+ "Invalid output address, not a valid taddr." | Transparent output address is invalid.
482+ "Invalid from address, should be a taddr or zaddr." | Sender address is invalid.
483+ "From address does not belong to this node, zaddr spending key not found." | Sender address spending key not found.
484+
485+
486+ RPC_WALLET_INSUFFICIENT_FUNDS (-6) | _Not enough funds in wallet or account_
487+ -----------------------------------| ------------------------------------------
488+ "Insufficient funds, no UTXOs found for taddr from address." | Insufficient funds for sending address.
489+ "Could not find any non-coinbase UTXOs to spend. Coinbase UTXOs can only be sent to a single zaddr recipient." | Must send Coinbase UTXO to a single z_address.
490+ "Could not find any non-coinbase UTXOs to spend." | No available non-coinbase UTXOs.
491+ "Insufficient funds, no unspent notes found for zaddr from address." | Insufficient funds for sending address.
492+ "Insufficient transparent funds, have __, need __ plus fee __" | Insufficient funds from transparent address.
493+ "Insufficient protected funds, have __, need __ plus fee __" | Insufficient funds from shielded address.
494+
495+ RPC_WALLET_ERROR (-4) | _Unspecified problem with wallet_
496+ ----------------------| -------------------------------------
497+ "Could not find previous JoinSplit anchor" | Try restarting node with `-reindex`.
498+ "Error decrypting output note of previous JoinSplit: __" |
499+ "Could not find witness for note commitment" | Try restarting node with `-reindex`.
500+ "Witness for note commitment is null" | Missing witness for note commitement.
501+ "Witness for spendable note does not have same anchor as change input" | Invalid anchor for spendable note witness.
502+ "Not enough funds to pay miners fee" | Retry with sufficient funds.
503+ "Missing hex data for raw transaction" | Raw transaction data is null.
504+ "Missing hex data for signed transaction" | Hex value for signed transaction is null.
505+ "Send raw transaction did not return an error or a txid." |
506+
507+ RPC_WALLET_ENCRYPTION_FAILED (-16) | _Failed to encrypt the wallet_
508+ -------------------------------------------------------------------------| -------------------------------------
509+ "Failed to sign transaction" | Transaction was not signed, sign transaction and retry.
510+
511+ RPC_WALLET_KEYPOOL_RAN_OUT (-12) | _Keypool ran out, call keypoolrefill first_
512+ -------------------------------------------------------------------------| -----------------------------------------------
513+ "Could not generate a taddr to use as a change address" | Call keypoolrefill and retry.
514diff -crB ./doc/release-notes/release-notes-0.11.2.z6.md ../../komodo-jl777/doc/release-notes/release-notes-0.11.2.z6.md
515*** ./doc/release-notes/release-notes-0.11.2.z6.md 2017-01-03 10:40:50.191328153 +0000
516--- ../../komodo-jl777/doc/release-notes/release-notes-0.11.2.z6.md 2017-01-03 09:49:08.848505929 +0000
517***************
518*** 1,19 ****
519! Jack Grigg:
520 Equihash: Only compare the first n/(k+1) bits when sorting.
521 Randomise the nonce in the block header.
522 Clear mempool before using it for benchmark test, fix parameter name.
523 Fix memory leak in large tx benchmark.
524
525! Sean Bowe:
526 Increase block size to 2MB and update performance test.
527 Make sigop limit `20000` just as in Bitcoin, ignoring our change to the blocksize limit.
528 Remove the mainnet checkpoints.
529 Fix performance test for block verification.
530 Make `validatelargetx` test more accurate.
531
532! Taylor Hornby:
533 Add example mock test of CheckTransaction.
534
535! aniemerg:
536 Suppress Libsnark Debugging Info.
537-
538--- 1,18 ----
539! Jack Grigg (4):
540 Equihash: Only compare the first n/(k+1) bits when sorting.
541 Randomise the nonce in the block header.
542 Clear mempool before using it for benchmark test, fix parameter name.
543 Fix memory leak in large tx benchmark.
544
545! Sean Bowe (5):
546 Increase block size to 2MB and update performance test.
547 Make sigop limit `20000` just as in Bitcoin, ignoring our change to the blocksize limit.
548 Remove the mainnet checkpoints.
549 Fix performance test for block verification.
550 Make `validatelargetx` test more accurate.
551
552! Taylor Hornby (1):
553 Add example mock test of CheckTransaction.
554
555! aniemerg (1):
556 Suppress Libsnark Debugging Info.
557diff -crB ./doc/release-notes/release-notes-0.11.2.z9.md ../../komodo-jl777/doc/release-notes/release-notes-0.11.2.z9.md
558*** ./doc/release-notes/release-notes-0.11.2.z9.md 2017-01-03 10:40:50.191328153 +0000
559--- ../../komodo-jl777/doc/release-notes/release-notes-0.11.2.z9.md 2017-01-03 09:49:08.848505929 +0000
560***************
561*** 1,5 ****
562!
563! Sean Bowe:
564 Change memo field size and relocate `ciphertexts` field of JoinSplit description.
565 Implement zkSNARK compression.
566 Perform curve parameter initialization at start of gtest suite.
567--- 1,4 ----
568! Sean Bowe (6):
569 Change memo field size and relocate `ciphertexts` field of JoinSplit description.
570 Implement zkSNARK compression.
571 Perform curve parameter initialization at start of gtest suite.
572***************
573*** 7,13 ****
574 Enable MONTGOMERY_OUTPUT everywhere.
575 Update proving/verifying keys.
576
577! Jack Grigg:
578 Add support for spending keys to the basic key store.
579 Merge AddSpendingKeyPaymentAddress into AddSpendingKey to simplify API.
580 Add methods for byte array expansion and compression.
581--- 6,12 ----
582 Enable MONTGOMERY_OUTPUT everywhere.
583 Update proving/verifying keys.
584
585! Jack Grigg (11):
586 Add support for spending keys to the basic key store.
587 Merge AddSpendingKeyPaymentAddress into AddSpendingKey to simplify API.
588 Add methods for byte array expansion and compression.
589***************
590*** 20,26 ****
591 Add separate lock for SpendingKey key store operations.
592 Test conversion between solution indices and minimal representation.
593
594! Daira Hopwood:
595 Move bigint arithmetic implementations to libsnark.
596 Add mostly-static checks on consistency of Equihash parameters, MAX_HEADERS_RESULTS, and MAX_PROTOCOL_MESSAGE_LENGTH.
597 Change some asserts in equihash.cpp to be static.
598--- 19,25 ----
599 Add separate lock for SpendingKey key store operations.
600 Test conversion between solution indices and minimal representation.
601
602! Daira Hopwood (6):
603 Move bigint arithmetic implementations to libsnark.
604 Add mostly-static checks on consistency of Equihash parameters, MAX_HEADERS_RESULTS, and MAX_PROTOCOL_MESSAGE_LENGTH.
605 Change some asserts in equihash.cpp to be static.
606***************
607*** 28,57 ****
608 Increment version numbers for z9 release.
609 Add these release notes for z9.
610
611! Taylor Hornby:
612 Disable hardening when building for coverage reports.
613 Upgrade libsodium for AVX2-detection bugfix.
614 Fix inconsistent optimization flags; single source of truth.
615 Add -fwrapv -fno-strict-aliasing; fix libzcash flags.
616 Use libsodium's s < L check, instead checking that libsodium checks that.
617
618! Simon Liu:
619 Fixes #1193 so that during verification benchmarking it does not unncessarily create thousands of CTransaction objects.
620 Closes #701 by adding documentation about the Payment RPC interface.
621 Add note about zkey and encrypted wallets.
622
623! Gaurav Rana:
624 Update zcash-cli stop message.
625
626! Tom Ritter:
627 Clarify comment about nonce space for Note Encryption.
628
629! Robert C. Seacord:
630 Memory safety and correctness fixes found in NCC audit.
631
632! Patrick Strateman (merged by Taylor Hornby):
633 Pull in some DoS mitigations from upstream. (#1258)
634
635! Wladimir J. van der Laan:
636 net: correctly initialize nMinPingUsecTime.
637-
638--- 27,55 ----
639 Increment version numbers for z9 release.
640 Add these release notes for z9.
641
642! Taylor Hornby (5):
643 Disable hardening when building for coverage reports.
644 Upgrade libsodium for AVX2-detection bugfix.
645 Fix inconsistent optimization flags; single source of truth.
646 Add -fwrapv -fno-strict-aliasing; fix libzcash flags.
647 Use libsodium's s < L check, instead checking that libsodium checks that.
648
649! Simon Liu (3):
650 Fixes #1193 so that during verification benchmarking it does not unncessarily create thousands of CTransaction objects.
651 Closes #701 by adding documentation about the Payment RPC interface.
652 Add note about zkey and encrypted wallets.
653
654! Gaurav Rana (1):
655 Update zcash-cli stop message.
656
657! Tom Ritter (1):
658 Clarify comment about nonce space for Note Encryption.
659
660! Robert C. Seacord (1):
661 Memory safety and correctness fixes found in NCC audit.
662
663! Patrick Strateman (1):
664 Pull in some DoS mitigations from upstream. (#1258)
665
666! Wladimir J. van der Laan (1):
667 net: correctly initialize nMinPingUsecTime.
668Only in ../../komodo-jl777/doc/release-notes: release-notes-1.0.1.md
669Only in ../../komodo-jl777/doc/release-notes: release-notes-1.0.2.md
670Only in ../../komodo-jl777/doc/release-notes: release-notes-1.0.3.md
671diff -crB ./doc/release-process.md ../../komodo-jl777/doc/release-process.md
672*** ./doc/release-process.md 2017-01-03 10:40:50.191328153 +0000
673--- ../../komodo-jl777/doc/release-process.md 2017-01-03 09:49:08.848505929 +0000
674***************
675*** 38,43 ****
676--- 38,45 ----
677 contrib/DEBIAN/control
678 contrib/gitian-descriptors/gitian-linux.yml
679
680+ Build and commit to update versions, and then perform the following commands:
681+
682 help2man -n "RPC client for the Zcash daemon" src/zcash-cli > contrib/DEBIAN/manpages/zcash-cli.1
683 help2man -n "Network daemon for interacting with the Zcash blockchain" src/zcashd > contrib/DEBIAN/manpages/zcashd.1
684
685***************
686*** 57,66 ****
687
688 ### B2. Write release notes
689
690! git shortlog helps a lot, for example:
691
692! $ git shortlog --no-merges v${ZCASH_RELEASE_PREV}..HEAD \
693! > ./doc/release-notes/release-notes-${ZCASH_RELEASE}.md
694
695 Update the Debian package changelog:
696
697--- 59,67 ----
698
699 ### B2. Write release notes
700
701! Run the release-notes.py script to generate release notes and update authors.md file. For example:
702
703! $ python zcutil/release-notes.py --version $ZCASH_RELEASE
704
705 Update the Debian package changelog:
706
707diff -crB ./doc/security-warnings.md ../../komodo-jl777/doc/security-warnings.md
708*** ./doc/security-warnings.md 2017-01-03 10:40:50.191328153 +0000
709--- ../../komodo-jl777/doc/security-warnings.md 2017-01-03 09:49:08.848505929 +0000
710***************
711*** 35,44 ****
712 from the earlier issue).
713
714 - We were concerned about the resistance of the algorithm used to derive wallet
715! encryption keys (inherited from Bitcoin) to dictionary attacks by a powerful
716! attacker. If and when we re-enable wallet encryption, it is likely to be with
717! a modern passphrase-based key derivation algorithm designed for greater
718! resistance to dictionary attack, such as Argon2i.
719
720 You should use full-disk encryption (or encryption of your home directory) to
721 protect your wallet at rest, and should assume (even unprivileged) users who are
722--- 35,44 ----
723 from the earlier issue).
724
725 - We were concerned about the resistance of the algorithm used to derive wallet
726! encryption keys (inherited from [Bitcoin](https://bitcoin.org/en/secure-your-wallet))
727! to dictionary attacks by a powerful attacker. If and when we re-enable wallet
728! encryption, it is likely to be with a modern passphrase-based key derivation
729! algorithm designed for greater resistance to dictionary attack, such as Argon2i.
730
731 You should use full-disk encryption (or encryption of your home directory) to
732 protect your wallet at rest, and should assume (even unprivileged) users who are
733diff -crB ./doc/tor.md ../../komodo-jl777/doc/tor.md
734*** ./doc/tor.md 2017-01-03 10:40:50.191328153 +0000
735--- ../../komodo-jl777/doc/tor.md 2017-01-03 09:49:08.848505929 +0000
736***************
737*** 18,24 ****
738 -proxy=ip:port Set the proxy server. If SOCKS5 is selected (default), this proxy
739 server will be used to try to reach .onion addresses as well.
740
741! -onion=ip:port Set the proxy server to use for tor hidden services. You do not
742 need to set this if it's the same as -proxy. You can use -noonion
743 to explicitly disable access to hidden service.
744
745--- 18,24 ----
746 -proxy=ip:port Set the proxy server. If SOCKS5 is selected (default), this proxy
747 server will be used to try to reach .onion addresses as well.
748
749! -onion=ip:port Set the proxy server to use for Tor hidden services. You do not
750 need to set this if it's the same as -proxy. You can use -noonion
751 to explicitly disable access to hidden service.
752
753diff -crB ./Dockerfile ../../komodo-jl777/Dockerfile
754*** ./Dockerfile 2017-01-03 10:40:50.151326129 +0000
755--- ../../komodo-jl777/Dockerfile 2017-01-03 09:49:08.848505929 +0000
756***************
757*** 1,15 ****
758! FROM ubuntu:16.04
759! MAINTAINER Mihail Fedorov <[email protected]>
760!
761! # All the stuff
762! # And clean out packages, keep space minimal
763! RUN apt-get -y update && \
764! apt-get -y upgrade && \
765! apt-get -y install build-essential pkg-config libc6-dev m4 g++-multilib autoconf libtool ncurses-dev \
766! unzip python zlib1g-dev wget bsdmainutils automake libboost-all-dev libssl-dev libprotobuf-dev \
767! protobuf-compiler libqt4-dev libqrencode-dev libdb++-dev software-properties-common libcurl4-openssl-dev && \
768! apt-get clean && \
769! rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
770
771 ADD ./ /komodo
772 ENV HOME /komodo
773--- 1,5 ----
774! FROM kolobus/ubuntu:komodo
775! MAINTAINER Mihail Fedorov <[email protected]>
776
777 ADD ./ /komodo
778 ENV HOME /komodo
779***************
780*** 19,25 ****
781 RUN cd /komodo && \
782 ./autogen.sh && \
783 ./configure --with-incompatible-bdb --with-gui || true && \
784! ./zcutil/build.sh -j4
785
786 # Unknown stuff goes here
787
788--- 9,15 ----
789 RUN cd /komodo && \
790 ./autogen.sh && \
791 ./configure --with-incompatible-bdb --with-gui || true && \
792! ./zcutil/build.sh -j$(nproc)
793
794 # Unknown stuff goes here
795
796diff -crB ./.git/config ../../komodo-jl777/.git/config
797*** ./.git/config 2017-01-03 10:40:50.131325117 +0000
798--- ../../komodo-jl777/.git/config 2017-01-03 09:49:08.884507813 +0000
799***************
800*** 4,11 ****
801 bare = false
802 logallrefupdates = true
803 [remote "origin"]
804! url = https://github.com/j-cimb-barker/komodo.git
805 fetch = +refs/heads/*:refs/remotes/origin/*
806 [branch "master"]
807 remote = origin
808 merge = refs/heads/master
809--- 4,14 ----
810 bare = false
811 logallrefupdates = true
812 [remote "origin"]
813! url = https://github.com/jl777/komodo.git
814 fetch = +refs/heads/*:refs/remotes/origin/*
815 [branch "master"]
816 remote = origin
817 merge = refs/heads/master
818+ [branch "dev"]
819+ remote = origin
820+ merge = refs/heads/dev
821diff -crB ./.git/HEAD ../../komodo-jl777/.git/HEAD
822*** ./.git/HEAD 2017-01-03 10:40:50.131325117 +0000
823--- ../../komodo-jl777/.git/HEAD 2017-01-03 09:49:08.884507813 +0000
824***************
825*** 1 ****
826! ref: refs/heads/master
827--- 1 ----
828! ref: refs/heads/dev
829Binary files ./.git/index and ../../komodo-jl777/.git/index differ
830diff -crB ./.git/logs/HEAD ../../komodo-jl777/.git/logs/HEAD
831*** ./.git/logs/HEAD 2017-01-03 10:40:50.131325117 +0000
832--- ../../komodo-jl777/.git/logs/HEAD 2017-01-03 09:49:08.884507813 +0000
833***************
834*** 1 ****
835! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483440050 +0000 clone: from https://github.com/j-cimb-barker/komodo.git
836--- 1,2 ----
837! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483436901 +0000 clone: from https://github.com/jl777/komodo.git
838! d03fbd981fce86504b78d2a9582e4da988d59823 26ac06c4f5a6b4dc3163b36a1e5d24bfa7eccbd2 joel <joel@abigail> 1483436948 +0000 checkout: moving from master to dev
839Only in ../../komodo-jl777/.git/logs/refs/heads: dev
840diff -crB ./.git/logs/refs/heads/master ../../komodo-jl777/.git/logs/refs/heads/master
841*** ./.git/logs/refs/heads/master 2017-01-03 10:40:50.131325117 +0000
842--- ../../komodo-jl777/.git/logs/refs/heads/master 2017-01-03 09:48:21.598032424 +0000
843***************
844*** 1 ****
845! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483440050 +0000 clone: from https://github.com/j-cimb-barker/komodo.git
846--- 1 ----
847! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483436901 +0000 clone: from https://github.com/jl777/komodo.git
848diff -crB ./.git/logs/refs/remotes/origin/HEAD ../../komodo-jl777/.git/logs/refs/remotes/origin/HEAD
849*** ./.git/logs/refs/remotes/origin/HEAD 2017-01-03 10:40:50.131325117 +0000
850--- ../../komodo-jl777/.git/logs/refs/remotes/origin/HEAD 2017-01-03 09:48:21.598032424 +0000
851***************
852*** 1 ****
853! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483440050 +0000 clone: from https://github.com/j-cimb-barker/komodo.git
854--- 1 ----
855! 0000000000000000000000000000000000000000 d03fbd981fce86504b78d2a9582e4da988d59823 joel <joel@abigail> 1483436901 +0000 clone: from https://github.com/jl777/komodo.git
856Only in ./.git/objects/pack: pack-12e7bdf654b29f95604673fb1b3ee01a9bd52369.idx
857Only in ./.git/objects/pack: pack-12e7bdf654b29f95604673fb1b3ee01a9bd52369.pack
858Only in ../../komodo-jl777/.git/objects/pack: pack-3d08e40e89111c75a81ccd6099e05e09fd0e0f08.idx
859Only in ../../komodo-jl777/.git/objects/pack: pack-3d08e40e89111c75a81ccd6099e05e09fd0e0f08.pack
860diff -crB ./.git/packed-refs ../../komodo-jl777/.git/packed-refs
861*** ./.git/packed-refs 2017-01-03 10:40:50.131325117 +0000
862--- ../../komodo-jl777/.git/packed-refs 2017-01-03 09:48:21.598032424 +0000
863***************
864*** 2,10 ****
865 fcd361184f09fe17546698b0d13caddac5b63500 refs/remotes/origin/PoS
866 730a5006cbbfb0607ed93067db1a74d57584eb1f refs/remotes/origin/acspeed
867 80259d4b4f193c7c438f3c057ce70af3beb1a099 refs/remotes/origin/auto
868! 060c9a92939c62bbedb5fe560bf8ef6856e2b8f1 refs/remotes/origin/beta
869 ba9104dd7e9b6ba2b68ad352253ac8f3298092f4 refs/remotes/origin/dPoW
870! cb42e5518262235ed4e4dbff43179e0308114d6a refs/remotes/origin/dev
871 76b6eacf41395ddd2badd5d5dc3352e603c59df2 refs/remotes/origin/kolo
872 bb40eb8b043a1e63c3dc3b1c2e4d0f6e67e771d4 refs/remotes/origin/kolo-dev
873 d03fbd981fce86504b78d2a9582e4da988d59823 refs/remotes/origin/master
874--- 2,10 ----
875 fcd361184f09fe17546698b0d13caddac5b63500 refs/remotes/origin/PoS
876 730a5006cbbfb0607ed93067db1a74d57584eb1f refs/remotes/origin/acspeed
877 80259d4b4f193c7c438f3c057ce70af3beb1a099 refs/remotes/origin/auto
878! f6f296f1acf8c2b177451ed0c9f8660f3a80ec3d refs/remotes/origin/beta
879 ba9104dd7e9b6ba2b68ad352253ac8f3298092f4 refs/remotes/origin/dPoW
880! 26ac06c4f5a6b4dc3163b36a1e5d24bfa7eccbd2 refs/remotes/origin/dev
881 76b6eacf41395ddd2badd5d5dc3352e603c59df2 refs/remotes/origin/kolo
882 bb40eb8b043a1e63c3dc3b1c2e4d0f6e67e771d4 refs/remotes/origin/kolo-dev
883 d03fbd981fce86504b78d2a9582e4da988d59823 refs/remotes/origin/master
884Only in ../../komodo-jl777/.git/refs/heads: dev
885diff -crB ./.gitignore ../../komodo-jl777/.gitignore
886*** ./.gitignore 2017-01-03 10:40:50.151326129 +0000
887--- ../../komodo-jl777/.gitignore 2017-01-03 09:49:08.848505929 +0000
888***************
889*** 65,70 ****
890--- 65,71 ----
891 *.a
892 *.pb.cc
893 *.pb.h
894+ .vscode
895
896 *.log
897 *.trs
898diff -crB ./Makefile.am ../../komodo-jl777/Makefile.am
899*** ./Makefile.am 2017-01-03 10:40:50.151326129 +0000
900--- ../../komodo-jl777/Makefile.am 2017-01-03 09:49:08.848505929 +0000
901***************
902*** 258,267 ****
903 @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) 2>&1
904 endif
905
906! dist_noinst_SCRIPTS = autogen.sh
907
908 EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.sh qa/pull-tester/run-bitcoin-cli qa/rpc-tests qa/zcash $(DIST_DOCS) $(BIN_CHECKS)
909
910 CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER)
911
912 .INTERMEDIATE: $(COVERAGE_INFO)
913--- 258,271 ----
914 @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) 2>&1
915 endif
916
917! dist_bin_SCRIPTS = zcutil/fetch-params.sh
918! dist_noinst_SCRIPTS = autogen.sh zcutil/build-debian-package.sh zcutil/build.sh
919
920 EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.sh qa/pull-tester/run-bitcoin-cli qa/rpc-tests qa/zcash $(DIST_DOCS) $(BIN_CHECKS)
921
922+ install-exec-hook:
923+ mv $(DESTDIR)$(bindir)/fetch-params.sh $(DESTDIR)$(bindir)/zcash-fetch-params
924+
925 CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER)
926
927 .INTERMEDIATE: $(COVERAGE_INFO)
928Only in .: patches
929diff -crB ./qa/pull-tester/rpc-tests.sh ../../komodo-jl777/qa/pull-tester/rpc-tests.sh
930*** ./qa/pull-tester/rpc-tests.sh 2017-01-03 10:40:50.195328356 +0000
931--- ../../komodo-jl777/qa/pull-tester/rpc-tests.sh 2017-01-03 09:49:08.848505929 +0000
932***************
933*** 11,16 ****
934--- 11,17 ----
935 #Run the tests
936
937 testScripts=(
938+ 'wallet_treestate.py'
939 'wallet_protectcoinbase.py'
940 'wallet.py'
941 'wallet_nullifiers.py'
942diff -crB ./qa/rpc-tests/httpbasics.py ../../komodo-jl777/qa/rpc-tests/httpbasics.py
943*** ./qa/rpc-tests/httpbasics.py 2017-01-03 10:40:50.195328356 +0000
944--- ../../komodo-jl777/qa/rpc-tests/httpbasics.py 2017-01-03 09:49:08.856506348 +0000
945***************
946*** 38,50 ****
947 conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
948 out1 = conn.getresponse().read();
949 assert_equal('"error":null' in out1, True)
950! assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
951!
952! #send 2nd request without closing connection
953! conn.request('POST', '/', '{"method": "getchaintips"}', headers)
954! out2 = conn.getresponse().read();
955! assert_equal('"error":null' in out1, True) #must also response with a correct json-rpc message
956! assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
957 conn.close()
958
959 #same should be if we add keep-alive because this should be the std. behaviour
960--- 38,46 ----
961 conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
962 out1 = conn.getresponse().read();
963 assert_equal('"error":null' in out1, True)
964!
965! # TODO #1856: Re-enable support for persistent connections.
966! assert_equal(conn.sock!=None, False)
967 conn.close()
968
969 #same should be if we add keep-alive because this should be the std. behaviour
970***************
971*** 55,67 ****
972 conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
973 out1 = conn.getresponse().read();
974 assert_equal('"error":null' in out1, True)
975! assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
976!
977! #send 2nd request without closing connection
978! conn.request('POST', '/', '{"method": "getchaintips"}', headers)
979! out2 = conn.getresponse().read();
980! assert_equal('"error":null' in out1, True) #must also response with a correct json-rpc message
981! assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
982 conn.close()
983
984 #now do the same with "Connection: close"
985--- 51,59 ----
986 conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
987 out1 = conn.getresponse().read();
988 assert_equal('"error":null' in out1, True)
989!
990! # TODO #1856: Re-enable support for persistent connections.
991! assert_equal(conn.sock!=None, False)
992 conn.close()
993
994 #now do the same with "Connection: close"
995***************
996*** 96,102 ****
997 conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
998 out1 = conn.getresponse().read();
999 assert_equal('"error":null' in out1, True)
1000! assert_equal(conn.sock!=None, True) #connection must be closed because bitcoind should use keep-alive by default
1001
1002 if __name__ == '__main__':
1003 HTTPBasicsTest ().main ()
1004--- 88,97 ----
1005 conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
1006 out1 = conn.getresponse().read();
1007 assert_equal('"error":null' in out1, True)
1008!
1009! # TODO #1856: Re-enable support for persistent connections.
1010! assert_equal(conn.sock!=None, False)
1011! conn.close()
1012
1013 if __name__ == '__main__':
1014 HTTPBasicsTest ().main ()
1015diff -crB ./qa/rpc-tests/wallet_protectcoinbase.py ../../komodo-jl777/qa/rpc-tests/wallet_protectcoinbase.py
1016*** ./qa/rpc-tests/wallet_protectcoinbase.py 2017-01-03 10:40:50.199328558 +0000
1017--- ../../komodo-jl777/qa/rpc-tests/wallet_protectcoinbase.py 2017-01-03 09:49:08.856506348 +0000
1018***************
1019*** 8,14 ****
1020 from test_framework.util import *
1021 from time import *
1022
1023! class Wallet2Test (BitcoinTestFramework):
1024
1025 def setup_chain(self):
1026 print("Initializing test directory "+self.options.tmpdir)
1027--- 8,14 ----
1028 from test_framework.util import *
1029 from time import *
1030
1031! class WalletProtectCoinbaseTest (BitcoinTestFramework):
1032
1033 def setup_chain(self):
1034 print("Initializing test directory "+self.options.tmpdir)
1035***************
1036*** 23,43 ****
1037 self.is_network_split=False
1038 self.sync_all()
1039
1040! def wait_for_operationd_success(self, myopid):
1041 print('waiting for async operation {}'.format(myopid))
1042 opids = []
1043 opids.append(myopid)
1044! timeout = 120
1045 status = None
1046 for x in xrange(1, timeout):
1047 results = self.nodes[0].z_getoperationresult(opids)
1048 if len(results)==0:
1049 sleep(1)
1050 else:
1051 status = results[0]["status"]
1052 break
1053 print('...returned status: {}'.format(status))
1054! assert_equal("success", status)
1055
1056 def run_test (self):
1057 print "Mining blocks..."
1058--- 23,55 ----
1059 self.is_network_split=False
1060 self.sync_all()
1061
1062! # Returns txid if operation was a success or None
1063! def wait_and_assert_operationid_status(self, myopid, in_status='success', in_errormsg=None):
1064 print('waiting for async operation {}'.format(myopid))
1065 opids = []
1066 opids.append(myopid)
1067! timeout = 300
1068 status = None
1069+ errormsg = None
1070+ txid = None
1071 for x in xrange(1, timeout):
1072 results = self.nodes[0].z_getoperationresult(opids)
1073 if len(results)==0:
1074 sleep(1)
1075 else:
1076 status = results[0]["status"]
1077+ if status == "failed":
1078+ errormsg = results[0]['error']['message']
1079+ elif status == "success":
1080+ txid = results[0]['result']['txid']
1081 break
1082 print('...returned status: {}'.format(status))
1083! assert_equal(in_status, status)
1084! if errormsg is not None:
1085! assert(in_errormsg is not None)
1086! assert_equal(in_errormsg in errormsg, True)
1087! print('...returned error: {}'.format(errormsg))
1088! return txid
1089
1090 def run_test (self):
1091 print "Mining blocks..."
1092***************
1093*** 94,100 ****
1094 recipients = []
1095 recipients.append({"address":myzaddr, "amount": Decimal('20.0') - Decimal('0.0001')})
1096 myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
1097! self.wait_for_operationd_success(myopid)
1098 self.sync_all()
1099 self.nodes[1].generate(1)
1100 self.sync_all()
1101--- 106,112 ----
1102 recipients = []
1103 recipients.append({"address":myzaddr, "amount": Decimal('20.0') - Decimal('0.0001')})
1104 myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
1105! self.wait_and_assert_operationid_status(myopid)
1106 self.sync_all()
1107 self.nodes[1].generate(1)
1108 self.sync_all()
1109***************
1110*** 109,116 ****
1111 recipients = []
1112 recipients.append({"address":mytaddr, "amount":Decimal('10.0')})
1113 myopid = self.nodes[0].z_sendmany(myzaddr, recipients)
1114! self.wait_for_operationd_success(myopid)
1115 self.sync_all()
1116 self.nodes[1].generate(1)
1117 self.sync_all()
1118
1119--- 121,134 ----
1120 recipients = []
1121 recipients.append({"address":mytaddr, "amount":Decimal('10.0')})
1122 myopid = self.nodes[0].z_sendmany(myzaddr, recipients)
1123! mytxid = self.wait_and_assert_operationid_status(myopid)
1124! assert(mytxid is not None)
1125 self.sync_all()
1126+
1127+ # check that priority of the tx sending from a zaddr is not 0
1128+ mempool = self.nodes[0].getrawmempool(True)
1129+ assert(Decimal(mempool[mytxid]['startingpriority']) >= Decimal('1000000000000'))
1130+
1131 self.nodes[1].generate(1)
1132 self.sync_all()
1133
1134***************
1135*** 120,125 ****
1136--- 138,152 ----
1137 assert_equal(Decimal(resp["private"]), Decimal('9.9998'))
1138 assert_equal(Decimal(resp["total"]), Decimal('39.9998'))
1139
1140+ # z_sendmany will return an error if there is transparent change output considered dust.
1141+ # UTXO selection in z_sendmany sorts in ascending order, so smallest utxos are consumed first.
1142+ # At this point in time, unspent notes all have a value of 10.0 and standard z_sendmany fee is 0.0001.
1143+ recipients = []
1144+ amount = Decimal('10.0') - Decimal('0.00010000') - Decimal('0.00000001') # this leaves change at 1 zatoshi less than dust threshold
1145+ recipients.append({"address":self.nodes[0].getnewaddress(), "amount":amount })
1146+ myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
1147+ self.wait_and_assert_operationid_status(myopid, "failed", "Insufficient transparent funds, have 10.00, need 0.00000545 more to avoid creating invalid change output 0.00000001 (dust threshold is 0.00000546)")
1148+
1149 # Send will fail because send amount is too big, even when including coinbase utxos
1150 errorString = ""
1151 try:
1152***************
1153*** 128,133 ****
1154--- 155,168 ----
1155 errorString = e.error['message']
1156 assert_equal("Insufficient funds" in errorString, True)
1157
1158+ # z_sendmany will fail because of insufficient funds
1159+ recipients = []
1160+ recipients.append({"address":self.nodes[1].getnewaddress(), "amount":Decimal('10000.0')})
1161+ myopid = self.nodes[0].z_sendmany(mytaddr, recipients)
1162+ self.wait_and_assert_operationid_status(myopid, "failed", "Insufficient transparent funds, have 10.00, need 10000.0001")
1163+ myopid = self.nodes[0].z_sendmany(myzaddr, recipients)
1164+ self.wait_and_assert_operationid_status(myopid, "failed", "Insufficient protected funds, have 9.9998, need 10000.0001")
1165+
1166 # Send will fail because of insufficient funds unless sender uses coinbase utxos
1167 try:
1168 self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 21)
1169***************
1170*** 135,140 ****
1171--- 170,227 ----
1172 errorString = e.error['message']
1173 assert_equal("Insufficient funds, coinbase funds can only be spent after they have been sent to a zaddr" in errorString, True)
1174
1175+ # Verify that mempools accept tx with joinsplits which have at least the default z_sendmany fee.
1176+ # If this test passes, it confirms that issue #1851 has been resolved, where sending from
1177+ # a zaddr to 1385 taddr recipients fails because the default fee was considered too low
1178+ # given the tx size, resulting in mempool rejection.
1179+ errorString = ''
1180+ recipients = []
1181+ num_t_recipients = 2500
1182+ amount_per_recipient = Decimal('0.00000546') # dust threshold
1183+ # Note that regtest chainparams does not require standard tx, so setting the amount to be
1184+ # less than the dust threshold, e.g. 0.00000001 will not result in mempool rejection.
1185+ for i in xrange(0,num_t_recipients):
1186+ newtaddr = self.nodes[2].getnewaddress()
1187+ recipients.append({"address":newtaddr, "amount":amount_per_recipient})
1188+ myopid = self.nodes[0].z_sendmany(myzaddr, recipients)
1189+ try:
1190+ self.wait_and_assert_operationid_status(myopid)
1191+ except JSONRPCException as e:
1192+ print("JSONRPC error: "+e.error['message'])
1193+ assert(False)
1194+ except Exception as e:
1195+ print("Unexpected exception caught during testing: "+str(sys.exc_info()[0]))
1196+ assert(False)
1197+
1198+ self.sync_all()
1199+ self.nodes[1].generate(1)
1200+ self.sync_all()
1201+
1202+ # check balance
1203+ node2balance = amount_per_recipient * num_t_recipients
1204+ assert_equal(self.nodes[2].getbalance(), node2balance)
1205+
1206+ # Send will fail because fee is negative
1207+ try:
1208+ self.nodes[0].z_sendmany(myzaddr, recipients, 1, -1)
1209+ except JSONRPCException,e:
1210+ errorString = e.error['message']
1211+ assert_equal("Invalid amount" in errorString, True)
1212+
1213+ # Send will fail because fee is larger than MAX_MONEY
1214+ try:
1215+ self.nodes[0].z_sendmany(myzaddr, recipients, 1, Decimal('21000000.00000001'))
1216+ except JSONRPCException,e:
1217+ errorString = e.error['message']
1218+ assert_equal("Invalid amount" in errorString, True)
1219+
1220+ # Send will fail because fee is larger than sum of outputs
1221+ try:
1222+ self.nodes[0].z_sendmany(myzaddr, recipients, 1, (amount_per_recipient * num_t_recipients) + Decimal('0.00000001'))
1223+ except JSONRPCException,e:
1224+ errorString = e.error['message']
1225+ assert_equal("is greater than the sum of outputs" in errorString, True)
1226+
1227 # Send will succeed because the balance of non-coinbase utxos is 10.0
1228 try:
1229 self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 9)
1230***************
1231*** 146,152 ****
1232 self.sync_all()
1233
1234 # check balance
1235! assert_equal(self.nodes[2].getbalance(), 9)
1236
1237 if __name__ == '__main__':
1238! Wallet2Test ().main ()
1239--- 233,263 ----
1240 self.sync_all()
1241
1242 # check balance
1243! node2balance = node2balance + 9
1244! assert_equal(self.nodes[2].getbalance(), node2balance)
1245!
1246! # Check that chained joinsplits in a single tx are created successfully.
1247! recipients = []
1248! num_recipients = 3
1249! amount_per_recipient = Decimal('0.002')
1250! minconf = 1
1251! send_amount = num_recipients * amount_per_recipient
1252! custom_fee = Decimal('0.00012345')
1253! zbalance = self.nodes[0].z_getbalance(myzaddr)
1254! for i in xrange(0,num_recipients):
1255! newzaddr = self.nodes[2].z_getnewaddress()
1256! recipients.append({"address":newzaddr, "amount":amount_per_recipient})
1257! myopid = self.nodes[0].z_sendmany(myzaddr, recipients, minconf, custom_fee)
1258! self.wait_and_assert_operationid_status(myopid)
1259! self.sync_all()
1260! self.nodes[1].generate(1)
1261! self.sync_all()
1262!
1263! # check balances
1264! resp = self.nodes[2].z_gettotalbalance()
1265! assert_equal(Decimal(resp["private"]), send_amount)
1266! resp = self.nodes[0].z_getbalance(myzaddr)
1267! assert_equal(Decimal(resp), zbalance - custom_fee - send_amount)
1268
1269 if __name__ == '__main__':
1270! WalletProtectCoinbaseTest().main()
1271diff -crB ./qa/rpc-tests/wallet.py ../../komodo-jl777/qa/rpc-tests/wallet.py
1272*** ./qa/rpc-tests/wallet.py 2017-01-03 10:40:50.199328558 +0000
1273--- ../../komodo-jl777/qa/rpc-tests/wallet.py 2017-01-03 09:49:08.856506348 +0000
1274***************
1275*** 244,249 ****
1276--- 244,295 ----
1277 myvjoinsplits = mytxdetails["vjoinsplit"]
1278 assert_equal(0, len(myvjoinsplits))
1279
1280+ # z_sendmany is expected to fail if tx size breaks limit
1281+ myzaddr = self.nodes[0].z_getnewaddress()
1282+
1283+ recipients = []
1284+ num_t_recipients = 3000
1285+ amount_per_recipient = Decimal('0.00000001')
1286+ errorString = ''
1287+ for i in xrange(0,num_t_recipients):
1288+ newtaddr = self.nodes[2].getnewaddress()
1289+ recipients.append({"address":newtaddr, "amount":amount_per_recipient})
1290+ try:
1291+ self.nodes[0].z_sendmany(myzaddr, recipients)
1292+ except JSONRPCException,e:
1293+ errorString = e.error['message']
1294+ assert("Too many outputs, size of raw transaction" in errorString)
1295+
1296+ recipients = []
1297+ num_t_recipients = 2000
1298+ num_z_recipients = 50
1299+ amount_per_recipient = Decimal('0.00000001')
1300+ errorString = ''
1301+ for i in xrange(0,num_t_recipients):
1302+ newtaddr = self.nodes[2].getnewaddress()
1303+ recipients.append({"address":newtaddr, "amount":amount_per_recipient})
1304+ for i in xrange(0,num_z_recipients):
1305+ newzaddr = self.nodes[2].z_getnewaddress()
1306+ recipients.append({"address":newzaddr, "amount":amount_per_recipient})
1307+ try:
1308+ self.nodes[0].z_sendmany(myzaddr, recipients)
1309+ except JSONRPCException,e:
1310+ errorString = e.error['message']
1311+ assert("size of raw transaction would be larger than limit" in errorString)
1312+
1313+ recipients = []
1314+ num_z_recipients = 100
1315+ amount_per_recipient = Decimal('0.00000001')
1316+ errorString = ''
1317+ for i in xrange(0,num_z_recipients):
1318+ newzaddr = self.nodes[2].z_getnewaddress()
1319+ recipients.append({"address":newzaddr, "amount":amount_per_recipient})
1320+ try:
1321+ self.nodes[0].z_sendmany(myzaddr, recipients)
1322+ except JSONRPCException,e:
1323+ errorString = e.error['message']
1324+ assert("Invalid parameter, too many zaddr outputs" in errorString)
1325+
1326 # add zaddr to node 2
1327 myzaddr = self.nodes[2].z_getnewaddress()
1328
1329Only in ../../komodo-jl777/qa/rpc-tests: wallet_treestate.py
1330diff -crB ./qa/rpc-tests/zcjoinsplit.py ../../komodo-jl777/qa/rpc-tests/zcjoinsplit.py
1331*** ./qa/rpc-tests/zcjoinsplit.py 2017-01-03 10:40:50.203328760 +0000
1332--- ../../komodo-jl777/qa/rpc-tests/zcjoinsplit.py 2017-01-03 09:49:08.856506348 +0000
1333***************
1334*** 36,41 ****
1335--- 36,49 ----
1336 receive_result = self.nodes[0].zcrawreceive(zcsecretkey, joinsplit_result["encryptednote1"])
1337 assert_equal(receive_result["exists"], True)
1338
1339+ # The pure joinsplit we create should be mined in the next block
1340+ # despite other transactions being in the mempool.
1341+ addrtest = self.nodes[0].getnewaddress()
1342+ for xx in range(0,10):
1343+ self.nodes[0].generate(1)
1344+ for x in range(0,50):
1345+ self.nodes[0].sendtoaddress(addrtest, 0.01);
1346+
1347 joinsplit_tx = self.nodes[0].createrawtransaction([], {})
1348 joinsplit_result = self.nodes[0].zcrawjoinsplit(joinsplit_tx, {receive_result["note"] : zcsecretkey}, {zcaddress: 39.8}, 0, 0.1)
1349
1350diff -crB ./qa/zcash/performance-measurements.sh ../../komodo-jl777/qa/zcash/performance-measurements.sh
1351*** ./qa/zcash/performance-measurements.sh 2017-01-03 10:40:50.203328760 +0000
1352--- ../../komodo-jl777/qa/zcash/performance-measurements.sh 2017-01-03 09:49:08.856506348 +0000
1353***************
1354*** 88,93 ****
1355--- 88,99 ----
1356 validatelargetx)
1357 zcash_rpc zcbenchmark validatelargetx 5
1358 ;;
1359+ trydecryptnotes)
1360+ zcash_rpc zcbenchmark trydecryptnotes 1000 "${@:3}"
1361+ ;;
1362+ incnotewitnesses)
1363+ zcash_rpc zcbenchmark incnotewitnesses 100 "${@:3}"
1364+ ;;
1365 *)
1366 zcashd_stop
1367 echo "Bad arguments."
1368***************
1369*** 116,121 ****
1370--- 122,133 ----
1371 verifyequihash)
1372 zcash_rpc zcbenchmark verifyequihash 1
1373 ;;
1374+ trydecryptnotes)
1375+ zcash_rpc zcbenchmark trydecryptnotes 1 "${@:3}"
1376+ ;;
1377+ incnotewitnesses)
1378+ zcash_rpc zcbenchmark incnotewitnesses 1 "${@:3}"
1379+ ;;
1380 *)
1381 zcashd_massif_stop
1382 echo "Bad arguments."
1383***************
1384*** 145,150 ****
1385--- 157,168 ----
1386 verifyequihash)
1387 zcash_rpc zcbenchmark verifyequihash 1
1388 ;;
1389+ trydecryptnotes)
1390+ zcash_rpc zcbenchmark trydecryptnotes 1 "${@:3}"
1391+ ;;
1392+ incnotewitnesses)
1393+ zcash_rpc zcbenchmark incnotewitnesses 1 "${@:3}"
1394+ ;;
1395 *)
1396 zcashd_valgrind_stop
1397 echo "Bad arguments."
1398diff -crB ./README.md ../../komodo-jl777/README.md
1399*** ./README.md 2017-01-03 10:40:50.151326129 +0000
1400--- ../../komodo-jl777/README.md 2017-01-03 09:49:08.848505929 +0000
1401***************
1402*** 1,43 ****
1403- <<<<<<< HEAD
1404
1405- Zcash
1406- =====
1407-
1408- https://z.cash/
1409-
1410- Where do I begin?
1411- -----------------
1412-
1413- We have a guide for joining the public testnet: https://github.com/zcash/zcash/wiki/Beta-Guide
1414-
1415- What is Zcash?
1416- --------------
1417-
1418- Zcash is an implementation of the "Zerocash" protocol. Based on Bitcoin's code, it intends to
1419- offer a far higher standard of privacy and anonymity through a sophisticiated zero-knowledge
1420- proving scheme which preserves confidentiality of transaction metadata.
1421-
1422- **Zcash is unfinished and highly experimental.** Use at your own risk.
1423-
1424- Participation in the Zcash project is subject to a [Code of Conduct](code_of_conduct.md).
1425-
1426- =======
1427- Zcash 1.0.0
1428- ===========
1429
1430 What is Zcash?
1431 --------------
1432
1433 [Zcash](https://z.cash/) is an implementation of the "Zerocash" protocol.
1434 Based on Bitcoin's code, it intends to offer a far higher standard of privacy
1435! and anonymity through a sophisticated zero-knowledge proving scheme that
1436! preserves confidentiality of transaction metadata. Technical details are
1437! available in our [Protocol Specification](https://github.com/zcash/zips/raw/master/protocol/protocol.pdf).
1438
1439 This software is the Zcash client. It downloads and stores the entire history
1440 of Zcash transactions; depending on the speed of your computer and network
1441 connection, the synchronization process could take a day or more once the
1442! block chain has reached a significant size.
1443
1444 Security Warnings
1445 -----------------
1446--- 1,18 ----
1447
1448
1449 What is Zcash?
1450 --------------
1451
1452 [Zcash](https://z.cash/) is an implementation of the "Zerocash" protocol.
1453 Based on Bitcoin's code, it intends to offer a far higher standard of privacy
1454! through a sophisticated zero-knowledge proving scheme that preserves
1455! confidentiality of transaction metadata. Technical details are available
1456! in our [Protocol Specification](https://github.com/zcash/zips/raw/master/protocol/protocol.pdf).
1457
1458 This software is the Zcash client. It downloads and stores the entire history
1459 of Zcash transactions; depending on the speed of your computer and network
1460 connection, the synchronization process could take a day or more once the
1461! blockchain has reached a significant size.
1462
1463 Security Warnings
1464 -----------------
1465***************
1466*** 165,173 ****
1467
1468 Where do I begin?
1469 -----------------
1470!
1471! We have a guide for joining the public testnet:
1472! https://github.com/zcash/zcash/wiki/Beta-Guide
1473
1474 ### Need Help?
1475
1476--- 140,147 ----
1477
1478 Where do I begin?
1479 -----------------
1480! We have a guide for joining the main Zcash network:
1481! https://github.com/zcash/zcash/wiki/1.0-User-Guide
1482
1483 ### Need Help?
1484
1485***************
1486*** 182,188 ****
1487 --------
1488
1489 Build Zcash along with most dependencies from source by running
1490! ./zcutil/build.sh. Currently only Linux is supported.
1491
1492 License
1493 -------
1494--- 156,162 ----
1495 --------
1496
1497 Build Zcash along with most dependencies from source by running
1498! ./zcutil/build.sh. Currently only Linux is officially supported.
1499
1500 License
1501 -------
1502diff -crB ./src/assetchains ../../komodo-jl777/src/assetchains
1503*** ./src/assetchains 2017-01-03 10:40:50.211329166 +0000
1504--- ../../komodo-jl777/src/assetchains 2017-01-03 09:49:08.856506348 +0000
1505***************
1506*** 3,96 ****
1507 source pubkey.txt
1508 echo $pubkey
1509
1510! ./komodod -pubkey=$pubkey -ac_name=REVS -ac_supply=1300000 -addnode=78.47.196.146 $1 &
1511! ./komodod -pubkey=$pubkey -ac_name=SUPERNET -ac_supply=816061 -addnode=78.47.196.146 $1 &
1512! ./komodod -pubkey=$pubkey -ac_name=DEX -ac_supply=999999 -addnode=78.47.196.146 $1 &
1513! ./komodod -pubkey=$pubkey -ac_name=PANGEA -ac_supply=999999 -addnode=78.47.196.146 $1 &
1514! ./komodod -pubkey=$pubkey -ac_name=JUMBLR -ac_supply=999999 -addnode=78.47.196.146 $1 &
1515! ./komodod -pubkey=$pubkey -ac_name=BET -ac_supply=999999 -addnode=78.47.196.146 $1 &
1516! ./komodod -pubkey=$pubkey -ac_name=CRYPTO -ac_supply=999999 -addnode=78.47.196.146 $1 &
1517! ./komodod -pubkey=$pubkey -ac_name=HODL -ac_supply=9999999 -addnode=78.47.196.146 $1 &
1518! ./komodod -pubkey=$pubkey -ac_name=SHARK -ac_supply=1401 -addnode=78.47.196.146 $1 &
1519! ./komodod -pubkey=$pubkey -ac_name=BOTS -ac_supply=999999 -addnode=78.47.196.146 $1 &
1520! ./komodod -pubkey=$pubkey -ac_name=MGW -ac_supply=999999 -addnode=78.47.196.146 $1 &
1521
1522! ./komodod -pubkey=$pubkey -ac_name=USD -addnode=78.47.196.146 $1 &
1523! ./komodod -pubkey=$pubkey -ac_name=EUR -addnode=78.47.196.146 $1 &
1524! ./komodod -pubkey=$pubkey -ac_name=JPY -addnode=78.47.196.146 $1 &
1525! ./komodod -pubkey=$pubkey -ac_name=GBP -addnode=78.47.196.146 $1 &
1526! ./komodod -pubkey=$pubkey -ac_name=AUD -addnode=78.47.196.146 $1 &
1527! ./komodod -pubkey=$pubkey -ac_name=CAD -addnode=78.47.196.146 $1 &
1528! ./komodod -pubkey=$pubkey -ac_name=CHF -addnode=78.47.196.146 $1 &
1529! ./komodod -pubkey=$pubkey -ac_name=NZD -addnode=78.47.196.146 $1 &
1530! ./komodod -pubkey=$pubkey -ac_name=CNY -addnode=78.47.196.146 $1 &
1531! ./komodod -pubkey=$pubkey -ac_name=RUB -addnode=78.47.196.146 $1 &
1532! ./komodod -pubkey=$pubkey -ac_name=MXN -addnode=78.47.196.146 $1 &
1533! ./komodod -pubkey=$pubkey -ac_name=BRL -addnode=78.47.196.146 $1 &
1534! ./komodod -pubkey=$pubkey -ac_name=INR -addnode=78.47.196.146 $1 &
1535! ./komodod -pubkey=$pubkey -ac_name=HKD -addnode=78.47.196.146 $1 &
1536! ./komodod -pubkey=$pubkey -ac_name=TRY -addnode=78.47.196.146 $1 &
1537! ./komodod -pubkey=$pubkey -ac_name=ZAR -addnode=78.47.196.146 $1 &
1538! ./komodod -pubkey=$pubkey -ac_name=PLN -addnode=78.47.196.146 $1 &
1539! ./komodod -pubkey=$pubkey -ac_name=NOK -addnode=78.47.196.146 $1 &
1540! ./komodod -pubkey=$pubkey -ac_name=SEK -addnode=78.47.196.146 $1 &
1541! ./komodod -pubkey=$pubkey -ac_name=DKK -addnode=78.47.196.146 $1 &
1542! ./komodod -pubkey=$pubkey -ac_name=CZK -addnode=78.47.196.146 $1 &
1543! ./komodod -pubkey=$pubkey -ac_name=HUF -addnode=78.47.196.146 $1 &
1544! ./komodod -pubkey=$pubkey -ac_name=ILS -addnode=78.47.196.146 $1 &
1545! ./komodod -pubkey=$pubkey -ac_name=KRW -addnode=78.47.196.146 $1 &
1546! ./komodod -pubkey=$pubkey -ac_name=MYR -addnode=78.47.196.146 $1 &
1547! ./komodod -pubkey=$pubkey -ac_name=PHP -addnode=78.47.196.146 $1 &
1548! ./komodod -pubkey=$pubkey -ac_name=RON -addnode=78.47.196.146 $1 &
1549! ./komodod -pubkey=$pubkey -ac_name=SGD -addnode=78.47.196.146 $1 &
1550! ./komodod -pubkey=$pubkey -ac_name=THB -addnode=78.47.196.146 $1 &
1551! ./komodod -pubkey=$pubkey -ac_name=BGN -addnode=78.47.196.146 $1 &
1552! ./komodod -pubkey=$pubkey -ac_name=IDR -addnode=78.47.196.146 $1 &
1553! ./komodod -pubkey=$pubkey -ac_name=HRK -addnode=78.47.196.146 $1 &
1554!
1555! curl --url "http://127.0.0.1:7776" --data "{\"timeout\":60000,\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"REVS\",\"pubkey\":\"$pubkey\"}"
1556!
1557! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SUPERNET\",\"pubkey\":\"$pubkey\"}"
1558! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"DEX\",\"pubkey\":\"$pubkey\"}"
1559! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PANGEA\",\"pubkey\":\"$pubkey\"}"
1560! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"JUMBLR\",\"pubkey\":\"$pubkey\"}"
1561! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BET\",\"pubkey\":\"$pubkey\"}"
1562! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CRYPTO\",\"pubkey\":\"$pubkey\"}"
1563! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HODL\",\"pubkey\":\"$pubkey\"}"
1564! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SHARK\",\"pubkey\":\"$pubkey\"}"
1565! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BOTS\",\"pubkey\":\"$pubkey\"}"
1566! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MGW\",\"pubkey\":\"$pubkey\"}"
1567! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"USD\",\"pubkey\":\"$pubkey\"}"
1568! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"EUR\",\"pubkey\":\"$pubkey\"}"
1569!
1570! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"JPY\",\"pubkey\":\"$pubkey\"}"
1571! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"GBP\",\"pubkey\":\"$pubkey\"}"
1572! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"AUD\",\"pubkey\":\"$pubkey\"}"
1573! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CAD\",\"pubkey\":\"$pubkey\"}"
1574! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CHF\",\"pubkey\":\"$pubkey\"}"
1575! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NZD\",\"pubkey\":\"$pubkey\"}"
1576! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CNY\",\"pubkey\":\"$pubkey\"}"
1577! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"RUB\",\"pubkey\":\"$pubkey\"}"
1578! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MXN\",\"pubkey\":\"$pubkey\"}"
1579! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BRL\",\"pubkey\":\"$pubkey\"}"
1580! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"INR\",\"pubkey\":\"$pubkey\"}"
1581! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HKD\",\"pubkey\":\"$pubkey\"}"
1582! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"TRY\",\"pubkey\":\"$pubkey\"}"
1583! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"ZAR\",\"pubkey\":\"$pubkey\"}"
1584! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PLN\",\"pubkey\":\"$pubkey\"}"
1585! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"NOK\",\"pubkey\":\"$pubkey\"}"
1586! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SEK\",\"pubkey\":\"$pubkey\"}"
1587! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"DKK\",\"pubkey\":\"$pubkey\"}"
1588! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"CZK\",\"pubkey\":\"$pubkey\"}"
1589! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HUF\",\"pubkey\":\"$pubkey\"}"
1590! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"ILS\",\"pubkey\":\"$pubkey\"}"
1591! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"KRW\",\"pubkey\":\"$pubkey\"}"
1592! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"MYR\",\"pubkey\":\"$pubkey\"}"
1593! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"PHP\",\"pubkey\":\"$pubkey\"}"
1594! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"RON\",\"pubkey\":\"$pubkey\"}"
1595! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"SGD\",\"pubkey\":\"$pubkey\"}"
1596! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"THB\",\"pubkey\":\"$pubkey\"}"
1597! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"BGN\",\"pubkey\":\"$pubkey\"}"
1598! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"IDR\",\"pubkey\":\"$pubkey\"}"
1599! curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"dpow\",\"symbol\":\"HRK\",\"pubkey\":\"$pubkey\"}"
1600
1601--- 3,50 ----
1602 source pubkey.txt
1603 echo $pubkey
1604
1605! ./komodod -pubkey=$pubkey -ac_name=REVS -ac_supply=1300000 -addnode=78.47.196.146 $1 -gen &
1606! ./komodod -pubkey=$pubkey -ac_name=SUPERNET -ac_supply=816061 -addnode=78.47.196.146 $1 -gen &
1607! ./komodod -pubkey=$pubkey -ac_name=DEX -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
1608! ./komodod -pubkey=$pubkey -ac_name=PANGEA -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
1609! ./komodod -pubkey=$pubkey -ac_name=JUMBLR -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
1610! ./komodod -pubkey=$pubkey -ac_name=BET -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
1611! ./komodod -pubkey=$pubkey -ac_name=CRYPTO -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
1612! ./komodod -pubkey=$pubkey -ac_name=HODL -ac_supply=9999999 -addnode=78.47.196.146 $1 -gen &
1613! ./komodod -pubkey=$pubkey -ac_name=SHARK -ac_supply=1401 -addnode=78.47.196.146 $1 -gen &
1614! ./komodod -pubkey=$pubkey -ac_name=BOTS -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
1615! ./komodod -pubkey=$pubkey -ac_name=MGW -ac_supply=999999 -addnode=78.47.196.146 $1 -gen &
1616
1617! ./komodod -pubkey=$pubkey -ac_name=USD -addnode=78.47.196.146 $1 -gen &
1618! ./komodod -pubkey=$pubkey -ac_name=EUR -addnode=78.47.196.146 $1 -gen &
1619! ./komodod -pubkey=$pubkey -ac_name=JPY -addnode=78.47.196.146 $1 -gen &
1620! ./komodod -pubkey=$pubkey -ac_name=GBP -addnode=78.47.196.146 $1 -gen &
1621! ./komodod -pubkey=$pubkey -ac_name=AUD -addnode=78.47.196.146 $1 -gen &
1622! ./komodod -pubkey=$pubkey -ac_name=CAD -addnode=78.47.196.146 $1 -gen &
1623! ./komodod -pubkey=$pubkey -ac_name=CHF -addnode=78.47.196.146 $1 -gen &
1624! ./komodod -pubkey=$pubkey -ac_name=NZD -addnode=78.47.196.146 $1 -gen &
1625! ./komodod -pubkey=$pubkey -ac_name=CNY -addnode=78.47.196.146 $1 -gen &
1626! ./komodod -pubkey=$pubkey -ac_name=RUB -addnode=78.47.196.146 $1 -gen &
1627! ./komodod -pubkey=$pubkey -ac_name=MXN -addnode=78.47.196.146 $1 -gen &
1628! ./komodod -pubkey=$pubkey -ac_name=BRL -addnode=78.47.196.146 $1 -gen &
1629! ./komodod -pubkey=$pubkey -ac_name=INR -addnode=78.47.196.146 $1 -gen &
1630! ./komodod -pubkey=$pubkey -ac_name=HKD -addnode=78.47.196.146 $1 -gen &
1631! ./komodod -pubkey=$pubkey -ac_name=TRY -addnode=78.47.196.146 $1 -gen &
1632! ./komodod -pubkey=$pubkey -ac_name=ZAR -addnode=78.47.196.146 $1 -gen &
1633! ./komodod -pubkey=$pubkey -ac_name=PLN -addnode=78.47.196.146 $1 -gen &
1634! ./komodod -pubkey=$pubkey -ac_name=NOK -addnode=78.47.196.146 $1 -gen &
1635! ./komodod -pubkey=$pubkey -ac_name=SEK -addnode=78.47.196.146 $1 -gen &
1636! ./komodod -pubkey=$pubkey -ac_name=DKK -addnode=78.47.196.146 $1 -gen &
1637! ./komodod -pubkey=$pubkey -ac_name=CZK -addnode=78.47.196.146 $1 -gen &
1638! ./komodod -pubkey=$pubkey -ac_name=HUF -addnode=78.47.196.146 $1 -gen &
1639! ./komodod -pubkey=$pubkey -ac_name=ILS -addnode=78.47.196.146 $1 -gen &
1640! ./komodod -pubkey=$pubkey -ac_name=KRW -addnode=78.47.196.146 $1 -gen &
1641! ./komodod -pubkey=$pubkey -ac_name=MYR -addnode=78.47.196.146 $1 -gen &
1642! ./komodod -pubkey=$pubkey -ac_name=PHP -addnode=78.47.196.146 $1 -gen &
1643! ./komodod -pubkey=$pubkey -ac_name=RON -addnode=78.47.196.146 $1 -gen &
1644! ./komodod -pubkey=$pubkey -ac_name=SGD -addnode=78.47.196.146 $1 -gen &
1645! ./komodod -pubkey=$pubkey -ac_name=THB -addnode=78.47.196.146 $1 -gen &
1646! ./komodod -pubkey=$pubkey -ac_name=BGN -addnode=78.47.196.146 $1 -gen &
1647! ./komodod -pubkey=$pubkey -ac_name=IDR -addnode=78.47.196.146 $1 -gen &
1648! ./komodod -pubkey=$pubkey -ac_name=HRK -addnode=78.47.196.146 $1 -gen &
1649
1650diff -crB ./src/bitcoind.cpp ../../komodo-jl777/src/bitcoind.cpp
1651*** ./src/bitcoind.cpp 2017-01-03 10:40:50.215329368 +0000
1652--- ../../komodo-jl777/src/bitcoind.cpp 2017-01-03 09:49:08.856506348 +0000
1653***************
1654*** 41,47 ****
1655 // Tell the main threads to shutdown.
1656 while (!fShutdown)
1657 {
1658! MilliSleep(10000);
1659 komodo_passport_iteration();
1660 fShutdown = ShutdownRequested();
1661 }
1662--- 41,47 ----
1663 // Tell the main threads to shutdown.
1664 while (!fShutdown)
1665 {
1666! MilliSleep(16000);
1667 komodo_passport_iteration();
1668 fShutdown = ShutdownRequested();
1669 }
1670diff -crB ./src/chainparams.cpp ../../komodo-jl777/src/chainparams.cpp
1671*** ./src/chainparams.cpp 2017-01-03 10:40:50.215329368 +0000
1672--- ../../komodo-jl777/src/chainparams.cpp 2017-01-03 09:49:08.856506348 +0000
1673***************
1674*** 43,48 ****
1675--- 43,49 ----
1676 CMainParams()
1677 {
1678 strNetworkID = "main";
1679+ strCurrencyUnits = "KMD";
1680 consensus.fCoinbaseMustBeProtected = false;//true;
1681 consensus.nSubsidySlowStartInterval = 20000;
1682 consensus.nSubsidyHalvingInterval = 840000;
1683***************
1684*** 119,129 ****
1685 checkpointData = (Checkpoints::CCheckpointData)
1686 {
1687 boost::assign::map_list_of
1688! ( 0, consensus.hashGenesisBlock),
1689! genesis.nTime, // * UNIX timestamp of last checkpoint block
1690! 0, // * total number of transactions between genesis and last checkpoint
1691! // (the tx=... number in the SetBestChain debug.log lines)
1692! 0 // * estimated number of transactions per day after checkpoint
1693 };
1694 if ( pthread_create((pthread_t *)malloc(sizeof(pthread_t)),NULL,chainparams_commandline,(void *)&consensus) != 0 )
1695 {
1696--- 120,134 ----
1697 checkpointData = (Checkpoints::CCheckpointData)
1698 {
1699 boost::assign::map_list_of
1700! (0, consensus.hashGenesisBlock),
1701! //(2500, uint256S("0x0e6a3d5a46eba97c4e7618d66a39f115729e1176433c98481124c2bf733aa54e"))
1702! //(15000, uint256S("0x00f0bd236790e903321a2d22f85bd6bf8a505f6ef4eddb20458a65d37e14d142")),
1703! //(100000, uint256S("0x0f02eb1f3a4b89df9909fec81a4bd7d023e32e24e1f5262d9fc2cc36a715be6f")),
1704! 1481120910, // * UNIX timestamp of last checkpoint block
1705! 110415, // * total number of transactions between genesis and last checkpoint
1706! // (the tx=... number in the SetBestChain debug.log lines)
1707! 4240 // * estimated number of transactions per day after checkpoint
1708! // total number of tx / (checkpoint block height / (24 * 24))
1709 };
1710 if ( pthread_create((pthread_t *)malloc(sizeof(pthread_t)),NULL,chainparams_commandline,(void *)&consensus) != 0 )
1711 {
1712***************
1713*** 160,165 ****
1714--- 165,171 ----
1715 public:
1716 CTestNetParams() {
1717 strNetworkID = "test";
1718+ strCurrencyUnits = "TAZ";
1719 consensus.nMajorityEnforceBlockUpgrade = 51;
1720 consensus.nMajorityRejectBlockOutdated = 75;
1721 consensus.nMajorityWindow = 400;
1722***************
1723*** 222,227 ****
1724--- 228,234 ----
1725 public:
1726 CRegTestParams() {
1727 strNetworkID = "regtest";
1728+ strCurrencyUnits = "REG";
1729 consensus.fCoinbaseMustBeProtected = false;
1730 consensus.nSubsidySlowStartInterval = 0;
1731 consensus.nSubsidyHalvingInterval = 150;
1732diff -crB ./src/chainparams.h ../../komodo-jl777/src/chainparams.h
1733*** ./src/chainparams.h 2017-01-03 10:40:50.215329368 +0000
1734--- ../../komodo-jl777/src/chainparams.h 2017-01-03 09:49:08.856506348 +0000
1735***************
1736*** 69,74 ****
1737--- 69,75 ----
1738 int64_t PruneAfterHeight() const { return nPruneAfterHeight; }
1739 unsigned int EquihashN() const { return nEquihashN; }
1740 unsigned int EquihashK() const { return nEquihashK; }
1741+ std::string CurrencyUnits() const { return strCurrencyUnits; }
1742 /** Make miner stop after a block is found. In RPC, don't return until nGenProcLimit blocks are generated */
1743 bool MineBlocksOnDemand() const { return fMineBlocksOnDemand; }
1744 /** In the future use NetworkIDString() for RPC fields */
1745***************
1746*** 107,112 ****
1747--- 108,114 ----
1748 std::vector<CDNSSeedData> vSeeds;
1749 std::vector<unsigned char> base58Prefixes[MAX_BASE58_TYPES];
1750 std::string strNetworkID;
1751+ std::string strCurrencyUnits;
1752 CBlock genesis;
1753 std::vector<SeedSpec6> vFixedSeeds;
1754 bool fRequireRPCPassword = false;
1755diff -crB ./src/clientversion.h ../../komodo-jl777/src/clientversion.h
1756*** ./src/clientversion.h 2017-01-03 10:40:50.215329368 +0000
1757--- ../../komodo-jl777/src/clientversion.h 2017-01-03 09:49:08.856506348 +0000
1758***************
1759*** 16,22 ****
1760 //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it
1761 #define CLIENT_VERSION_MAJOR 1
1762 #define CLIENT_VERSION_MINOR 0
1763! #define CLIENT_VERSION_REVISION 0
1764 #define CLIENT_VERSION_BUILD 50
1765
1766 //! Set to true for release, false for prerelease or test build
1767--- 16,22 ----
1768 //! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it
1769 #define CLIENT_VERSION_MAJOR 1
1770 #define CLIENT_VERSION_MINOR 0
1771! #define CLIENT_VERSION_REVISION 3
1772 #define CLIENT_VERSION_BUILD 50
1773
1774 //! Set to true for release, false for prerelease or test build
1775diff -crB ./src/coins.cpp ../../komodo-jl777/src/coins.cpp
1776*** ./src/coins.cpp 2017-01-03 10:40:50.215329368 +0000
1777--- ../../komodo-jl777/src/coins.cpp 2017-01-03 09:49:08.856506348 +0000
1778***************
1779*** 6,11 ****
1780--- 6,12 ----
1781
1782 #include "memusage.h"
1783 #include "random.h"
1784+ #include "version.h"
1785
1786 #include <assert.h>
1787
1788***************
1789*** 176,186 ****
1790 // case restoring the "old" anchor during a reorg must
1791 // have no effect.
1792 if (currentRoot != newrt) {
1793! CAnchorsMap::iterator ret = cacheAnchors.insert(std::make_pair(currentRoot, CAnchorsCacheEntry())).first;
1794
1795! ret->second.entered = false;
1796! ret->second.flags = CAnchorsCacheEntry::DIRTY;
1797
1798 hashAnchor = newrt;
1799 }
1800 }
1801--- 177,196 ----
1802 // case restoring the "old" anchor during a reorg must
1803 // have no effect.
1804 if (currentRoot != newrt) {
1805! // Bring the current best anchor into our local cache
1806! // so that its tree exists in memory.
1807! {
1808! ZCIncrementalMerkleTree tree;
1809! assert(GetAnchorAt(currentRoot, tree));
1810! }
1811
1812! // Mark the anchor as unentered, removing it from view
1813! cacheAnchors[currentRoot].entered = false;
1814
1815+ // Mark the cache entry as dirty so it's propagated
1816+ cacheAnchors[currentRoot].flags = CAnchorsCacheEntry::DIRTY;
1817+
1818+ // Mark the new root as the best anchor
1819 hashAnchor = newrt;
1820 }
1821 }
1822***************
1823*** 303,318 ****
1824 CAnchorsMap::iterator parent_it = cacheAnchors.find(child_it->first);
1825
1826 if (parent_it == cacheAnchors.end()) {
1827! if (child_it->second.entered) {
1828! // Parent doesn't have an entry, but child has a new commitment root.
1829!
1830! CAnchorsCacheEntry& entry = cacheAnchors[child_it->first];
1831! entry.entered = true;
1832! entry.tree = child_it->second.tree;
1833! entry.flags = CAnchorsCacheEntry::DIRTY;
1834
1835! cachedCoinsUsage += memusage::DynamicUsage(entry.tree);
1836! }
1837 } else {
1838 if (parent_it->second.entered != child_it->second.entered) {
1839 // The parent may have removed the entry.
1840--- 313,324 ----
1841 CAnchorsMap::iterator parent_it = cacheAnchors.find(child_it->first);
1842
1843 if (parent_it == cacheAnchors.end()) {
1844! CAnchorsCacheEntry& entry = cacheAnchors[child_it->first];
1845! entry.entered = child_it->second.entered;
1846! entry.tree = child_it->second.tree;
1847! entry.flags = CAnchorsCacheEntry::DIRTY;
1848
1849! cachedCoinsUsage += memusage::DynamicUsage(entry.tree);
1850 } else {
1851 if (parent_it->second.entered != child_it->second.entered) {
1852 // The parent may have removed the entry.
1853***************
1854*** 332,345 ****
1855 CNullifiersMap::iterator parent_it = cacheNullifiers.find(child_it->first);
1856
1857 if (parent_it == cacheNullifiers.end()) {
1858! if (child_it->second.entered) {
1859! // Parent doesn't have an entry, but child has a SPENT nullifier.
1860! // Move the spent nullifier up.
1861!
1862! CNullifiersCacheEntry& entry = cacheNullifiers[child_it->first];
1863! entry.entered = true;
1864! entry.flags = CNullifiersCacheEntry::DIRTY;
1865! }
1866 } else {
1867 if (parent_it->second.entered != child_it->second.entered) {
1868 parent_it->second.entered = child_it->second.entered;
1869--- 338,346 ----
1870 CNullifiersMap::iterator parent_it = cacheNullifiers.find(child_it->first);
1871
1872 if (parent_it == cacheNullifiers.end()) {
1873! CNullifiersCacheEntry& entry = cacheNullifiers[child_it->first];
1874! entry.entered = child_it->second.entered;
1875! entry.flags = CNullifiersCacheEntry::DIRTY;
1876 } else {
1877 if (parent_it->second.entered != child_it->second.entered) {
1878 parent_it->second.entered = child_it->second.entered;
1879***************
1880*** 469,474 ****
1881--- 470,476 ----
1882 {
1883 if (tx.IsCoinBase())
1884 return 0.0;
1885+ CAmount nTotalIn = 0;
1886 double dResult = 0.0;
1887 BOOST_FOREACH(const CTxIn& txin, tx.vin)
1888 {
1889***************
1890*** 477,484 ****
1891--- 479,512 ----
1892 if (!coins->IsAvailable(txin.prevout.n)) continue;
1893 if (coins->nHeight < nHeight) {
1894 dResult += coins->vout[txin.prevout.n].nValue * (nHeight-coins->nHeight);
1895+ nTotalIn += coins->vout[txin.prevout.n].nValue;
1896 }
1897 }
1898+
1899+ // If a transaction contains a joinsplit, we boost the priority of the transaction.
1900+ // Joinsplits do not reveal any information about the value or age of a note, so we
1901+ // cannot apply the priority algorithm used for transparent utxos. Instead, we pick a
1902+ // very large number and multiply it by the transaction's fee per 1000 bytes of data.
1903+ // One trillion, 1000000000000, is equivalent to 1 ZEC utxo * 10000 blocks (~17 days).
1904+ if (tx.vjoinsplit.size() > 0) {
1905+ unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
1906+ nTotalIn += tx.GetJoinSplitValueIn();
1907+ CAmount fee = nTotalIn - tx.GetValueOut();
1908+ CFeeRate feeRate(fee, nTxSize);
1909+ CAmount feePerK = feeRate.GetFeePerK();
1910+
1911+ if (feePerK == 0) {
1912+ feePerK = 1;
1913+ }
1914+
1915+ dResult += 1000000000000 * double(feePerK);
1916+ // We cast feePerK from int64_t to double because if feePerK is a large number, say
1917+ // close to MAX_MONEY, the multiplication operation will result in an integer overflow.
1918+ // The variable dResult should never overflow since a 64-bit double in C++ is typically
1919+ // a double-precision floating-point number as specified by IEE 754, with a maximum
1920+ // value DBL_MAX of 1.79769e+308.
1921+ }
1922+
1923 return tx.ComputePriority(dResult);
1924 }
1925
1926Only in ../../komodo-jl777/src: dpowassets
1927Only in ../../komodo-jl777/src: fundnotaries
1928diff -crB ./src/gtest/test_checkblock.cpp ../../komodo-jl777/src/gtest/test_checkblock.cpp
1929*** ./src/gtest/test_checkblock.cpp 2017-01-03 10:40:50.227329975 +0000
1930--- ../../komodo-jl777/src/gtest/test_checkblock.cpp 2017-01-03 09:49:08.856506348 +0000
1931***************
1932*** 29,31 ****
1933--- 29,74 ----
1934 EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "version-too-low", false)).Times(1);
1935 EXPECT_FALSE(CheckBlock(0,0,block, state, false, false));
1936 }
1937+
1938+ TEST(ContextualCheckBlock, BadCoinbaseHeight) {
1939+ SelectParams(CBaseChainParams::MAIN);
1940+
1941+ // Create a block with no height in scriptSig
1942+ CMutableTransaction mtx;
1943+ mtx.vin.resize(1);
1944+ mtx.vin[0].prevout.SetNull();
1945+ mtx.vin[0].scriptSig = CScript() << OP_0;
1946+ mtx.vout.resize(1);
1947+ mtx.vout[0].scriptPubKey = CScript() << OP_TRUE;
1948+ mtx.vout[0].nValue = 0;
1949+ CTransaction tx {mtx};
1950+ CBlock block;
1951+ block.vtx.push_back(tx);
1952+
1953+ // Treating block as genesis should pass
1954+ MockCValidationState state;
1955+ EXPECT_TRUE(ContextualCheckBlock(block, state, NULL));
1956+
1957+ // Treating block as non-genesis should fail
1958+ mtx.vout.push_back(CTxOut(GetBlockSubsidy(1, Params().GetConsensus())/5, Params().GetFoundersRewardScriptAtHeight(1)));
1959+ CTransaction tx2 {mtx};
1960+ block.vtx[0] = tx2;
1961+ CBlock prev;
1962+ CBlockIndex indexPrev {prev};
1963+ indexPrev.nHeight = 0;
1964+ EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-cb-height", false)).Times(1);
1965+ EXPECT_FALSE(ContextualCheckBlock(block, state, &indexPrev));
1966+
1967+ // Setting to an incorrect height should fail
1968+ mtx.vin[0].scriptSig = CScript() << 2 << OP_0;
1969+ CTransaction tx3 {mtx};
1970+ block.vtx[0] = tx3;
1971+ EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-cb-height", false)).Times(1);
1972+ EXPECT_FALSE(ContextualCheckBlock(block, state, &indexPrev));
1973+
1974+ // After correcting the scriptSig, should pass
1975+ mtx.vin[0].scriptSig = CScript() << 1 << OP_0;
1976+ CTransaction tx4 {mtx};
1977+ block.vtx[0] = tx4;
1978+ EXPECT_TRUE(ContextualCheckBlock(block, state, &indexPrev));
1979+ }
1980diff -crB ./src/gtest/test_joinsplit.cpp ../../komodo-jl777/src/gtest/test_joinsplit.cpp
1981*** ./src/gtest/test_joinsplit.cpp 2017-01-03 10:40:50.227329975 +0000
1982--- ../../komodo-jl777/src/gtest/test_joinsplit.cpp 2017-01-03 09:49:08.856506348 +0000
1983***************
1984*** 15,20 ****
1985--- 15,23 ----
1986
1987 void test_full_api(ZCJoinSplit* js)
1988 {
1989+ // Create verification context.
1990+ auto verifier = libzcash::ProofVerifier::Strict();
1991+
1992 // The recipient's information.
1993 SpendingKey recipient_key = SpendingKey::random();
1994 PaymentAddress recipient_addr = recipient_key.address();
1995***************
1996*** 69,74 ****
1997--- 72,78 ----
1998 // Verify the transaction:
1999 ASSERT_TRUE(js->verify(
2000 proof,
2001+ verifier,
2002 pubKeyHash,
2003 randomSeed,
2004 macs,
2005***************
2006*** 143,148 ****
2007--- 147,153 ----
2008 // Verify the transaction:
2009 ASSERT_TRUE(js->verify(
2010 proof,
2011+ verifier,
2012 pubKeyHash,
2013 randomSeed,
2014 macs,
2015***************
2016*** 154,159 ****
2017--- 159,222 ----
2018 ));
2019 }
2020
2021+ // Invokes the API (but does not compute a proof)
2022+ // to test exceptions
2023+ void invokeAPI(
2024+ ZCJoinSplit* js,
2025+ const boost::array<JSInput, 2>& inputs,
2026+ const boost::array<JSOutput, 2>& outputs,
2027+ uint64_t vpub_old,
2028+ uint64_t vpub_new,
2029+ const uint256& rt
2030+ ) {
2031+ uint256 ephemeralKey;
2032+ uint256 randomSeed;
2033+ uint256 pubKeyHash = random_uint256();
2034+ boost::array<uint256, 2> macs;
2035+ boost::array<uint256, 2> nullifiers;
2036+ boost::array<uint256, 2> commitments;
2037+ boost::array<ZCNoteEncryption::Ciphertext, 2> ciphertexts;
2038+
2039+ boost::array<Note, 2> output_notes;
2040+
2041+ ZCProof proof = js->prove(
2042+ inputs,
2043+ outputs,
2044+ output_notes,
2045+ ciphertexts,
2046+ ephemeralKey,
2047+ pubKeyHash,
2048+ randomSeed,
2049+ macs,
2050+ nullifiers,
2051+ commitments,
2052+ vpub_old,
2053+ vpub_new,
2054+ rt,
2055+ false
2056+ );
2057+ }
2058+
2059+ void invokeAPIFailure(
2060+ ZCJoinSplit* js,
2061+ const boost::array<JSInput, 2>& inputs,
2062+ const boost::array<JSOutput, 2>& outputs,
2063+ uint64_t vpub_old,
2064+ uint64_t vpub_new,
2065+ const uint256& rt,
2066+ std::string reason
2067+ )
2068+ {
2069+ try {
2070+ invokeAPI(js, inputs, outputs, vpub_old, vpub_new, rt);
2071+ FAIL() << "It worked, when it shouldn't have!";
2072+ } catch(std::invalid_argument const & err) {
2073+ EXPECT_EQ(err.what(), reason);
2074+ } catch(...) {
2075+ FAIL() << "Expected invalid_argument exception.";
2076+ }
2077+ }
2078+
2079 TEST(joinsplit, h_sig)
2080 {
2081 auto js = ZCJoinSplit::Unopened();
2082***************
2083*** 233,242 ****
2084--- 296,515 ----
2085 delete js;
2086 }
2087
2088+ void increment_note_witnesses(
2089+ const uint256& element,
2090+ std::vector<ZCIncrementalWitness>& witnesses,
2091+ ZCIncrementalMerkleTree& tree
2092+ )
2093+ {
2094+ tree.append(element);
2095+ for (ZCIncrementalWitness& w : witnesses) {
2096+ w.append(element);
2097+ }
2098+ witnesses.push_back(tree.witness());
2099+ }
2100+
2101 TEST(joinsplit, full_api_test)
2102 {
2103 auto js = ZCJoinSplit::Generate();
2104
2105+ {
2106+ std::vector<ZCIncrementalWitness> witnesses;
2107+ ZCIncrementalMerkleTree tree;
2108+ increment_note_witnesses(uint256(), witnesses, tree);
2109+ SpendingKey sk = SpendingKey::random();
2110+ PaymentAddress addr = sk.address();
2111+ Note note1(addr.a_pk, 100, random_uint256(), random_uint256());
2112+ increment_note_witnesses(note1.cm(), witnesses, tree);
2113+ Note note2(addr.a_pk, 100, random_uint256(), random_uint256());
2114+ increment_note_witnesses(note2.cm(), witnesses, tree);
2115+ Note note3(addr.a_pk, 2100000000000001, random_uint256(), random_uint256());
2116+ increment_note_witnesses(note3.cm(), witnesses, tree);
2117+ Note note4(addr.a_pk, 1900000000000000, random_uint256(), random_uint256());
2118+ increment_note_witnesses(note4.cm(), witnesses, tree);
2119+ Note note5(addr.a_pk, 1900000000000000, random_uint256(), random_uint256());
2120+ increment_note_witnesses(note5.cm(), witnesses, tree);
2121+
2122+ // Should work
2123+ invokeAPI(js,
2124+ {
2125+ JSInput(),
2126+ JSInput()
2127+ },
2128+ {
2129+ JSOutput(),
2130+ JSOutput()
2131+ },
2132+ 0,
2133+ 0,
2134+ tree.root());
2135+
2136+ // lhs > MAX_MONEY
2137+ invokeAPIFailure(js,
2138+ {
2139+ JSInput(),
2140+ JSInput()
2141+ },
2142+ {
2143+ JSOutput(),
2144+ JSOutput()
2145+ },
2146+ 2100000000000001,
2147+ 0,
2148+ tree.root(),
2149+ "nonsensical vpub_old value");
2150+
2151+ // rhs > MAX_MONEY
2152+ invokeAPIFailure(js,
2153+ {
2154+ JSInput(),
2155+ JSInput()
2156+ },
2157+ {
2158+ JSOutput(),
2159+ JSOutput()
2160+ },
2161+ 0,
2162+ 2100000000000001,
2163+ tree.root(),
2164+ "nonsensical vpub_new value");
2165+
2166+ // input witness for the wrong element
2167+ invokeAPIFailure(js,
2168+ {
2169+ JSInput(witnesses[0], note1, sk),
2170+ JSInput()
2171+ },
2172+ {
2173+ JSOutput(),
2174+ JSOutput()
2175+ },
2176+ 0,
2177+ 100,
2178+ tree.root(),
2179+ "witness of wrong element for joinsplit input");
2180+
2181+ // input witness doesn't match up with
2182+ // real root
2183+ invokeAPIFailure(js,
2184+ {
2185+ JSInput(witnesses[1], note1, sk),
2186+ JSInput()
2187+ },
2188+ {
2189+ JSOutput(),
2190+ JSOutput()
2191+ },
2192+ 0,
2193+ 100,
2194+ uint256(),
2195+ "joinsplit not anchored to the correct root");
2196+
2197+ // input is in the tree now! this should work
2198+ invokeAPI(js,
2199+ {
2200+ JSInput(witnesses[1], note1, sk),
2201+ JSInput()
2202+ },
2203+ {
2204+ JSOutput(),
2205+ JSOutput()
2206+ },
2207+ 0,
2208+ 100,
2209+ tree.root());
2210+
2211+ // Wrong secret key
2212+ invokeAPIFailure(js,
2213+ {
2214+ JSInput(witnesses[1], note1, SpendingKey::random()),
2215+ JSInput()
2216+ },
2217+ {
2218+ JSOutput(),
2219+ JSOutput()
2220+ },
2221+ 0,
2222+ 0,
2223+ tree.root(),
2224+ "input note not authorized to spend with given key");
2225+
2226+ // Absurd input value
2227+ invokeAPIFailure(js,
2228+ {
2229+ JSInput(witnesses[3], note3, sk),
2230+ JSInput()
2231+ },
2232+ {
2233+ JSOutput(),
2234+ JSOutput()
2235+ },
2236+ 0,
2237+ 0,
2238+ tree.root(),
2239+ "nonsensical input note value");
2240+
2241+ // Absurd total input value
2242+ invokeAPIFailure(js,
2243+ {
2244+ JSInput(witnesses[4], note4, sk),
2245+ JSInput(witnesses[5], note5, sk)
2246+ },
2247+ {
2248+ JSOutput(),
2249+ JSOutput()
2250+ },
2251+ 0,
2252+ 0,
2253+ tree.root(),
2254+ "nonsensical left hand size of joinsplit balance");
2255+
2256+ // Absurd output value
2257+ invokeAPIFailure(js,
2258+ {
2259+ JSInput(),
2260+ JSInput()
2261+ },
2262+ {
2263+ JSOutput(addr, 2100000000000001),
2264+ JSOutput()
2265+ },
2266+ 0,
2267+ 0,
2268+ tree.root(),
2269+ "nonsensical output value");
2270+
2271+ // Absurd total output value
2272+ invokeAPIFailure(js,
2273+ {
2274+ JSInput(),
2275+ JSInput()
2276+ },
2277+ {
2278+ JSOutput(addr, 1900000000000000),
2279+ JSOutput(addr, 1900000000000000)
2280+ },
2281+ 0,
2282+ 0,
2283+ tree.root(),
2284+ "nonsensical right hand side of joinsplit balance");
2285+
2286+ // Absurd total output value
2287+ invokeAPIFailure(js,
2288+ {
2289+ JSInput(),
2290+ JSInput()
2291+ },
2292+ {
2293+ JSOutput(addr, 1900000000000000),
2294+ JSOutput()
2295+ },
2296+ 0,
2297+ 0,
2298+ tree.root(),
2299+ "invalid joinsplit balance");
2300+ }
2301+
2302 test_full_api(js);
2303
2304 js->saveProvingKey("./zcashTest.pk");
2305diff -crB ./src/gtest/test_merkletree.cpp ../../komodo-jl777/src/gtest/test_merkletree.cpp
2306*** ./src/gtest/test_merkletree.cpp 2017-01-03 10:40:50.227329975 +0000
2307--- ../../komodo-jl777/src/gtest/test_merkletree.cpp 2017-01-03 09:49:08.856506348 +0000
2308***************
2309*** 5,10 ****
2310--- 5,11 ----
2311 #include "test/data/merkle_serialization.json.h"
2312 #include "test/data/merkle_witness_serialization.json.h"
2313 #include "test/data/merkle_path.json.h"
2314+ #include "test/data/merkle_commitments.json.h"
2315
2316 #include <iostream>
2317
2318***************
2319*** 55,86 ****
2320 }
2321
2322 template<typename Tree, typename Witness>
2323! void test_tree(Array root_tests, Array ser_tests, Array witness_ser_tests, Array path_tests) {
2324 Array::iterator root_iterator = root_tests.begin();
2325 Array::iterator ser_iterator = ser_tests.begin();
2326 Array::iterator witness_ser_iterator = witness_ser_tests.begin();
2327 Array::iterator path_iterator = path_tests.begin();
2328
2329- uint256 test_commitment = uint256S("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
2330-
2331 Tree tree;
2332
2333 // The root of the tree at this point is expected to be the root of the
2334 // empty tree.
2335 ASSERT_TRUE(tree.root() == Tree::empty_root());
2336
2337 // We need to witness at every single point in the tree, so
2338 // that the consistency of the tree and the merkle paths can
2339 // be checked.
2340 vector<Witness> witnesses;
2341
2342 for (size_t i = 0; i < 16; i++) {
2343 // Witness here
2344 witnesses.push_back(tree.witness());
2345
2346 // Now append a commitment to the tree
2347 tree.append(test_commitment);
2348
2349 // Check tree root consistency
2350 expect_test_vector(root_iterator, tree.root());
2351
2352--- 56,101 ----
2353 }
2354
2355 template<typename Tree, typename Witness>
2356! void test_tree(
2357! Array commitment_tests,
2358! Array root_tests,
2359! Array ser_tests,
2360! Array witness_ser_tests,
2361! Array path_tests
2362! )
2363! {
2364! Array::iterator commitment_iterator = commitment_tests.begin();
2365 Array::iterator root_iterator = root_tests.begin();
2366 Array::iterator ser_iterator = ser_tests.begin();
2367 Array::iterator witness_ser_iterator = witness_ser_tests.begin();
2368 Array::iterator path_iterator = path_tests.begin();
2369
2370 Tree tree;
2371
2372 // The root of the tree at this point is expected to be the root of the
2373 // empty tree.
2374 ASSERT_TRUE(tree.root() == Tree::empty_root());
2375
2376+ // The tree doesn't have a 'last' element added since it's blank.
2377+ ASSERT_THROW(tree.last(), std::runtime_error);
2378+
2379 // We need to witness at every single point in the tree, so
2380 // that the consistency of the tree and the merkle paths can
2381 // be checked.
2382 vector<Witness> witnesses;
2383
2384 for (size_t i = 0; i < 16; i++) {
2385+ uint256 test_commitment = uint256S((commitment_iterator++)->get_str());
2386+
2387 // Witness here
2388 witnesses.push_back(tree.witness());
2389
2390 // Now append a commitment to the tree
2391 tree.append(test_commitment);
2392
2393+ // Last element added to the tree was `test_commitment`
2394+ ASSERT_TRUE(tree.last() == test_commitment);
2395+
2396 // Check tree root consistency
2397 expect_test_vector(root_iterator, tree.root());
2398
2399***************
2400*** 95,100 ****
2401--- 110,116 ----
2402
2403 if (first) {
2404 ASSERT_THROW(wit.path(), std::runtime_error);
2405+ ASSERT_THROW(wit.element(), std::runtime_error);
2406 } else {
2407 auto path = wit.path();
2408
2409***************
2410*** 119,125 ****
2411
2412 std::vector<bool> commitment_bv;
2413 {
2414! std::vector<unsigned char> commitment_v(test_commitment.begin(), test_commitment.end());
2415 commitment_bv = convertBytesVectorToVector(commitment_v);
2416 }
2417
2418--- 135,142 ----
2419
2420 std::vector<bool> commitment_bv;
2421 {
2422! uint256 witnessed_commitment = wit.element();
2423! std::vector<unsigned char> commitment_v(witnessed_commitment.begin(), witnessed_commitment.end());
2424 commitment_bv = convertBytesVectorToVector(commitment_v);
2425 }
2426
2427***************
2428*** 174,181 ****
2429 Array ser_tests = read_json(std::string(json_tests::merkle_serialization, json_tests::merkle_serialization + sizeof(json_tests::merkle_serialization)));
2430 Array witness_ser_tests = read_json(std::string(json_tests::merkle_witness_serialization, json_tests::merkle_witness_serialization + sizeof(json_tests::merkle_witness_serialization)));
2431 Array path_tests = read_json(std::string(json_tests::merkle_path, json_tests::merkle_path + sizeof(json_tests::merkle_path)));
2432
2433! test_tree<ZCTestingIncrementalMerkleTree, ZCTestingIncrementalWitness>(root_tests, ser_tests, witness_ser_tests, path_tests);
2434 }
2435
2436 TEST(merkletree, emptyroots) {
2437--- 191,199 ----
2438 Array ser_tests = read_json(std::string(json_tests::merkle_serialization, json_tests::merkle_serialization + sizeof(json_tests::merkle_serialization)));
2439 Array witness_ser_tests = read_json(std::string(json_tests::merkle_witness_serialization, json_tests::merkle_witness_serialization + sizeof(json_tests::merkle_witness_serialization)));
2440 Array path_tests = read_json(std::string(json_tests::merkle_path, json_tests::merkle_path + sizeof(json_tests::merkle_path)));
2441+ Array commitment_tests = read_json(std::string(json_tests::merkle_commitments, json_tests::merkle_commitments + sizeof(json_tests::merkle_commitments)));
2442
2443! test_tree<ZCTestingIncrementalMerkleTree, ZCTestingIncrementalWitness>(commitment_tests, root_tests, ser_tests, witness_ser_tests, path_tests);
2444 }
2445
2446 TEST(merkletree, emptyroots) {
2447Only in ../../komodo-jl777/src/gtest: test_metrics.cpp
2448diff -crB ./src/gtest/test_proofs.cpp ../../komodo-jl777/src/gtest/test_proofs.cpp
2449*** ./src/gtest/test_proofs.cpp 2017-01-03 10:40:50.227329975 +0000
2450--- ../../komodo-jl777/src/gtest/test_proofs.cpp 2017-01-03 09:49:08.856506348 +0000
2451***************
2452*** 336,341 ****
2453--- 336,364 ----
2454 auto example = libsnark::generate_r1cs_example_with_field_input<curve_Fr>(250, 4);
2455 example.constraint_system.swap_AB_if_beneficial();
2456 auto kp = libsnark::r1cs_ppzksnark_generator<curve_pp>(example.constraint_system);
2457+ auto vkprecomp = libsnark::r1cs_ppzksnark_verifier_process_vk(kp.vk);
2458+
2459+ for (size_t i = 0; i < 20; i++) {
2460+ auto badproof = ZCProof::random_invalid();
2461+ auto proof = badproof.to_libsnark_proof<libsnark::r1cs_ppzksnark_proof<curve_pp>>();
2462+
2463+ auto verifierEnabled = ProofVerifier::Strict();
2464+ auto verifierDisabled = ProofVerifier::Disabled();
2465+ // This verifier should catch the bad proof
2466+ ASSERT_FALSE(verifierEnabled.check(
2467+ kp.vk,
2468+ vkprecomp,
2469+ example.primary_input,
2470+ proof
2471+ ));
2472+ // This verifier won't!
2473+ ASSERT_TRUE(verifierDisabled.check(
2474+ kp.vk,
2475+ vkprecomp,
2476+ example.primary_input,
2477+ proof
2478+ ));
2479+ }
2480
2481 for (size_t i = 0; i < 20; i++) {
2482 auto proof = libsnark::r1cs_ppzksnark_prover<curve_pp>(
2483***************
2484*** 345,350 ****
2485--- 368,390 ----
2486 example.constraint_system
2487 );
2488
2489+ {
2490+ auto verifierEnabled = ProofVerifier::Strict();
2491+ auto verifierDisabled = ProofVerifier::Disabled();
2492+ ASSERT_TRUE(verifierEnabled.check(
2493+ kp.vk,
2494+ vkprecomp,
2495+ example.primary_input,
2496+ proof
2497+ ));
2498+ ASSERT_TRUE(verifierDisabled.check(
2499+ kp.vk,
2500+ vkprecomp,
2501+ example.primary_input,
2502+ proof
2503+ ));
2504+ }
2505+
2506 ASSERT_TRUE(libsnark::r1cs_ppzksnark_verifier_strong_IC<curve_pp>(
2507 kp.vk,
2508 example.primary_input,
2509diff -crB ./src/gtest/test_random.cpp ../../komodo-jl777/src/gtest/test_random.cpp
2510*** ./src/gtest/test_random.cpp 2017-01-03 10:40:50.227329975 +0000
2511--- ../../komodo-jl777/src/gtest/test_random.cpp 2017-01-03 09:49:08.856506348 +0000
2512***************
2513*** 24,27 ****
2514--- 24,35 ----
2515 std::vector<int> em2 {0, 1, 2, 3, 4};
2516 EXPECT_EQ(ea2, a2);
2517 EXPECT_EQ(em2, m2);
2518+
2519+ auto a3 = a;
2520+ auto m3 = m;
2521+ MappedShuffle(a3.begin(), m3.begin(), a3.size(), GenIdentity);
2522+ std::vector<int> ea3 {8, 4, 6, 3, 5};
2523+ std::vector<int> em3 {0, 1, 2, 3, 4};
2524+ EXPECT_EQ(ea3, a3);
2525+ EXPECT_EQ(em3, m3);
2526 }
2527diff -crB ./src/init.cpp ../../komodo-jl777/src/init.cpp
2528*** ./src/init.cpp 2017-01-03 10:40:50.227329975 +0000
2529--- ../../komodo-jl777/src/init.cpp 2017-01-03 09:49:08.856506348 +0000
2530***************
2531*** 62,68 ****
2532 bool fFeeEstimatesInitialized = false;
2533
2534 #ifdef WIN32
2535! // Win32 LevelDB doesn't use filedescriptors, and the ones used for
2536 // accessing block files don't count towards the fd_set size limit
2537 // anyway.
2538 #define MIN_CORE_FILEDESCRIPTORS 0
2539--- 62,68 ----
2540 bool fFeeEstimatesInitialized = false;
2541
2542 #ifdef WIN32
2543! // Win32 LevelDB doesn't use file descriptors, and the ones used for
2544 // accessing block files don't count towards the fd_set size limit
2545 // anyway.
2546 #define MIN_CORE_FILEDESCRIPTORS 0
2547***************
2548*** 348,354 ****
2549 strUsage += HelpMessageOpt("-mintxfee=<amt>", strprintf("Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)",
2550 FormatMoney(CWallet::minTxFee.GetFeePerK())));
2551 strUsage += HelpMessageOpt("-paytxfee=<amt>", strprintf(_("Fee (in BTC/kB) to add to transactions you send (default: %s)"), FormatMoney(payTxFee.GetFeePerK())));
2552! strUsage += HelpMessageOpt("-rescan", _("Rescan the block chain for missing wallet transactions") + " " + _("on startup"));
2553 strUsage += HelpMessageOpt("-salvagewallet", _("Attempt to recover private keys from a corrupt wallet.dat") + " " + _("on startup"));
2554 strUsage += HelpMessageOpt("-sendfreetransactions", strprintf(_("Send transactions as zero-fee transactions if possible (default: %u)"), 0));
2555 strUsage += HelpMessageOpt("-spendzeroconfchange", strprintf(_("Spend unconfirmed change when sending transactions (default: %u)"), 1));
2556--- 348,354 ----
2557 strUsage += HelpMessageOpt("-mintxfee=<amt>", strprintf("Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)",
2558 FormatMoney(CWallet::minTxFee.GetFeePerK())));
2559 strUsage += HelpMessageOpt("-paytxfee=<amt>", strprintf(_("Fee (in BTC/kB) to add to transactions you send (default: %s)"), FormatMoney(payTxFee.GetFeePerK())));
2560! strUsage += HelpMessageOpt("-rescan", _("Rescan the blockchain for missing wallet transactions") + " " + _("on startup"));
2561 strUsage += HelpMessageOpt("-salvagewallet", _("Attempt to recover private keys from a corrupt wallet.dat") + " " + _("on startup"));
2562 strUsage += HelpMessageOpt("-sendfreetransactions", strprintf(_("Send transactions as zero-fee transactions if possible (default: %u)"), 0));
2563 strUsage += HelpMessageOpt("-spendzeroconfchange", strprintf(_("Spend unconfirmed change when sending transactions (default: %u)"), 1));
2564***************
2565*** 380,386 ****
2566 if (mode == HMM_BITCOIN_QT)
2567 debugCategories += ", qt";
2568 strUsage += HelpMessageOpt("-debug=<category>", strprintf(_("Output debugging information (default: %u, supplying <category> is optional)"), 0) + ". " +
2569! _("If <category> is not supplied, output all debugging information.") + _("<category> can be:") + " " + debugCategories + ".");
2570 #ifdef ENABLE_WALLET
2571 strUsage += HelpMessageOpt("-gen", strprintf(_("Generate coins (default: %u)"), 0));
2572 strUsage += HelpMessageOpt("-genproclimit=<n>", strprintf(_("Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)"), 1));
2573--- 380,386 ----
2574 if (mode == HMM_BITCOIN_QT)
2575 debugCategories += ", qt";
2576 strUsage += HelpMessageOpt("-debug=<category>", strprintf(_("Output debugging information (default: %u, supplying <category> is optional)"), 0) + ". " +
2577! _("If <category> is not supplied or if <category> = 1, output all debugging information.") + _("<category> can be:") + " " + debugCategories + ".");
2578 #ifdef ENABLE_WALLET
2579 strUsage += HelpMessageOpt("-gen", strprintf(_("Generate coins (default: %u)"), 0));
2580 strUsage += HelpMessageOpt("-genproclimit=<n>", strprintf(_("Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)"), 1));
2581***************
2582*** 425,431 ****
2583 strUsage += HelpMessageOpt("-rpcport=<port>", strprintf(_("Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)"), 8232, 18232));
2584 strUsage += HelpMessageOpt("-rpcallowip=<ip>", _("Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times"));
2585 strUsage += HelpMessageOpt("-rpcthreads=<n>", strprintf(_("Set the number of threads to service RPC calls (default: %d)"), 4));
2586! strUsage += HelpMessageOpt("-rpckeepalive", strprintf(_("RPC support for HTTP persistent connections (default: %d)"), 1));
2587
2588 // Disabled until we can lock notes and also tune performance of libsnark which by default uses multiple threads
2589 //strUsage += HelpMessageOpt("-rpcasyncthreads=<n>", strprintf(_("Set the number of threads to service Async RPC calls (default: %d)"), 1));
2590--- 425,434 ----
2591 strUsage += HelpMessageOpt("-rpcport=<port>", strprintf(_("Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)"), 8232, 18232));
2592 strUsage += HelpMessageOpt("-rpcallowip=<ip>", _("Allow JSON-RPC connections from specified source. Valid for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times"));
2593 strUsage += HelpMessageOpt("-rpcthreads=<n>", strprintf(_("Set the number of threads to service RPC calls (default: %d)"), 4));
2594!
2595! // TODO #1856: Re-enable support for persistent connections.
2596! // Disabled to avoid rpc deadlock #1680, until we backport upstream changes which replace boost::asio with libevent, or another solution is implemented.
2597! //strUsage += HelpMessageOpt("-rpckeepalive", strprintf(_("RPC support for HTTP persistent connections (default: %d)"), 1));
2598
2599 // Disabled until we can lock notes and also tune performance of libsnark which by default uses multiple threads
2600 //strUsage += HelpMessageOpt("-rpcasyncthreads=<n>", strprintf(_("Set the number of threads to service Async RPC calls (default: %d)"), 1));
2601***************
2602*** 447,452 ****
2603--- 450,460 ----
2604 strUsage += HelpMessageOpt("-min", _("Start minimized"));
2605 strUsage += HelpMessageOpt("-rootcertificates=<file>", _("Set SSL root certificates for payment request (default: -system-)"));
2606 strUsage += HelpMessageOpt("-splash", _("Show splash screen on startup (default: 1)"));
2607+ } else if (mode == HMM_BITCOIND) {
2608+ strUsage += HelpMessageGroup(_("Metrics Options (only if -daemon and -printtoconsole are not set):"));
2609+ strUsage += HelpMessageOpt("-showmetrics", _("Show metrics on stdout (default: 1 if running in a console, 0 otherwise)"));
2610+ strUsage += HelpMessageOpt("-metricsui", _("Set to 1 for a persistent metrics screen, 0 for sequential metrics output (default: 1 if running in a console, 0 otherwise)"));
2611+ strUsage += HelpMessageOpt("-metricsrefreshtime", strprintf(_("Number of seconds between metrics refreshes (default: %u if running in a console, %u otherwise)"), 1, 600));
2612 }
2613
2614 return strUsage;
2615***************
2616*** 538,548 ****
2617 RenameThread("zcash-loadblk");
2618 // -reindex
2619 if (fReindex) {
2620- #ifdef ENABLE_WALLET
2621- if (pwalletMain) {
2622- pwalletMain->ClearNoteWitnessCache();
2623- }
2624- #endif
2625 CImportingNow imp;
2626 int nFile = 0;
2627 while (true) {
2628--- 546,551 ----
2629***************
2630*** 980,1000 ****
2631 CScheduler::Function serviceLoop = boost::bind(&CScheduler::serviceQueue, &scheduler);
2632 threadGroup.create_thread(boost::bind(&TraceThread<CScheduler::Function>, "scheduler", serviceLoop));
2633
2634 if ((chainparams.NetworkIDString() != "regtest") &&
2635! GetBoolArg("-showmetrics", false) &&
2636 !fPrintToConsole && !GetBoolArg("-daemon", false)) {
2637 // Start the persistent metrics interface
2638 ConnectMetricsScreen();
2639 threadGroup.create_thread(&ThreadShowMetricsScreen);
2640 }
2641
2642- // Initialize Zcash circuit parameters
2643- ZC_LoadParams();
2644 // These must be disabled for now, they are buggy and we probably don't
2645 // want any of libsnark's profiling in production anyway.
2646 libsnark::inhibit_profiling_info = true;
2647 libsnark::inhibit_profiling_counters = true;
2648
2649 /* Start the RPC server already. It will be started in "warmup" mode
2650 * and not really process calls already (but it will signify connections
2651 * that the server is there and will be ready later). Warmup mode will
2652--- 983,1007 ----
2653 CScheduler::Function serviceLoop = boost::bind(&CScheduler::serviceQueue, &scheduler);
2654 threadGroup.create_thread(boost::bind(&TraceThread<CScheduler::Function>, "scheduler", serviceLoop));
2655
2656+ // Count uptime
2657+ MarkStartTime();
2658+
2659 if ((chainparams.NetworkIDString() != "regtest") &&
2660! GetBoolArg("-showmetrics", 0) &&
2661 !fPrintToConsole && !GetBoolArg("-daemon", false)) {
2662 // Start the persistent metrics interface
2663 ConnectMetricsScreen();
2664 threadGroup.create_thread(&ThreadShowMetricsScreen);
2665 }
2666
2667 // These must be disabled for now, they are buggy and we probably don't
2668 // want any of libsnark's profiling in production anyway.
2669 libsnark::inhibit_profiling_info = true;
2670 libsnark::inhibit_profiling_counters = true;
2671
2672+ // Initialize Zcash circuit parameters
2673+ ZC_LoadParams();
2674+
2675 /* Start the RPC server already. It will be started in "warmup" mode
2676 * and not really process calls already (but it will signify connections
2677 * that the server is there and will be ready later). Warmup mode will
2678***************
2679*** 1379,1385 ****
2680--- 1386,1395 ----
2681
2682 CBlockIndex *pindexRescan = chainActive.Tip();
2683 if (GetBoolArg("-rescan", false))
2684+ {
2685+ pwalletMain->ClearNoteWitnessCache();
2686 pindexRescan = chainActive.Genesis();
2687+ }
2688 else
2689 {
2690 CWalletDB walletdb(strWalletFile);
2691diff -crB ./src/komodo_gateway.h ../../komodo-jl777/src/komodo_gateway.h
2692*** ./src/komodo_gateway.h 2017-01-03 10:40:50.231330177 +0000
2693--- ../../komodo-jl777/src/komodo_gateway.h 2017-01-03 09:49:08.856506348 +0000
2694***************
2695*** 87,95 ****
2696--- 87,105 ----
2697 return(pax);
2698 }
2699
2700+ void komodo_paxdelete(struct pax_transaction *pax)
2701+ {
2702+ return; // breaks when out of order
2703+ pthread_mutex_lock(&komodo_mutex);
2704+ HASH_DELETE(hh,PAX,pax);
2705+ pthread_mutex_unlock(&komodo_mutex);
2706+ }
2707+
2708 void komodo_gateway_deposit(char *coinaddr,uint64_t value,char *symbol,uint64_t fiatoshis,uint8_t *rmd160,uint256 txid,uint16_t vout,uint8_t type,int32_t height,int32_t otherheight,char *source,int32_t approved) // assetchain context
2709 {
2710 struct pax_transaction *pax; uint8_t buf[35]; int32_t addflag = 0; struct komodo_state *sp; char str[16],dest[16],*s;
2711+ if ( KOMODO_PAX == 0 )
2712+ return;
2713 sp = komodo_stateptr(str,dest);
2714 pthread_mutex_lock(&komodo_mutex);
2715 pax_keyset(buf,txid,vout,type);
2716***************
2717*** 178,190 ****
2718 int32_t komodo_issued_opreturn(char *base,uint256 *txids,uint16_t *vouts,int64_t *values,int64_t *srcvalues,int32_t *kmdheights,int32_t *otherheights,int8_t *baseids,uint8_t *rmd160s,uint8_t *opretbuf,int32_t opretlen,int32_t iskomodo)
2719 {
2720 struct pax_transaction p,*pax; int32_t i,n=0,j,len=0,incr,height,otherheight; uint8_t type,rmd160[20]; uint64_t fiatoshis; char symbol[16];
2721! incr = 34 + (iskomodo * (2*sizeof(fiatoshis) + 2*sizeof(height) + 20 + 4));
2722! for (i=0; i<4; i++)
2723! base[i] = opretbuf[opretlen-4+i];
2724 //for (i=0; i<opretlen; i++)
2725 // printf("%02x",opretbuf[i]);
2726 //printf(" opretlen.%d (%s)\n",opretlen,base);
2727! //printf(" opretlen.%d vs %d incr.%d\n",opretlen,(int32_t)(2*sizeof(fiatoshis) + 2*sizeof(height) + 20 + 4),incr);
2728 //if ( ASSETCHAINS_SYMBOL[0] == 0 || strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0 )
2729 {
2730 type = opretbuf[0];
2731--- 188,201 ----
2732 int32_t komodo_issued_opreturn(char *base,uint256 *txids,uint16_t *vouts,int64_t *values,int64_t *srcvalues,int32_t *kmdheights,int32_t *otherheights,int8_t *baseids,uint8_t *rmd160s,uint8_t *opretbuf,int32_t opretlen,int32_t iskomodo)
2733 {
2734 struct pax_transaction p,*pax; int32_t i,n=0,j,len=0,incr,height,otherheight; uint8_t type,rmd160[20]; uint64_t fiatoshis; char symbol[16];
2735! if ( KOMODO_PAX == 0 )
2736! return(0);
2737! incr = 34 + (iskomodo * (2*sizeof(fiatoshis) + 2*sizeof(height) + 20));
2738! //41e77b91cb68dc2aa02fa88550eae6b6d44db676a7e935337b6d1392d9718f03cb0200305c90660400000000fbcbeb1f000000bde801006201000058e7945ad08ddba1eac9c9b6c8e1e97e8016a2d152
2739 //for (i=0; i<opretlen; i++)
2740 // printf("%02x",opretbuf[i]);
2741 //printf(" opretlen.%d (%s)\n",opretlen,base);
2742! //printf(" opretlen.%d vs %d incr.%d (%d)\n",opretlen,(int32_t)(2*sizeof(fiatoshis) + 2*sizeof(height) + 20 + 2),incr,opretlen/incr);
2743 //if ( ASSETCHAINS_SYMBOL[0] == 0 || strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0 )
2744 {
2745 type = opretbuf[0];
2746***************
2747*** 215,220 ****
2748--- 226,233 ----
2749 }
2750 else
2751 {
2752+ for (i=0; i<4; i++)
2753+ base[i] = opretbuf[opretlen-4+i];
2754 for (j=0; j<32; j++)
2755 {
2756 ((uint8_t *)&txids[n])[j] = opretbuf[len++];
2757***************
2758*** 238,259 ****
2759 return(n);
2760 }
2761
2762 uint64_t komodo_paxtotal()
2763 {
2764 struct pax_transaction *pax,*pax2,*tmp,*tmp2; char symbol[16],dest[16],*str; int32_t i,ht; int64_t checktoshis; uint64_t seed,total = 0; struct komodo_state *basesp;
2765 if ( komodo_isrealtime(&ht) == 0 )
2766 return(0);
2767 else
2768 {
2769 HASH_ITER(hh,PAX,pax,tmp)
2770 {
2771 if ( pax->type == 'A' || pax->type == 'D' || pax->type == 'X' )
2772 str = pax->symbol;
2773 else str = pax->source;
2774 basesp = komodo_stateptrget(str);
2775! if ( basesp != 0 && pax->didstats == 0 && pax->type == 'I' )
2776 {
2777! if ( (pax2= komodo_paxfind(pax->txid,pax->vout,'D')) != 0 )
2778 {
2779 if ( pax2->fiatoshis != 0 )
2780 {
2781--- 251,300 ----
2782 return(n);
2783 }
2784
2785+ int32_t komodo_paxcmp(char *symbol,int32_t kmdheight,uint64_t value,uint64_t checkvalue,uint64_t seed)
2786+ {
2787+ int32_t ratio;
2788+ if ( seed == 0 && checkvalue != 0 )
2789+ {
2790+ ratio = ((value << 6) / checkvalue);
2791+ if ( ratio >= 63 && ratio <= 65 )
2792+ return(0);
2793+ else
2794+ {
2795+ if ( kmdheight >= 86150 )
2796+ printf("ht.%d ignore mismatched %s value %lld vs checkvalue %lld -> ratio.%d\n",kmdheight,symbol,(long long)value,(long long)checkvalue,ratio);
2797+ return(-1);
2798+ }
2799+ }
2800+ else if ( checkvalue != 0 )
2801+ {
2802+ ratio = ((value << 10) / checkvalue);
2803+ if ( ratio >= 1023 && ratio <= 1025 )
2804+ return(0);
2805+ }
2806+ return(value != checkvalue);
2807+ }
2808+
2809 uint64_t komodo_paxtotal()
2810 {
2811 struct pax_transaction *pax,*pax2,*tmp,*tmp2; char symbol[16],dest[16],*str; int32_t i,ht; int64_t checktoshis; uint64_t seed,total = 0; struct komodo_state *basesp;
2812+ if ( KOMODO_PAX == 0 )
2813+ return(0);
2814 if ( komodo_isrealtime(&ht) == 0 )
2815 return(0);
2816 else
2817 {
2818 HASH_ITER(hh,PAX,pax,tmp)
2819 {
2820+ if ( pax->marked != 0 )
2821+ continue;
2822 if ( pax->type == 'A' || pax->type == 'D' || pax->type == 'X' )
2823 str = pax->symbol;
2824 else str = pax->source;
2825 basesp = komodo_stateptrget(str);
2826! if ( basesp != 0 && pax->didstats == 0 )
2827 {
2828! if ( pax->type == 'I' && (pax2= komodo_paxfind(pax->txid,pax->vout,'D')) != 0 )
2829 {
2830 if ( pax2->fiatoshis != 0 )
2831 {
2832***************
2833*** 267,305 ****
2834 pax->marked = pax->height;
2835 }
2836 }
2837 }
2838 }
2839 }
2840 komodo_stateptr(symbol,dest);
2841 HASH_ITER(hh,PAX,pax,tmp)
2842 {
2843! //printf("pax.%s marked.%d %.8f -> %.8f\n",pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis));
2844! if ( strcmp(symbol,pax->symbol) == 0 )
2845 {
2846 if ( pax->marked == 0 )
2847 {
2848 if ( komodo_is_issuer() != 0 )
2849! total += pax->fiatoshis;
2850! else if ( pax->approved != 0 )
2851 {
2852 if ( pax->validated != 0 )
2853 total += pax->komodoshis;
2854 else
2855 {
2856 seed = 0;
2857 checktoshis = komodo_paxprice(&seed,pax->height,pax->source,(char *)"KMD",(uint64_t)pax->fiatoshis);
2858 //printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f vs %.8f\n",pax->height,pax->symbol,(double)pax->fiatoshis/COIN,(double)pax->komodoshis/COIN,(double)checktoshis/COIN);
2859 //printf(" v%d %.8f k.%d ht.%d\n",pax->vout,dstr(pax->komodoshis),pax->height,pax->otherheight);
2860! if ( seed != 0 )
2861 {
2862! if ( checktoshis >= pax->komodoshis )
2863 {
2864 total += pax->komodoshis;
2865 pax->validated = pax->komodoshis;
2866 } else pax->marked = pax->height;
2867 }
2868 }
2869 }
2870 }
2871 }
2872 }
2873--- 308,382 ----
2874 pax->marked = pax->height;
2875 }
2876 }
2877+ else if ( pax->type == 'W' )
2878+ {
2879+ //bitcoin_address(coinaddr,addrtype,rmd160,20);
2880+ if ( (checktoshis= komodo_paxprice(&seed,pax->height,pax->source,(char *)"KMD",(uint64_t)pax->fiatoshis)) != 0 )
2881+ {
2882+ if ( komodo_paxcmp(pax->source,pax->height,pax->komodoshis,checktoshis,seed) != 0 )
2883+ {
2884+ pax->marked = pax->height;
2885+ //printf("WITHDRAW.%s mark <- %d %.8f != %.8f\n",pax->source,pax->height,dstr(checktoshis),dstr(pax->komodoshis));
2886+ }
2887+ else if ( pax->validated == 0 )
2888+ {
2889+ pax->validated = pax->komodoshis = checktoshis;
2890+ //int32_t j; for (j=0; j<32; j++)
2891+ // printf("%02x",((uint8_t *)&pax->txid)[j]);
2892+ //if ( strcmp(str,ASSETCHAINS_SYMBOL) == 0 )
2893+ // printf(" v%d %p got WITHDRAW.%s kmd.%d ht.%d %.8f -> %.8f/%.8f\n",pax->vout,pax,pax->source,pax->height,pax->otherheight,dstr(pax->fiatoshis),dstr(pax->komodoshis),dstr(checktoshis));
2894+ }
2895+ }
2896+ }
2897 }
2898 }
2899 }
2900 komodo_stateptr(symbol,dest);
2901 HASH_ITER(hh,PAX,pax,tmp)
2902 {
2903! pax->ready = 0;
2904! if ( 0 && pax->type == 'A' )
2905! printf("%p pax.%s <- %s marked.%d %.8f -> %.8f validated.%d approved.%d\n",pax,pax->symbol,pax->source,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis),pax->validated != 0,pax->approved != 0);
2906! if ( pax->marked != 0 )
2907! continue;
2908! if ( strcmp(symbol,pax->symbol) == 0 || pax->type == 'A' )
2909 {
2910 if ( pax->marked == 0 )
2911 {
2912 if ( komodo_is_issuer() != 0 )
2913! {
2914! if ( pax->validated != 0 && pax->type == 'D' )
2915! {
2916! total += pax->fiatoshis;
2917! pax->ready = 1;
2918! }
2919! }
2920! else if ( pax->approved != 0 && pax->type == 'A' )
2921 {
2922 if ( pax->validated != 0 )
2923+ {
2924 total += pax->komodoshis;
2925+ pax->ready = 1;
2926+ }
2927 else
2928 {
2929 seed = 0;
2930 checktoshis = komodo_paxprice(&seed,pax->height,pax->source,(char *)"KMD",(uint64_t)pax->fiatoshis);
2931 //printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f vs %.8f\n",pax->height,pax->symbol,(double)pax->fiatoshis/COIN,(double)pax->komodoshis/COIN,(double)checktoshis/COIN);
2932 //printf(" v%d %.8f k.%d ht.%d\n",pax->vout,dstr(pax->komodoshis),pax->height,pax->otherheight);
2933! if ( seed != 0 && checktoshis != 0 )
2934 {
2935! if ( checktoshis == pax->komodoshis )
2936 {
2937 total += pax->komodoshis;
2938 pax->validated = pax->komodoshis;
2939+ pax->ready = 1;
2940 } else pax->marked = pax->height;
2941 }
2942 }
2943 }
2944+ if ( 0 && pax->ready != 0 )
2945+ printf("%p (%c) pax.%s marked.%d %.8f -> %.8f validated.%d approved.%d\n",pax,pax->type,pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis),pax->validated != 0,pax->approved != 0);
2946 }
2947 }
2948 }
2949***************
2950*** 307,373 ****
2951 return(total);
2952 }
2953
2954! int32_t komodo_pending_withdraws(char *opretstr)
2955 {
2956! struct pax_transaction *pax,*tmp; uint8_t opretbuf[16384]; int32_t ht,len=0; uint64_t total = 0;
2957 if ( komodo_isrealtime(&ht) == 0 || ASSETCHAINS_SYMBOL[0] != 0 )
2958 return(0);
2959 HASH_ITER(hh,PAX,pax,tmp)
2960 {
2961! //printf("pax %s marked.%u approved.%u\n",pax->symbol,pax->marked,pax->approved);
2962! if ( pax->marked == 0 && strcmp((char *)"KMD",pax->symbol) == 0 && pax->approved == 0 )
2963 {
2964! // add 'A' opreturn entry
2965! if ( len == 0 )
2966! opretbuf[len++] = 'A';
2967! len += komodo_rwapproval(1,&opretbuf[len],pax);
2968! //printf("%s.(marked.%u approved.%d) %p\n",pax->source,pax->marked,pax->approved,pax);
2969 }
2970 }
2971! if ( len > 0 )
2972! init_hexbytes_noT(opretstr,opretbuf,len);
2973! else opretstr[0] = 0;
2974! fprintf(stderr,"komodo_pending_withdraws len.%d PAXTOTAL %.8f\n",len,dstr(komodo_paxtotal()));
2975 return(len);
2976 }
2977
2978 int32_t komodo_gateway_deposits(CMutableTransaction *txNew,char *base,int32_t tokomodo)
2979 {
2980 struct pax_transaction *pax,*tmp; char symbol[16],dest[16]; uint8_t *script,opcode,opret[16384],data[16384]; int32_t i,baseid,ht,len=0,opretlen=0,numvouts=1; struct komodo_state *sp; uint64_t available,deposited,issued,withdrawn,approved,redeemed,mask;
2981 sp = komodo_stateptr(symbol,dest);
2982 strcpy(symbol,base);
2983 PENDING_KOMODO_TX = 0;
2984 if ( tokomodo == 0 )
2985 {
2986 opcode = 'I';
2987 if ( komodo_isrealtime(&ht) == 0 )
2988 return(0);
2989! } else opcode = 'X';
2990 HASH_ITER(hh,PAX,pax,tmp)
2991 {
2992- //printf("pax.%s marked.%d %.8f -> %.8f\n",pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis));
2993- if ( strcmp(symbol,"KMD") == 0 && pax->approved == 0 )
2994- continue;
2995- //else if ( strcmp(symbol,"KMD") != 0 )
2996 {
2997 #ifdef KOMODO_ASSETCHAINS_WAITNOTARIZE
2998! struct komodo_state *kmdsp = komodo_stateptrget((char *)"KMD");
2999! if ( kmdsp != 0 && kmdsp->NOTARIZED_HEIGHT >= pax->height ) // assumes same chain as notarize
3000 pax->validated = pax->komodoshis; //kmdsp->NOTARIZED_HEIGHT;
3001 #endif
3002 }
3003! if ( pax_fiatstatus(&available,&deposited,&issued,&withdrawn,&approved,&redeemed,symbol) != 0 || available < pax->fiatoshis )
3004 {
3005! printf("miner: skip %s %.8f when avail %.8f\n",symbol,dstr(pax->fiatoshis),dstr(available));
3006 continue;
3007 }
3008! if ( pax->marked != 0 )
3009 continue;
3010! if ( strcmp(pax->symbol,symbol) != 0 || pax->validated == 0 )
3011 {
3012 //printf("pax->symbol.%s != %s or null pax->validated %.8f\n",pax->symbol,symbol,dstr(pax->validated));
3013 continue;
3014 }
3015 if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
3016 printf("pax.%s marked.%d %.8f -> %.8f\n",ASSETCHAINS_SYMBOL,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis));
3017 txNew->vout.resize(numvouts+1);
3018--- 384,518 ----
3019 return(total);
3020 }
3021
3022! static int _paxorder(const void *a,const void *b)
3023 {
3024! #define pax_a (*(struct pax_transaction **)a)
3025! #define pax_b (*(struct pax_transaction **)b)
3026! uint64_t aval,bval;
3027! aval = pax_a->fiatoshis + pax_a->komodoshis + pax_a->height;
3028! bval = pax_b->fiatoshis + pax_b->komodoshis + pax_b->height;
3029! if ( bval > aval )
3030! return(-1);
3031! else if ( bval < aval )
3032! return(1);
3033! return(0);
3034! #undef pax_a
3035! #undef pax_b
3036! }
3037!
3038! int32_t komodo_pending_withdraws(char *opretstr) // todo: enforce deterministic order
3039! {
3040! struct pax_transaction *pax,*pax2,*tmp,*paxes[64]; uint8_t opretbuf[16384]; int32_t i,n,ht,len=0; uint64_t total = 0;
3041! if ( KOMODO_PAX == 0 )
3042! return(0);
3043 if ( komodo_isrealtime(&ht) == 0 || ASSETCHAINS_SYMBOL[0] != 0 )
3044 return(0);
3045+ n = 0;
3046 HASH_ITER(hh,PAX,pax,tmp)
3047 {
3048! if ( pax->type == 'W' )
3049 {
3050! if ( (pax2= komodo_paxfind(pax->txid,pax->vout,'A')) != 0 )
3051! {
3052! if ( pax2->approved != 0 )
3053! pax->approved = pax2->approved;
3054! }
3055! else if ( (pax2= komodo_paxfind(pax->txid,pax->vout,'X')) != 0 )
3056! pax->approved = pax->height;
3057! //printf("pax %s marked.%u approved.%u validated.%llu\n",pax->symbol,pax->marked,pax->approved,(long long)pax->validated);
3058! if ( pax->marked == 0 && strcmp((char *)"KMD",pax->symbol) == 0 && pax->approved == 0 && pax->validated != 0 )
3059! {
3060! if ( n < sizeof(paxes)/sizeof(*paxes) )
3061! {
3062! paxes[n++] = pax;
3063! //int32_t j; for (j=0; j<32; j++)
3064! // printf("%02x",((uint8_t *)&pax->txid)[j]);
3065! //printf(" %s.(kmdht.%d ht.%d marked.%u approved.%d validated %.8f) %.8f\n",pax->source,pax->height,pax->otherheight,pax->marked,pax->approved,dstr(pax->validated),dstr(pax->komodoshis));
3066! }
3067! }
3068 }
3069 }
3070! opretstr[0] = 0;
3071! if ( n > 0 )
3072! {
3073! opretbuf[len++] = 'A';
3074! qsort(paxes,n,sizeof(*paxes),_paxorder);
3075! for (i=0; i<n; i++)
3076! {
3077! if ( len < (sizeof(opretbuf)>>3)*7 )
3078! len += komodo_rwapproval(1,&opretbuf[len],paxes[i]);
3079! }
3080! if ( len > 0 )
3081! init_hexbytes_noT(opretstr,opretbuf,len);
3082! }
3083! //fprintf(stderr,"komodo_pending_withdraws len.%d PAXTOTAL %.8f\n",len,dstr(komodo_paxtotal()));
3084 return(len);
3085 }
3086
3087 int32_t komodo_gateway_deposits(CMutableTransaction *txNew,char *base,int32_t tokomodo)
3088 {
3089 struct pax_transaction *pax,*tmp; char symbol[16],dest[16]; uint8_t *script,opcode,opret[16384],data[16384]; int32_t i,baseid,ht,len=0,opretlen=0,numvouts=1; struct komodo_state *sp; uint64_t available,deposited,issued,withdrawn,approved,redeemed,mask;
3090+ if ( KOMODO_PAX == 0 )
3091+ return(0);
3092+ struct komodo_state *kmdsp = komodo_stateptrget((char *)"KMD");
3093 sp = komodo_stateptr(symbol,dest);
3094 strcpy(symbol,base);
3095+ if ( ASSETCHAINS_SYMBOL[0] != 0 && komodo_baseid(ASSETCHAINS_SYMBOL) < 0 )
3096+ return(0);
3097 PENDING_KOMODO_TX = 0;
3098 if ( tokomodo == 0 )
3099 {
3100 opcode = 'I';
3101 if ( komodo_isrealtime(&ht) == 0 )
3102 return(0);
3103! }
3104! else
3105! {
3106! opcode = 'X';
3107! if ( komodo_paxtotal() == 0 )
3108! return(0);
3109! }
3110 HASH_ITER(hh,PAX,pax,tmp)
3111 {
3112 {
3113 #ifdef KOMODO_ASSETCHAINS_WAITNOTARIZE
3114! if ( kmdsp != 0 && (kmdsp->NOTARIZED_HEIGHT >= pax->height || kmdsp->CURRENT_HEIGHT > pax->height+30) ) // assumes same chain as notarize
3115 pax->validated = pax->komodoshis; //kmdsp->NOTARIZED_HEIGHT;
3116+ else pax->validated = pax->ready = 0;
3117 #endif
3118 }
3119! if ( ASSETCHAINS_SYMBOL[0] != 0 && (pax_fiatstatus(&available,&deposited,&issued,&withdrawn,&approved,&redeemed,symbol) != 0 || available < pax->fiatoshis) )
3120 {
3121! if ( strcmp(ASSETCHAINS_SYMBOL,symbol) == 0 )
3122! printf("miner.[%s]: skip %s %.8f when avail %.8f\n",ASSETCHAINS_SYMBOL,symbol,dstr(pax->fiatoshis),dstr(available));
3123 continue;
3124 }
3125! /*printf("pax.%s marked.%d %.8f -> %.8f ready.%d validated.%d\n",pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis),pax->ready!=0,pax->validated!=0);
3126! if ( pax->marked != 0 || (pax->type != 'D' && pax->type != 'A') || pax->ready == 0 )
3127! {
3128! printf("reject 2\n");
3129 continue;
3130! }*/
3131! if ( ASSETCHAINS_SYMBOL[0] != 0 && (strcmp(pax->symbol,symbol) != 0 || pax->validated == 0) )
3132 {
3133 //printf("pax->symbol.%s != %s or null pax->validated %.8f\n",pax->symbol,symbol,dstr(pax->validated));
3134 continue;
3135 }
3136+ if ( pax->ready == 0 )
3137+ continue;
3138+ if ( pax->type == 'A' && ASSETCHAINS_SYMBOL[0] == 0 )
3139+ {
3140+ if ( kmdsp != 0 )
3141+ {
3142+ if ( (baseid= komodo_baseid(pax->symbol)) < 0 || ((1LL << baseid) & sp->RTmask) == 0 )
3143+ {
3144+ printf("not RT for (%s) %llx baseid.%d %llx\n",pax->symbol,(long long)sp->RTmask,baseid,(long long)(1LL<<baseid));
3145+ continue;
3146+ }
3147+ } else continue;
3148+ }
3149+
3150+ //printf("redeem.%d? (%c) %p pax.%s marked.%d %.8f -> %.8f ready.%d validated.%d approved.%d\n",tokomodo,pax->type,pax,pax->symbol,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis),pax->ready!=0,pax->validated!=0,pax->approved!=0);
3151 if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
3152 printf("pax.%s marked.%d %.8f -> %.8f\n",ASSETCHAINS_SYMBOL,pax->marked,dstr(pax->komodoshis),dstr(pax->fiatoshis));
3153 txNew->vout.resize(numvouts+1);
3154***************
3155*** 392,398 ****
3156 {
3157 len += komodo_rwapproval(1,&data[len],pax);
3158 PENDING_KOMODO_TX += pax->komodoshis;
3159! //printf(" vout.%u DEPOSIT %.8f <- pax.%s pending %.8f | ",pax->vout,(double)txNew->vout[numvouts].nValue/COIN,symbol,dstr(PENDING_KOMODO_TX));
3160 }
3161 if ( numvouts++ >= 64 )
3162 break;
3163--- 537,543 ----
3164 {
3165 len += komodo_rwapproval(1,&data[len],pax);
3166 PENDING_KOMODO_TX += pax->komodoshis;
3167! printf(" vout.%u DEPOSIT %.8f <- pax.%s pending %.8f | ",pax->vout,(double)txNew->vout[numvouts].nValue/COIN,symbol,dstr(PENDING_KOMODO_TX));
3168 }
3169 if ( numvouts++ >= 64 )
3170 break;
3171***************
3172*** 419,424 ****
3173--- 564,571 ----
3174 int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above block is valid pax pricing
3175 {
3176 int32_t i,j,n,num,opretlen,offset=1,errs=0,matched=0,kmdheights[64],otherheights[64]; uint256 hash,txids[64]; char symbol[16],base[16]; uint16_t vouts[64]; int8_t baseids[64]; uint8_t *script,opcode,rmd160s[64*20]; uint64_t available,deposited,issued,withdrawn,approved,redeemed; int64_t values[64],srcvalues[64]; struct pax_transaction *pax;
3177+ if ( KOMODO_PAX == 0 )
3178+ return(0);
3179 memset(baseids,0xff,sizeof(baseids));
3180 memset(values,0,sizeof(values));
3181 memset(srcvalues,0,sizeof(srcvalues));
3182***************
3183*** 442,447 ****
3184--- 589,603 ----
3185 {
3186 strcpy(symbol,ASSETCHAINS_SYMBOL);
3187 opcode = 'I';
3188+ if ( komodo_baseid(symbol) < 0 )
3189+ {
3190+ if ( block.vtx[0].vout.size() != 1 )
3191+ {
3192+ printf("%s has more than one coinbase?\n",symbol);
3193+ return(-1);
3194+ }
3195+ return(0);
3196+ }
3197 }
3198 if ( script[offset] == opcode && opretlen < block.vtx[0].vout[n-1].scriptPubKey.size() )
3199 {
3200***************
3201*** 449,455 ****
3202 {
3203 for (i=1; i<n-1; i++)
3204 {
3205! if ( (pax= komodo_paxfinds(txids[i-1],vouts[i-1])) != 0 )
3206 {
3207 pax->type = opcode;
3208 if ( opcode == 'I' && pax_fiatstatus(&available,&deposited,&issued,&withdrawn,&approved,&redeemed,symbol) != 0 || available < pax->fiatoshis )
3209--- 605,611 ----
3210 {
3211 for (i=1; i<n-1; i++)
3212 {
3213! if ( (pax= komodo_paxfinds(txids[i-1],vouts[i-1])) != 0 ) // finds... make sure right one
3214 {
3215 pax->type = opcode;
3216 if ( opcode == 'I' && pax_fiatstatus(&available,&deposited,&issued,&withdrawn,&approved,&redeemed,symbol) != 0 || available < pax->fiatoshis )
3217***************
3218*** 461,476 ****
3219 {
3220 if ( pax->marked != 0 && height >= 80820 )
3221 {
3222! printf("%c errs.%d i.%d match %.8f vs %.8f pax.%p\n",opcode,errs,i,dstr(opcode == 'I' ? pax->fiatoshis : pax->komodoshis),dstr(block.vtx[0].vout[i].nValue),pax);
3223 errs++;
3224! } else matched++;
3225 }
3226 else
3227 {
3228 for (j=0; j<32; j++)
3229 printf("%02x",((uint8_t *)&txids[i-1])[j]);
3230 printf(" cant paxfind %c txid\n",opcode);
3231! printf("%c errs.%d i.%d match %.8f vs %.8f pax.%p\n",opcode,errs,i,dstr(opcode == 'I' ? pax->fiatoshis : pax->komodoshis),dstr(block.vtx[0].vout[i].nValue),pax);
3232 }
3233 }
3234 else
3235--- 617,638 ----
3236 {
3237 if ( pax->marked != 0 && height >= 80820 )
3238 {
3239! printf(">>>>>>>>>>> %c errs.%d i.%d match %.8f vs %.8f pax.%p\n",opcode,errs,i,dstr(opcode == 'I' ? pax->fiatoshis : pax->komodoshis),dstr(block.vtx[0].vout[i].nValue),pax);
3240 errs++;
3241! }
3242! else
3243! {
3244! if ( opcode == 'X' )
3245! printf("check deposit validates %s %.8f -> %.8f\n",CURRENCIES[baseids[i]],dstr(srcvalues[i]),dstr(values[i]));
3246! matched++;
3247! }
3248 }
3249 else
3250 {
3251 for (j=0; j<32; j++)
3252 printf("%02x",((uint8_t *)&txids[i-1])[j]);
3253 printf(" cant paxfind %c txid\n",opcode);
3254! printf(">>>>>>>>>>> %c errs.%d i.%d match %.8f vs %.8f pax.%p\n",opcode,errs,i,dstr(opcode == 'I' ? pax->fiatoshis : pax->komodoshis),dstr(block.vtx[0].vout[i].nValue),pax);
3255 }
3256 }
3257 else
3258***************
3259*** 478,491 ****
3260 hash = block.GetHash();
3261 for (j=0; j<32; j++)
3262 printf("%02x",((uint8_t *)&hash)[j]);
3263! printf(" ht.%d blockhash X couldnt find vout.[%d]\n",height,i);
3264 }
3265 }
3266! if ( matched != num )
3267 {
3268 printf("WOULD REJECT %s: ht.%d (%c) matched.%d vs num.%d\n",symbol,height,opcode,matched,num);
3269 // can easily happen depending on order of loading
3270! if ( height > 100000 ) //&& opcode == 'X' )
3271 {
3272 printf("REJECT: ht.%d (%c) matched.%d vs num.%d\n",height,opcode,matched,num);
3273 return(-1);
3274--- 640,653 ----
3275 hash = block.GetHash();
3276 for (j=0; j<32; j++)
3277 printf("%02x",((uint8_t *)&hash)[j]);
3278! printf(" kht.%d ht.%d %.8f %.8f blockhash couldnt find vout.[%d]\n",kmdheights[i-1],otherheights[i-1],dstr(values[i-1]),dstr(srcvalues[i]),i);
3279 }
3280 }
3281! if ( height <= chainActive.Tip()->nHeight && matched != num )
3282 {
3283 printf("WOULD REJECT %s: ht.%d (%c) matched.%d vs num.%d\n",symbol,height,opcode,matched,num);
3284 // can easily happen depending on order of loading
3285! if ( height > 200000 )
3286 {
3287 printf("REJECT: ht.%d (%c) matched.%d vs num.%d\n",height,opcode,matched,num);
3288 return(-1);
3289***************
3290*** 497,530 ****
3291 return(0);
3292 }
3293
3294- int32_t komodo_paxcmp(char *symbol,int32_t kmdheight,uint64_t value,uint64_t checkvalue,uint64_t seed)
3295- {
3296- int32_t ratio;
3297- if ( seed == 0 && checkvalue != 0 )
3298- {
3299- ratio = ((value << 6) / checkvalue);
3300- if ( ratio >= 63 && ratio <= 65 )
3301- return(0);
3302- else
3303- {
3304- if ( kmdheight >= 86150 )
3305- printf("ht.%d ignore mismatched %s value %lld vs checkvalue %lld -> ratio.%d\n",kmdheight,symbol,(long long)value,(long long)checkvalue,ratio);
3306- return(-1);
3307- }
3308- }
3309- else if ( checkvalue != 0 )
3310- {
3311- ratio = ((value << 10) / checkvalue);
3312- if ( ratio >= 1023 && ratio <= 1025 )
3313- return(0);
3314- }
3315- return(value != checkvalue);
3316- }
3317-
3318 const char *komodo_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int32_t opretlen,uint256 txid,uint16_t vout,char *source)
3319 {
3320 uint8_t rmd160[20],rmd160s[64*20],addrtype,shortflag,pubkey33[33]; int32_t didstats,i,j,n,len,tokomodo,kmdheight,otherheights[64],kmdheights[64]; int8_t baseids[64]; char base[4],coinaddr[64],destaddr[64]; uint256 txids[64]; uint16_t vouts[64]; uint64_t convtoshis,seed; int64_t fiatoshis,komodoshis,checktoshis,values[64],srcvalues[64]; struct pax_transaction *pax,*pax2; struct komodo_state *basesp; double diff;
3321 const char *typestr = "unknown";
3322 memset(baseids,0xff,sizeof(baseids));
3323 memset(values,0,sizeof(values));
3324 memset(srcvalues,0,sizeof(srcvalues));
3325--- 659,675 ----
3326 return(0);
3327 }
3328
3329 const char *komodo_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int32_t opretlen,uint256 txid,uint16_t vout,char *source)
3330 {
3331 uint8_t rmd160[20],rmd160s[64*20],addrtype,shortflag,pubkey33[33]; int32_t didstats,i,j,n,len,tokomodo,kmdheight,otherheights[64],kmdheights[64]; int8_t baseids[64]; char base[4],coinaddr[64],destaddr[64]; uint256 txids[64]; uint16_t vouts[64]; uint64_t convtoshis,seed; int64_t fiatoshis,komodoshis,checktoshis,values[64],srcvalues[64]; struct pax_transaction *pax,*pax2; struct komodo_state *basesp; double diff;
3332 const char *typestr = "unknown";
3333+ if ( KOMODO_PAX == 0 )
3334+ return("nopax");
3335+ if ( ASSETCHAINS_SYMBOL[0] != 0 && komodo_baseid(ASSETCHAINS_SYMBOL) < 0 )
3336+ {
3337+ //printf("komodo_opreturn skip %s\n",ASSETCHAINS_SYMBOL);
3338+ return("assetchain");
3339+ }
3340 memset(baseids,0xff,sizeof(baseids));
3341 memset(values,0,sizeof(values));
3342 memset(srcvalues,0,sizeof(srcvalues));
3343***************
3344*** 546,552 ****
3345 if ( kmdheight <= height )
3346 {
3347 didstats = 0;
3348! if ( strcmp(base,ASSETCHAINS_SYMBOL) == 0 )
3349 {
3350 printf("(%s) (%s) kmdheight.%d vs height.%d check %.8f vs %.8f tokomodo.%d %d seed.%llx\n",ASSETCHAINS_SYMBOL,base,kmdheight,height,dstr(checktoshis),dstr(value),komodo_is_issuer(),strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0,(long long)seed);
3351 for (i=0; i<32; i++)
3352--- 691,697 ----
3353 if ( kmdheight <= height )
3354 {
3355 didstats = 0;
3356! if ( 0 && strcmp(base,ASSETCHAINS_SYMBOL) == 0 )
3357 {
3358 printf("(%s) (%s) kmdheight.%d vs height.%d check %.8f vs %.8f tokomodo.%d %d seed.%llx\n",ASSETCHAINS_SYMBOL,base,kmdheight,height,dstr(checktoshis),dstr(value),komodo_is_issuer(),strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0,(long long)seed);
3359 for (i=0; i<32; i++)
3360***************
3361*** 592,598 ****
3362 pax2->fiatoshis = pax->fiatoshis;
3363 pax2->komodoshis = pax->komodoshis;
3364 pax->marked = pax2->marked = pax->height;
3365! pax->otherheight = height;
3366 if ( pax2->didstats == 0 )
3367 {
3368 if ( (basesp= komodo_stateptrget(base)) != 0 )
3369--- 737,743 ----
3370 pax2->fiatoshis = pax->fiatoshis;
3371 pax2->komodoshis = pax->komodoshis;
3372 pax->marked = pax2->marked = pax->height;
3373! pax2->height = pax->height = height;
3374 if ( pax2->didstats == 0 )
3375 {
3376 if ( (basesp= komodo_stateptrget(base)) != 0 )
3377***************
3378*** 632,638 ****
3379 {
3380 pax->type = opretbuf[0];
3381 strcpy(pax->source,(char *)&opretbuf[opretlen-4]);
3382! if ( (pax2= komodo_paxfind(txids[i],vouts[i],'D')) != 0 )
3383 {
3384 // realtime path?
3385 pax->fiatoshis = pax2->fiatoshis;
3386--- 777,783 ----
3387 {
3388 pax->type = opretbuf[0];
3389 strcpy(pax->source,(char *)&opretbuf[opretlen-4]);
3390! if ( (pax2= komodo_paxfind(txids[i],vouts[i],'D')) != 0 && pax2->fiatoshis != 0 && pax2->komodoshis != 0 )
3391 {
3392 // realtime path?
3393 pax->fiatoshis = pax2->fiatoshis;
3394***************
3395*** 651,665 ****
3396 }
3397 }
3398 }
3399- komodo_paxmark(pax->height,txids[i],vouts[i],'D',height);
3400 }
3401 }
3402 } else printf("opreturn none issued?\n");
3403 }
3404- if ( strcmp(source,ASSETCHAINS_SYMBOL) == 0 )
3405- printf("source.%s opreturn[I] matches %s\n",source,(char *)&opretbuf[opretlen-4]);
3406 }
3407! else if ( opretbuf[0] == 'W' && opretlen >= 38 )
3408 {
3409 tokomodo = 1;
3410 iguana_rwnum(0,&opretbuf[34],sizeof(kmdheight),&kmdheight);
3411--- 796,811 ----
3412 }
3413 }
3414 }
3415 }
3416+ if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'I',height)) != 0 )
3417+ komodo_paxdelete(pax);
3418+ if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'D',height)) != 0 )
3419+ komodo_paxdelete(pax);
3420 }
3421 } else printf("opreturn none issued?\n");
3422 }
3423 }
3424! else if ( opretbuf[0] == 'W' )//&& opretlen >= 38 )
3425 {
3426 tokomodo = 1;
3427 iguana_rwnum(0,&opretbuf[34],sizeof(kmdheight),&kmdheight);
3428***************
3429*** 668,676 ****
3430 bitcoin_address(coinaddr,addrtype,rmd160,20);
3431 checktoshis = PAX_fiatdest(&seed,tokomodo,destaddr,pubkey33,coinaddr,kmdheight,base,value);
3432 typestr = "withdraw";
3433! //printf("%s.height.%d vs height.%d check %.8f/%.8f vs %.8f tokomodo.%d %d seed.%llx -> (%s)\n",ASSETCHAINS_SYMBOL,kmdheight,height,dstr(checktoshis),dstr(komodoshis),dstr(value),komodo_is_issuer(),strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0,(long long)seed,coinaddr);
3434 didstats = 0;
3435! if ( komodo_paxcmp(base,kmdheight,komodoshis,checktoshis,seed) == 0 )
3436 {
3437 if ( value != 0 && ((pax= komodo_paxfind(txid,vout,'W')) == 0 || pax->didstats == 0) )
3438 {
3439--- 814,823 ----
3440 bitcoin_address(coinaddr,addrtype,rmd160,20);
3441 checktoshis = PAX_fiatdest(&seed,tokomodo,destaddr,pubkey33,coinaddr,kmdheight,base,value);
3442 typestr = "withdraw";
3443! if ( 0 && strcmp(base,"RUB") == 0 )
3444! printf("RUB WITHDRAW %s.height.%d vs height.%d check %.8f/%.8f vs %.8f tokomodo.%d %d seed.%llx -> (%s) len.%d\n",ASSETCHAINS_SYMBOL,kmdheight,height,dstr(checktoshis),dstr(komodoshis),dstr(value),komodo_is_issuer(),strncmp(ASSETCHAINS_SYMBOL,base,strlen(base)) == 0,(long long)seed,coinaddr,opretlen);
3445 didstats = 0;
3446! //if ( komodo_paxcmp(base,kmdheight,komodoshis,checktoshis,seed) == 0 )
3447 {
3448 if ( value != 0 && ((pax= komodo_paxfind(txid,vout,'W')) == 0 || pax->didstats == 0) )
3449 {
3450***************
3451*** 679,697 ****
3452 basesp->withdrawn += value;
3453 didstats = 1;
3454 if ( strcmp(base,ASSETCHAINS_SYMBOL) == 0 )
3455! printf("########### %p withdrawn %s += %.8f\n",basesp,base,dstr(value));
3456 }
3457! //printf("notarize %s %.8f -> %.8f kmd.%d other.%d\n",ASSETCHAINS_SYMBOL,dstr(value),dstr(komodoshis),kmdheight,height);
3458 }
3459! komodo_gateway_deposit(coinaddr,komodoshis,(char *)"KMD",value,rmd160,txid,vout,'W',kmdheight,height,source,0);
3460 if ( (pax= komodo_paxfind(txid,vout,'W')) != 0 )
3461 {
3462- if ( didstats != 0 )
3463- pax->didstats = 1;
3464 pax->type = opretbuf[0];
3465! pax->validated = komodoshis;
3466 }
3467! }
3468 }
3469 else if ( tokomodo != 0 && opretbuf[0] == 'A' )
3470 {
3471--- 826,848 ----
3472 basesp->withdrawn += value;
3473 didstats = 1;
3474 if ( strcmp(base,ASSETCHAINS_SYMBOL) == 0 )
3475! printf("########### %p withdrawn %s += %.8f check %.8f\n",basesp,base,dstr(value),dstr(checktoshis));
3476 }
3477! if ( 0 && strcmp(base,"RUB") == 0 && (pax == 0 || pax->approved == 0) )
3478! printf("notarize %s %.8f -> %.8f kmd.%d other.%d\n",ASSETCHAINS_SYMBOL,dstr(value),dstr(komodoshis),kmdheight,height);
3479 }
3480! komodo_gateway_deposit(coinaddr,0,(char *)"KMD",value,rmd160,txid,vout,'W',kmdheight,height,source,0);
3481 if ( (pax= komodo_paxfind(txid,vout,'W')) != 0 )
3482 {
3483 pax->type = opretbuf[0];
3484! strcpy(pax->source,base);
3485! strcpy(pax->symbol,"KMD");
3486! pax->height = kmdheight;
3487! pax->otherheight = height;
3488! pax->komodoshis = komodoshis;
3489 }
3490! } // else printf("withdraw %s paxcmp ht.%d %d error value %.8f -> %.8f vs %.8f\n",base,kmdheight,height,dstr(value),dstr(komodoshis),dstr(checktoshis));
3491! // need to allocate pax
3492 }
3493 else if ( tokomodo != 0 && opretbuf[0] == 'A' )
3494 {
3495***************
3496*** 700,756 ****
3497 {
3498 for (i=0; i<opretlen; i++)
3499 printf("%02x",opretbuf[i]);
3500! printf(" opret[%c] else path tokomodo.%d ht.%d before %.8f\n",opretbuf[0],tokomodo,height,dstr(komodo_paxtotal()));
3501 }
3502 if ( (n= komodo_issued_opreturn(base,txids,vouts,values,srcvalues,kmdheights,otherheights,baseids,rmd160s,opretbuf,opretlen,1)) > 0 )
3503 {
3504 for (i=0; i<n; i++)
3505 {
3506 if ( baseids[i] < 0 )
3507- continue;
3508- didstats = 0;
3509- seed = 0;
3510- checktoshis = komodo_paxprice(&seed,kmdheights[i],CURRENCIES[baseids[i]],(char *)"KMD",(uint64_t)srcvalues[i]);
3511- /*printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f vs %.8f\n",kmdheights[i],CURRENCIES[baseids[i]],(double)srcvalues[i]/COIN,(double)values[i]/COIN,(double)checktoshis/COIN);
3512- for (j=0; j<32; j++)
3513- printf("%02x",((uint8_t *)&txids[i])[j]);
3514- printf(" v%d %.8f k.%d ht.%d base.%d\n",vouts[i],dstr(values[i]),kmdheights[i],otherheights[i],baseids[i]);*/
3515- if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) == 0 )
3516 {
3517! bitcoin_address(coinaddr,60,&rmd160s[i*20],20);
3518! komodo_gateway_deposit(coinaddr,values[i],CURRENCIES[baseids[i]],srcvalues[i],&rmd160s[i*20],txids[i],vouts[i],'A',kmdheights[i],otherheights[i],CURRENCIES[baseids[i]],kmdheights[i]);
3519! komodo_paxmark(height,txids[i],vouts[i],'W',height);
3520! komodo_paxmark(height,txids[i],vouts[i],'A',height);
3521! if ( srcvalues[i] != 0 && (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
3522 {
3523! basesp->approved += srcvalues[i];
3524! didstats = 1;
3525! if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3526! printf("########### %p approved %s += %.8f\n",basesp,CURRENCIES[baseids[i]],dstr(srcvalues[i]));
3527 }
3528! //printf(" i.%d (%s) <- %.8f ADDFLAG APPROVED\n",i,coinaddr,dstr(values[i]));
3529 }
3530! else if ( pax->didstats == 0 && srcvalues[i] != 0 )
3531! {
3532! if ( (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
3533 {
3534! basesp->approved += srcvalues[i];
3535! didstats = 1;
3536! if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3537! printf("########### %p approved %s += %.8f\n",basesp,CURRENCIES[baseids[i]],dstr(srcvalues[i]));
3538 }
3539- } //else printf(" i.%d of n.%d pax.%p baseids[] %d\n",i,n,pax,baseids[i]);
3540- if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) != 0 )
3541- {
3542- pax->type = opretbuf[0];
3543- pax->approved = kmdheights[i];
3544- if ( didstats != 0 )
3545- pax->didstats = 1;
3546- if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3547- printf(" i.%d approved.%d <<<<<<<<<<<<< APPROVED %p\n",i,kmdheights[i],pax);
3548 }
3549 }
3550! }
3551 //printf("extra.[%d] after %.8f\n",n,dstr(komodo_paxtotal()));
3552 }
3553 else if ( opretbuf[0] == 'X' )
3554--- 851,928 ----
3555 {
3556 for (i=0; i<opretlen; i++)
3557 printf("%02x",opretbuf[i]);
3558! printf(" opret[%c] else path tokomodo.%d ht.%d before %.8f opretlen.%d\n",opretbuf[0],tokomodo,height,dstr(komodo_paxtotal()),opretlen);
3559 }
3560 if ( (n= komodo_issued_opreturn(base,txids,vouts,values,srcvalues,kmdheights,otherheights,baseids,rmd160s,opretbuf,opretlen,1)) > 0 )
3561 {
3562 for (i=0; i<n; i++)
3563 {
3564+ //for (j=0; j<32; j++)
3565+ // printf("%02x",((uint8_t *)&txids[i])[j]);
3566+ //printf(" v%d %.8f %.8f k.%d ht.%d base.%d\n",vouts[i],dstr(values[i]),dstr(srcvalues[i]),kmdheights[i],otherheights[i],baseids[i]);
3567 if ( baseids[i] < 0 )
3568 {
3569! for (i=0; i<opretlen; i++)
3570! printf("%02x",opretbuf[i]);
3571! printf(" opret[%c] else path tokomodo.%d ht.%d before %.8f opretlen.%d\n",opretbuf[0],tokomodo,height,dstr(komodo_paxtotal()),opretlen);
3572! //printf("baseids[%d] %d\n",i,baseids[i]);
3573! if ( (pax= komodo_paxfind(txids[i],vouts[i],'W')) != 0 || (pax= komodo_paxfind(txids[i],vouts[i],'X')) != 0 )
3574 {
3575! baseids[i] = komodo_baseid(pax->symbol);
3576! printf("override neg1 with (%s)\n",pax->symbol);
3577 }
3578! if ( baseids[i] < 0 )
3579! continue;
3580 }
3581! didstats = 0;
3582! seed = 0;
3583! checktoshis = komodo_paxprice(&seed,kmdheights[i],CURRENCIES[baseids[i]],(char *)"KMD",(uint64_t)values[i]);
3584! //printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f vs %.8f\n",kmdheights[i],CURRENCIES[baseids[i]],(double)values[i]/COIN,(double)srcvalues[i]/COIN,(double)checktoshis/COIN);
3585! if ( srcvalues[i] == checktoshis )
3586! {
3587! if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) == 0 )
3588! {
3589! bitcoin_address(coinaddr,60,&rmd160s[i*20],20);
3590! komodo_gateway_deposit(coinaddr,srcvalues[i],CURRENCIES[baseids[i]],values[i],&rmd160s[i*20],txids[i],vouts[i],'A',kmdheights[i],otherheights[i],CURRENCIES[baseids[i]],kmdheights[i]);
3591! if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) == 0 )
3592! printf("unexpected null pax for approve\n");
3593! else pax->validated = checktoshis;
3594! if ( (pax2= komodo_paxfind(txids[i],vouts[i],'W')) != 0 )
3595! pax2->approved = kmdheights[i];
3596! komodo_paxmark(height,txids[i],vouts[i],'W',height);
3597! //komodo_paxmark(height,txids[i],vouts[i],'A',height);
3598! if ( values[i] != 0 && (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
3599! {
3600! basesp->approved += values[i];
3601! didstats = 1;
3602! if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3603! printf("pax.%p ########### %p approved %s += %.8f -> %.8f/%.8f kht.%d %d\n",pax,basesp,CURRENCIES[baseids[i]],dstr(values[i]),dstr(srcvalues[i]),dstr(checktoshis),kmdheights[i],otherheights[i]);
3604! }
3605! //printf(" i.%d (%s) <- %.8f ADDFLAG APPROVED\n",i,coinaddr,dstr(values[i]));
3606! }
3607! else if ( pax->didstats == 0 && srcvalues[i] != 0 )
3608 {
3609! if ( (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
3610! {
3611! basesp->approved += values[i];
3612! didstats = 1;
3613! if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3614! printf("pax.%p ########### %p approved %s += %.8f -> %.8f/%.8f\n",pax,basesp,CURRENCIES[baseids[i]],dstr(values[i]),dstr(srcvalues[i]),dstr(checktoshis));
3615! }
3616! } //else printf(" i.%d of n.%d pax.%p baseids[] %d\n",i,n,pax,baseids[i]);
3617! if ( (pax= komodo_paxfind(txids[i],vouts[i],'A')) != 0 )
3618! {
3619! pax->type = opretbuf[0];
3620! pax->approved = kmdheights[i];
3621! pax->validated = checktoshis;
3622! if ( didstats != 0 )
3623! pax->didstats = 1;
3624! //if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3625! //printf(" i.%d approved.%d <<<<<<<<<<<<< APPROVED %p\n",i,kmdheights[i],pax);
3626 }
3627 }
3628 }
3629! } else printf("n.%d from opreturns\n",n);
3630 //printf("extra.[%d] after %.8f\n",n,dstr(komodo_paxtotal()));
3631 }
3632 else if ( opretbuf[0] == 'X' )
3633***************
3634*** 770,783 ****
3635 if ( (pax= komodo_paxfind(txids[i],vouts[i],'X')) != 0 )
3636 {
3637 pax->type = opretbuf[0];
3638! if ( baseids[i] >= 0 && srcvalues[i] != 0 && (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
3639 {
3640! basesp->redeemed += srcvalues[i];
3641 pax->didstats = 1;
3642! if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3643! printf("########### %p redeemed %s += %.8f\n",basesp,CURRENCIES[baseids[i]],dstr(srcvalues[i]));
3644 }
3645 }
3646 }
3647 } //else printf("komodo_issued_opreturn returned %d\n",n);
3648 }
3649--- 942,964 ----
3650 if ( (pax= komodo_paxfind(txids[i],vouts[i],'X')) != 0 )
3651 {
3652 pax->type = opretbuf[0];
3653! if ( height < 121842 ) // fields got switched around due to legacy issues and approves
3654! value = srcvalues[i];
3655! else value = values[i];
3656! if ( baseids[i] >= 0 && value != 0 && (basesp= komodo_stateptrget(CURRENCIES[baseids[i]])) != 0 )
3657 {
3658! basesp->redeemed += value;
3659 pax->didstats = 1;
3660! //if ( strcmp(CURRENCIES[baseids[i]],ASSETCHAINS_SYMBOL) == 0 )
3661! printf("ht.%d %.8f ########### %p redeemed %s += %.8f %.8f kht.%d ht.%d\n",height,dstr(value),basesp,CURRENCIES[baseids[i]],dstr(value),dstr(srcvalues[i]),kmdheights[i],otherheights[i]);
3662 }
3663 }
3664+ if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'W',height)) != 0 )
3665+ komodo_paxdelete(pax);
3666+ if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'A',height)) != 0 )
3667+ komodo_paxdelete(pax);
3668+ if ( (pax= komodo_paxmark(height,txids[i],vouts[i],'X',height)) != 0 )
3669+ komodo_paxdelete(pax);
3670 }
3671 } //else printf("komodo_issued_opreturn returned %d\n",n);
3672 }
3673***************
3674*** 788,802 ****
3675 {
3676 static long lastpos[34]; static char userpass[33][1024];
3677 FILE *fp; int32_t baseid,isrealtime,refid,blocks,longest; struct komodo_state *sp,*refsp; char *retstr,fname[512],*base,symbol[16],dest[16]; uint32_t buf[3]; cJSON *infoobj,*result; uint64_t RTmask = 0;
3678 while ( KOMODO_INITDONE == 0 )
3679 {
3680! fprintf(stderr,"PASSPORT iteration waiting for KOMODO_INITDONE\n");
3681 sleep(3);
3682 }
3683 refsp = komodo_stateptr(symbol,dest);
3684 if ( ASSETCHAINS_SYMBOL[0] == 0 )
3685 refid = 33;
3686! else refid = komodo_baseid(ASSETCHAINS_SYMBOL)+1; // illegal base -> baseid.-1 -> 0
3687 //printf("PASSPORT %s refid.%d\n",ASSETCHAINS_SYMBOL,refid);
3688 for (baseid=32; baseid>=0; baseid--)
3689 {
3690--- 969,997 ----
3691 {
3692 static long lastpos[34]; static char userpass[33][1024];
3693 FILE *fp; int32_t baseid,isrealtime,refid,blocks,longest; struct komodo_state *sp,*refsp; char *retstr,fname[512],*base,symbol[16],dest[16]; uint32_t buf[3]; cJSON *infoobj,*result; uint64_t RTmask = 0;
3694+ //printf("PASSPORT.(%s)\n",ASSETCHAINS_SYMBOL);
3695 while ( KOMODO_INITDONE == 0 )
3696 {
3697! fprintf(stderr,"[%s] PASSPORT iteration waiting for KOMODO_INITDONE\n",ASSETCHAINS_SYMBOL);
3698 sleep(3);
3699 }
3700 refsp = komodo_stateptr(symbol,dest);
3701 if ( ASSETCHAINS_SYMBOL[0] == 0 )
3702 refid = 33;
3703! else
3704! {
3705! refid = komodo_baseid(ASSETCHAINS_SYMBOL)+1; // illegal base -> baseid.-1 -> 0
3706! if ( refid == 0 )
3707! {
3708! KOMODO_PASSPORT_INITDONE = 1;
3709! return;
3710! }
3711! }
3712! if ( KOMODO_PAX == 0 )
3713! {
3714! KOMODO_PASSPORT_INITDONE = 1;
3715! return;
3716! }
3717 //printf("PASSPORT %s refid.%d\n",ASSETCHAINS_SYMBOL,refid);
3718 for (baseid=32; baseid>=0; baseid--)
3719 {
3720***************
3721*** 807,813 ****
3722 {
3723 komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"komodostate");
3724 komodo_nameset(symbol,dest,base);
3725! if ( (fp= fopen(fname,"rb")) != 0 && (sp= komodo_stateptrget(symbol)) != 0 )
3726 {
3727 fseek(fp,0,SEEK_END);
3728 if ( ftell(fp) > lastpos[baseid] )
3729--- 1002,1009 ----
3730 {
3731 komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"komodostate");
3732 komodo_nameset(symbol,dest,base);
3733! sp = komodo_stateptrget(symbol);
3734! if ( (fp= fopen(fname,"rb")) != 0 && sp != 0 )
3735 {
3736 fseek(fp,0,SEEK_END);
3737 if ( ftell(fp) > lastpos[baseid] )
3738***************
3739*** 822,840 ****
3740 printf("from.(%s) lastpos[%s] %ld\n",ASSETCHAINS_SYMBOL,CURRENCIES[baseid],lastpos[baseid]);
3741 } //else fprintf(stderr,"%s.%ld ",CURRENCIES[baseid],ftell(fp));
3742 fclose(fp);
3743! }
3744 komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"realtime");
3745 if ( (fp= fopen(fname,"rb")) != 0 )
3746 {
3747 if ( fread(buf,1,sizeof(buf),fp) == sizeof(buf) )
3748 {
3749 sp->CURRENT_HEIGHT = buf[0];
3750! if ( buf[0] != 0 && buf[0] == buf[1] && buf[2] > time(NULL)-60 )
3751 {
3752 isrealtime = 1;
3753 RTmask |= (1LL << baseid);
3754 memcpy(refsp->RTbufs[baseid+1],buf,sizeof(refsp->RTbufs[baseid+1]));
3755! } //else fprintf(stderr,"%s not RT\n",base);
3756 } //else fprintf(stderr,"%s size error RT\n",base);
3757 fclose(fp);
3758 } //else fprintf(stderr,"%s open error RT\n",base);
3759--- 1018,1036 ----
3760 printf("from.(%s) lastpos[%s] %ld\n",ASSETCHAINS_SYMBOL,CURRENCIES[baseid],lastpos[baseid]);
3761 } //else fprintf(stderr,"%s.%ld ",CURRENCIES[baseid],ftell(fp));
3762 fclose(fp);
3763! } else printf("error.(%s) %p\n",fname,sp);
3764 komodo_statefname(fname,baseid<32?base:(char *)"",(char *)"realtime");
3765 if ( (fp= fopen(fname,"rb")) != 0 )
3766 {
3767 if ( fread(buf,1,sizeof(buf),fp) == sizeof(buf) )
3768 {
3769 sp->CURRENT_HEIGHT = buf[0];
3770! if ( buf[0] != 0 && buf[0] >= buf[1] && buf[2] > time(NULL)-300 )
3771 {
3772 isrealtime = 1;
3773 RTmask |= (1LL << baseid);
3774 memcpy(refsp->RTbufs[baseid+1],buf,sizeof(refsp->RTbufs[baseid+1]));
3775! } else fprintf(stderr,"[%s]: %s not RT %u %u %d\n",ASSETCHAINS_SYMBOL,base,buf[0],buf[1],(int32_t)(time(NULL)-buf[2]));
3776 } //else fprintf(stderr,"%s size error RT\n",base);
3777 fclose(fp);
3778 } //else fprintf(stderr,"%s open error RT\n",base);
3779***************
3780*** 849,855 ****
3781 if ( buf[0] != 0 && buf[0] == buf[1] )
3782 {
3783 buf[2] = (uint32_t)time(NULL);
3784! RTmask |= (1LL << baseid) | 1;
3785 memcpy(refsp->RTbufs[baseid+1],buf,sizeof(refsp->RTbufs[baseid+1]));
3786 if ( refid != 0 )
3787 memcpy(refsp->RTbufs[0],buf,sizeof(refsp->RTbufs[0]));
3788--- 1045,1051 ----
3789 if ( buf[0] != 0 && buf[0] == buf[1] )
3790 {
3791 buf[2] = (uint32_t)time(NULL);
3792! RTmask |= (1LL << baseid);
3793 memcpy(refsp->RTbufs[baseid+1],buf,sizeof(refsp->RTbufs[baseid+1]));
3794 if ( refid != 0 )
3795 memcpy(refsp->RTbufs[0],buf,sizeof(refsp->RTbufs[0]));
3796***************
3797*** 865,869 ****
3798--- 1061,1066 ----
3799 komodo_paxtotal();
3800 refsp->RTmask = RTmask;
3801 KOMODO_PASSPORT_INITDONE = 1;
3802+ //printf("done PASSPORT %s refid.%d\n",ASSETCHAINS_SYMBOL,refid);
3803 }
3804
3805diff -crB ./src/komodo_globals.h ../../komodo-jl777/src/komodo_globals.h
3806*** ./src/komodo_globals.h 2017-01-03 10:40:50.231330177 +0000
3807--- ../../komodo-jl777/src/komodo_globals.h 2017-01-03 09:49:08.856506348 +0000
3808***************
3809*** 36,42 ****
3810
3811 int COINBASE_MATURITY = 100;
3812
3813! int32_t IS_KOMODO_NOTARY,KOMODO_REWIND,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAINS_SEED,KOMODO_ON_DEMAND,KOMODO_EXTERNAL_NOTARIES,KOMODO_PASSPORT_INITDONE;
3814 std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES;
3815 uint8_t NOTARY_PUBKEY33[33];
3816
3817--- 36,42 ----
3818
3819 int COINBASE_MATURITY = 100;
3820
3821! int32_t IS_KOMODO_NOTARY,KOMODO_REWIND,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAINS_SEED,KOMODO_ON_DEMAND,KOMODO_EXTERNAL_NOTARIES,KOMODO_PASSPORT_INITDONE,KOMODO_PAX;
3822 std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES;
3823 uint8_t NOTARY_PUBKEY33[33];
3824
3825diff -crB ./src/komodo.h ../../komodo-jl777/src/komodo.h
3826*** ./src/komodo.h 2017-01-03 10:40:50.231330177 +0000
3827--- ../../komodo-jl777/src/komodo.h 2017-01-03 09:49:08.856506348 +0000
3828***************
3829*** 23,29 ****
3830 // a. automate notarization fee payouts
3831 // b. automated distribution of test REVS snapshot
3832
3833! //#define KOMODO_ASSETCHAINS_WAITNOTARIZE
3834 #define KOMODO_PAXMAX (10000 * COIN)
3835
3836 #include <stdint.h>
3837--- 23,29 ----
3838 // a. automate notarization fee payouts
3839 // b. automated distribution of test REVS snapshot
3840
3841! #define KOMODO_ASSETCHAINS_WAITNOTARIZE
3842 #define KOMODO_PAXMAX (10000 * COIN)
3843
3844 #include <stdint.h>
3845***************
3846*** 194,200 ****
3847--- 194,203 ----
3848 static FILE *fp; static int32_t errs;
3849 struct komodo_state *sp; char fname[512],symbol[16],dest[16]; int32_t ht,func; uint8_t num,pubkeys[64][33];
3850 if ( (sp= komodo_stateptr(symbol,dest)) == 0 )
3851+ {
3852+ KOMODO_INITDONE = (uint32_t)time(NULL);
3853 return;
3854+ }
3855 if ( fp == 0 )
3856 {
3857 komodo_statefname(fname,ASSETCHAINS_SYMBOL,(char *)"komodostate");
3858***************
3859*** 281,287 ****
3860 errs++;
3861 //komodo_eventadd_utxo(sp,symbol,height,notaryid,txhash,voutmask,numvouts);
3862 }
3863- //#ifdef KOMODO_PAX
3864 else if ( pvals != 0 && numpvals > 0 )
3865 {
3866 int32_t i,nonz = 0;
3867--- 284,289 ----
3868***************
3869*** 301,307 ****
3870 }
3871 //printf("save pvals height.%d numpvals.%d\n",height,numpvals);
3872 }
3873- //#endif
3874 else if ( height != 0 )
3875 {
3876 //printf("ht.%d func N ht.%d errs.%d\n",height,NOTARIZED_HEIGHT,errs);
3877--- 303,308 ----
3878diff -crB ./src/komodo_interest.h ../../komodo-jl777/src/komodo_interest.h
3879*** ./src/komodo_interest.h 2017-01-03 10:40:50.231330177 +0000
3880--- ../../komodo-jl777/src/komodo_interest.h 2017-01-03 09:49:08.856506348 +0000
3881***************
3882*** 21,29 ****
3883 uint64_t total; int32_t ind,incr = 100000;
3884 if ( height >= maxheight )
3885 {
3886! interests = (uint64_t *)realloc(interests,(maxheight + incr) * sizeof(*interests) * 2);
3887! memset(&interests[maxheight << 1],0,incr * sizeof(*interests) * 2);
3888! maxheight += incr;
3889 }
3890 ind = (height << 1);
3891 if ( paidinterest < 0 ) // request
3892--- 21,37 ----
3893 uint64_t total; int32_t ind,incr = 100000;
3894 if ( height >= maxheight )
3895 {
3896! if ( interests == 0 )
3897! {
3898! maxheight = height + incr;
3899! interests = (uint64_t *)calloc(maxheight,sizeof(*interests) * 2);
3900! }
3901! else
3902! {
3903! interests = (uint64_t *)realloc(interests,(maxheight + incr) * sizeof(*interests) * 2);
3904! memset(&interests[maxheight << 1],0,incr * sizeof(*interests) * 2);
3905! maxheight += incr;
3906! }
3907 }
3908 ind = (height << 1);
3909 if ( paidinterest < 0 ) // request
3910diff -crB ./src/komodo_pax.h ../../komodo-jl777/src/komodo_pax.h
3911*** ./src/komodo_pax.h 2017-01-03 10:40:50.231330177 +0000
3912--- ../../komodo-jl777/src/komodo_pax.h 2017-01-03 09:49:08.856506348 +0000
3913***************
3914*** 429,434 ****
3915--- 429,435 ----
3916 height -= 10;
3917 if ( (baseid= komodo_baseid(base)) >= 0 && (relid= komodo_baseid(rel)) >= 0 )
3918 {
3919+ portable_mutex_lock(&komodo_mutex);
3920 for (i=NUM_PRICES-1; i>=0; i--)
3921 {
3922 ptr = &PVALS[36 * i];
3923***************
3924*** 439,450 ****
3925 *kmdbtcp = ptr[MAX_CURRENCIES + 1] / 539;
3926 *btcusdp = ptr[MAX_CURRENCIES + 2] / 539;
3927 }
3928 if ( kmdbtc != 0 && btcusd != 0 )
3929 return(komodo_paxcalc(&ptr[1],baseid,relid,basevolume,kmdbtc,btcusd));
3930 else return(0);
3931 }
3932 }
3933! } else printf("paxprice invalid base.%s %d, rel.%s %d\n",base,baseid,rel,relid);
3934 return(0);
3935 }
3936
3937--- 440,453 ----
3938 *kmdbtcp = ptr[MAX_CURRENCIES + 1] / 539;
3939 *btcusdp = ptr[MAX_CURRENCIES + 2] / 539;
3940 }
3941+ portable_mutex_unlock(&komodo_mutex);
3942 if ( kmdbtc != 0 && btcusd != 0 )
3943 return(komodo_paxcalc(&ptr[1],baseid,relid,basevolume,kmdbtc,btcusd));
3944 else return(0);
3945 }
3946 }
3947! portable_mutex_unlock(&komodo_mutex);
3948! } //else printf("paxprice invalid base.%s %d, rel.%s %d\n",base,baseid,rel,relid);
3949 return(0);
3950 }
3951
3952***************
3953*** 473,479 ****
3954 }
3955 kmdbtc = komodo_paxcorrelation(kmdbtcs,numvotes,*seedp) * 539;
3956 btcusd = komodo_paxcorrelation(btcusds,numvotes,*seedp) * 539;
3957- //printf("kmdbtc %llu btcusd %llu\n",(long long)kmdbtc,(long long)btcusd);
3958 for (i=nonz=0; i<numvotes; i++)
3959 {
3960 if ( (votes[numvotes-1-i]= _komodo_paxprice(0,0,height-i,base,rel,100000,kmdbtc,btcusd)) == 0 )
3961--- 476,481 ----
3962***************
3963*** 481,487 ****
3964--- 483,493 ----
3965 else nonz++;
3966 }
3967 if ( nonz <= (numvotes >> 1) )
3968+ {
3969+ //printf("kmdbtc %llu btcusd %llu\n",(long long)kmdbtc,(long long)btcusd);
3970+ //printf("komodo_paxprice nonz.%d of numvotes.%d\n",nonz,numvotes);
3971 return(0);
3972+ }
3973 return(komodo_paxcorrelation(votes,numvotes,*seedp) * basevolume / 100000);
3974 }
3975
3976***************
3977*** 527,533 ****
3978 if ( fiatoshis < 0 )
3979 shortflag = 1, fiatoshis = -fiatoshis;
3980 komodoshis = komodo_paxprice(seedp,height,base,(char *)"KMD",(uint64_t)fiatoshis);
3981! //printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f seed.%llx\n",height,base,(double)fiatoshis/COIN,(double)komodoshis/COIN,(long long)*seedp);
3982 if ( bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr) == 20 )
3983 {
3984 PAX_pubkey(1,pubkey33,&addrtype,rmd160,base,&shortflag,tokomodo != 0 ? &komodoshis : &fiatoshis);
3985--- 533,540 ----
3986 if ( fiatoshis < 0 )
3987 shortflag = 1, fiatoshis = -fiatoshis;
3988 komodoshis = komodo_paxprice(seedp,height,base,(char *)"KMD",(uint64_t)fiatoshis);
3989! if ( 0 && strcmp(base,"RUB") == 0 )
3990! printf("PAX_fiatdest ht.%d price %s %.8f -> KMD %.8f seed.%llx\n",height,base,(double)fiatoshis/COIN,(double)komodoshis/COIN,(long long)*seedp);
3991 if ( bitcoin_addr2rmd160(&addrtype,rmd160,coinaddr) == 20 )
3992 {
3993 PAX_pubkey(1,pubkey33,&addrtype,rmd160,base,&shortflag,tokomodo != 0 ? &komodoshis : &fiatoshis);
3994diff -crB ./src/komodo_structs.h ../../komodo-jl777/src/komodo_structs.h
3995*** ./src/komodo_structs.h 2017-01-03 10:40:50.231330177 +0000
3996--- ../../komodo-jl777/src/komodo_structs.h 2017-01-03 09:49:08.856506348 +0000
3997***************
3998*** 57,63 ****
3999 UT_hash_handle hh;
4000 uint256 txid;
4001 uint64_t komodoshis,fiatoshis,validated;
4002! int32_t marked,height,otherheight,approved,didstats;
4003 uint16_t vout;
4004 char symbol[16],source[16],coinaddr[64]; uint8_t rmd160[20],type,buf[35];
4005 };
4006--- 57,63 ----
4007 UT_hash_handle hh;
4008 uint256 txid;
4009 uint64_t komodoshis,fiatoshis,validated;
4010! int32_t marked,height,otherheight,approved,didstats,ready;
4011 uint16_t vout;
4012 char symbol[16],source[16],coinaddr[64]; uint8_t rmd160[20],type,buf[35];
4013 };
4014diff -crB ./src/komodo_utils.h ../../komodo-jl777/src/komodo_utils.h
4015*** ./src/komodo_utils.h 2017-01-03 10:40:50.235330381 +0000
4016--- ../../komodo-jl777/src/komodo_utils.h 2017-01-03 09:49:08.856506348 +0000
4017***************
4018*** 1448,1454 ****
4019--- 1448,1457 ----
4020 IS_KOMODO_NOTARY = GetBoolArg("-notary", false);
4021 NOTARY_PUBKEY = GetArg("-pubkey", "");
4022 if ( strlen(NOTARY_PUBKEY.c_str()) == 66 )
4023+ {
4024 USE_EXTERNAL_PUBKEY = 1;
4025+ KOMODO_PAX = 1;
4026+ } else KOMODO_PAX = GetArg("-pax",0);
4027 name = GetArg("-ac_name","");
4028 if ( (KOMODO_REWIND= GetArg("-rewind",0)) != 0 )
4029 ;
4030diff -crB ./src/main.cpp ../../komodo-jl777/src/main.cpp
4031*** ./src/main.cpp 2017-01-03 10:40:50.255331392 +0000
4032--- ../../komodo-jl777/src/main.cpp 2017-01-03 09:49:08.864506767 +0000
4033***************
4034*** 26,31 ****
4035--- 26,32 ----
4036 #include "util.h"
4037 #include "utilmoneystr.h"
4038 #include "validationinterface.h"
4039+ #include "wallet/asyncrpcoperation_sendmany.h"
4040
4041 #include <sstream>
4042
4043***************
4044*** 70,76 ****
4045 bool fAlerts = DEFAULT_ALERTS;
4046
4047 /** Fees smaller than this (in satoshi) are considered zero fee (for relaying and mining) */
4048! CFeeRate minRelayTxFee = CFeeRate(5000);
4049
4050 CTxMemPool mempool(::minRelayTxFee);
4051
4052--- 71,77 ----
4053 bool fAlerts = DEFAULT_ALERTS;
4054
4055 /** Fees smaller than this (in satoshi) are considered zero fee (for relaying and mining) */
4056! CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE);
4057
4058 CTxMemPool mempool(::minRelayTxFee);
4059
4060***************
4061*** 550,556 ****
4062
4063 // Komodo globals
4064
4065- #define KOMODO_PAX
4066 #define KOMODO_ZCASH
4067 #include "komodo.h"
4068
4069--- 551,556 ----
4070***************
4071*** 871,878 ****
4072 return false;
4073 } else {
4074 // Ensure that zk-SNARKs verify
4075 BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) {
4076! if (!joinsplit.Verify(*pzcashParams, tx.joinSplitPubKey)) {
4077 return state.DoS(100, error("CheckTransaction(): joinsplit does not verify"),
4078 REJECT_INVALID, "bad-txns-joinsplit-verification-failed");
4079 }
4080--- 871,879 ----
4081 return false;
4082 } else {
4083 // Ensure that zk-SNARKs verify
4084+ auto verifier = libzcash::ProofVerifier::Strict();
4085 BOOST_FOREACH(const JSDescription &joinsplit, tx.vjoinsplit) {
4086! if (!joinsplit.Verify(*pzcashParams, verifier, tx.joinSplitPubKey)) {
4087 return state.DoS(100, error("CheckTransaction(): joinsplit does not verify"),
4088 REJECT_INVALID, "bad-txns-joinsplit-verification-failed");
4089 }
4090***************
4091*** 1211,1222 ****
4092 CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), mempool.HasNoInputsOf(tx));
4093 unsigned int nSize = entry.GetTxSize();
4094
4095! // Don't accept it if it can't get into a block
4096! CAmount txMinFee = GetMinRelayFee(tx, nSize, true);
4097! if (fLimitFree && nFees < txMinFee)
4098! return state.DoS(0, error("AcceptToMemoryPool: not enough fees %s, %d < %d",
4099! hash.ToString(), nFees, txMinFee),
4100! REJECT_INSUFFICIENTFEE, "insufficient fee");
4101
4102 // Require that free transactions have sufficient priority to be mined in the next block.
4103 if (GetBoolArg("-relaypriority", false) && nFees < ::minRelayTxFee.GetFee(nSize) && !AllowFree(view.GetPriority(tx, chainActive.Height() + 1))) {
4104--- 1212,1228 ----
4105 CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), mempool.HasNoInputsOf(tx));
4106 unsigned int nSize = entry.GetTxSize();
4107
4108! // Accept a tx if it contains joinsplits and has at least the default fee specified by z_sendmany.
4109! if (tx.vjoinsplit.size() > 0 && nFees >= ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE) {
4110! // In future we will we have more accurate and dynamic computation of fees for tx with joinsplits.
4111! } else {
4112! // Don't accept it if it can't get into a block
4113! CAmount txMinFee = GetMinRelayFee(tx, nSize, true);
4114! if (fLimitFree && nFees < txMinFee)
4115! return state.DoS(0, error("AcceptToMemoryPool: not enough fees %s, %d < %d",
4116! hash.ToString(), nFees, txMinFee),
4117! REJECT_INSUFFICIENTFEE, "insufficient fee");
4118! }
4119
4120 // Require that free transactions have sufficient priority to be mined in the next block.
4121 if (GetBoolArg("-relaypriority", false) && nFees < ::minRelayTxFee.GetFee(nSize) && !AllowFree(view.GetPriority(tx, chainActive.Height() + 1))) {
4122***************
4123*** 1566,1572 ****
4124 }
4125
4126 // We define a condition where we should warn the user about as a fork of at least 7 blocks
4127! // with a tip within 72 blocks (+/- 12 hours if no one mines it) of ours
4128 // We use 7 blocks rather arbitrarily as it represents just under 10% of sustained network
4129 // hash rate operating on the fork.
4130 // or a chain that is entirely longer than ours and invalid (note that this should be detected by both)
4131--- 1572,1578 ----
4132 }
4133
4134 // We define a condition where we should warn the user about as a fork of at least 7 blocks
4135! // with a tip within 72 blocks (+/- 3 hours if no one mines it) of ours
4136 // We use 7 blocks rather arbitrarily as it represents just under 10% of sustained network
4137 // hash rate operating on the fork.
4138 // or a chain that is entirely longer than ours and invalid (note that this should be detected by both)
4139***************
4140*** 3213,3219 ****
4141
4142 // Enforce block.nVersion=2 rule that the coinbase starts with serialized block height
4143 // if 750 of the last 1,000 blocks are version 2 or greater (51/100 if testnet):
4144! if (block.nVersion >= 2)
4145 {
4146 CScript expect = CScript() << nHeight;
4147 if (block.vtx[0].vin[0].scriptSig.size() < expect.size() ||
4148--- 3219,3228 ----
4149
4150 // Enforce block.nVersion=2 rule that the coinbase starts with serialized block height
4151 // if 750 of the last 1,000 blocks are version 2 or greater (51/100 if testnet):
4152! // Since MIN_BLOCK_VERSION = 4 all blocks with nHeight > 0 should satisfy this.
4153! // This rule is not applied to the genesis block, which didn't include the height
4154! // in the coinbase.
4155! if (nHeight > 0)
4156 {
4157 CScript expect = CScript() << nHeight;
4158 if (block.vtx[0].vin[0].scriptSig.size() < expect.size() ||
4159diff -crB ./src/main.h ../../komodo-jl777/src/main.h
4160*** ./src/main.h 2017-01-03 10:40:50.255331392 +0000
4161--- ../../komodo-jl777/src/main.h 2017-01-03 09:49:08.864506767 +0000
4162***************
4163*** 48,57 ****
4164 struct CNodeStateStats;
4165
4166 /** Default for -blockmaxsize and -blockminsize, which control the range of sizes the mining code will create **/
4167! static const unsigned int DEFAULT_BLOCK_MAX_SIZE = 750000;
4168 static const unsigned int DEFAULT_BLOCK_MIN_SIZE = 0;
4169 /** Default for -blockprioritysize, maximum space for zero/low-fee transactions **/
4170! static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = 50000;
4171 /** Default for accepting alerts from the P2P network. */
4172 static const bool DEFAULT_ALERTS = true;
4173 /** Minimum alert priority for enabling safe mode. */
4174--- 48,57 ----
4175 struct CNodeStateStats;
4176
4177 /** Default for -blockmaxsize and -blockminsize, which control the range of sizes the mining code will create **/
4178! static const unsigned int DEFAULT_BLOCK_MAX_SIZE = MAX_BLOCK_SIZE;
4179 static const unsigned int DEFAULT_BLOCK_MIN_SIZE = 0;
4180 /** Default for -blockprioritysize, maximum space for zero/low-fee transactions **/
4181! static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = DEFAULT_BLOCK_MAX_SIZE / 2;
4182 /** Default for accepting alerts from the P2P network. */
4183 static const bool DEFAULT_ALERTS = true;
4184 /** Minimum alert priority for enabling safe mode. */
4185***************
4186*** 60,65 ****
4187--- 60,67 ----
4188 static const unsigned int MAX_P2SH_SIGOPS = 15;
4189 /** The maximum number of sigops we're willing to relay/mine in a single tx */
4190 static const unsigned int MAX_STANDARD_TX_SIGOPS = MAX_BLOCK_SIGOPS/5;
4191+ /** Default for -minrelaytxfee, minimum relay fee for transactions */
4192+ static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 1000;
4193 /** Default for -maxorphantx, maximum number of orphan transactions kept in memory */
4194 static const unsigned int DEFAULT_MAX_ORPHAN_TRANSACTIONS = 100;
4195 /** The maximum size of a blk?????.dat file (since 0.8) */
4196***************
4197*** 91,96 ****
4198--- 93,102 ----
4199 /** Maximum length of reject messages. */
4200 static const unsigned int MAX_REJECT_MESSAGE_LENGTH = 111;
4201
4202+ // Sanity check the magic numbers when we change them
4203+ BOOST_STATIC_ASSERT(DEFAULT_BLOCK_MAX_SIZE <= MAX_BLOCK_SIZE);
4204+ BOOST_STATIC_ASSERT(DEFAULT_BLOCK_PRIORITY_SIZE <= DEFAULT_BLOCK_MAX_SIZE);
4205+
4206 #define equihash_parameters_acceptable(N, K) \
4207 ((CBlockHeader::HEADER_SIZE + equihash_solution_size(N, K))*MAX_HEADERS_RESULTS < \
4208 MAX_PROTOCOL_MESSAGE_LENGTH-1000)
4209diff -crB ./src/Makefile.am ../../komodo-jl777/src/Makefile.am
4210*** ./src/Makefile.am 2017-01-03 10:40:50.211329166 +0000
4211--- ../../komodo-jl777/src/Makefile.am 2017-01-03 09:49:08.856506348 +0000
4212***************
4213*** 232,237 ****
4214--- 232,239 ----
4215 # when wallet enabled
4216 libbitcoin_wallet_a_CPPFLAGS = $(BITCOIN_INCLUDES)
4217 libbitcoin_wallet_a_SOURCES = \
4218+ utiltest.cpp \
4219+ utiltest.h \
4220 zcbenchmarks.cpp \
4221 zcbenchmarks.h \
4222 wallet/asyncrpcoperation_sendmany.cpp \
4223***************
4224*** 516,525 ****
4225 @test -f $(PROTOC)
4226 $(AM_V_GEN) $(PROTOC) --cpp_out=$(@D) --proto_path=$(abspath $(<D) $<)
4227
4228! if ENABLE_TESTS
4229! include Makefile.test.include
4230! include Makefile.gtest.include
4231! endif
4232
4233 if ENABLE_QT
4234 include Makefile.qt.include
4235--- 518,527 ----
4236 @test -f $(PROTOC)
4237 $(AM_V_GEN) $(PROTOC) --cpp_out=$(@D) --proto_path=$(abspath $(<D) $<)
4238
4239! #if ENABLE_TESTS
4240! #include Makefile.test.include
4241! #include Makefile.gtest.include
4242! #endif
4243
4244 if ENABLE_QT
4245 include Makefile.qt.include
4246diff -crB ./src/Makefile.gtest.include ../../komodo-jl777/src/Makefile.gtest.include
4247*** ./src/Makefile.gtest.include 2017-01-03 10:40:50.211329166 +0000
4248--- ../../komodo-jl777/src/Makefile.gtest.include 2017-01-03 09:49:08.856506348 +0000
4249***************
4250*** 5,11 ****
4251 komodo_gtest_SOURCES = \
4252 gtest/main.cpp \
4253 gtest/utils.cpp \
4254- gtest/test_checkblock.cpp \
4255 gtest/test_checktransaction.cpp \
4256 gtest/json_test_vectors.cpp \
4257 gtest/json_test_vectors.h \
4258--- 5,10 ----
4259***************
4260*** 18,23 ****
4261--- 17,23 ----
4262 gtest/test_keystore.cpp \
4263 gtest/test_noteencryption.cpp \
4264 gtest/test_merkletree.cpp \
4265+ gtest/test_metrics.cpp \
4266 gtest/test_pow.cpp \
4267 gtest/test_random.cpp \
4268 gtest/test_rpc.cpp \
4269***************
4270*** 26,32 ****
4271--- 26,36 ----
4272 gtest/test_txid.cpp \
4273 gtest/test_libzcash_utils.cpp \
4274 gtest/test_proofs.cpp \
4275+ gtest/test_checkblock.cpp
4276+ if ENABLE_WALLET
4277+ zcash_gtest_SOURCES += \
4278 wallet/gtest/test_wallet.cpp
4279+ endif
4280
4281 komodo_gtest_CPPFLAGS = -DMULTICORE -fopenmp -DBINARY_OUTPUT -DCURVE_ALT_BN128 -DSTATIC
4282
4283diff -crB ./src/Makefile.test.include ../../komodo-jl777/src/Makefile.test.include
4284*** ./src/Makefile.test.include 2017-01-03 10:40:50.211329166 +0000
4285--- ../../komodo-jl777/src/Makefile.test.include 2017-01-03 09:49:08.856506348 +0000
4286***************
4287*** 31,36 ****
4288--- 31,37 ----
4289 test/data/merkle_serialization.json \
4290 test/data/merkle_witness_serialization.json \
4291 test/data/merkle_path.json \
4292+ test/data/merkle_commitments.json \
4293 test/data/g1_compressed.json \
4294 test/data/g2_compressed.json
4295
4296diff -crB ./src/metrics.cpp ../../komodo-jl777/src/metrics.cpp
4297*** ./src/metrics.cpp 2017-01-03 10:40:50.255331392 +0000
4298--- ../../komodo-jl777/src/metrics.cpp 2017-01-03 09:49:08.864506767 +0000
4299***************
4300*** 5,13 ****
4301--- 5,15 ----
4302 #include "metrics.h"
4303
4304 #include "chainparams.h"
4305+ #include "main.h"
4306 #include "ui_interface.h"
4307 #include "util.h"
4308 #include "utiltime.h"
4309+ #include "utilmoneystr.h"
4310
4311 #include <boost/thread.hpp>
4312 #include <boost/thread/synchronized_value.hpp>
4313***************
4314*** 15,29 ****
4315--- 17,65 ----
4316 #include <sys/ioctl.h>
4317 #include <unistd.h>
4318
4319+ CCriticalSection cs_metrics;
4320+
4321+ boost::synchronized_value<int64_t> nNodeStartTime;
4322 AtomicCounter transactionsValidated;
4323 AtomicCounter ehSolverRuns;
4324 AtomicCounter solutionTargetChecks;
4325 AtomicCounter minedBlocks;
4326
4327+ boost::synchronized_value<std::list<uint256>> trackedBlocks;
4328+
4329 boost::synchronized_value<std::list<std::string>> messageBox;
4330 boost::synchronized_value<std::string> initMessage;
4331 bool loaded = false;
4332
4333+ extern int64_t GetNetworkHashPS(int lookup, int height);
4334+
4335+ void TrackMinedBlock(uint256 hash)
4336+ {
4337+ LOCK(cs_metrics);
4338+ minedBlocks.increment();
4339+ trackedBlocks->push_back(hash);
4340+ }
4341+
4342+ void MarkStartTime()
4343+ {
4344+ *nNodeStartTime = GetTime();
4345+ }
4346+
4347+ int64_t GetUptime()
4348+ {
4349+ return GetTime() - *nNodeStartTime;
4350+ }
4351+
4352+ double GetLocalSolPS_INTERNAL(int64_t uptime)
4353+ {
4354+ return uptime > 0 ? (double)solutionTargetChecks.get() / uptime : 0;
4355+ }
4356+
4357+ double GetLocalSolPS()
4358+ {
4359+ return GetLocalSolPS_INTERNAL(GetUptime());
4360+ }
4361+
4362 static bool metrics_ThreadSafeMessageBox(const std::string& message,
4363 const std::string& caption,
4364 unsigned int style)
4365***************
4366*** 64,71 ****
4367 uiInterface.InitMessage.connect(metrics_InitMessage);
4368 }
4369
4370! void printMiningStatus(bool mining)
4371 {
4372 if (mining) {
4373 int nThreads = GetArg("-genproclimit", 1);
4374 if (nThreads < 0) {
4375--- 100,122 ----
4376 uiInterface.InitMessage.connect(metrics_InitMessage);
4377 }
4378
4379! int printNetworkStats()
4380! {
4381! LOCK2(cs_main, cs_vNodes);
4382!
4383! std::cout << " " << _("Block height") << " | " << chainActive.Height() << std::endl;
4384! std::cout << " " << _("Network solution rate") << " | " << GetNetworkHashPS(120, -1) << " Sol/s" << std::endl;
4385! std::cout << " " << _("Connections") << " | " << vNodes.size() << std::endl;
4386! std::cout << std::endl;
4387!
4388! return 4;
4389! }
4390!
4391! int printMiningStatus(bool mining)
4392 {
4393+ // Number of lines that are always displayed
4394+ int lines = 1;
4395+
4396 if (mining) {
4397 int nThreads = GetArg("-genproclimit", 1);
4398 if (nThreads < 0) {
4399***************
4400*** 75,95 ****
4401 else
4402 nThreads = boost::thread::hardware_concurrency();
4403 }
4404! std::cout << strprintf(_("You are running %d mining threads."), nThreads) << std::endl;
4405 } else {
4406 std::cout << _("You are currently not mining.") << std::endl;
4407 std::cout << _("To enable mining, add 'gen=1' to your zcash.conf and restart.") << std::endl;
4408 }
4409 std::cout << std::endl;
4410 }
4411
4412! int printMetrics(size_t cols, int64_t nStart, bool mining)
4413 {
4414 // Number of lines that are always displayed
4415 int lines = 3;
4416
4417 // Calculate uptime
4418! int64_t uptime = GetTime() - nStart;
4419 int days = uptime / (24 * 60 * 60);
4420 int hours = (uptime - (days * 24 * 60 * 60)) / (60 * 60);
4421 int minutes = (uptime - (((days * 24) + hours) * 60 * 60)) / 60;
4422--- 126,151 ----
4423 else
4424 nThreads = boost::thread::hardware_concurrency();
4425 }
4426! std::cout << strprintf(_("You are mining with the %s solver on %d threads."),
4427! GetArg("-equihashsolver", "default"), nThreads) << std::endl;
4428! lines++;
4429 } else {
4430 std::cout << _("You are currently not mining.") << std::endl;
4431 std::cout << _("To enable mining, add 'gen=1' to your zcash.conf and restart.") << std::endl;
4432+ lines += 2;
4433 }
4434 std::cout << std::endl;
4435+
4436+ return lines;
4437 }
4438
4439! int printMetrics(size_t cols, bool mining)
4440 {
4441 // Number of lines that are always displayed
4442 int lines = 3;
4443
4444 // Calculate uptime
4445! int64_t uptime = GetUptime();
4446 int days = uptime / (24 * 60 * 60);
4447 int hours = (uptime - (days * 24 * 60 * 60)) / (60 * 60);
4448 int minutes = (uptime - (((days * 24) + hours) * 60 * 60)) / 60;
4449***************
4450*** 110,128 ****
4451 std::cout << strDuration << std::endl;
4452 lines += (strDuration.size() / cols);
4453
4454! std::cout << "- " << strprintf(_("You have validated %d transactions!"), transactionsValidated.get()) << std::endl;
4455
4456! if (mining) {
4457! double solps = uptime > 0 ? (double)solutionTargetChecks.get() / uptime : 0;
4458 std::string strSolps = strprintf("%.4f Sol/s", solps);
4459 std::cout << "- " << strprintf(_("You have contributed %s on average to the network solution rate."), strSolps) << std::endl;
4460 std::cout << "- " << strprintf(_("You have completed %d Equihash solver runs."), ehSolverRuns.get()) << std::endl;
4461 lines += 2;
4462
4463! int mined = minedBlocks.get();
4464 if (mined > 0) {
4465 std::cout << "- " << strprintf(_("You have mined %d blocks!"), mined) << std::endl;
4466! lines++;
4467 }
4468 }
4469 std::cout << std::endl;
4470--- 166,233 ----
4471 std::cout << strDuration << std::endl;
4472 lines += (strDuration.size() / cols);
4473
4474! int validatedCount = transactionsValidated.get();
4475! if (validatedCount > 1) {
4476! std::cout << "- " << strprintf(_("You have validated %d transactions!"), validatedCount) << std::endl;
4477! } else if (validatedCount == 1) {
4478! std::cout << "- " << _("You have validated a transaction!") << std::endl;
4479! } else {
4480! std::cout << "- " << _("You have validated no transactions.") << std::endl;
4481! }
4482
4483! if (mining && loaded) {
4484! double solps = GetLocalSolPS_INTERNAL(uptime);
4485 std::string strSolps = strprintf("%.4f Sol/s", solps);
4486 std::cout << "- " << strprintf(_("You have contributed %s on average to the network solution rate."), strSolps) << std::endl;
4487 std::cout << "- " << strprintf(_("You have completed %d Equihash solver runs."), ehSolverRuns.get()) << std::endl;
4488 lines += 2;
4489
4490! int mined = 0;
4491! int orphaned = 0;
4492! CAmount immature {0};
4493! CAmount mature {0};
4494! {
4495! LOCK2(cs_main, cs_metrics);
4496! boost::strict_lock_ptr<std::list<uint256>> u = trackedBlocks.synchronize();
4497! auto consensusParams = Params().GetConsensus();
4498! auto tipHeight = chainActive.Height();
4499!
4500! // Update orphans and calculate subsidies
4501! std::list<uint256>::iterator it = u->begin();
4502! while (it != u->end()) {
4503! auto hash = *it;
4504! if (mapBlockIndex.count(hash) > 0 &&
4505! chainActive.Contains(mapBlockIndex[hash])) {
4506! int height = mapBlockIndex[hash]->nHeight;
4507! CAmount subsidy = GetBlockSubsidy(height, consensusParams);
4508! if ((height > 0) && (height <= consensusParams.GetLastFoundersRewardBlockHeight())) {
4509! subsidy -= subsidy/5;
4510! }
4511! if (std::max(0, COINBASE_MATURITY - (tipHeight - height)) > 0) {
4512! immature += subsidy;
4513! } else {
4514! mature += subsidy;
4515! }
4516! it++;
4517! } else {
4518! it = u->erase(it);
4519! }
4520! }
4521!
4522! mined = minedBlocks.get();
4523! orphaned = mined - u->size();
4524! }
4525!
4526 if (mined > 0) {
4527+ std::string units = Params().CurrencyUnits();
4528 std::cout << "- " << strprintf(_("You have mined %d blocks!"), mined) << std::endl;
4529! std::cout << " "
4530! << strprintf(_("Orphaned: %d blocks, Immature: %u %s, Mature: %u %s"),
4531! orphaned,
4532! FormatMoney(immature), units,
4533! FormatMoney(mature), units)
4534! << std::endl;
4535! lines += 2;
4536 }
4537 }
4538 std::cout << std::endl;
4539***************
4540*** 171,194 ****
4541 // Make this thread recognisable as the metrics screen thread
4542 RenameThread("zcash-metrics-screen");
4543
4544! // Clear screen
4545! std::cout << "\e[2J";
4546!
4547! // Print art
4548! std::cout << METRICS_ART << std::endl;
4549! std::cout << std::endl;
4550!
4551! // Thank you text
4552! std::cout << _("Thank you for running a Zcash node!") << std::endl;
4553! std::cout << _("You're helping to strengthen the network and contributing to a social good :)") << std::endl;
4554! std::cout << std::endl;
4555!
4556! // Miner status
4557! bool mining = GetBoolArg("-gen", false);
4558! printMiningStatus(mining);
4559!
4560! // Count uptime
4561! int64_t nStart = GetTime();
4562
4563 while (true) {
4564 // Number of lines that are always displayed
4565--- 276,299 ----
4566 // Make this thread recognisable as the metrics screen thread
4567 RenameThread("zcash-metrics-screen");
4568
4569! // Determine whether we should render a persistent UI or rolling metrics
4570! bool isTTY = isatty(STDOUT_FILENO);
4571! bool isScreen = GetBoolArg("-metricsui", isTTY);
4572! int64_t nRefresh = GetArg("-metricsrefreshtime", isTTY ? 1 : 600);
4573!
4574! if (isScreen) {
4575! // Clear screen
4576! std::cout << "\e[2J";
4577!
4578! // Print art
4579! std::cout << METRICS_ART << std::endl;
4580! std::cout << std::endl;
4581!
4582! // Thank you text
4583! std::cout << _("Thank you for running a Zcash node!") << std::endl;
4584! std::cout << _("You're helping to strengthen the network and contributing to a social good :)") << std::endl;
4585! std::cout << std::endl;
4586! }
4587
4588 while (true) {
4589 // Number of lines that are always displayed
4590***************
4591*** 196,202 ****
4592 int cols = 80;
4593
4594 // Get current window size
4595! if (isatty(STDOUT_FILENO)) {
4596 struct winsize w;
4597 w.ws_col = 0;
4598 if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) != -1 && w.ws_col != 0) {
4599--- 301,307 ----
4600 int cols = 80;
4601
4602 // Get current window size
4603! if (isTTY) {
4604 struct winsize w;
4605 w.ws_col = 0;
4606 if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) != -1 && w.ws_col != 0) {
4607***************
4608*** 204,223 ****
4609 }
4610 }
4611
4612! // Erase below current position
4613! std::cout << "\e[J";
4614
4615! lines += printMetrics(cols, nStart, mining);
4616 lines += printMessageBox(cols);
4617 lines += printInitMessage();
4618
4619! // Explain how to exit
4620! std::cout << "[" << _("Press Ctrl+C to exit") << "] [" << _("Set 'showmetrics=0' to hide") << "]" << std::endl;;
4621
4622! boost::this_thread::interruption_point();
4623! MilliSleep(1000);
4624
4625! // Return to the top of the updating section
4626! std::cout << "\e[" << lines << "A";
4627 }
4628 }
4629--- 309,347 ----
4630 }
4631 }
4632
4633! if (isScreen) {
4634! // Erase below current position
4635! std::cout << "\e[J";
4636! }
4637!
4638! // Miner status
4639! bool mining = GetBoolArg("-gen", false);
4640
4641! if (loaded) {
4642! lines += printNetworkStats();
4643! }
4644! lines += printMiningStatus(mining);
4645! lines += printMetrics(cols, mining);
4646 lines += printMessageBox(cols);
4647 lines += printInitMessage();
4648
4649! if (isScreen) {
4650! // Explain how to exit
4651! std::cout << "[" << _("Press Ctrl+C to exit") << "] [" << _("Set 'showmetrics=0' to hide") << "]" << std::endl;
4652! } else {
4653! // Print delineator
4654! std::cout << "----------------------------------------" << std::endl;
4655! }
4656
4657! int64_t nWaitEnd = GetTime() + nRefresh;
4658! while (GetTime() < nWaitEnd) {
4659! boost::this_thread::interruption_point();
4660! MilliSleep(200);
4661! }
4662
4663! if (isScreen) {
4664! // Return to the top of the updating section
4665! std::cout << "\e[" << lines << "A";
4666! }
4667 }
4668 }
4669diff -crB ./src/metrics.h ../../komodo-jl777/src/metrics.h
4670*** ./src/metrics.h 2017-01-03 10:40:50.255331392 +0000
4671--- ../../komodo-jl777/src/metrics.h 2017-01-03 09:49:08.864506767 +0000
4672***************
4673*** 2,12 ****
4674 // Distributed under the MIT software license, see the accompanying
4675 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4676
4677 #include <atomic>
4678 #include <string>
4679
4680 struct AtomicCounter {
4681! std::atomic<int> value;
4682
4683 AtomicCounter() : value {0} { }
4684
4685--- 2,14 ----
4686 // Distributed under the MIT software license, see the accompanying
4687 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4688
4689+ #include "uint256.h"
4690+
4691 #include <atomic>
4692 #include <string>
4693
4694 struct AtomicCounter {
4695! std::atomic<uint64_t> value;
4696
4697 AtomicCounter() : value {0} { }
4698
4699***************
4700*** 26,32 ****
4701 extern AtomicCounter transactionsValidated;
4702 extern AtomicCounter ehSolverRuns;
4703 extern AtomicCounter solutionTargetChecks;
4704! extern AtomicCounter minedBlocks;
4705
4706 void ConnectMetricsScreen();
4707 void ThreadShowMetricsScreen();
4708--- 28,38 ----
4709 extern AtomicCounter transactionsValidated;
4710 extern AtomicCounter ehSolverRuns;
4711 extern AtomicCounter solutionTargetChecks;
4712!
4713! void TrackMinedBlock(uint256 hash);
4714!
4715! void MarkStartTime();
4716! double GetLocalSolPS();
4717
4718 void ConnectMetricsScreen();
4719 void ThreadShowMetricsScreen();
4720diff -crB ./src/miner.cpp ../../komodo-jl777/src/miner.cpp
4721*** ./src/miner.cpp 2017-01-03 10:40:50.255331392 +0000
4722--- ../../komodo-jl777/src/miner.cpp 2017-01-03 09:49:08.864506767 +0000
4723***************
4724*** 99,105 ****
4725 }
4726
4727 #define ASSETCHAINS_MINHEIGHT 100
4728! #define ROUNDROBIN_DELAY 58
4729 extern int32_t ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAIN_INIT,KOMODO_INITDONE,KOMODO_ON_DEMAND,KOMODO_INITDONE;
4730 extern char ASSETCHAINS_SYMBOL[16];
4731 extern std::string NOTARY_PUBKEY;
4732--- 99,106 ----
4733 }
4734
4735 #define ASSETCHAINS_MINHEIGHT 100
4736! #define KOMODO_ELECTION_GAP 2000
4737! #define ROUNDROBIN_DELAY 55
4738 extern int32_t ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAIN_INIT,KOMODO_INITDONE,KOMODO_ON_DEMAND,KOMODO_INITDONE;
4739 extern char ASSETCHAINS_SYMBOL[16];
4740 extern std::string NOTARY_PUBKEY;
4741***************
4742*** 109,114 ****
4743--- 110,116 ----
4744 int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33]);
4745 int32_t komodo_pax_opreturn(uint8_t *opret,int32_t maxsize);
4746 uint64_t komodo_paxtotal();
4747+ int32_t komodo_baseid(char *origbase);
4748 int32_t komodo_is_issuer();
4749 int32_t komodo_gateway_deposits(CMutableTransaction *txNew,char *symbol,int32_t tokomodo);
4750 int32_t komodo_isrealtime(int32_t *kmdheightp);
4751***************
4752*** 121,137 ****
4753 if(!pblocktemplate.get())
4754 return NULL;
4755 CBlock *pblock = &pblocktemplate->block; // pointer for convenience
4756! if ( ASSETCHAINS_SYMBOL[0] != 0 && chainActive.Tip()->nHeight > ASSETCHAINS_MINHEIGHT )
4757 {
4758 isrealtime = komodo_isrealtime(&kmdheight);
4759! while ( KOMODO_ON_DEMAND == 0 )
4760 {
4761 deposits = komodo_paxtotal();
4762! if ( KOMODO_INITDONE == 0 || (isrealtime= komodo_isrealtime(&kmdheight)) == 0 )
4763 {
4764 //fprintf(stderr,"INITDONE.%d RT.%d deposits %.8f ht.%d\n",KOMODO_INITDONE,isrealtime,(double)deposits/COIN,kmdheight);
4765 }
4766! else if ( deposits != 0 )
4767 {
4768 fprintf(stderr,"start CreateNewBlock %s initdone.%d deposit %.8f mempool.%d RT.%u KOMODO_ON_DEMAND.%d\n",ASSETCHAINS_SYMBOL,KOMODO_INITDONE,(double)komodo_paxtotal()/COIN,(int32_t)mempool.GetTotalTxSize(),isrealtime,KOMODO_ON_DEMAND);
4769 break;
4770--- 123,140 ----
4771 if(!pblocktemplate.get())
4772 return NULL;
4773 CBlock *pblock = &pblocktemplate->block; // pointer for convenience
4774! if ( ASSETCHAINS_SYMBOL[0] != 0 && chainActive.Tip()->nHeight >= ASSETCHAINS_MINHEIGHT )
4775 {
4776 isrealtime = komodo_isrealtime(&kmdheight);
4777! deposits = komodo_paxtotal();
4778! while ( KOMODO_ON_DEMAND == 0 && deposits == 0 && (int32_t)mempool.GetTotalTxSize() == 0 )
4779 {
4780 deposits = komodo_paxtotal();
4781! if ( KOMODO_INITDONE == 0 || (komodo_baseid(ASSETCHAINS_SYMBOL) >= 0 && (isrealtime= komodo_isrealtime(&kmdheight)) == 0) )
4782 {
4783 //fprintf(stderr,"INITDONE.%d RT.%d deposits %.8f ht.%d\n",KOMODO_INITDONE,isrealtime,(double)deposits/COIN,kmdheight);
4784 }
4785! else if ( deposits != 0 || (int32_t)mempool.GetTotalTxSize() > 0 )
4786 {
4787 fprintf(stderr,"start CreateNewBlock %s initdone.%d deposit %.8f mempool.%d RT.%u KOMODO_ON_DEMAND.%d\n",ASSETCHAINS_SYMBOL,KOMODO_INITDONE,(double)komodo_paxtotal()/COIN,(int32_t)mempool.GetTotalTxSize(),isrealtime,KOMODO_ON_DEMAND);
4788 break;
4789***************
4790*** 242,247 ****
4791--- 245,252 ----
4792
4793 dPriority += (double)nValueIn * nConf;
4794 }
4795+ nTotalIn += tx.GetJoinSplitValueIn();
4796+
4797 if (fMissingInputs) continue;
4798
4799 // Priority is sum(valuein * age) / modified_txsize
4800***************
4801*** 419,425 ****
4802 if ( !TestBlockValidity(state, *pblock, pindexPrev, false, false))
4803 {
4804 fprintf(stderr,"testblockvalidity failed\n");
4805! //throw std::runtime_error("CreateNewBlock(): TestBlockValidity failed");
4806 }
4807 }
4808
4809--- 424,430 ----
4810 if ( !TestBlockValidity(state, *pblock, pindexPrev, false, false))
4811 {
4812 fprintf(stderr,"testblockvalidity failed\n");
4813! throw std::runtime_error("CreateNewBlock(): TestBlockValidity failed");
4814 }
4815 }
4816
4817***************
4818*** 473,479 ****
4819 script[34] = OP_CHECKSIG;
4820 //scriptPubKey = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
4821 }
4822! if ( 0 && ASSETCHAINS_SYMBOL[0] == 0 )
4823 {
4824 for (i=0; i<65; i++)
4825 fprintf(stderr,"%d ",komodo_minerid(chainActive.Tip()->nHeight-i));
4826--- 478,484 ----
4827 script[34] = OP_CHECKSIG;
4828 //scriptPubKey = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
4829 }
4830! if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
4831 {
4832 for (i=0; i<65; i++)
4833 fprintf(stderr,"%d ",komodo_minerid(chainActive.Tip()->nHeight-i));
4834***************
4835*** 509,515 ****
4836 if (!ProcessNewBlock(chainActive.Tip()->nHeight+1,state, NULL, pblock, true, NULL))
4837 return error("KomodoMiner: ProcessNewBlock, block not accepted");
4838
4839! minedBlocks.increment();
4840
4841 return true;
4842 }
4843--- 514,520 ----
4844 if (!ProcessNewBlock(chainActive.Tip()->nHeight+1,state, NULL, pblock, true, NULL))
4845 return error("KomodoMiner: ProcessNewBlock, block not accepted");
4846
4847! TrackMinedBlock(pblock->GetHash());
4848
4849 return true;
4850 }
4851***************
4852*** 614,627 ****
4853 arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits);
4854 if ( ASSETCHAINS_SYMBOL[0] == 0 && komodo_is_special(pindexPrev->nHeight+1,NOTARY_PUBKEY33) > 0 )
4855 {
4856! hashTarget = arith_uint256().SetCompact(KOMODO_MINDIFF_NBITS);
4857! fprintf(stderr,"I am the chosen one for %s ht.%d\n",ASSETCHAINS_SYMBOL,pindexPrev->nHeight+1);
4858 } else Mining_start = 0;
4859 while (true)
4860 {
4861! if ( ASSETCHAINS_SYMBOL[0] != 0 && pblock->vtx[0].vout.size() == 1 && Mining_height > ASSETCHAINS_MINHEIGHT )
4862 {
4863! //fprintf(stderr,"skip generating %s on-demand block, no tx avail\n",ASSETCHAINS_SYMBOL);
4864 sleep(10);
4865 break;
4866 }
4867--- 619,635 ----
4868 arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits);
4869 if ( ASSETCHAINS_SYMBOL[0] == 0 && komodo_is_special(pindexPrev->nHeight+1,NOTARY_PUBKEY33) > 0 )
4870 {
4871! if ( (Mining_height % KOMODO_ELECTION_GAP) > 64 || (Mining_height % KOMODO_ELECTION_GAP) == 0 )
4872! {
4873! hashTarget = arith_uint256().SetCompact(KOMODO_MINDIFF_NBITS);
4874! fprintf(stderr,"I am the chosen one for %s ht.%d\n",ASSETCHAINS_SYMBOL,pindexPrev->nHeight+1);
4875! } else Mining_start = 0;
4876 } else Mining_start = 0;
4877 while (true)
4878 {
4879! if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 && pblock->vtx[0].vout.size() == 1 && Mining_height > ASSETCHAINS_MINHEIGHT )
4880 {
4881! fprintf(stderr,"skip generating %s on-demand block, no tx avail\n",ASSETCHAINS_SYMBOL);
4882 sleep(10);
4883 break;
4884 }
4885***************
4886*** 784,794 ****
4887--- 792,804 ----
4888 }
4889 catch (const boost::thread_interrupted&)
4890 {
4891+ c.disconnect();
4892 LogPrintf("KomodoMiner terminated\n");
4893 throw;
4894 }
4895 catch (const std::runtime_error &e)
4896 {
4897+ c.disconnect();
4898 LogPrintf("KomodoMiner runtime error: %s\n", e.what());
4899 return;
4900 }
4901diff -crB ./src/pow.cpp ../../komodo-jl777/src/pow.cpp
4902*** ./src/pow.cpp 2017-01-03 10:40:50.259331594 +0000
4903--- ../../komodo-jl777/src/pow.cpp 2017-01-03 09:49:08.864506767 +0000
4904***************
4905*** 113,119 ****
4906 bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned int nBits, const Consensus::Params& params)
4907 {
4908 extern int32_t KOMODO_REWIND;
4909! bool fNegative,fOverflow; int32_t i,nonz=0,special,special2,notaryid=-1,flag = 0;
4910 arith_uint256 bnTarget;
4911
4912 bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
4913--- 113,119 ----
4914 bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned int nBits, const Consensus::Params& params)
4915 {
4916 extern int32_t KOMODO_REWIND;
4917! bool fNegative,fOverflow; int32_t i,nonz=0,special=0,special2=0,notaryid=-1,flag = 0;
4918 arith_uint256 bnTarget;
4919
4920 bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
4921***************
4922*** 130,144 ****
4923 if ( nonz == 0 )
4924 return(true); // will come back via different path with pubkey set
4925 special2 = komodo_is_special(height,pubkey33);
4926! if ( notaryid >= 0 && ((height >= 64000 && height <= 90065) || (height % KOMODO_ELECTION_GAP) > 64) )
4927 {
4928- //if ( special2 == -2 )
4929- // printf("height.%d special2.%d special.%d\n",height,special2,special);
4930 if ( (height >= 64000 && height <= 90065) || (height % KOMODO_ELECTION_GAP) == 0 || (height < 80000 && (special != 0 || special2 > 0)) || (height >= 80000 && special2 > 0) )
4931 {
4932 bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow);
4933 flag = 1;
4934 }
4935 }
4936 }
4937 if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit))
4938--- 130,153 ----
4939 if ( nonz == 0 )
4940 return(true); // will come back via different path with pubkey set
4941 special2 = komodo_is_special(height,pubkey33);
4942! /*if ( notaryid >= 0 && ((height >= 64000 && height <= 90065) || (height % KOMODO_ELECTION_GAP) > 64) )
4943 {
4944 if ( (height >= 64000 && height <= 90065) || (height % KOMODO_ELECTION_GAP) == 0 || (height < 80000 && (special != 0 || special2 > 0)) || (height >= 80000 && special2 > 0) )
4945 {
4946 bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow);
4947 flag = 1;
4948 }
4949+ }*/
4950+ if ( notaryid >= 0 )
4951+ {
4952+ if ( height > 10000 && height < 80000 && (special != 0 || special2 > 0) )
4953+ flag = 1;
4954+ else if ( height >= 80000 && height < 108000 && special2 > 0 )
4955+ flag = 1;
4956+ else if ( height >= 108000 && special2 > 0 )
4957+ flag = ((height % KOMODO_ELECTION_GAP) > 64 || (height % KOMODO_ELECTION_GAP) == 0);
4958+ if ( flag != 0 )
4959+ bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow);
4960 }
4961 }
4962 if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit))
4963***************
4964*** 146,160 ****
4965 // Check proof of work matches claimed amount
4966 if ( UintToArith256(hash) > bnTarget )
4967 {
4968! int32_t i;
4969! for (i=31; i>=0; i--)
4970! printf("%02x",((uint8_t *)&hash)[i]);
4971! printf(" hash vs ");
4972! for (i=31; i>=0; i--)
4973! printf("%02x",((uint8_t *)&bnTarget)[i]);
4974! printf(" ht.%d REWIND.%d special.%d notaryid.%d ht.%d mod.%d error\n",height,KOMODO_REWIND,special,notaryid,height,(height % 35));
4975! if ( height <= KOMODO_REWIND )
4976! return error("CheckProofOfWork(): hash doesn't match nBits");
4977 }
4978 return true;
4979 }
4980--- 155,171 ----
4981 // Check proof of work matches claimed amount
4982 if ( UintToArith256(hash) > bnTarget )
4983 {
4984! {
4985! int32_t i;
4986! for (i=31; i>=0; i--)
4987! printf("%02x",((uint8_t *)&hash)[i]);
4988! printf(" hash vs ");
4989! for (i=31; i>=0; i--)
4990! printf("%02x",((uint8_t *)&bnTarget)[i]);
4991! printf(" ht.%d REWIND.%d special.%d notaryid.%d ht.%d mod.%d error\n",height,KOMODO_REWIND,special,notaryid,height,(height % 35));
4992! if ( height < 90000 || (height > 110000 && KOMODO_REWIND == 0) )
4993! return error("CheckProofOfWork(): hash doesn't match nBits");
4994! }
4995 }
4996 return true;
4997 }
4998diff -crB ./src/primitives/block.h ../../komodo-jl777/src/primitives/block.h
4999*** ./src/primitives/block.h 2017-01-03 10:40:50.259331594 +0000
5000--- ../../komodo-jl777/src/primitives/block.h 2017-01-03 09:49:08.864506767 +0000
5001***************
5002*** 200,205 ****
5003--- 200,209 ----
5004 {
5005 return vHave.empty();
5006 }
5007+
5008+ friend bool operator==(const CBlockLocator& a, const CBlockLocator& b) {
5009+ return (a.vHave == b.vHave);
5010+ }
5011 };
5012
5013 #endif // BITCOIN_PRIMITIVES_BLOCK_H
5014diff -crB ./src/primitives/transaction.cpp ../../komodo-jl777/src/primitives/transaction.cpp
5015*** ./src/primitives/transaction.cpp 2017-01-03 10:40:50.259331594 +0000
5016--- ../../komodo-jl777/src/primitives/transaction.cpp 2017-01-03 09:49:08.864506767 +0000
5017***************
5018*** 62,67 ****
5019--- 62,70 ----
5020 // Randomize the order of the inputs and outputs
5021 inputMap = {0, 1};
5022 outputMap = {0, 1};
5023+
5024+ assert(gen);
5025+
5026 MappedShuffle(inputs.begin(), inputMap.begin(), ZC_NUM_JS_INPUTS, gen);
5027 MappedShuffle(outputs.begin(), outputMap.begin(), ZC_NUM_JS_OUTPUTS, gen);
5028
5029***************
5030*** 72,81 ****
5031--- 75,86 ----
5032
5033 bool JSDescription::Verify(
5034 ZCJoinSplit& params,
5035+ libzcash::ProofVerifier& verifier,
5036 const uint256& pubKeyHash
5037 ) const {
5038 return params.verify(
5039 proof,
5040+ verifier,
5041 pubKeyHash,
5042 randomSeed,
5043 macs,
5044diff -crB ./src/primitives/transaction.h ../../komodo-jl777/src/primitives/transaction.h
5045*** ./src/primitives/transaction.h 2017-01-03 10:40:50.259331594 +0000
5046--- ../../komodo-jl777/src/primitives/transaction.h 2017-01-03 09:49:08.864506767 +0000
5047***************
5048*** 101,107 ****
5049 );
5050
5051 // Verifies that the JoinSplit proof is correct.
5052! bool Verify(ZCJoinSplit& params, const uint256& pubKeyHash) const;
5053
5054 // Returns the calculated h_sig
5055 uint256 h_sig(ZCJoinSplit& params, const uint256& pubKeyHash) const;
5056--- 101,111 ----
5057 );
5058
5059 // Verifies that the JoinSplit proof is correct.
5060! bool Verify(
5061! ZCJoinSplit& params,
5062! libzcash::ProofVerifier& verifier,
5063! const uint256& pubKeyHash
5064! ) const;
5065
5066 // Returns the calculated h_sig
5067 uint256 h_sig(ZCJoinSplit& params, const uint256& pubKeyHash) const;
5068diff -crB ./src/random.cpp ../../komodo-jl777/src/random.cpp
5069*** ./src/random.cpp 2017-01-03 10:40:50.339335643 +0000
5070--- ../../komodo-jl777/src/random.cpp 2017-01-03 09:49:08.864506767 +0000
5071***************
5072*** 137,139 ****
5073--- 137,144 ----
5074 insecure_rand_Rw = tmp;
5075 }
5076 }
5077+
5078+ int GenIdentity(int n)
5079+ {
5080+ return n-1;
5081+ }
5082diff -crB ./src/random.h ../../komodo-jl777/src/random.h
5083*** ./src/random.h 2017-01-03 10:40:50.339335643 +0000
5084--- ../../komodo-jl777/src/random.h 2017-01-03 09:49:08.864506767 +0000
5085***************
5086*** 26,31 ****
5087--- 26,36 ----
5088 uint256 GetRandHash();
5089
5090 /**
5091+ * Identity function for MappedShuffle, so that elements retain their original order.
5092+ */
5093+ int GenIdentity(int n);
5094+
5095+ /**
5096 * Rearranges the elements in the range [first,first+len) randomly, assuming
5097 * that gen is a uniform random number generator. Follows the same algorithm as
5098 * std::shuffle in C++11 (a Durstenfeld shuffle).
5099diff -crB ./src/rpcclient.cpp ../../komodo-jl777/src/rpcclient.cpp
5100*** ./src/rpcclient.cpp 2017-01-03 10:40:50.343335845 +0000
5101--- ../../komodo-jl777/src/rpcclient.cpp 2017-01-03 09:49:08.864506767 +0000
5102***************
5103*** 103,108 ****
5104--- 103,109 ----
5105 { "z_gettotalbalance", 0},
5106 { "z_sendmany", 1},
5107 { "z_sendmany", 2},
5108+ { "z_sendmany", 3},
5109 { "z_getoperationstatus", 0},
5110 { "z_getoperationresult", 0},
5111 { "z_importkey", 1 },
5112diff -crB ./src/rpcmining.cpp ../../komodo-jl777/src/rpcmining.cpp
5113*** ./src/rpcmining.cpp 2017-01-03 10:40:50.343335845 +0000
5114--- ../../komodo-jl777/src/rpcmining.cpp 2017-01-03 09:49:08.864506767 +0000
5115***************
5116*** 37,43 ****
5117 * or over the difficulty averaging window if 'lookup' is nonpositive.
5118 * If 'height' is nonnegative, compute the estimate at the time when a given block was found.
5119 */
5120! Value GetNetworkHashPS(int lookup, int height) {
5121 CBlockIndex *pb = chainActive.Tip();
5122
5123 if (height >= 0 && height < chainActive.Height())
5124--- 37,43 ----
5125 * or over the difficulty averaging window if 'lookup' is nonpositive.
5126 * If 'height' is nonnegative, compute the estimate at the time when a given block was found.
5127 */
5128! int64_t GetNetworkHashPS(int lookup, int height) {
5129 CBlockIndex *pb = chainActive.Tip();
5130
5131 if (height >= 0 && height < chainActive.Height())
5132***************
5133*** 74,92 ****
5134 return (int64_t)(workDiff.getdouble() / timeDiff);
5135 }
5136
5137 Value getnetworkhashps(const Array& params, bool fHelp)
5138 {
5139 if (fHelp || params.size() > 2)
5140 throw runtime_error(
5141 "getnetworkhashps ( blocks height )\n"
5142! "\nReturns the estimated network hashes per second based on the last n blocks.\n"
5143 "Pass in [blocks] to override # of blocks, -1 specifies over difficulty averaging window.\n"
5144 "Pass in [height] to estimate the network speed at the time when a certain block was found.\n"
5145 "\nArguments:\n"
5146 "1. blocks (numeric, optional, default=120) The number of blocks, or -1 for blocks over difficulty averaging window.\n"
5147 "2. height (numeric, optional, default=-1) To estimate at the time of the given height.\n"
5148 "\nResult:\n"
5149! "x (numeric) Hashes per second estimated\n"
5150 "\nExamples:\n"
5151 + HelpExampleCli("getnetworkhashps", "")
5152 + HelpExampleRpc("getnetworkhashps", "")
5153--- 74,133 ----
5154 return (int64_t)(workDiff.getdouble() / timeDiff);
5155 }
5156
5157+ Value getlocalsolps(const Array& params, bool fHelp)
5158+ {
5159+ if (fHelp)
5160+ throw runtime_error(
5161+ "getlocalsolps\n"
5162+ "\nReturns the average local solutions per second since this node was started.\n"
5163+ "This is the same information shown on the metrics screen (if enabled).\n"
5164+ "\nResult:\n"
5165+ "xxx.xxxxx (numeric) Solutions per second average\n"
5166+ "\nExamples:\n"
5167+ + HelpExampleCli("getlocalsolps", "")
5168+ + HelpExampleRpc("getlocalsolps", "")
5169+ );
5170+
5171+ LOCK(cs_main);
5172+ return GetLocalSolPS();
5173+ }
5174+
5175+ Value getnetworksolps(const Array& params, bool fHelp)
5176+ {
5177+ if (fHelp || params.size() > 2)
5178+ throw runtime_error(
5179+ "getnetworksolps ( blocks height )\n"
5180+ "\nReturns the estimated network solutions per second based on the last n blocks.\n"
5181+ "Pass in [blocks] to override # of blocks, -1 specifies over difficulty averaging window.\n"
5182+ "Pass in [height] to estimate the network speed at the time when a certain block was found.\n"
5183+ "\nArguments:\n"
5184+ "1. blocks (numeric, optional, default=120) The number of blocks, or -1 for blocks over difficulty averaging window.\n"
5185+ "2. height (numeric, optional, default=-1) To estimate at the time of the given height.\n"
5186+ "\nResult:\n"
5187+ "x (numeric) Solutions per second estimated\n"
5188+ "\nExamples:\n"
5189+ + HelpExampleCli("getnetworksolps", "")
5190+ + HelpExampleRpc("getnetworksolps", "")
5191+ );
5192+
5193+ LOCK(cs_main);
5194+ return GetNetworkHashPS(params.size() > 0 ? params[0].get_int() : 120, params.size() > 1 ? params[1].get_int() : -1);
5195+ }
5196+
5197 Value getnetworkhashps(const Array& params, bool fHelp)
5198 {
5199 if (fHelp || params.size() > 2)
5200 throw runtime_error(
5201 "getnetworkhashps ( blocks height )\n"
5202! "\nDEPRECATED - left for backwards-compatibility. Use getnetworksolps instead.\n"
5203! "\nReturns the estimated network solutions per second based on the last n blocks.\n"
5204 "Pass in [blocks] to override # of blocks, -1 specifies over difficulty averaging window.\n"
5205 "Pass in [height] to estimate the network speed at the time when a certain block was found.\n"
5206 "\nArguments:\n"
5207 "1. blocks (numeric, optional, default=120) The number of blocks, or -1 for blocks over difficulty averaging window.\n"
5208 "2. height (numeric, optional, default=-1) To estimate at the time of the given height.\n"
5209 "\nResult:\n"
5210! "x (numeric) Solutions per second estimated\n"
5211 "\nExamples:\n"
5212 + HelpExampleCli("getnetworkhashps", "")
5213 + HelpExampleRpc("getnetworkhashps", "")
5214***************
5215*** 209,215 ****
5216 CValidationState state;
5217 if (!ProcessNewBlock(chainActive.Tip()->nHeight+1,state, NULL, pblock, true, NULL))
5218 throw JSONRPCError(RPC_INTERNAL_ERROR, "ProcessNewBlock, block not accepted");
5219- minedBlocks.increment();
5220 ++nHeight;
5221 blockHashes.push_back(pblock->GetHash().GetHex());
5222 }
5223--- 250,255 ----
5224***************
5225*** 280,285 ****
5226--- 320,327 ----
5227 " \"errors\": \"...\" (string) Current errors\n"
5228 " \"generate\": true|false (boolean) If the generation is on or off (see getgenerate or setgenerate calls)\n"
5229 " \"genproclimit\": n (numeric) The processor limit for generation. -1 if no generation. (see getgenerate or setgenerate calls)\n"
5230+ " \"localsolps\": xxx.xxxxx (numeric) The average local solution rate in Sol/s since this node was started\n"
5231+ " \"networksolps\": x (numeric) The estimated network solution rate in Sol/s\n"
5232 " \"pooledtx\": n (numeric) The size of the mem pool\n"
5233 " \"testnet\": true|false (boolean) If using testnet or not\n"
5234 " \"chain\": \"xxxx\", (string) current network name as defined in BIP70 (main, test, regtest)\n"
5235***************
5236*** 299,305 ****
5237 obj.push_back(Pair("difficulty", (double)GetNetworkDifficulty()));
5238 obj.push_back(Pair("errors", GetWarnings("statusbar")));
5239 obj.push_back(Pair("genproclimit", (int)GetArg("-genproclimit", -1)));
5240! obj.push_back(Pair("networkhashps", getnetworkhashps(params, false)));
5241 obj.push_back(Pair("pooledtx", (uint64_t)mempool.size()));
5242 obj.push_back(Pair("testnet", Params().TestnetToBeDeprecatedFieldRPC()));
5243 obj.push_back(Pair("chain", Params().NetworkIDString()));
5244--- 341,349 ----
5245 obj.push_back(Pair("difficulty", (double)GetNetworkDifficulty()));
5246 obj.push_back(Pair("errors", GetWarnings("statusbar")));
5247 obj.push_back(Pair("genproclimit", (int)GetArg("-genproclimit", -1)));
5248! obj.push_back(Pair("localsolps" , getlocalsolps(params, false)));
5249! obj.push_back(Pair("networksolps", getnetworksolps(params, false)));
5250! obj.push_back(Pair("networkhashps", getnetworksolps(params, false)));
5251 obj.push_back(Pair("pooledtx", (uint64_t)mempool.size()));
5252 obj.push_back(Pair("testnet", Params().TestnetToBeDeprecatedFieldRPC()));
5253 obj.push_back(Pair("chain", Params().NetworkIDString()));
5254***************
5255*** 483,492 ****
5256 throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode");
5257
5258 if (vNodes.empty())
5259! throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Bitcoin is not connected!");
5260
5261 if (IsInitialBlockDownload())
5262! throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Bitcoin is downloading blocks...");
5263
5264 static unsigned int nTransactionsUpdatedLast;
5265
5266--- 527,536 ----
5267 throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode");
5268
5269 if (vNodes.empty())
5270! throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Zcash is not connected!");
5271
5272 if (IsInitialBlockDownload())
5273! throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Zcash is downloading blocks...");
5274
5275 static unsigned int nTransactionsUpdatedLast;
5276
5277diff -crB ./src/rpcmisc.cpp ../../komodo-jl777/src/rpcmisc.cpp
5278*** ./src/rpcmisc.cpp 2017-01-03 10:40:50.343335845 +0000
5279--- ../../komodo-jl777/src/rpcmisc.cpp 2017-01-03 09:49:08.864506767 +0000
5280***************
5281*** 23,28 ****
5282--- 23,30 ----
5283 #include "json/json_spirit_utils.h"
5284 #include "json/json_spirit_value.h"
5285
5286+ #include "zcash/Address.hpp"
5287+
5288 using namespace json_spirit;
5289 using namespace std;
5290
5291***************
5292*** 236,241 ****
5293--- 238,306 ----
5294 return ret;
5295 }
5296
5297+
5298+ Value z_validateaddress(const Array& params, bool fHelp)
5299+ {
5300+ if (fHelp || params.size() != 1)
5301+ throw runtime_error(
5302+ "z_validateaddress \"zaddr\"\n"
5303+ "\nReturn information about the given z address.\n"
5304+ "\nArguments:\n"
5305+ "1. \"zaddr\" (string, required) The z address to validate\n"
5306+ "\nResult:\n"
5307+ "{\n"
5308+ " \"isvalid\" : true|false, (boolean) If the address is valid or not. If not, this is the only property returned.\n"
5309+ " \"address\" : \"zaddr\", (string) The z address validated\n"
5310+ " \"ismine\" : true|false, (boolean) If the address is yours or not\n"
5311+ " \"payingkey\" : \"hex\", (string) The hex value of the paying key, a_pk\n"
5312+ " \"transmissionkey\" : \"hex\", (string) The hex value of the transmission key, pk_enc\n"
5313+
5314+ "}\n"
5315+ "\nExamples:\n"
5316+ + HelpExampleCli("validateaddress", "\"zcWsmqT4X2V4jgxbgiCzyrAfRT1vi1F4sn7M5Pkh66izzw8Uk7LBGAH3DtcSMJeUb2pi3W4SQF8LMKkU2cUuVP68yAGcomL\"")
5317+ );
5318+
5319+
5320+ #ifdef ENABLE_WALLET
5321+ LOCK2(cs_main, pwalletMain->cs_wallet);
5322+ #else
5323+ LOCK(cs_main);
5324+ #endif
5325+
5326+ bool isValid = false;
5327+ bool isMine = false;
5328+ std::string payingKey, transmissionKey;
5329+
5330+ string strAddress = params[0].get_str();
5331+ try {
5332+ CZCPaymentAddress address(strAddress);
5333+ libzcash::PaymentAddress addr = address.Get();
5334+
5335+ #ifdef ENABLE_WALLET
5336+ isMine = pwalletMain->HaveSpendingKey(addr);
5337+ #endif
5338+ payingKey = addr.a_pk.GetHex();
5339+ transmissionKey = addr.pk_enc.GetHex();
5340+ isValid = true;
5341+ } catch (std::runtime_error e) {
5342+ // address is invalid, nop here as isValid is false.
5343+ }
5344+
5345+ Object ret;
5346+ ret.push_back(Pair("isvalid", isValid));
5347+ if (isValid)
5348+ {
5349+ ret.push_back(Pair("address", strAddress));
5350+ ret.push_back(Pair("payingkey", payingKey));
5351+ ret.push_back(Pair("transmissionkey", transmissionKey));
5352+ #ifdef ENABLE_WALLET
5353+ ret.push_back(Pair("ismine", isMine));
5354+ #endif
5355+ }
5356+ return ret;
5357+ }
5358+
5359+
5360 /**
5361 * Used by addmultisigaddress / createmultisig:
5362 */
5363diff -crB ./src/rpcprotocol.cpp ../../komodo-jl777/src/rpcprotocol.cpp
5364*** ./src/rpcprotocol.cpp 2017-01-03 10:40:50.343335845 +0000
5365--- ../../komodo-jl777/src/rpcprotocol.cpp 2017-01-03 09:49:08.864506767 +0000
5366***************
5367*** 33,39 ****
5368
5369 /**
5370 * HTTP protocol
5371! *
5372 * This ain't Apache. We're just using HTTP header for the length field
5373 * and to be compatible with other JSON-RPC implementations.
5374 */
5375--- 33,39 ----
5376
5377 /**
5378 * HTTP protocol
5379! *
5380 * This ain't Apache. We're just using HTTP header for the length field
5381 * and to be compatible with other JSON-RPC implementations.
5382 */
5383***************
5384*** 42,48 ****
5385 {
5386 ostringstream s;
5387 s << "POST / HTTP/1.1\r\n"
5388! << "User-Agent: bitcoin-json-rpc/" << FormatFullVersion() << "\r\n"
5389 << "Host: 127.0.0.1\r\n"
5390 << "Content-Type: application/json\r\n"
5391 << "Content-Length: " << strMsg.size() << "\r\n"
5392--- 42,48 ----
5393 {
5394 ostringstream s;
5395 s << "POST / HTTP/1.1\r\n"
5396! << "User-Agent: zcash-json-rpc/" << FormatFullVersion() << "\r\n"
5397 << "Host: 127.0.0.1\r\n"
5398 << "Content-Type: application/json\r\n"
5399 << "Content-Length: " << strMsg.size() << "\r\n"
5400***************
5401*** 77,83 ****
5402 if (nStatus == HTTP_UNAUTHORIZED)
5403 return strprintf("HTTP/1.0 401 Authorization Required\r\n"
5404 "Date: %s\r\n"
5405! "Server: bitcoin-json-rpc/%s\r\n"
5406 "WWW-Authenticate: Basic realm=\"jsonrpc\"\r\n"
5407 "Content-Type: text/html\r\n"
5408 "Content-Length: 296\r\n"
5409--- 77,83 ----
5410 if (nStatus == HTTP_UNAUTHORIZED)
5411 return strprintf("HTTP/1.0 401 Authorization Required\r\n"
5412 "Date: %s\r\n"
5413! "Server: zcash-json-rpc/%s\r\n"
5414 "WWW-Authenticate: Basic realm=\"jsonrpc\"\r\n"
5415 "Content-Type: text/html\r\n"
5416 "Content-Length: 296\r\n"
5417***************
5418*** 104,110 ****
5419 "Connection: %s\r\n"
5420 "Content-Length: %u\r\n"
5421 "Content-Type: %s\r\n"
5422! "Server: bitcoin-json-rpc/%s\r\n"
5423 "\r\n",
5424 nStatus,
5425 httpStatusDescription(nStatus),
5426--- 104,110 ----
5427 "Connection: %s\r\n"
5428 "Content-Length: %u\r\n"
5429 "Content-Type: %s\r\n"
5430! "Server: zcash-json-rpc/%s\r\n"
5431 "\r\n",
5432 nStatus,
5433 httpStatusDescription(nStatus),
5434***************
5435*** 248,254 ****
5436 * JSON-RPC protocol. Bitcoin speaks version 1.0 for maximum compatibility,
5437 * but uses JSON-RPC 1.1/2.0 standards for parts of the 1.0 standard that were
5438 * unspecified (HTTP errors and contents of 'error').
5439! *
5440 * 1.0 spec: http://json-rpc.org/wiki/specification
5441 * 1.2 spec: http://jsonrpc.org/historical/json-rpc-over-http.html
5442 * http://www.codeproject.com/KB/recipes/JSON_Spirit.aspx
5443--- 248,254 ----
5444 * JSON-RPC protocol. Bitcoin speaks version 1.0 for maximum compatibility,
5445 * but uses JSON-RPC 1.1/2.0 standards for parts of the 1.0 standard that were
5446 * unspecified (HTTP errors and contents of 'error').
5447! *
5448 * 1.0 spec: http://json-rpc.org/wiki/specification
5449 * 1.2 spec: http://jsonrpc.org/historical/json-rpc-over-http.html
5450 * http://www.codeproject.com/KB/recipes/JSON_Spirit.aspx
5451diff -crB ./src/rpcserver.cpp ../../komodo-jl777/src/rpcserver.cpp
5452*** ./src/rpcserver.cpp 2017-01-03 10:40:50.343335845 +0000
5453--- ../../komodo-jl777/src/rpcserver.cpp 2017-01-03 09:49:08.864506767 +0000
5454***************
5455*** 309,314 ****
5456--- 309,316 ----
5457 /* Mining */
5458 { "mining", "getblocktemplate", &getblocktemplate, true },
5459 { "mining", "getmininginfo", &getmininginfo, true },
5460+ { "mining", "getlocalsolps", &getlocalsolps, true },
5461+ { "mining", "getnetworksolps", &getnetworksolps, true },
5462 { "mining", "getnetworkhashps", &getnetworkhashps, true },
5463 { "mining", "prioritisetransaction", &prioritisetransaction, true },
5464 { "mining", "submitblock", &submitblock, true },
5465***************
5466*** 335,340 ****
5467--- 337,343 ----
5468 { "util", "verifymessage", &verifymessage, true },
5469 { "util", "estimatefee", &estimatefee, true },
5470 { "util", "estimatepriority", &estimatepriority, true },
5471+ { "util", "z_validateaddress", &z_validateaddress, true }, /* uses wallet if enabled */
5472
5473 /* Not shown in help */
5474 { "hidden", "invalidateblock", &invalidateblock, true },
5475***************
5476*** 1034,1042 ****
5477--- 1037,1051 ----
5478 // Read HTTP message headers and body
5479 ReadHTTPMessage(conn->stream(), mapHeaders, strRequest, nProto, MAX_SIZE);
5480
5481+ // TODO #1856: Re-enable support for persistent connections.
5482+ // We have disabled support for HTTP Keep-Alive until resolution of #1680, upstream rpc deadlock.
5483+ // Close connection immediately.
5484+ fRun = false;
5485+ /*
5486 // HTTP Keep-Alive is false; close connection immediately
5487 if ((mapHeaders["connection"] == "close") || (!GetBoolArg("-rpckeepalive", true)))
5488 fRun = false;
5489+ */
5490
5491 // Process via JSON-RPC API
5492 if (strURI == "/") {
5493diff -crB ./src/rpcserver.h ../../komodo-jl777/src/rpcserver.h
5494*** ./src/rpcserver.h 2017-01-03 10:40:50.343335845 +0000
5495--- ../../komodo-jl777/src/rpcserver.h 2017-01-03 09:49:08.864506767 +0000
5496***************
5497*** 169,174 ****
5498--- 169,176 ----
5499 extern json_spirit::Value getgenerate(const json_spirit::Array& params, bool fHelp); // in rpcmining.cpp
5500 extern json_spirit::Value setgenerate(const json_spirit::Array& params, bool fHelp);
5501 extern json_spirit::Value generate(const json_spirit::Array& params, bool fHelp);
5502+ extern json_spirit::Value getlocalsolps(const json_spirit::Array& params, bool fHelp);
5503+ extern json_spirit::Value getnetworksolps(const json_spirit::Array& params, bool fHelp);
5504 extern json_spirit::Value getnetworkhashps(const json_spirit::Array& params, bool fHelp);
5505 extern json_spirit::Value getmininginfo(const json_spirit::Array& params, bool fHelp);
5506 extern json_spirit::Value prioritisetransaction(const json_spirit::Array& params, bool fHelp);
5507***************
5508*** 270,275 ****
5509--- 272,278 ----
5510 extern json_spirit::Value z_getoperationstatus(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
5511 extern json_spirit::Value z_getoperationresult(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
5512 extern json_spirit::Value z_listoperationids(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
5513+ extern json_spirit::Value z_validateaddress(const json_spirit::Array& params, bool fHelp); // in rpcmisc.cpp
5514
5515
5516 // in rest.cpp
5517diff -crB ./src/test/coins_tests.cpp ../../komodo-jl777/src/test/coins_tests.cpp
5518*** ./src/test/coins_tests.cpp 2017-01-03 10:40:50.375337465 +0000
5519--- ../../komodo-jl777/src/test/coins_tests.cpp 2017-01-03 09:49:08.868506976 +0000
5520***************
5521*** 166,171 ****
5522--- 166,414 ----
5523
5524 BOOST_FIXTURE_TEST_SUITE(coins_tests, BasicTestingSetup)
5525
5526+ BOOST_AUTO_TEST_CASE(nullifier_regression_test)
5527+ {
5528+ // Correct behavior:
5529+ {
5530+ CCoinsViewTest base;
5531+ CCoinsViewCacheTest cache1(&base);
5532+
5533+ // Insert a nullifier into the base.
5534+ uint256 nf = GetRandHash();
5535+ cache1.SetNullifier(nf, true);
5536+ cache1.Flush(); // Flush to base.
5537+
5538+ // Remove the nullifier from cache
5539+ cache1.SetNullifier(nf, false);
5540+
5541+ // The nullifier now should be `false`.
5542+ BOOST_CHECK(!cache1.GetNullifier(nf));
5543+ }
5544+
5545+ // Also correct behavior:
5546+ {
5547+ CCoinsViewTest base;
5548+ CCoinsViewCacheTest cache1(&base);
5549+
5550+ // Insert a nullifier into the base.
5551+ uint256 nf = GetRandHash();
5552+ cache1.SetNullifier(nf, true);
5553+ cache1.Flush(); // Flush to base.
5554+
5555+ // Remove the nullifier from cache
5556+ cache1.SetNullifier(nf, false);
5557+ cache1.Flush(); // Flush to base.
5558+
5559+ // The nullifier now should be `false`.
5560+ BOOST_CHECK(!cache1.GetNullifier(nf));
5561+ }
5562+
5563+ // Works because we bring it from the parent cache:
5564+ {
5565+ CCoinsViewTest base;
5566+ CCoinsViewCacheTest cache1(&base);
5567+
5568+ // Insert a nullifier into the base.
5569+ uint256 nf = GetRandHash();
5570+ cache1.SetNullifier(nf, true);
5571+ cache1.Flush(); // Empties cache.
5572+
5573+ // Create cache on top.
5574+ {
5575+ // Remove the nullifier.
5576+ CCoinsViewCacheTest cache2(&cache1);
5577+ BOOST_CHECK(cache2.GetNullifier(nf));
5578+ cache2.SetNullifier(nf, false);
5579+ cache2.Flush(); // Empties cache, flushes to cache1.
5580+ }
5581+
5582+ // The nullifier now should be `false`.
5583+ BOOST_CHECK(!cache1.GetNullifier(nf));
5584+ }
5585+
5586+ // Was broken:
5587+ {
5588+ CCoinsViewTest base;
5589+ CCoinsViewCacheTest cache1(&base);
5590+
5591+ // Insert a nullifier into the base.
5592+ uint256 nf = GetRandHash();
5593+ cache1.SetNullifier(nf, true);
5594+ cache1.Flush(); // Empties cache.
5595+
5596+ // Create cache on top.
5597+ {
5598+ // Remove the nullifier.
5599+ CCoinsViewCacheTest cache2(&cache1);
5600+ cache2.SetNullifier(nf, false);
5601+ cache2.Flush(); // Empties cache, flushes to cache1.
5602+ }
5603+
5604+ // The nullifier now should be `false`.
5605+ BOOST_CHECK(!cache1.GetNullifier(nf));
5606+ }
5607+ }
5608+
5609+ BOOST_AUTO_TEST_CASE(anchor_pop_regression_test)
5610+ {
5611+ // Correct behavior:
5612+ {
5613+ CCoinsViewTest base;
5614+ CCoinsViewCacheTest cache1(&base);
5615+
5616+ // Create dummy anchor/commitment
5617+ ZCIncrementalMerkleTree tree;
5618+ uint256 cm = GetRandHash();
5619+ tree.append(cm);
5620+
5621+ // Add the anchor
5622+ cache1.PushAnchor(tree);
5623+ cache1.Flush();
5624+
5625+ // Remove the anchor
5626+ cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
5627+ cache1.Flush();
5628+
5629+ // Add the anchor back
5630+ cache1.PushAnchor(tree);
5631+ cache1.Flush();
5632+
5633+ // The base contains the anchor, of course!
5634+ {
5635+ ZCIncrementalMerkleTree checktree;
5636+ BOOST_CHECK(cache1.GetAnchorAt(tree.root(), checktree));
5637+ BOOST_CHECK(checktree.root() == tree.root());
5638+ }
5639+ }
5640+
5641+ // Previously incorrect behavior
5642+ {
5643+ CCoinsViewTest base;
5644+ CCoinsViewCacheTest cache1(&base);
5645+
5646+ // Create dummy anchor/commitment
5647+ ZCIncrementalMerkleTree tree;
5648+ uint256 cm = GetRandHash();
5649+ tree.append(cm);
5650+
5651+ // Add the anchor and flush to disk
5652+ cache1.PushAnchor(tree);
5653+ cache1.Flush();
5654+
5655+ // Remove the anchor, but don't flush yet!
5656+ cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
5657+
5658+ {
5659+ CCoinsViewCacheTest cache2(&cache1); // Build cache on top
5660+ cache2.PushAnchor(tree); // Put the same anchor back!
5661+ cache2.Flush(); // Flush to cache1
5662+ }
5663+
5664+ // cache2's flush kinda worked, i.e. cache1 thinks the
5665+ // tree is there, but it didn't bring down the correct
5666+ // treestate...
5667+ {
5668+ ZCIncrementalMerkleTree checktree;
5669+ BOOST_CHECK(cache1.GetAnchorAt(tree.root(), checktree));
5670+ BOOST_CHECK(checktree.root() == tree.root()); // Oh, shucks.
5671+ }
5672+
5673+ // Flushing cache won't help either, just makes the inconsistency
5674+ // permanent.
5675+ cache1.Flush();
5676+ {
5677+ ZCIncrementalMerkleTree checktree;
5678+ BOOST_CHECK(cache1.GetAnchorAt(tree.root(), checktree));
5679+ BOOST_CHECK(checktree.root() == tree.root()); // Oh, shucks.
5680+ }
5681+ }
5682+ }
5683+
5684+ BOOST_AUTO_TEST_CASE(anchor_regression_test)
5685+ {
5686+ // Correct behavior:
5687+ {
5688+ CCoinsViewTest base;
5689+ CCoinsViewCacheTest cache1(&base);
5690+
5691+ // Insert anchor into base.
5692+ ZCIncrementalMerkleTree tree;
5693+ uint256 cm = GetRandHash();
5694+ tree.append(cm);
5695+ cache1.PushAnchor(tree);
5696+ cache1.Flush();
5697+
5698+ cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
5699+ BOOST_CHECK(cache1.GetBestAnchor() == ZCIncrementalMerkleTree::empty_root());
5700+ BOOST_CHECK(!cache1.GetAnchorAt(tree.root(), tree));
5701+ }
5702+
5703+ // Also correct behavior:
5704+ {
5705+ CCoinsViewTest base;
5706+ CCoinsViewCacheTest cache1(&base);
5707+
5708+ // Insert anchor into base.
5709+ ZCIncrementalMerkleTree tree;
5710+ uint256 cm = GetRandHash();
5711+ tree.append(cm);
5712+ cache1.PushAnchor(tree);
5713+ cache1.Flush();
5714+
5715+ cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
5716+ cache1.Flush();
5717+ BOOST_CHECK(cache1.GetBestAnchor() == ZCIncrementalMerkleTree::empty_root());
5718+ BOOST_CHECK(!cache1.GetAnchorAt(tree.root(), tree));
5719+ }
5720+
5721+ // Works because we bring the anchor in from parent cache.
5722+ {
5723+ CCoinsViewTest base;
5724+ CCoinsViewCacheTest cache1(&base);
5725+
5726+ // Insert anchor into base.
5727+ ZCIncrementalMerkleTree tree;
5728+ uint256 cm = GetRandHash();
5729+ tree.append(cm);
5730+ cache1.PushAnchor(tree);
5731+ cache1.Flush();
5732+
5733+ {
5734+ // Pop anchor.
5735+ CCoinsViewCacheTest cache2(&cache1);
5736+ BOOST_CHECK(cache2.GetAnchorAt(tree.root(), tree));
5737+ cache2.PopAnchor(ZCIncrementalMerkleTree::empty_root());
5738+ cache2.Flush();
5739+ }
5740+
5741+ BOOST_CHECK(cache1.GetBestAnchor() == ZCIncrementalMerkleTree::empty_root());
5742+ BOOST_CHECK(!cache1.GetAnchorAt(tree.root(), tree));
5743+ }
5744+
5745+ // Was broken:
5746+ {
5747+ CCoinsViewTest base;
5748+ CCoinsViewCacheTest cache1(&base);
5749+
5750+ // Insert anchor into base.
5751+ ZCIncrementalMerkleTree tree;
5752+ uint256 cm = GetRandHash();
5753+ tree.append(cm);
5754+ cache1.PushAnchor(tree);
5755+ cache1.Flush();
5756+
5757+ {
5758+ // Pop anchor.
5759+ CCoinsViewCacheTest cache2(&cache1);
5760+ cache2.PopAnchor(ZCIncrementalMerkleTree::empty_root());
5761+ cache2.Flush();
5762+ }
5763+
5764+ BOOST_CHECK(cache1.GetBestAnchor() == ZCIncrementalMerkleTree::empty_root());
5765+ BOOST_CHECK(!cache1.GetAnchorAt(tree.root(), tree));
5766+ }
5767+ }
5768+
5769 BOOST_AUTO_TEST_CASE(nullifiers_test)
5770 {
5771 CCoinsViewTest base;
5772Only in ../../komodo-jl777/src/test/data: merkle_commitments.json
5773diff -crB ./src/test/data/merkle_path.json ../../komodo-jl777/src/test/data/merkle_path.json
5774*** ./src/test/data/merkle_path.json 2017-01-03 10:40:50.395338477 +0000
5775--- ../../komodo-jl777/src/test/data/merkle_path.json 2017-01-03 09:49:08.872507185 +0000
5776***************
5777*** 1,123 ****
5778 [
5779! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5780! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5781! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5782! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5783! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5784! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5785! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5786! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5787! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5788! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5789! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5790! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5791! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5792! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5793! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5794! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5795! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5796! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5797! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5798! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5799! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5800! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5801! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5802! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5803! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5804! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5805! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5806! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5807! "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5808! "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5809! "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5810! "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5811! "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5812! "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5813! "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5814! "04fd000101010001000100000000010100010000000100000000000100010000010001010000010001010101000000010001010000010101010100010100010101000100000100010101000101000101010100000000010101000101010000010001000000000101010000010001010000000000010001000100000001000100010101010100000001010101010101010100000001000000000000000001000000000000000001000101000001000001010000010000000101000101000000010100000100000001010101000001010101000001000000010101000001000100000100010100010101000000010001000000000100000100000000010100000100000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5815! "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5816! "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5817! "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5818! "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5819! "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5820! "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5821! "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5822! "04fd000101000101010001010100010100010001010101010100000101010000010101000001010001000100000000010101000101000101010001010001000101010001010001010000000100000101010000000000000101000001010001010101000001010000000000000101010101010001010101010000000000010000010000000000000001000101000001010100010100000001010001000000010000000000010101000101010000000001000000000100000000010101000101000001000000000100000000010100000001010101000100010101000001010001010101010001000000000000010001000000010101000100010000010000000001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5823! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
5824! "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5825! "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5826! "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5827! "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5828! "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5829! "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5830! "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5831! "04fd000100010100000101010000000000010101000000010001010100000001000100010000010101000101010000000101010001010101000000010000010000000100000101010101000100010001010001010001010101010001000000000001010000010000000001010000000000010001010001010000000100010101000101000001010001010101010100010100000101010000010101010000000000010001000000010100000101010101000100010100000001000101000001000101000101010000000100010100000100000101010000000100010000000100010001000101010001000000000001010001010100000000000100010100000000000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5832! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
5833! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
5834! "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5835! "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5836! "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5837! "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5838! "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5839! "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5840! "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5841! "04fd000101010100010100000001010000010101010101000100010101010100010101010101000001010001000101010001010000000100000101000101000101000100010001000100000001010100000101010001000000000000010000010101000000010000000001010001000000010100010000000000010100000000000000010000000000000001010100010100010100010101010100010001010000000001000101010000000001010001000000010000000001010000010101010001000100010001010101000000010100000101010100010000000001000101010001010001000000010000010101000000000000000101010000010101010100000001fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5842! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
5843! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
5844! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
5845! "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5846! "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5847! "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5848! "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5849! "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5850! "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5851! "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5852! "04fd000100010000010100000001010100010101010000010000010001010100000000010100010001000100010001010001000000000000010000000001000000000100000101000000000001010101000100000000010101000101000001000001000000010101010100000100010000010101010101010001000100000101010001010001000000010001000000010000010000010100010001010001000101010101010000000100010100000100000101010000010001010100000100000100000101000001000101010100000000000000000000010000000101010000010001010000000101000001010001010001010000010000010101000101000000000100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5853! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
5854! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
5855! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
5856! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100000001000101000101010100000000000001000000000001000100000000010000010001000100010000000100010101010000000000010001010001000001010001010100000001000001010101010100000001010000000000000000000101000000010100000000000001010100010001010100010101000000010000010001010000000001000100000101000100010100000001000001000001000100010000000001000001010000010101000100010000000001010100010101010000010001000000010000000100010100010100010100010100000101010001010101010000010000000100000001000101010000010001000001010000000001fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000101",
5857! "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5858! "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5859! "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5860! "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5861! "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5862! "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5863! "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5864! "04fd000100010000000001010001010001000000000100000001010100010001000000010101010000010000000000010101010000010101000101010101000101010001000100000001000000000001010101000100000100000101000000010101000100010000000101010101000000000100000000010000000101010000010100000001000000010001000000000000010000010100010101010101000001000100000000010100000101010100010000000000010101010100000001000001000100010001000000010001000000010001010100000101010101010000000001000100000001000100000000000000010100010001000101000001000001010100fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5865! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
5866! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
5867! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
5868! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010000010000010100010101000100010000000001010100000001000100010000010100000000010100000000010000010100000001000100010000000000010001000100000101000101000101010101000001000100000101000000000101000101000101000101000001010101010001010000000101000001000101010000010001010001000000000001000001000100000000010001010100000101000000010001010000000100010000000001000001010001000001000100010001010000010101010001010101010000000100010100010001000000000001000000010101000001010001000001000001010100000101010000010101fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000101",
5869! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010000",
5870! "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5871! "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5872! "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5873! "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5874! "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5875! "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5876! "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5877! "04fd000101000000000101000100000101010000010000000101010000010100010101010000000101010001010101000101000100000001010000000001010000010001010001000100010000010001000001010000010000010100010101000101010001010101000000010100010000000100000001000000010101000101010101000101000000000001000000000001010100010000010100000101010101000101000100010001000000000000000001000001010101010100000001000100000101000001010101010001010100000001000000010100000101000101010101000001000001000101010100010001010100010000010100010001010001000000fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5878! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
5879! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
5880! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
5881! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000100010101010001010000010001000000010100000001010100000000010001000000000101010101000001000100010100010000010001010001010101010000010101000101010100010001000000010100000001010100010001000000000100000101010001000000000100010100000001010000010001000000000000010101000000010101010001000101010101010100010100000000010100010101000101000100010101000000010101000000010101000001000001000101010000000101010000000000000001010101010001010001010100010000000001010100000101000000000101010001010100000101000101010000010000000100fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000101",
5882! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010000",
5883! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000100000000000100010001000001010101000000000000000101010001010000000001000000010101010001010001010101010001010001000001000000010000010001000000010101000001000100010100010101010100000001000100000001010001010001000000000100010101000000000100000100010001010101010001000100000001010001010001000100010101010100010000010101010000010001010100000101010100010100000001010101010101000101000001010001000000000100000001010001010101000101000100000001010100010100010101000100010001010001010101010000000001000001000000010000000001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010001",
5884! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000000",
5885! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000001",
5886! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000100",
5887! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400000101",
5888! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010000",
5889! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010001",
5890! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010100",
5891! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010400010101",
5892! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000000",
5893! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000001",
5894! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000100",
5895! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401000101",
5896! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010000",
5897! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010001",
5898! "04fd000100010001000100010001010000010000010100010100000100010101000101010000010000000001000100000001000101010001000001000101010000010001000001010100010100000000000001000101000101010100000001000101000101000000010101000000010000000100010001010000000100000000010001000100000000000100000000000001010000000001000100000101010000000000010100010100000001000000010101000100010101010001010100010001000001000000010100010101000101010000000101010000000101010101000000000100010101000001010001010100010001000001000100000001000000000101fd000101010001010100000000010100000101010100000100010001000001000000000101010001000000000101000000000001000100010001010001010000010101000101010000000001010001010000000000010001000101010001000100000101000000010101010000010000000000010101000100010001010100000101000101000100010001010101000000010001010000010001000100000101000100000101000000010101010101000101000000010101010101000101000100000101000101000100000000000001010100000001010101000001010101000101010000010001010100000000010000010000000001010100010001010001010000fd000101000000000101000100000100010001010000000001010100000101010100010001010000000101010101000101000000000000010001010101000001010100010101000100010001010001010001010001000101000101010101010001000001010000010100000101000000010100000101010000010000000101010001000101000001000000000000000000010101010000000000010100000000000100000101000101010101010000000101010101000001010101010001010000010100010000010101010101000000010101000101000000000101000000000000000000010100000000000100010100010001010100000001000001010101010001fd0001000100010001000101000101010000000001000100000100000101010100000000000001010001010100000101000001010000010001000101000100000100000001000001010000010000010000010101000001010001010001010000010000010101000001000000010000000000010100010001010100000001000001010100000100000100000100010101000001000101000101010101000001010000010101000001000000010101010001000001010101010001010100000101000100000000010001000000000001010100000101010101010000010000010100000000010000000001000101000000010000010001010000000001010100000001010401010100"
5899!
5900 ]
5901--- 1,122 ----
5902 [
5903! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5904! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000100010000010101010000010001000001000001000100000001010101010001000001000100000001000001000100010100010101000100000001000000010001000100000001000001010000010001000001010101010101010100000100000101010000000101000100010100000100000101010001000100010101000000010001000001010000010001000101010101000001010101000001010101000001000100000101000101010000000000010001010000010101010000010000000100010000010101000000000001000001000001010001010101010001010001000101010001000000000101000000000100010100000000010000000000fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5905! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100000100010000010101010000010001000001000001000100000001010101010001000001000100000001000001000100010100010101000100000001000000010001000100000001000001010000010001000001010101010101010100000100000101010000000101000100010100000100000101010001000100010101000000010001000001010000010001000101010101000001010101000001010101000001000100000101000101010000000000010001010000010101010000010000000100010000010101000000000001000001000001010001010101010001010001000101010001000000000101000000000100010100000000010000000000fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5906! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5907! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5908! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5909! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010000000000010100000001000100000100010100010000010001010000000101010101010101010100000000000000010101010100010001000101000001000001010001000101010100000000010000010001010001010101010100010001000100010001010001000100010101000000000000010001000100000100000000000001000100000101000100000101010101010000010100000001010100000001000000010100010100010000010100010100000001010001000100010000000101010000010101010000010101000100010000010001010101000001010101000100000001010000010101000001010101000100000001000100010000fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5910! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010000000000010100000001000100000100010100010000010001010000000101010101010101010100000000000000010101010100010001000101000001000001010001000101010100000000010000010001010001010101010100010001000100010001010001000100010101000000000000010001000100000100000000000001000100000101000100000101010101010000010100000001010100000001000000010100010100010000010100010100000001010001000100010000000101010000010101010000010101000100010000010001010101000001010101000100000001010000010101000001010101000100000001000100010000fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5911! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010000000000010100000001000100000100010100010000010001010000000101010101010101010100000000000000010101010100010001000101000001000001010001000101010100000000010000010001010001010101010100010001000100010001010001000100010101000000000000010001000100000100000000000001000100000101000100000101010101010000010100000001010100000001000000010100010100010000010100010100000001010001000100010000000101010000010101010000010101000100010000010001010101000001010101000100000001010000010101000001010101000100000001000100010000fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5912! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101010000000000010100000001000100000100010100010000010001010000000101010101010101010100000000000000010101010100010001000101000001000001010001000101010100000000010000010001010001010101010100010001000100010001010001000100010101000000000000010001000100000100000000000001000100000101000100000101010101010000010100000001010100000001000000010100010100010000010100010100000001010001000100010000000101010000010101010000010101000100010000010001010101000001010101000100000001010000010101000001010101000100000001000100010000fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5913! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101000001000100010101010100000001000101000001000001010100000001010100010001000001000101000001010100010001010000010000010100010101010001000000000001010101000101010001010000010001010101010101000001000001010101000101010100010001000000010001010100010000010001010101010001000000000000000101000101000101000101010001010000010101000101010100010100000001010001000000000101010000010000010101000000010100010101000101000001000001000001000000000100000000000001000001000100000100000000010100000100010000010101010000010001010101fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5914! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101000001000100010101010100000001000101000001000001010100000001010100010001000001000101000001010100010001010000010000010100010101010001000000000001010101000101010001010000010001010101010101000001000001010101000101010100010001000000010001010100010000010001010101010001000000000000000101000101000101000101010001010000010101000101010100010100000001010001000000000101010000010000010101000000010100010101000101000001000001000001000000000100000000000001000001000100000100000000010100000100010000010101010000010001010101fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5915! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101000001000100010101010100000001000101000001000001010100000001010100010001000001000101000001010100010001010000010000010100010101010001000000000001010101000101010001010000010001010101010101000001000001010101000101010100010001000000010001010100010000010001010101010001000000000000000101000101000101000101010001010000010101000101010100010100000001010001000000000101010000010000010101000000010100010101000101000001000001000001000000000100000000000001000001000100000100000000010100000100010000010101010000010001010101fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5916! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000101000001000100010101010100000001000101000001000001010100000001010100010001000001000101000001010100010001010000010000010100010101010001000000000001010101000101010001010000010001010101010101000001000001010101000101010100010001000000010001010100010000010001010101010001000000000000000101000101000101000101010001010000010101000101010100010100000001010001000000000101010000010000010101000000010100010101000101000001000001000001000000000100000000000001000001000100000100000000010100000100010000010101010000010001010101fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5917! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5918! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000100010100010000010001000001010100000000010100010000000001000000010100010101010101000000010001010000000100000001000001010101000101000101000001010000010101000000010001000100000101000100000100010100010101010101010001010000010001010100010100000101000001010001000101000000000100010000000000000000000001010000000000010000000001010000000000010000000001010101010100010101010001000101010000010000000000010000010100000100010100010001010100000101000001000001000101000101010001000000000100010000000100000000010001010100fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5919! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000100010100010000010001000001010100000000010100010000000001000000010100010101010101000000010001010000000100000001000001010101000101000101000001010000010101000000010001000100000101000100000100010100010101010101010001010000010001010100010100000101000001010001000101000000000100010000000000000000000001010000000000010000000001010000000000010000000001010101010100010101010001000101010000010000000000010000010100000100010100010001010100000101000001000001000101000101010001000000000100010000000100000000010001010100fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5920! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000100010100010000010001000001010100000000010100010000000001000000010100010101010101000000010001010000000100000001000001010101000101000101000001010000010101000000010001000100000101000100000100010100010101010101010001010000010001010100010100000101000001010001000101000000000100010000000000000000000001010000000000010000000001010000000000010000000001010101010100010101010001000101010000010000000000010000010100000100010100010001010100000101000001000001000101000101010001000000000100010000000100000000010001010100fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5921! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000100010100010000010001000001010100000000010100010000000001000000010100010101010101000000010001010000000100000001000001010101000101000101000001010000010101000000010001000100000101000100000100010100010101010101010001010000010001010100010100000101000001010001000101000000000100010000000000000000000001010000000000010000000001010000000000010000000001010101010100010101010001000101010000010000000000010000010100000100010100010001010100000101000001000001000101000101010001000000000100010000000100000000010001010100fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5922! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101010001010001000101000100000101000000010101000100010101010001000101000000000000010100000000010001010100000000010001010101010100010101010101010101010001000001000000010100000101010100010001010000010000010001010001010101000101000101010000010000010100000100000001010101000100010000000101010000000100000000000000000101010101010100000100010100000101000001000101000101000101010000010100010101010000010101010101010000010100000101000001010001000101010101000101010001010101000101010001000000010100000100010001010000010001fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5923! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101010001010001000101000100000101000000010101000100010101010001000101000000000000010100000000010001010100000000010001010101010100010101010101010101010001000001000000010100000101010100010001010000010000010001010001010101000101000101010000010000010100000100000001010101000100010000000101010000000100000000000000000101010101010100000100010100000101000001000101000101000101010000010100010101010000010101010101010000010100000101000001010001000101010101000101010001010101000101010001000000010100000100010001010000010001fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5924! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5925! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5926! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5927! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5928! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5929! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5930! "04fd000100000101010101010000000001000100000100000000000000010100000000010100000000000001000000010000000000010001010000010001010001000000010101010101000101000100010101000101010000000101000000000001010000010101010000010101010000000101000001000001010100000101010100000001010000010100010001010001010100000100010001010101010101000001010001000001010101010101000100010101000101010100010001010100010101010101000001010100010100010001010001000000000001000100000001000001010001010100000001010001000101000001010101010100000100000100fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
5931! "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5932! "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5933! "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5934! "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5935! "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5936! "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5937! "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
5938! "04fd000101000001000101000001000001010101010100010101000001000000010000010101010001000000010000000001010101000001010101010000000100000001010101000100010000000000010000000001010101000000010101010000000101000001010001000001000000010001010000010101010101010000000100010000010101000000010101000000010001010001010101010101000000000101010100000000010100000000000000010000000101010100010000010001000101010101000000010000010001010100000001010101010001000100010000010100010100010100000001000101000001010100000101010101000000010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
5939! "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5940! "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5941! "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5942! "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5943! "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5944! "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5945! "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
5946! "04fd000100010001000100000101010000010101010001000001000101010001010101000000000000010100010101000001010001010000000001000001010000000101000001000101000100000000000001010001010001000100000001010101000100010101000000000100000101000001010100000101010101010101010101000101010101010000010001010000010001010100000001000101010001010001000001010001010001000101010100010100010100000001010000000000010100010101010000000100010101010100000001000001000101010001000101010000000000010001010000000101000100000100010100000100000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
5947! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
5948! "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5949! "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5950! "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5951! "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5952! "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5953! "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5954! "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
5955! "04fd000101000100010100010000010001010100010101010000000001010000000100000001010001010000000000000101000101000000000000000101010001000101010101000100010000010101000100010001010101000000000000000101000100010001010001000101010100000000000101010001010100000101010100010100010101000000000001010000010100000000010001010101000001010000000100000101010101000101010000000100000100000101010100010000010000010101010001000001010000010100010001000101010001000000010000000000000000010101010101010100010100000101010000000000000001010000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
5956! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100010101000100000100000000010100010100010000010001010101010100010100010100000000010100000001010101010101000001000001010001010101010000010000000001010101010001000101000000000001010000000001010000010001000100010101000101000100000100010101010000000100000100000100010100000100000001000001000001000101000100000101000101000101000101010000000000000100000100000100000101010000010000000001000001000001000001010101000000010100000101000101010001000101010100000100000001000100010100000101000001010000000100000101010000000001fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
5957! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000100010101000100000100000000010100010100010000010001010101010100010100010100000000010100000001010101010101000001000001010001010101010000010000000001010101010001000101000000000001010000000001010000010001000100010101000101000100000100010101010000000100000100000100010100000100000001000001000001000101000100000101000101000101000101010000000000000100000100000100000101010000010000000001000001000001000001010101000000010100000101000101010001000101010100000100000001000100010100000101000001010000000100000101010000000001fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
5958! "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5959! "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5960! "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5961! "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5962! "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5963! "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5964! "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
5965! "04fd000100010000010101000101000001000001000000000101010101000100000001000001000100010000000100010100000100000100000000010101000000010100010000010101000100000001000100010100000101000100010101010101000001010001000100010100010000000101000101000100000101010001010101010101010000010100010000000000010100010101000000000001000100000000000001010000000000010000000101010001000100000101010100010001000100010100000100000101000101010000000101010000000100010001000101000101010100010000000001010100010000000101000101010101010100000101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
5966! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
5967! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
5968! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010001010100000001010100010100000101000101010101000100010001010001000001000001000001000101000001010000010101010000010101010001000000010101010000010000010000010101000100010000010101010000010100010101000100000100010100010001000001000000010100010001010101010100010000010001000101000001000100000000000101000100010001000100010100000000010000000100000001000001000001010001000001010100000101010101010000010001000000000101010101010101000001010001000100000100000100000100000000000000010001000001000101010001000001010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
5969! "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5970! "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5971! "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5972! "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5973! "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5974! "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5975! "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
5976! "04fd000101000100010101010000010001010100000001010000010101000101000001000100000001010100010000000101010101000001010101010101010101000101010100010000000000000001000001000101010000000100010001010100000100010101000000000001010001010101000100010100000001010000000100010001000101010100010000000001010000010100010000010000000100010001000001010100010101000000000100000101000001000101000101000101000100010000000101010000000001000101010000010101010001000101010000010100010001010101000001000100000100010001000101010101000100010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
5977! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000100010000000001000101000100010001010100010001000101010000010100010101010101010001000101010100000100000000010101010000010101010100010000000000010100000100010101010000010100010100000101010001000000000001010000010000000001010100000000000000010100000000010100000100000000010001010000010101010101010001000100010001010100000101010000000101000101010100000101010100010101000100000001000000010100000101000001000100010000000001010101000001010100010001000000010100000001000001010001000100010000010101010101000101000000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
5978! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000100010000000001000101000100010001010100010001000101010000010100010101010101010001000101010100000100000000010101010000010101010100010000000000010100000100010101010000010100010100000101010001000000000001010000010000000001010100000000000000010100000000010100000100000000010001010000010101010101010001000100010001010100000101010000000101000101010100000101010100010101000100000001000000010100000101000001000100010000000001010101000001010100010001000000010100000001000001010001000100010000010101010101000101000000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
5979! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000100010000000001000101000100010001010100010001000101010000010100010101010101010001000101010100000100000000010101010000010101010100010000000000010100000100010101010000010100010100000101010001000000000001010000010000000001010100000000000000010100000000010100000100000000010001010000010101010101010001000100010001010100000101010000000101000101010100000101010100010101000100000001000000010100000101000001000100010000000001010101000001010100010001000000010100000001000001010001000100010000010101010101000101000000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
5980! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000100010000000001000101000100010001010100010001000101010000010100010101010101010001000101010100000100000000010101010000010101010100010000000000010100000100010101010000010100010100000101010001000000000001010000010000000001010100000000000000010100000000010100000100000000010001010000010101010101010001000100010001010100000101010000000101000101010100000101010100010101000100000001000000010100000101000001000100010000000001010101000001010100010001000000010100000001000001010001000100010000010101010101000101000000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001010000000100010101000001000001000100010000010000010101000101000000010100010000010001000000000100000101010000000101010101010101000000000101000101000000010001010001010000010100000000000001010100010001000100000001000100000100000000010100000101010001010101010100000001010000010101010000010101010000000101010001000101000100010101000001000100000101010000010100000101010100000101000000000001000001010001010101010101000001010100000001010100000100010101010001010000010001010000000000010001000101010100000001000001010001010401000101",
5981! "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5982! "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5983! "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5984! "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5985! "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5986! "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
5987! "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
5988! "04fd000100000101010001000000010100000101010000000101000101000000010001010000000000010000000001010101000001010000010101000000000000000001010001000101010101010000000001000100000001010001000000010001000001000101000000000101000101000101000101010000000100000000010100010000000101010000010001010001010000010001010101010100000000010001010000010100000100010001010100010001000000000101010101000001000101010000010101000101000101000101000001000101000001010000010101000100000000000100000001010101010100010001000100000000000001010001fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
5989! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101000100000101010000000101000101000101010001010000000001010101010001010101000001010000000101010000000000000001010100000001010101000000010101010101010001010000000001010100010000010101010001000000010100010000010000000101000101010000000101000100000000000000010000010100010000010101010001000101010100010101010100000101000000000000010001010001010100010101010101010000010101010001010101010000000000010001010100000100010101000101010100010001000000010001000001010000010001010001000000000101000100010100010100010100010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
5990! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101000100000101010000000101000101000101010001010000000001010101010001010101000001010000000101010000000000000001010100000001010101000000010101010101010001010000000001010100010000010101010001000000010100010000010000000101000101010000000101000100000000000000010000010100010000010101010001000101010100010101010100000101000000000000010001010001010100010101010101010000010101010001010101010000000000010001010100000100010101000101010100010001000000010001000001010000010001010001000000000101000100010100010100010100010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
5991! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101000100000101010000000101000101000101010001010000000001010101010001010101000001010000000101010000000000000001010100000001010101000000010101010101010001010000000001010100010000010101010001000000010100010000010000000101000101010000000101000100000000000000010000010100010000010101010001000101010100010101010100000101000000000000010001010001010100010101010101010000010101010001010101010000000000010001010100000100010101000101010100010001000000010001000001010000010001010001000000000101000100010100010100010100010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
5992! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101000100000101010000000101000101000101010001010000000001010101010001010101000001010000000101010000000000000001010100000001010101000000010101010101010001010000000001010100010000010101010001000000010100010000010000000101000101010000000101000100000000000000010000010100010000010101010001000101010100010101010100000101000000000000010001010001010100010101010101010000010101010001010101010000000000010001010100000100010101000101010100010001000000010001000001010000010001010001000000000101000100010100010100010100010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001010000000100010101000001000001000100010000010000010101000101000000010100010000010001000000000100000101010000000101010101010101000000000101000101000000010001010001010000010100000000000001010100010001000100000001000100000100000000010100000101010001010101010100000001010000010101010000010101010000000101010001000101000100010101000001000100000101010000010100000101010100000101000000000001000001010001010101010101000001010100000001010100000100010101010001010000010001010000000000010001000101010100000001000001010001010401000101",
5993! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000101010001010001000001000100010100010000010100000001000101010101000000000100010101010001010100000101000101000100000001010001000001000101000000010000000101000001010001000100010101010000010100000100010101000101010100000101010101010001010101010001010000010001000100000001010000010101000001000101010001000100000100000100000001010100000000000001010001000001000001010000000100000100000000010101000101010001000101010101010100010101010100000101010100010001000000000101000000000001010001010101000100010000010101000101000000fd0001000000010100000001000000000000000100000100010100000101010101010101010000010000000000010000000100000101000000010101000000000000000100010001000000000100000100000101010000000101000000010100010001000001010000010001000101010001010100010000010100000101010100000101000001000000000101010100010101010100010000000001000100000000010000000001010100010000010101000001000001000000000100010101000000000100000100000001010101000100010100000001010001000101000000010100010000010000010001000100010101010100000001010001010100010000010401010000",
5994! "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
5995! "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
5996! "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
5997! "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
5998! "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
5999! "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
6000! "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
6001! "04fd000100000101010000010001000101000101000101010100010101010000010000000001000100000100000101010101010100000000000100010101000001010100000101000000000101000000000100010101010000000100010001000001000001010100010100010101000001000001010001010001010000000001010101010001010100000100010101010100010001000000000101000001000000000001000001000101010001010001010100010101010001000101010100010001000000000000000001010001010101000001000100000001010001000101000100000101010100010001000100010101000000010001000101000000000101000000fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
6002! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100010101000101000100000001000100000100010100000100010000000001000100010000000000010100000101000100010001000101010100010101000000010000000001010100010001010000010001000101000001010101010001000000000000000000000000000100000101010100000100000101000000000001000001010100000001000001000000000101010100010100010000010100010001010100000000000000010101000101000001000101000001000101000000000001000100010101000001010101010100000101010000010101010000010000000101010001010100010101000001010001010001000100000001000100010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
6003! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100010101000101000100000001000100000100010100000100010000000001000100010000000000010100000101000100010001000101010100010101000000010000000001010100010001010000010001000101000001010101010001000000000000000000000000000100000101010100000100000101000000000001000001010100000001000001000000000101010100010100010000010100010001010100000000000000010101000101000001000101000001000101000000000001000100010101000001010101010100000101010000010101010000010000000101010001010100010101000001010001010001000100000001000100010000fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
6004! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100010101000101000100000001000100000100010100000100010000000001000100010000000000010100000101000100010001000101010100010101000000010000000001010100010001010000010001000101000001010101010001000000000000000000000000000100000101010100000100000101000000000001000001010100000001000001000000000101010100010100010000010100010001010100000000000000010101000101000001000101000001000101000000000001000100010101000001010101010100000101010000010101010000010000000101010001010100010101000001010001010001000100000001000100010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
6005! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100010101000101000100000001000100000100010100000100010000000001000100010000000000010100000101000100010001000101010100010101000000010000000001010100010001010000010001000101000001010101010001000000000000000000000000000100000101010100000100000101000000000001000001010100000001000001000000000101010100010100010000010100010001010100000000000000010101000101000001000101000001000101000000000001000100010101000001010101010100000101010000010101010000010000000101010001010100010101000001010001010001000100000001000100010000fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001010000000100010101000001000001000100010000010000010101000101000000010100010000010001000000000100000101010000000101010101010101000000000101000101000000010001010001010000010100000000000001010100010001000100000001000100000100000000010100000101010001010101010100000001010000010101010000010101010000000101010001000101000100010101000001000100000101010000010100000101010100000101000000000001000001010001010101010101000001010100000001010100000100010101010001010000010001010000000000010001000101010100000001000001010001010401000101",
6006! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000100000001010000000000000001010000000001010101000100000001010100000100010000000000000001010100010100010001000100010000000101000001010001000001010000010001000100010000000101010100010101000101000001000000010001010101010100000001000101000000010100000100000000000000000000000100010101010001010100010000010000000000010100000000000001010000000100000101000001000101010100000101000000000000000000000101000101000100010001000000000100000001000000000000000001000100000001010001000100000101010100000101010101000100000100010100fd0001000000010100000001000000000000000100000100010100000101010101010101010000010000000000010000000100000101000000010101000000000000000100010001000000000100000100000101010000000101000000010100010001000001010000010001000101010001010100010000010100000101010100000101000001000000000101010100010101010100010000000001000100000000010000000001010100010000010101000001000001000000000100010101000000000100000100000001010101000100010100000001010001000101000000010100010000010000010001000100010101010100000001010001010100010000010401010000",
6007! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000100000001010000000000000001010000000001010101000100000001010100000100010000000000000001010100010100010001000100010000000101000001010001000001010000010001000100010000000101010100010101000101000001000000010001010101010100000001000101000000010100000100000000000000000000000100010101010001010100010000010000000000010100000000000001010000000100000101000001000101010100000101000000000000000000000101000101000100010001000000000100000001000000000000000001000100000001010001000100000101010100000101010101000100000100010100fd0001010001010101010000000101010101010001010001010000000000010100000000000001010101010000000100010100000001000100000000000100000100000000000101000001000000010101010001010000010101010000000101010101000101010100000001010000010001000101010000000101010101010101010101000101000000000101000101010001010101010101000101000100000101000001010100000001010001010100010101000001000001010000010000010101000101010101000001010100000101000101010001000101010100000100000100000100000000000000000101000100000000000100000100000001000001000401010001",
6008! "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000100000001010100010001010000010100010001010001010101000000010001010101000000000101010001010100010100010101000000000000000100010000010101000101000000000100010101000000010100000001010100000101000000010101000100000000010101010001010000010101010001000001010001000100000100000100010101000101010100010001010100000001000000010001010000010100000000000101000001010101010100010000010101000001010000010001000101010000000001000100010001000000010001000101000101000001000100010000010000010100000100000100010000000001010400000000",
6009! "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000100000101000001010000000101000101010101000000000101000001010000000001000000010001010001010101000101010000000101010000010100010101000100010001000101010100000000010101010000010000010101000000000101010001010101000100010100000101010000010001000101000100010001010001000000010100010001010100000101010100000100000001010001010101000001000001010000010101010000000100010000010100000100010000000100010001000000000000000000000100000101010101010101000001000000000001010000010000000001010001010000000101010100010001010100fd0001000101000000010001010101010100010100010001010001010000010100010101010101010001010101010100000001000101010101000000000101010000000101010001000100000101000000010000010100010001000100000101010000010000010100010101000000010001000101010101000000010001000001010100010000010000000101010000010100010001010001000000000101000101000001010101010000010000000001000001000001000100000101000001000100010101010000000001010000010001000001000101000001000001000100000101000001010000010101010001000000010001010001010001000101010001000400000001",
6010! "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000010000010000010000010000010100000001000100010000000000010001000001000100010101010001000100000001010001010001010001000100010100000100000101010101000100010001010100010101000001010101010000010001010100000001000101000100010001000101000101010101000000010101000100000001010101010000000101000101010100010101000000000000010100000000010001010100010000010101000000000000000001010100010100010000010000010100000001010000000001000000000000000100010001000001010000010100010001000100010101000100000100010001010100000100000400000100",
6011! "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100000001000000010000010001010100000101010100000101000100010101010001010000000000000000010100010001000100010001000000010101010000000000000100010000010000010000000101010000010100010100000000010100010101010000010000010100000000010100000101000001000100010100010001000001000101000100010100010000000101000001010001000000000000010001000000010100010101000001010100010000000001000100000101000100010101010001010001010101000001000101000100000100010101010101000001000101010100010101000001010100000101000000000101000101010001fd000101000001010101010001000101000101000001000100010100000001010101000001000001000101010101010001010101010100000101010000010100000001010000000101000100000000010001000000000101010101000100000000000100010101010100000100010000010100010001010101000001000100000001010001010000000000000101010001010100000000000001000001000101000101000001010101000100000001000000010101010000000000000101010001000001000101010000010001000001010000010100010001000100010001010100000101010001000001010101010000010101000000000101000000000101000000fd0001010000000000010100010100000000000001000000010001000100000100000000010000000000000001010100010101010100000101010100010100000001010100000100000000000000010100000000010000010101000100010000010101010100000101000100010000010000000100010100010000000101000000000001010100000001000101000100000000010101010000010000000100010001010000010000000100010000010000010101000101000101000100000100010100000001010000010101000101010001010000000100010001000001000000010100000001000100000100010000010100010000010000010001010101010001010400000101",
6012! "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001000101000100000001010000000100000101000100000000010101010001010001000001010100010000000101010101000000010100000001000101000101010001000100010100010100000000010001010100010101000100000000010101000100010101000000000001000100000101010100000001010100000001010001010000010100010000010101000000000101000100000000000100010101000001010100000001000100010101000101010100010100010000000100010000010001010101010100010101010101000000010101010000000000010101000000010001000101000000000100000000010101000100000101010101010100000400010000",
6013! "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000100000000000100010000000001000100000101010001000100000101010001010100010100010000000000010100000100010101000001000000010101000100010001010100010100010101010101010000010000000100000100000100000000010100010100000000010001000100000101010000000101000000000001000101010000000101010000010000000001010101000100000001010101000001000001000001010100010000000001010001000101000101010100000000010001010000000001000101010100010101010101010101000101000100010000010000010101000100010100010000000100000000000100000001010100010000fd0001010101010101010100010101010100000000010100010100000000000000010100010101000100000100010000010100000100010000000001000000010001000101010000000000010000010000000000010000010100000001010101000000000001000000000100000100000101010101010101010101000100010101000101010000010101000100000100000000010000010000000101000000010101010000010101010100010101000100000000000001010100000101010101000001000001000101010001010101000000010100010100010100010000010100010001010101010001010100000001000101010101010001000000010000000001010400010001",
6014! "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001000100010000000001010000000000000100010100010000000001010000000000010100000000010101000000000101010000010000000101000001000000010101000000000101010101000101000000010001000001000100000100010101000001010001000000000101000001000100000001000101000101010101010101000001010100000100010001010101010101000100010100010100010101010101000100000001000101000000010001010000010100000001000001000001010001000001000000010000010000010001000100010000000100000000010001010001010000010001000001000001010000010100010000000100010100010400010100",
6015! "04fd000100010000000100010100000001010000010001000100010100010000000100000100000100000100010100000101010001000000010000010101000000010100010001010001000100000000000000010001010000000001010101000000000000010001010000000000010101010000000001000000000100000001000100010101010000010101010000010000000000000000010100010100010101000001000101000001000001000100000100010000010101000101000100000100000101010100000000010001000100000100010000000000010001000000010100010001010001000100000001010100000101000001000000010100010001010101fd000100010000000101000101000000000100010101010101010000010001000000000101010001000000010100000001010000010100010001000100000001000101000100000000000000000100010001010101000101010101000000000001010100000001010101010001000100000100010100000001010101010101000100010000000001000001010101010001010101000100000000000001000000010001010000010001010101010101000001010000000101000000010000000001010001000101000001000100000000000100000001010101010000000100010000000100000001000100010000010000010100010100010100010100000101010101fd000101000100010101000101000100010001000000010100010001010100000001010000000101010101000100010100000100010101010101010100000100010101000101000100010101000100010100000000000001010101000101000000010001010000010100010001000101010100000100010001010000000101000001000000000000000101010101000100010001010001000100000100010100010001000001000000000000000100010100010001010000010000000100010100000101010000000100010101000100010000000100010001000000010100000101000101000101010001000101010000010100010101010001000101010100000100fd0001010000000100010100000001000101000101000001010001000001010101010001010000000100000001000001000000000101010001000101010100000100000100000000010001000101000101010000000101000000000000010100010000000100000101000000000000010001010001000001000100000101000100000001000100000101000101010101000001000001000100000101000100000101000100000001000101010101000001000100000001000000010001010101000101000001000000010000010001010001010100000000000000010000010000010000010100000001010000000000000001010101000001010101000101000000010400010101",
6016! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000101000000000001000100000100000000000001000101010001010001010100010101010100010100000100010001000101000101010100010100000000000000010101010001010000000001000001000100000101010000000001000000010100000101010101000000000100010101010101010000010000000000010101010100010101010000000001000000010001010101000100010100010000000100010001000001000000000101010100010101010000010101010000010001010101000101010101000100010101010001010101000100010001000001000000010000000000000101010101010100010100000100000001000000000001fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001010100010100000000000001010101000101010100010100000100000100010000000000000000000001010000000101000100010001010100000101010100010100000000000000010100000101000100000101000001000000010000000100000001000101000101000000010100010000000000010000010100010101010001000101010001010101010001000000000000000001010100000101000100000001000101000100010100010001010101000100010101010000010001010100010000010101010001010001010101010000000001010101000100000001000001000101010100010101010101000100010101010100000000000001000101010401000000",
6017! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000101000000000001000100000100000000000001000101010001010001010100010101010100010100000100010001000101000101010100010100000000000000010101010001010000000001000001000100000101010000000001000000010100000101010101000000000100010101010101010000010000000000010101010100010101010000000001000000010001010101000100010100010000000100010001000001000000000101010100010101010000010101010000010001010101000101010101000100010101010001010101000100010001000001000000010000000000000101010101010100010100000100000001000000000001fd000101000100000000010101010000000001000001000101000001010001000101010100010101000101010000000101000100010001000001010000000000000001000101000101000001000101010101010000000000010101000001000100000101010000010101010101000000000001010001010101010001000100010100010100000000010101000100010100000101000100010000010101010001000001000101010100010000010101010101000100010100010001000000000100010000010000000000010001010001000100000001000001010101010000010101000101000100000000000101010101010000010101000100010001000100000000fd0001000101010000000001010101010101010101000101010001000100010101010101000100000000000101010100000101010001000101010001000100000000010100000001000101010100010001000000010101000000000000000001010101000000010100010001010000000001000101010000000100010101000000000000000101010100000101010100010001010100010001000001000101000101010100010101000000000100010001010101010100010000000101000101010001010000010000010101000101010000000001010000000100010001000100000000000101000000010100000101000101010000010001010000010001000001010401000001",
6018! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000101000000000001000100000100000000000001000101010001010001010100010101010100010100000100010001000101000101010100010100000000000000010101010001010000000001000001000100000101010000000001000000010100000101010101000000000100010101010101010000010000000000010101010100010101010000000001000000010001010101000100010100010000000100010001000001000000000101010100010101010000010101010000010001010101000101010101000100010101010001010101000100010001000001000000010000000000000101010101010100010100000100000001000000000001fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001000000000001000001010100010000010001010000000101010001000100010100010101000001010000000101010100000100000100010001000100010001000100010001000100010101010100000100000101000000010101000000000101010100000000000000000101010000010101010001000100010000000101000001000001010100010001010101000001000000000001000000000001000101000000010101000001000001010001010001010100000000010100000101000100010000000100000100000100010000010001000000000101000100000101000101000100010000010100010001010001010101000100010101000100000001010401000100",
6019! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000100000101000000000001000100000100000000000001000101010001010001010100010101010100010100000100010001000101000101010100010100000000000000010101010001010000000001000001000100000101010000000001000000010100000101010101000000000100010101010101010000010000000000010101010100010101010000000001000000010001010101000100010100010000000100010001000001000000000101010100010101010000010101010000010001010101000101010101000100010101010001010101000100010001000001000000010000000000000101010101010100010100000100000001000000000001fd000101010101010101000000000101000001000000000101000100010001010101000000010101000101010101000100010001010101000000010000000001000000000100000101000000000001010001010000000101010000010001010001010000010100000001000000000101010001000001000001010000000100010100000000000001010000010100010100000001010000010100010000000100010100000100000001000100010000010101000101010100000000000000010100000001000000000100000001000000000001010001000100010101010101000000000001000101010001000001010001000100010100010001000001000000000001fd0001010000000100010101000001000001000100010000010000010101000101000000010100010000010001000000000100000101010000000101010101010101000000000101000101000000010001010001010000010100000000000001010100010001000100000001000100000100000000010100000101010001010101010100000001010000010101010000010101010000000101010001000101000100010101000001000100000101010000010100000101010100000101000000000001000001010001010101010101000001010100000001010100000100010101010001010000010001010000000000010001000101010100000001000001010001010401000101",
6020! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000100000100010101010001010101000100010000010001010001010100010100000101000000010101000001000001000100010100010000010001000000010001000001010000010101000100010000010100000101000001010100010100010100010100000101010100000000010100010101010001010000000000000000010001010001000101010100000101010101010001010100000100010000010001010100000100000100000101000100010000010100000001000100010000000101000000000001010001010101010101010001000101010100010000000001010101000101000001000001010101000000010001000000000101010001010101fd0001000000010100000001000000000000000100000100010100000101010101010101010000010000000000010000000100000101000000010101000000000000000100010001000000000100000100000101010000000101000000010100010001000001010000010001000101010001010100010000010100000101010100000101000001000000000101010100010101010100010000000001000100000000010000000001010100010000010101000001000001000000000100010101000000000100000100000001010101000100010100000001010001000101000000010100010000010000010001000100010101010100000001010001010100010000010401010000",
6021! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000100000100010101010001010101000100010000010001010001010100010100000101000000010101000001000001000100010100010000010001000000010001000001010000010101000100010000010100000101000001010100010100010100010100000101010100000000010100010101010001010000000000000000010001010001000101010100000101010101010001010100000100010000010001010100000100000100000101000100010000010100000001000100010000000101000000000001010001010101010101010001000101010100010000000001010101000101000001000001010101000000010001000000000101010001010101fd0001010001010101010000000101010101010001010001010000000000010100000000000001010101010000000100010100000001000100000000000100000100000000000101000001000000010101010001010000010101010000000101010101000101010100000001010000010001000101010000000101010101010101010101000101000000000101000101010001010101010101000101000100000101000001010100000001010001010100010101000001000001010000010000010101000101010101000001010100000101000101010001000101010100000100000100000100000000000000000101000100000000000100000100000001000001000401010001",
6022! "04fd000100010100010100000100010101000101010101010101000000000001010000000000010101000100000000010000000000000001000101010100000000010001010000010101000000010100010001000000000001000000010000000100000000000101010000000100010001010100000100000100000000010101010001010101010001000000000100000000010100000100000000010000010000010101000100000100010000000000000001010100000100010101000101010000010101000100000001010001000101000101000100000000010100010000010001010001010100010100000000010000000001000100010000000000000000010100fd000101010100010100000001000001000101000000010001000000010001010000000100010000000101010100000101010101000000000000000001000100000001010000010100000101000000000000000000010101000100000000010000010000000101000000010101010001000001000000000001010001000101010001000000000001000001000100010101010101000001000101000100000101000100000100010001010100010101000100010101000001000100000100000100010001010000000101010000010100000101000100000100000000010000000101010000010101010100000101010000000001010101000101000000010000010001fd000101010100010000010001010101010101000000010001010001000100010100010000000100010000000001010000010100010001010000010100000101000001010000010101000001000001000000000100010000010101010100010000010001000100000001010101010000010101010100010100010001000100010000010001000001000100010100010100000101000000000000000100000000010000000001000000010000000100000101000101000101000001000001010000010000000101010100010000010101010101000100000101010100000000010001000100010100010100000001000001000000010100000000000100010000010101fd0001010000000001000001010000010000000000010100010000010101000001010101010000010001010000010101000000010100010001010001010101000000000100000001010001010000000000010001010101000100010101000001010101000100000100000000000101010000010100010101000000010000010000010000000000000000010100000000010001000000010001010100010000010001010000000100000001010100000001010101000100010101010001010100010101000000010101010101010001000001010100000001010001010100010000000000000100010001010000010000000000000101000100010000000100000000000401010100"
6023 ]
6024diff -crB ./src/test/data/merkle_roots.json ../../komodo-jl777/src/test/data/merkle_roots.json
6025*** ./src/test/data/merkle_roots.json 2017-01-03 10:40:50.395338477 +0000
6026--- ../../komodo-jl777/src/test/data/merkle_roots.json 2017-01-03 09:49:08.872507185 +0000
6027***************
6028*** 1,18 ****
6029 [
6030! "26ee6e3f8c28892382264d72789c9c65a8577549fe35d3d6df86e0f07cc80057",
6031! "0e54a14ab674813f2a558b18df630ae095f2cb775d0bc37677073acb1f8f3443",
6032! "d06e16c2e6ee0b28d8f07c76a17976fea549ce2dd1debae260dc3215d265fddb",
6033! "52dc4b76365472537ff15cb18a71be54c91d207f5d62fb89bd74af9010ac0e01",
6034! "8dd27a2340e34015cd9b00a2ddc011dcdab03d38a49497490d631f71ce9c495e",
6035! "0cb8ae3ff2483ea7124237b62d0ac4388477b41e83d3811c6e0dd6fec0b365e6",
6036! "a67c1f145456880502a3d020d538fecf0515bd285edd6e3fcae26eb53c1f56d3",
6037! "7fb0adeb50e1084359414071486d89ead9c9a3700c64c9892f510f87af6ec27f",
6038! "45cd6f71215eabb2c25206471e9293bed2bc924ce5bbc16a8f728ec1e310886f",
6039! "01d1f338c2abee217962120611dafe0a0e9de76c18de77cbb1e3a6d3261e887c",
6040! "2700b09aa19ce460d509fc3bccfbc80f8381d156a4a52a7f3d4e8b852b5c10ea",
6041! "ac96cc858674f67d6c6119f933080cd69c10950409722468d2ac7b81e2cc2bba",
6042! "f4930affd93232b6051fe3a5f744a357201bff4363312d1115762a595261f030",
6043! "50b48f5226a69a62206f365ac5347c723b43faf9691c04b872225d5c08876eed",
6044! "a867397884b157b1db4dd03dc2fd6c40c4650e70b61441d4325e0b18d5280fb6",
6045! "52c8456d3538eed3b73778c596c1993ac6d6c337ae5e338391ce6cae58296dec"
6046 ]
6047--- 1,18 ----
6048 [
6049! "95bf71d8e803b8601c14b5949d0f92690181154ef9d82eb3e24852266823317a",
6050! "73f18d3f9cd11010aa01d4f444039e566f14ef282109df9649b2eb75e7a53ed1",
6051! "dcde8a273c9672bee1a894d7f7f4abb81078f52b498e095f2a87d0aec5addf25",
6052! "4677d481ec6d1e97969afbc530958d1cbb4f1c047af6fdad4687cd10830e02bd",
6053! "74cd9d82de30c4222a06d420b75522ae1273729c1d8419446adf1184df61dc69",
6054! "2ff57f5468c6afdad30ec0fb6c2cb67289f12584e2c20c4e0065f66748697d77",
6055! "27e4ce010670801911c5765a003b15f75cde31d7378bd36540f593c8a44b3011",
6056! "62231ef2ec8c4da461072871ab7bc9de10253fcb40e164ddbad05b47e0b7fb69",
6057! "733a4ce688fdf07efb9e9f5a4b2dafff87cfe198fbe1dff71e028ef4cdee1f1b",
6058! "df39ed31924facdd69a93db07311d45fceac7a4987c091648044f37e6ecbb0d2",
6059! "87795c069bdb55281c666b9cb872d13174334ce135c12823541e9536489a9107",
6060! "438c80f532903b283230446514e400c329b29483db4fe9e279fdfc79e8f4347d",
6061! "08afb2813eda17e94aba1ab28ec191d4af99283cd4f1c5a04c0c2bc221bc3119",
6062! "a8b3ab3284f3288f7caa21bd2b69789a159ab4188b0908825b34723305c1228c",
6063! "db9b289e620de7dca2ae8fdac96808752e32e7a2c6d97ce0755dcebaa03123ab",
6064! "0bf622cb9f901b7532433ea2e7c1b7632f5935899b62dcf897a71551997dc8cc"
6065 ]
6066diff -crB ./src/test/data/merkle_serialization.json ../../komodo-jl777/src/test/data/merkle_serialization.json
6067*** ./src/test/data/merkle_serialization.json 2017-01-03 10:40:50.399338679 +0000
6068--- ../../komodo-jl777/src/test/data/merkle_serialization.json 2017-01-03 09:49:08.872507185 +0000
6069***************
6070*** 1,18 ****
6071 [
6072! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6073! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6074! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6075! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6076! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6077! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6078! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6079! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6080! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
6081! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
6082! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
6083! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
6084! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
6085! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
6086! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443",
6087! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443"
6088! ]
6089\ No newline at end of file
6090--- 1,18 ----
6091 [
6092! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0000",
6093! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300",
6094! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618",
6095! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618",
6096! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
6097! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
6098! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
6099! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f",
6100! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
6101! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
6102! "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
6103! "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
6104! "01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
6105! "01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
6106! "01c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000301e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806",
6107! "01c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e0184c834e7cb38d6f08d82f5cf4839b8920185174b11c7af771fd38dd02b206a200301e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806"
6108! ]
6109diff -crB ./src/test/data/merkle_witness_serialization.json ../../komodo-jl777/src/test/data/merkle_witness_serialization.json
6110*** ./src/test/data/merkle_witness_serialization.json 2017-01-03 10:40:50.399338679 +0000
6111--- ../../komodo-jl777/src/test/data/merkle_witness_serialization.json 2017-01-03 09:49:08.872507185 +0000
6112***************
6113*** 1,138 ****
6114 [
6115! "0000000155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6116! "0000000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6117! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6118! "0000000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6119! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6120! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6121! "0000000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6122! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6123! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6124! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6125! "0000000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6126! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6127! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6128! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6129! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6130! "0000000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6131! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6132! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6133! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6134! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6135! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6136! "0000000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6137! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6138! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6139! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6140! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6141! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6142! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6143! "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6144! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6145! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6146! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6147! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6148! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6149! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6150! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6151! "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6152! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6153! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6154! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6155! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6156! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6157! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6158! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6159! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6160! "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6161! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6162! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6163! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6164! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6165! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6166! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6167! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6168! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6169! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6170! "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6171! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6172! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6173! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6174! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6175! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6176! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6177! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6178! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6179! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6180! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6181! "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6182! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6183! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6184! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6185! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6186! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6187! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6188! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6189! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6190! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6191! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6192! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6193! "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6194! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6195! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6196! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6197! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6198! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6199! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6200! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6201! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6202! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6203! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6204! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6205! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6206! "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6207! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6208! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6209! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6210! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6211! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6212! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6213! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6214! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6215! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6216! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6217! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6218! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6219! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300",
6220! "0000000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6221! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6222! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6223! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6224! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6225! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6226! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6227! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6228! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c",
6229! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6230! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6231! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6232! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d",
6233! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6234! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300010155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30000",
6235! "0000000555b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6236! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300000455b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6237! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300038695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6238! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30001018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d0355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6239! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e301018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d02dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6240! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6241! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3020001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d5564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6242! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30002018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c0255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e35564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6243! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e302018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944300",
6244! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430355b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6245! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030000015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443028695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27ddc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6246! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6247! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e303018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba944301dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c00",
6248! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430255b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e38695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6249! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e3030001dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba9443018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d00",
6250! "0155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e30003018695873d63ec0bceeadb5bf4ccc6723ac803c1826fc7cfb34fc76180305ae27d01dc33ca90e860ab6770d82ba98f20eae6d5e2ca9a63f63f69b40e3cf72e121d6c015564d9772145d2e53b02de2d8e22b10a820614e0d88ebdd48ddc71f0b9ba94430155b852781b9995a44c939b64e441ae2724b96f99c8f4fb9a141cfc9842c4b0e300"
6251! ]
6252\ No newline at end of file
6253--- 1,138 ----
6254 [
6255! "0000000162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00",
6256! "0000000262fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300",
6257! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300",
6258! "0000000262fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430101836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0000",
6259! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430101836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0000",
6260! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c94300000101836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0000",
6261! "0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae00",
6262! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae00",
6263! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae00",
6264! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae400",
6265! "0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
6266! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
6267! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
6268! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae40101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
6269! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618000101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430000",
6270! "0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
6271! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
6272! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae0101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
6273! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae40101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
6274! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f38618000101ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
6275! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc00",
6276! "0000000362fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
6277! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000268eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
6278! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430001a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
6279! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
6280! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180001018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000101aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af2",
6281! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc01018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10000",
6282! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0001018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10000",
6283! "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
6284! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
6285! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
6286! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
6287! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd00",
6288! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047400",
6289! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047400",
6290! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d00",
6291! "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6292! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6293! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6294! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6295! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6296! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6297! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6298! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6299! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f00010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b96530000",
6300! "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6301! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6302! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6303! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6304! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6305! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6306! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6307! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6308! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f00010170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6309! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81700",
6310! "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6311! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6312! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6313! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6314! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6315! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6316! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6317! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6318! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0001018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6319! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf81701018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0000",
6320! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060001018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0000",
6321! "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6322! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6323! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6324! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6325! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6326! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6327! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad1047401018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6328! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d01018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6329! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0001018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a41",
6330! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e755000",
6331! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e755000",
6332! "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba300",
6333! "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6334! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6335! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6336! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6337! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6338! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6339! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6340! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6341! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6342! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
6343! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
6344! "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
6345! "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a09120000",
6346! "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6347! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6348! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6349! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6350! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6351! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6352! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6353! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6354! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9020001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6355! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
6356! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
6357! "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
6358! "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
6359! "01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e900",
6360! "0000000462fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6361! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000368eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6362! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430002a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6363! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180292498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6364! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861801112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6365! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0268c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6366! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad104740101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6367! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6368! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f000101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000201e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625",
6369! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
6370! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e75500101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
6371! "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
6372! "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000101e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a7",
6373! "01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e90101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e0000",
6374! "01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806000101c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e0000",
6375! "0000000562fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba68eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6376! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba00000468eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c943a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6377! "0162fdad9bfbf17c38ea626a9c9b8af8a748e6b4367c8494caf0ca592999e8b6ba0168eb35bc5e1ddb80a761718e63a1ecf4d4977ae22cc19fa732b85515b2a4c9430003a6637c3308b7b8e6eabc3c9c3bd672b568d73c8de4cf14ca2a004ff20c86c7ae112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6378! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0001019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f386180392498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae4112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6379! "01836045484077cf6390184ea7cd48b460e2d0f22b2293b69633bb152314a692fb0192498a8295ea36d593eaee7cb8b55be3a3e37b8185d3807693184054cd574ae401019f5b2b1e4bf7e7318d0a1f417ca6bca36077025b3d11e074b94cd55ce9f3861802112e79af601aaa3c0a48e6c37930ccad4b5a3340a373a14d7b79697e5ee730dd458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6380! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430002000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0368c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6381! "01ff7c360374a6508ae0904c782127ff5dce90918f3ee81cf92ef1b69afb8bf4430168c4d0f69d1f18b756c2ee875c14f1c6cd38682e715ded14bf7e3c1c5610e9fc02000146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f02050a753bb419723abb7f22486c2a7182e390f47927435bc2c2f7fda93ad10474458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6382! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b1000201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f0250c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6383! "018b16cd3ec44875e4856e30344c0b4a68a6f929a68be5117b225b80926301e7b10150c0b43061c39191c3ec529734328b7f9cafeb6fd162cc49a4495442d9499a2d0201aed51ae31f597f976bac0f62cd5e563203ead4b5202d6459c5d45466dd737af20146c2fe50e8c66a8b402bdf071f52c7f509f7a04597f31886b2823e288a936d9f01458cab4492ce89c6b50161e0583c2115e7900db964a53b49e152828d6a3991af00",
6384! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965300030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80603d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e7550305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
6385! "0170ffdd5fa0f3aea18bd4700f1ac2e2e03cf5d4b7b857e8dd93b862a8319b965301d81ef64a0063573d80cd32222d8d04debbe807345ad7af2e9edf0f44bdfaf817030000016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80602a1e12cd7bb8d53016cbf0729cfc1bead8759a9e97a7eb50a416a27ced07e7550305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
6386! "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b000301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060204e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba3305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
6387! "018b92a4ec694271fe1b16cc0ea8a433bf19e78eb5ca733cc137f38e5ecb05789b0104e963ab731e4aaaaaf931c3c039ea8c9d7904163936e19a8929434da9adeba30301fe190d5e3beaf1084c1b1cb6621d262c0cd8cd16454ef0188441abf05d356a4100016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a80601305205dbbecab7b01ec2538467c2fe41f7845eb45487bcf2f7d7bd52207f644100",
6388! "01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a091200030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806021880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e92f7a96ecc725694533a999db6786f6016bcfdca5c9353151837faf43d93c50ef00",
6389! "01be3f6c181f162824191ecf1f78cae3ffb0ddfda671bb93277ce6ebc9201a0912011880967fc8226380a849c63532bba67990f7d0a10e9c90b848f58d634957c6e9030001ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a806012f7a96ecc725694533a999db6786f6016bcfdca5c9353151837faf43d93c50ef00",
6390! "01c465bb2893cba233351094f259396301c23d73a6cf6f92bc63428a43f0dd8f8e000301e97f16ad143359999c90a7d2a3e7daa94ad980842226d9323d3f4f0ab62460a701ec4b1458a3cf805199803a1231e906ba095f969a5775ca4ac73348473e70f625016cbbfc183a1017859c6a088838ae487be84321274a039773a35b434b7610a8060184c834e7cb38d6f08d82f5cf4839b8920185174b11c7af771fd38dd02b206a2000"
6391! ]
6392diff -crB ./src/test/rpc_wallet_tests.cpp ../../komodo-jl777/src/test/rpc_wallet_tests.cpp
6393*** ./src/test/rpc_wallet_tests.cpp 2017-01-03 10:40:50.419339691 +0000
6394--- ../../komodo-jl777/src/test/rpc_wallet_tests.cpp 2017-01-03 09:49:08.872507185 +0000
6395***************
6396*** 295,307 ****
6397 BOOST_CHECK_THROW(CallRPC("z_listreceivedbyaddress tnRZ8bPq2pff3xBWhTJhNkVUkm2uhzksDeW5PvEa7aFKGT9Qi3YgTALZfjaY4jU3HLVKBtHdSXxoPoLA3naMPcHBcY88FcF 1"), runtime_error);
6398 }
6399
6400 /*
6401 * This test covers RPC command z_exportwallet
6402 */
6403 BOOST_AUTO_TEST_CASE(rpc_wallet_z_exportwallet)
6404 {
6405 LOCK2(cs_main, pwalletMain->cs_wallet);
6406!
6407 // wallet should be empty
6408 std::set<libzcash::PaymentAddress> addrs;
6409 pwalletMain->GetPaymentAddresses(addrs);
6410--- 295,353 ----
6411 BOOST_CHECK_THROW(CallRPC("z_listreceivedbyaddress tnRZ8bPq2pff3xBWhTJhNkVUkm2uhzksDeW5PvEa7aFKGT9Qi3YgTALZfjaY4jU3HLVKBtHdSXxoPoLA3naMPcHBcY88FcF 1"), runtime_error);
6412 }
6413
6414+ /**
6415+ * This test covers RPC command z_validateaddress
6416+ */
6417+ BOOST_AUTO_TEST_CASE(rpc_wallet_z_validateaddress)
6418+ {
6419+ SelectParams(CBaseChainParams::MAIN);
6420+
6421+ LOCK2(cs_main, pwalletMain->cs_wallet);
6422+
6423+ Value retValue;
6424+
6425+ // Check number of args
6426+ BOOST_CHECK_THROW(CallRPC("z_validateaddress"), runtime_error);
6427+ BOOST_CHECK_THROW(CallRPC("z_validateaddress toomany args"), runtime_error);
6428+
6429+ // Wallet should be empty
6430+ std::set<libzcash::PaymentAddress> addrs;
6431+ pwalletMain->GetPaymentAddresses(addrs);
6432+ BOOST_CHECK(addrs.size()==0);
6433+
6434+ // This address is not valid, it belongs to another network
6435+ BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress ztaaga95QAPyp1kSQ1hD2kguCpzyMHjxWZqaYDEkzbvo7uYQYAw2S8X4Kx98AvhhofMtQL8PAXKHuZsmhRcanavKRKmdCzk"));
6436+ Object resultObj = retValue.get_obj();
6437+ bool b = find_value(resultObj, "isvalid").get_bool();
6438+ BOOST_CHECK_EQUAL(b, false);
6439+
6440+ // This address is valid, but the spending key is not in this wallet
6441+ BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress zcfA19SDAKRYHLoRDoShcoz4nPohqWxuHcqg8WAxsiB2jFrrs6k7oSvst3UZvMYqpMNSRBkxBsnyjjngX5L55FxMzLKach8"));
6442+ resultObj = retValue.get_obj();
6443+ b = find_value(resultObj, "isvalid").get_bool();
6444+ BOOST_CHECK_EQUAL(b, true);
6445+ b = find_value(resultObj, "ismine").get_bool();
6446+ BOOST_CHECK_EQUAL(b, false);
6447+
6448+ // Let's import a spending key to the wallet and validate its payment address
6449+ BOOST_CHECK_NO_THROW(CallRPC("z_importkey SKxoWv77WGwFnUJitQKNEcD636bL4X5Gd6wWmgaA4Q9x8jZBPJXT"));
6450+ BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress zcWsmqT4X2V4jgxbgiCzyrAfRT1vi1F4sn7M5Pkh66izzw8Uk7LBGAH3DtcSMJeUb2pi3W4SQF8LMKkU2cUuVP68yAGcomL"));
6451+ resultObj = retValue.get_obj();
6452+ b = find_value(resultObj, "isvalid").get_bool();
6453+ BOOST_CHECK_EQUAL(b, true);
6454+ b = find_value(resultObj, "ismine").get_bool();
6455+ BOOST_CHECK_EQUAL(b, true);
6456+ BOOST_CHECK_EQUAL(find_value(resultObj, "payingkey").get_str(), "f5bb3c888ccc9831e3f6ba06e7528e26a312eec3acc1823be8918b6a3a5e20ad");
6457+ BOOST_CHECK_EQUAL(find_value(resultObj, "transmissionkey").get_str(), "7a58c7132446564e6b810cf895c20537b3528357dc00150a8e201f491efa9c1a");
6458+ }
6459+
6460 /*
6461 * This test covers RPC command z_exportwallet
6462 */
6463 BOOST_AUTO_TEST_CASE(rpc_wallet_z_exportwallet)
6464 {
6465 LOCK2(cs_main, pwalletMain->cs_wallet);
6466!
6467 // wallet should be empty
6468 std::set<libzcash::PaymentAddress> addrs;
6469 pwalletMain->GetPaymentAddresses(addrs);
6470***************
6471*** 774,780 ****
6472
6473 BOOST_CHECK_THROW(CallRPC("z_sendmany"), runtime_error);
6474 BOOST_CHECK_THROW(CallRPC("z_sendmany toofewargs"), runtime_error);
6475! BOOST_CHECK_THROW(CallRPC("z_sendmany too many args here"), runtime_error);
6476
6477 // bad from address
6478 BOOST_CHECK_THROW(CallRPC("z_sendmany "
6479--- 820,826 ----
6480
6481 BOOST_CHECK_THROW(CallRPC("z_sendmany"), runtime_error);
6482 BOOST_CHECK_THROW(CallRPC("z_sendmany toofewargs"), runtime_error);
6483! BOOST_CHECK_THROW(CallRPC("z_sendmany just too many args here"), runtime_error);
6484
6485 // bad from address
6486 BOOST_CHECK_THROW(CallRPC("z_sendmany "
6487***************
6488*** 795,800 ****
6489--- 841,867 ----
6490 " {\"address\":\"tmQP9L3s31cLsghVYf2Jb5MhKj1jRBPoeQn\", \"amount\":12.0} ]"
6491 ), runtime_error);
6492
6493+ // invalid fee amount, cannot be negative
6494+ BOOST_CHECK_THROW(CallRPC("z_sendmany "
6495+ "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ "
6496+ "[{\"address\":\"tmQP9L3s31cLsghVYf2Jb5MhKj1jRBPoeQn\", \"amount\":50.0}] "
6497+ "1 -0.0001"
6498+ ), runtime_error);
6499+
6500+ // invalid fee amount, bigger than MAX_MONEY
6501+ BOOST_CHECK_THROW(CallRPC("z_sendmany "
6502+ "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ "
6503+ "[{\"address\":\"tmQP9L3s31cLsghVYf2Jb5MhKj1jRBPoeQn\", \"amount\":50.0}] "
6504+ "1 21000001"
6505+ ), runtime_error);
6506+
6507+ // fee amount is bigger than sum of outputs
6508+ BOOST_CHECK_THROW(CallRPC("z_sendmany "
6509+ "tmRr6yJonqGK23UVhrKuyvTpF8qxQQjKigJ "
6510+ "[{\"address\":\"tmQP9L3s31cLsghVYf2Jb5MhKj1jRBPoeQn\", \"amount\":50.0}] "
6511+ "1 50.00000001"
6512+ ), runtime_error);
6513+
6514 // memo bigger than allowed length of ZC_MEMO_SIZE
6515 std::vector<char> v (2 * (ZC_MEMO_SIZE+1)); // x2 for hexadecimal string format
6516 std::fill(v.begin(),v.end(), 'A');
6517diff -crB ./src/test/transaction_tests.cpp ../../komodo-jl777/src/test/transaction_tests.cpp
6518*** ./src/test/transaction_tests.cpp 2017-01-03 10:40:50.423339894 +0000
6519--- ../../komodo-jl777/src/test/transaction_tests.cpp 2017-01-03 09:49:08.872507185 +0000
6520***************
6521*** 341,349 ****
6522 libzcash::JSOutput(addr, 50)
6523 };
6524
6525 {
6526 JSDescription jsdesc(*p, pubKeyHash, rt, inputs, outputs, 0, 0);
6527! BOOST_CHECK(jsdesc.Verify(*p, pubKeyHash));
6528
6529 CDataStream ss(SER_DISK, CLIENT_VERSION);
6530 ss << jsdesc;
6531--- 341,351 ----
6532 libzcash::JSOutput(addr, 50)
6533 };
6534
6535+ auto verifier = libzcash::ProofVerifier::Strict();
6536+
6537 {
6538 JSDescription jsdesc(*p, pubKeyHash, rt, inputs, outputs, 0, 0);
6539! BOOST_CHECK(jsdesc.Verify(*p, verifier, pubKeyHash));
6540
6541 CDataStream ss(SER_DISK, CLIENT_VERSION);
6542 ss << jsdesc;
6543***************
6544*** 352,358 ****
6545 ss >> jsdesc_deserialized;
6546
6547 BOOST_CHECK(jsdesc_deserialized == jsdesc);
6548! BOOST_CHECK(jsdesc_deserialized.Verify(*p, pubKeyHash));
6549 }
6550
6551 {
6552--- 354,360 ----
6553 ss >> jsdesc_deserialized;
6554
6555 BOOST_CHECK(jsdesc_deserialized == jsdesc);
6556! BOOST_CHECK(jsdesc_deserialized.Verify(*p, verifier, pubKeyHash));
6557 }
6558
6559 {
6560***************
6561*** 365,371 ****
6562 // Ensure that it won't verify if the root is changed.
6563 auto test = JSDescription(*p, pubKeyHash, rt, inputs, outputs, 0, 0);
6564 test.anchor = GetRandHash();
6565! BOOST_CHECK(!test.Verify(*p, pubKeyHash));
6566 }
6567 }
6568
6569--- 367,373 ----
6570 // Ensure that it won't verify if the root is changed.
6571 auto test = JSDescription(*p, pubKeyHash, rt, inputs, outputs, 0, 0);
6572 test.anchor = GetRandHash();
6573! BOOST_CHECK(!test.Verify(*p, verifier, pubKeyHash));
6574 }
6575 }
6576
6577diff -crB ./src/util.cpp ../../komodo-jl777/src/util.cpp
6578*** ./src/util.cpp 2017-01-03 10:40:50.427340097 +0000
6579--- ../../komodo-jl777/src/util.cpp 2017-01-03 09:49:08.872507185 +0000
6580***************
6581*** 217,222 ****
6582--- 217,223 ----
6583
6584 // if not debugging everything and not debugging specific category, LogPrint does nothing.
6585 if (setCategories.count(string("")) == 0 &&
6586+ setCategories.count(string("1")) == 0 &&
6587 setCategories.count(string(category)) == 0)
6588 return false;
6589 }
6590***************
6591*** 526,532 ****
6592 path /= BaseParams().DataDir();
6593
6594 fs::create_directories(path);
6595!
6596 return path;
6597 }
6598
6599--- 527,534 ----
6600 path /= BaseParams().DataDir();
6601
6602 fs::create_directories(path);
6603! //std::string assetpath = path + "/assets";
6604! //boost::filesystem::create_directory(assetpath);
6605 return path;
6606 }
6607
6608Only in ../../komodo-jl777/src: utiltest.cpp
6609Only in ../../komodo-jl777/src: utiltest.h
6610diff -crB ./src/wallet/asyncrpcoperation_sendmany.cpp ../../komodo-jl777/src/wallet/asyncrpcoperation_sendmany.cpp
6611*** ./src/wallet/asyncrpcoperation_sendmany.cpp 2017-01-03 10:40:50.427340097 +0000
6612--- ../../komodo-jl777/src/wallet/asyncrpcoperation_sendmany.cpp 2017-01-03 09:49:08.872507185 +0000
6613***************
6614*** 52,60 ****
6615 std::string fromAddress,
6616 std::vector<SendManyRecipient> tOutputs,
6617 std::vector<SendManyRecipient> zOutputs,
6618! int minDepth) :
6619! fromaddress_(fromAddress), t_outputs_(tOutputs), z_outputs_(zOutputs), mindepth_(minDepth)
6620 {
6621 if (minDepth < 0) {
6622 throw JSONRPCError(RPC_INVALID_PARAMETER, "Minconf cannot be negative");
6623 }
6624--- 52,63 ----
6625 std::string fromAddress,
6626 std::vector<SendManyRecipient> tOutputs,
6627 std::vector<SendManyRecipient> zOutputs,
6628! int minDepth,
6629! CAmount fee) :
6630! fromaddress_(fromAddress), t_outputs_(tOutputs), z_outputs_(zOutputs), mindepth_(minDepth), fee_(fee)
6631 {
6632+ assert(fee_ > 0);
6633+
6634 if (minDepth < 0) {
6635 throw JSONRPCError(RPC_INVALID_PARAMETER, "Minconf cannot be negative");
6636 }
6637***************
6638*** 149,156 ****
6639 bool isSingleZaddrOutput = (t_outputs_.size()==0 && z_outputs_.size()==1);
6640 bool isMultipleZaddrOutput = (t_outputs_.size()==0 && z_outputs_.size()>=1);
6641 bool isPureTaddrOnlyTx = (isfromtaddr_ && z_outputs_.size() == 0);
6642! CAmount minersFee = ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE;
6643!
6644 // When spending coinbase utxos, you can only specify a single zaddr as the change must go somewhere
6645 // and if there are multiple zaddrs, we don't know where to send it.
6646 if (isfromtaddr_) {
6647--- 152,159 ----
6648 bool isSingleZaddrOutput = (t_outputs_.size()==0 && z_outputs_.size()==1);
6649 bool isMultipleZaddrOutput = (t_outputs_.size()==0 && z_outputs_.size()>=1);
6650 bool isPureTaddrOnlyTx = (isfromtaddr_ && z_outputs_.size() == 0);
6651! CAmount minersFee = fee_;
6652!
6653 // When spending coinbase utxos, you can only specify a single zaddr as the change must go somewhere
6654 // and if there are multiple zaddrs, we don't know where to send it.
6655 if (isfromtaddr_) {
6656***************
6657*** 202,218 ****
6658 assert(!isfromzaddr_ || t_inputs_total == 0);
6659
6660 if (isfromtaddr_ && (t_inputs_total < targetAmount)) {
6661! throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, strprintf("Insufficient transparent funds, have %ld, need %ld", t_inputs_total, targetAmount));
6662 }
6663
6664 if (isfromzaddr_ && (z_inputs_total < targetAmount)) {
6665! throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, strprintf("Insufficient protected funds, have %ld, need %ld", z_inputs_total, targetAmount));
6666 }
6667
6668 // If from address is a taddr, select UTXOs to spend
6669 CAmount selectedUTXOAmount = 0;
6670 bool selectedUTXOCoinbase = false;
6671 if (isfromtaddr_) {
6672 std::vector<SendManyInputUTXO> selectedTInputs;
6673 for (SendManyInputUTXO & t : t_inputs_) {
6674 bool b = std::get<3>(t);
6675--- 205,233 ----
6676 assert(!isfromzaddr_ || t_inputs_total == 0);
6677
6678 if (isfromtaddr_ && (t_inputs_total < targetAmount)) {
6679! throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS,
6680! strprintf("Insufficient transparent funds, have %s, need %s",
6681! FormatMoney(t_inputs_total), FormatMoney(targetAmount)));
6682 }
6683
6684 if (isfromzaddr_ && (z_inputs_total < targetAmount)) {
6685! throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS,
6686! strprintf("Insufficient protected funds, have %s, need %s",
6687! FormatMoney(z_inputs_total), FormatMoney(targetAmount)));
6688 }
6689
6690 // If from address is a taddr, select UTXOs to spend
6691 CAmount selectedUTXOAmount = 0;
6692 bool selectedUTXOCoinbase = false;
6693 if (isfromtaddr_) {
6694+ // Get dust threshold
6695+ CKey secret;
6696+ secret.MakeNewKey(true);
6697+ CScript scriptPubKey = GetScriptForDestination(secret.GetPubKey().GetID());
6698+ CTxOut out(CAmount(1), scriptPubKey);
6699+ CAmount dustThreshold = out.GetDustThreshold(minRelayTxFee);
6700+ CAmount dustChange = -1;
6701+
6702 std::vector<SendManyInputUTXO> selectedTInputs;
6703 for (SendManyInputUTXO & t : t_inputs_) {
6704 bool b = std::get<3>(t);
6705***************
6706*** 222,230 ****
6707 selectedUTXOAmount += std::get<2>(t);
6708 selectedTInputs.push_back(t);
6709 if (selectedUTXOAmount >= targetAmount) {
6710! break;
6711 }
6712 }
6713 t_inputs_ = selectedTInputs;
6714 t_inputs_total = selectedUTXOAmount;
6715
6716--- 237,257 ----
6717 selectedUTXOAmount += std::get<2>(t);
6718 selectedTInputs.push_back(t);
6719 if (selectedUTXOAmount >= targetAmount) {
6720! // Select another utxo if there is change less than the dust threshold.
6721! dustChange = selectedUTXOAmount - targetAmount;
6722! if (dustChange == 0 || dustChange >= dustThreshold) {
6723! break;
6724! }
6725 }
6726 }
6727+
6728+ // If there is transparent change, is it valid or is it dust?
6729+ if (dustChange < dustThreshold && dustChange != 0) {
6730+ throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS,
6731+ strprintf("Insufficient transparent funds, have %s, need %s more to avoid creating invalid change output %s (dust threshold is %s)",
6732+ FormatMoney(t_inputs_total), FormatMoney(dustThreshold - dustChange), FormatMoney(dustChange), FormatMoney(dustThreshold)));
6733+ }
6734+
6735 t_inputs_ = selectedTInputs;
6736 t_inputs_total = selectedUTXOAmount;
6737
6738***************
6739*** 298,304 ****
6740 zOutputsDeque.push_back(o);
6741 }
6742
6743!
6744 /**
6745 * SCENARIO #2
6746 *
6747--- 325,346 ----
6748 zOutputsDeque.push_back(o);
6749 }
6750
6751! // When spending notes, take a snapshot of note witnesses and anchors as the treestate will
6752! // change upon arrival of new blocks which contain joinsplit transactions. This is likely
6753! // to happen as creating a chained joinsplit transaction can take longer than the block interval.
6754! if (z_inputs_.size() > 0) {
6755! LOCK2(cs_main, pwalletMain->cs_wallet);
6756! for (auto t : z_inputs_) {
6757! JSOutPoint jso = std::get<0>(t);
6758! std::vector<JSOutPoint> vOutPoints = { jso };
6759! uint256 inputAnchor;
6760! std::vector<boost::optional<ZCIncrementalWitness>> vInputWitnesses;
6761! pwalletMain->GetNoteWitnesses(vOutPoints, vInputWitnesses, inputAnchor);
6762! jsopWitnessAnchorMap[ jso.ToString() ] = WitnessAnchorData{ vInputWitnesses[0], inputAnchor };
6763! }
6764! }
6765!
6766!
6767 /**
6768 * SCENARIO #2
6769 *
6770***************
6771*** 321,327 ****
6772 if (selectedUTXOCoinbase) {
6773 assert(isSingleZaddrOutput);
6774 throw JSONRPCError(RPC_WALLET_ERROR, strprintf(
6775! "Change %ld not allowed. When protecting coinbase funds, the wallet does not allow any change as there is currently no way to specify a change address in z_sendmany.", change));
6776 } else {
6777 add_taddr_change_output_to_tx(change);
6778 LogPrint("zrpc", "%s: transparent change in transaction output (amount=%s)\n",
6779--- 363,371 ----
6780 if (selectedUTXOCoinbase) {
6781 assert(isSingleZaddrOutput);
6782 throw JSONRPCError(RPC_WALLET_ERROR, strprintf(
6783! "Change %s not allowed. When protecting coinbase funds, the wallet does not "
6784! "allow any change as there is currently no way to specify a change address "
6785! "in z_sendmany.", FormatMoney(change)));
6786 } else {
6787 add_taddr_change_output_to_tx(change);
6788 LogPrint("zrpc", "%s: transparent change in transaction output (amount=%s)\n",
6789***************
6790*** 496,510 ****
6791 throw JSONRPCError(RPC_WALLET_ERROR, "Could not find previous JoinSplit anchor");
6792 }
6793
6794 for (const uint256& commitment : prevJoinSplit.commitments) {
6795 tree.append(commitment);
6796! previousCommitments.push_back(commitment);
6797 }
6798! ZCIncrementalWitness changeWitness = tree.witness();
6799! jsAnchor = changeWitness.root();
6800! uint256 changeCommitment = prevJoinSplit.commitments[changeOutputIndex];
6801! intermediates.insert(std::make_pair(tree.root(), tree));
6802! witnesses.push_back(changeWitness);
6803
6804 // Decrypt the change note's ciphertext to retrieve some data we need
6805 ZCNoteDecryption decryptor(spendingkey_.viewing_key());
6806--- 540,562 ----
6807 throw JSONRPCError(RPC_WALLET_ERROR, "Could not find previous JoinSplit anchor");
6808 }
6809
6810+ assert(changeOutputIndex != -1);
6811+ boost::optional<ZCIncrementalWitness> changeWitness;
6812+ int n = 0;
6813 for (const uint256& commitment : prevJoinSplit.commitments) {
6814 tree.append(commitment);
6815! previousCommitments.push_back(commitment);
6816! if (!changeWitness && changeOutputIndex == n++) {
6817! changeWitness = tree.witness();
6818! } else if (changeWitness) {
6819! changeWitness.get().append(commitment);
6820! }
6821 }
6822! if (changeWitness) {
6823! witnesses.push_back(changeWitness);
6824! }
6825! jsAnchor = tree.root();
6826! intermediates.insert(std::make_pair(tree.root(), tree)); // chained js are interstitial (found in between block boundaries)
6827
6828 // Decrypt the change note's ciphertext to retrieve some data we need
6829 ZCNoteDecryption decryptor(spendingkey_.viewing_key());
6830***************
6831*** 538,543 ****
6832--- 590,596 ----
6833 //
6834 std::vector<Note> vInputNotes;
6835 std::vector<JSOutPoint> vOutPoints;
6836+ std::vector<boost::optional<ZCIncrementalWitness>> vInputWitnesses;
6837 uint256 inputAnchor;
6838 int numInputsNeeded = (jsChange>0) ? 1 : 0;
6839 while (numInputsNeeded++ < ZC_NUM_JS_INPUTS && zInputsDeque.size() > 0) {
6840***************
6841*** 547,552 ****
6842--- 600,613 ----
6843 CAmount noteFunds = std::get<2>(t);
6844 zInputsDeque.pop_front();
6845
6846+ WitnessAnchorData wad = jsopWitnessAnchorMap[ jso.ToString() ];
6847+ vInputWitnesses.push_back(wad.witness);
6848+ if (inputAnchor.IsNull()) {
6849+ inputAnchor = wad.anchor;
6850+ } else if (inputAnchor != wad.anchor) {
6851+ throw JSONRPCError(RPC_WALLET_ERROR, "Selected input notes do not share the same anchor");
6852+ }
6853+
6854 vOutPoints.push_back(jso);
6855 vInputNotes.push_back(note);
6856
6857***************
6858*** 563,574 ****
6859
6860 // Add history of previous commitments to witness
6861 if (vInputNotes.size() > 0) {
6862! std::vector<boost::optional<ZCIncrementalWitness>> vInputWitnesses;
6863! {
6864! LOCK(cs_main);
6865! pwalletMain->GetNoteWitnesses(vOutPoints, vInputWitnesses, inputAnchor);
6866! }
6867!
6868 if (vInputWitnesses.size()==0) {
6869 throw JSONRPCError(RPC_WALLET_ERROR, "Could not find witness for note commitment");
6870 }
6871--- 624,630 ----
6872
6873 // Add history of previous commitments to witness
6874 if (vInputNotes.size() > 0) {
6875!
6876 if (vInputWitnesses.size()==0) {
6877 throw JSONRPCError(RPC_WALLET_ERROR, "Could not find witness for note commitment");
6878 }
6879***************
6880*** 760,765 ****
6881--- 816,826 ----
6882 t_inputs_.push_back(utxo);
6883 }
6884
6885+ // sort in ascending order, so smaller utxos appear first
6886+ std::sort(t_inputs_.begin(), t_inputs_.end(), [](SendManyInputUTXO i, SendManyInputUTXO j) -> bool {
6887+ return ( std::get<2>(i) < std::get<2>(j));
6888+ });
6889+
6890 return t_inputs_.size() > 0;
6891 }
6892
6893***************
6894*** 894,901 ****
6895 info.vpub_new,
6896 !this->testmode);
6897
6898! if (!(jsdesc.Verify(*pzcashParams, joinSplitPubKey_))) {
6899! throw std::runtime_error("error verifying joinsplit");
6900 }
6901
6902 mtx.vjoinsplit.push_back(jsdesc);
6903--- 955,965 ----
6904 info.vpub_new,
6905 !this->testmode);
6906
6907! {
6908! auto verifier = libzcash::ProofVerifier::Strict();
6909! if (!(jsdesc.Verify(*pzcashParams, verifier, joinSplitPubKey_))) {
6910! throw std::runtime_error("error verifying joinsplit");
6911! }
6912 }
6913
6914 mtx.vjoinsplit.push_back(jsdesc);
6915diff -crB ./src/wallet/asyncrpcoperation_sendmany.h ../../komodo-jl777/src/wallet/asyncrpcoperation_sendmany.h
6916*** ./src/wallet/asyncrpcoperation_sendmany.h 2017-01-03 10:40:50.427340097 +0000
6917--- ../../komodo-jl777/src/wallet/asyncrpcoperation_sendmany.h 2017-01-03 09:49:08.872507185 +0000
6918***************
6919*** 14,22 ****
6920 #include "json/json_spirit_value.h"
6921 #include "wallet.h"
6922
6923 #include <tuple>
6924
6925! // TODO: Compute fee based on a heuristic, e.g. (num tx output * dust threshold) + joinsplit bytes * ?
6926 #define ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE 10000
6927
6928 using namespace libzcash;
6929--- 14,23 ----
6930 #include "json/json_spirit_value.h"
6931 #include "wallet.h"
6932
6933+ #include <unordered_map>
6934 #include <tuple>
6935
6936! // Default transaction fee if caller does not specify one.
6937 #define ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE 10000
6938
6939 using namespace libzcash;
6940***************
6941*** 41,49 ****
6942 CAmount vpub_new = 0;
6943 };
6944
6945 class AsyncRPCOperation_sendmany : public AsyncRPCOperation {
6946 public:
6947! AsyncRPCOperation_sendmany(std::string fromAddress, std::vector<SendManyRecipient> tOutputs, std::vector<SendManyRecipient> zOutputs, int minDepth);
6948 virtual ~AsyncRPCOperation_sendmany();
6949
6950 // We don't want to be copied or moved around
6951--- 42,56 ----
6952 CAmount vpub_new = 0;
6953 };
6954
6955+ // A struct to help us track the witness and anchor for a given JSOutPoint
6956+ struct WitnessAnchorData {
6957+ boost::optional<ZCIncrementalWitness> witness;
6958+ uint256 anchor;
6959+ };
6960+
6961 class AsyncRPCOperation_sendmany : public AsyncRPCOperation {
6962 public:
6963! AsyncRPCOperation_sendmany(std::string fromAddress, std::vector<SendManyRecipient> tOutputs, std::vector<SendManyRecipient> zOutputs, int minDepth, CAmount fee = ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE);
6964 virtual ~AsyncRPCOperation_sendmany();
6965
6966 // We don't want to be copied or moved around
6967***************
6968*** 59,64 ****
6969--- 66,72 ----
6970 private:
6971 friend class TEST_FRIEND_AsyncRPCOperation_sendmany; // class for unit testing
6972
6973+ CAmount fee_;
6974 int mindepth_;
6975 std::string fromaddress_;
6976 bool isfromtaddr_;
6977***************
6978*** 70,76 ****
6979 uint256 joinSplitPubKey_;
6980 unsigned char joinSplitPrivKey_[crypto_sign_SECRETKEYBYTES];
6981
6982!
6983 std::vector<SendManyRecipient> t_outputs_;
6984 std::vector<SendManyRecipient> z_outputs_;
6985 std::vector<SendManyInputUTXO> t_inputs_;
6986--- 78,86 ----
6987 uint256 joinSplitPubKey_;
6988 unsigned char joinSplitPrivKey_[crypto_sign_SECRETKEYBYTES];
6989
6990! // The key is the result string from calling JSOutPoint::ToString()
6991! std::unordered_map<std::string, WitnessAnchorData> jsopWitnessAnchorMap;
6992!
6993 std::vector<SendManyRecipient> t_outputs_;
6994 std::vector<SendManyRecipient> z_outputs_;
6995 std::vector<SendManyInputUTXO> t_inputs_;
6996diff -crB ./src/wallet/gtest/test_wallet.cpp ../../komodo-jl777/src/wallet/gtest/test_wallet.cpp
6997*** ./src/wallet/gtest/test_wallet.cpp 2017-01-03 10:40:50.431340299 +0000
6998--- ../../komodo-jl777/src/wallet/gtest/test_wallet.cpp 2017-01-03 09:49:08.872507185 +0000
6999***************
7000*** 5,11 ****
7001--- 5,13 ----
7002 #include "base58.h"
7003 #include "chainparams.h"
7004 #include "main.h"
7005+ #include "primitives/block.h"
7006 #include "random.h"
7007+ #include "utiltest.h"
7008 #include "wallet/wallet.h"
7009 #include "zcash/JoinSplit.hpp"
7010 #include "zcash/Note.hpp"
7011***************
7012*** 29,37 ****
7013
7014 MOCK_METHOD2(WriteTx, bool(uint256 hash, const CWalletTx& wtx));
7015 MOCK_METHOD1(WriteWitnessCacheSize, bool(int64_t nWitnessCacheSize));
7016 };
7017
7018! template void CWallet::WriteWitnessCache<MockWalletDB>(MockWalletDB& walletdb);
7019
7020 class TestWallet : public CWallet {
7021 public:
7022--- 31,41 ----
7023
7024 MOCK_METHOD2(WriteTx, bool(uint256 hash, const CWalletTx& wtx));
7025 MOCK_METHOD1(WriteWitnessCacheSize, bool(int64_t nWitnessCacheSize));
7026+ MOCK_METHOD1(WriteBestBlock, bool(const CBlockLocator& loc));
7027 };
7028
7029! template void CWallet::SetBestChainINTERNAL<MockWalletDB>(
7030! MockWalletDB& walletdb, const CBlockLocator& loc);
7031
7032 class TestWallet : public CWallet {
7033 public:
7034***************
7035*** 50,60 ****
7036 ZCIncrementalMerkleTree tree) {
7037 CWallet::IncrementNoteWitnesses(pindex, pblock, tree);
7038 }
7039! void DecrementNoteWitnesses() {
7040! CWallet::DecrementNoteWitnesses();
7041 }
7042! void WriteWitnessCache(MockWalletDB& walletdb) {
7043! CWallet::WriteWitnessCache(walletdb);
7044 }
7045 bool UpdatedNoteData(const CWalletTx& wtxIn, CWalletTx& wtx) {
7046 return CWallet::UpdatedNoteData(wtxIn, wtx);
7047--- 54,64 ----
7048 ZCIncrementalMerkleTree tree) {
7049 CWallet::IncrementNoteWitnesses(pindex, pblock, tree);
7050 }
7051! void DecrementNoteWitnesses(const CBlockIndex* pindex) {
7052! CWallet::DecrementNoteWitnesses(pindex);
7053 }
7054! void SetBestChain(MockWalletDB& walletdb, const CBlockLocator& loc) {
7055! CWallet::SetBestChainINTERNAL(walletdb, loc);
7056 }
7057 bool UpdatedNoteData(const CWalletTx& wtxIn, CWalletTx& wtx) {
7058 return CWallet::UpdatedNoteData(wtxIn, wtx);
7059***************
7060*** 65,183 ****
7061 };
7062
7063 CWalletTx GetValidReceive(const libzcash::SpendingKey& sk, CAmount value, bool randomInputs) {
7064! CMutableTransaction mtx;
7065! mtx.nVersion = 2; // Enable JoinSplits
7066! mtx.vin.resize(2);
7067! if (randomInputs) {
7068! mtx.vin[0].prevout.hash = GetRandHash();
7069! mtx.vin[1].prevout.hash = GetRandHash();
7070! } else {
7071! mtx.vin[0].prevout.hash = uint256S("0000000000000000000000000000000000000000000000000000000000000001");
7072! mtx.vin[1].prevout.hash = uint256S("0000000000000000000000000000000000000000000000000000000000000002");
7073! }
7074! mtx.vin[0].prevout.n = 0;
7075! mtx.vin[1].prevout.n = 0;
7076!
7077! // Generate an ephemeral keypair.
7078! uint256 joinSplitPubKey;
7079! unsigned char joinSplitPrivKey[crypto_sign_SECRETKEYBYTES];
7080! crypto_sign_keypair(joinSplitPubKey.begin(), joinSplitPrivKey);
7081! mtx.joinSplitPubKey = joinSplitPubKey;
7082!
7083! boost::array<libzcash::JSInput, 2> inputs = {
7084! libzcash::JSInput(), // dummy input
7085! libzcash::JSInput() // dummy input
7086! };
7087!
7088! boost::array<libzcash::JSOutput, 2> outputs = {
7089! libzcash::JSOutput(sk.address(), value),
7090! libzcash::JSOutput(sk.address(), value)
7091! };
7092!
7093! boost::array<libzcash::Note, 2> output_notes;
7094!
7095! // Prepare JoinSplits
7096! uint256 rt;
7097! JSDescription jsdesc {*params, mtx.joinSplitPubKey, rt,
7098! inputs, outputs, value, 0, false};
7099! mtx.vjoinsplit.push_back(jsdesc);
7100!
7101! // Empty output script.
7102! CScript scriptCode;
7103! CTransaction signTx(mtx);
7104! uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL);
7105!
7106! // Add the signature
7107! assert(crypto_sign_detached(&mtx.joinSplitSig[0], NULL,
7108! dataToBeSigned.begin(), 32,
7109! joinSplitPrivKey
7110! ) == 0);
7111!
7112! CTransaction tx {mtx};
7113! CWalletTx wtx {NULL, tx};
7114! return wtx;
7115 }
7116
7117 libzcash::Note GetNote(const libzcash::SpendingKey& sk,
7118 const CTransaction& tx, size_t js, size_t n) {
7119! ZCNoteDecryption decryptor {sk.viewing_key()};
7120! auto hSig = tx.vjoinsplit[js].h_sig(*params, tx.joinSplitPubKey);
7121! auto note_pt = libzcash::NotePlaintext::decrypt(
7122! decryptor,
7123! tx.vjoinsplit[js].ciphertexts[n],
7124! tx.vjoinsplit[js].ephemeralKey,
7125! hSig,
7126! (unsigned char) n);
7127! return note_pt.note(sk.address());
7128 }
7129
7130 CWalletTx GetValidSpend(const libzcash::SpendingKey& sk,
7131 const libzcash::Note& note, CAmount value) {
7132! CMutableTransaction mtx;
7133! mtx.vout.resize(2);
7134! mtx.vout[0].nValue = value;
7135! mtx.vout[1].nValue = 0;
7136!
7137! // Generate an ephemeral keypair.
7138! uint256 joinSplitPubKey;
7139! unsigned char joinSplitPrivKey[crypto_sign_SECRETKEYBYTES];
7140! crypto_sign_keypair(joinSplitPubKey.begin(), joinSplitPrivKey);
7141! mtx.joinSplitPubKey = joinSplitPubKey;
7142!
7143! // Fake tree for the unused witness
7144! ZCIncrementalMerkleTree tree;
7145!
7146! boost::array<libzcash::JSInput, 2> inputs = {
7147! libzcash::JSInput(tree.witness(), note, sk),
7148! libzcash::JSInput() // dummy input
7149! };
7150!
7151! boost::array<libzcash::JSOutput, 2> outputs = {
7152! libzcash::JSOutput(), // dummy output
7153! libzcash::JSOutput() // dummy output
7154! };
7155!
7156! boost::array<libzcash::Note, 2> output_notes;
7157!
7158! // Prepare JoinSplits
7159! uint256 rt;
7160! JSDescription jsdesc {*params, mtx.joinSplitPubKey, rt,
7161! inputs, outputs, 0, value, false};
7162! mtx.vjoinsplit.push_back(jsdesc);
7163!
7164! // Empty output script.
7165! CScript scriptCode;
7166! CTransaction signTx(mtx);
7167! uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL);
7168!
7169! // Add the signature
7170! assert(crypto_sign_detached(&mtx.joinSplitSig[0], NULL,
7171! dataToBeSigned.begin(), 32,
7172! joinSplitPrivKey
7173! ) == 0);
7174! CTransaction tx {mtx};
7175! CWalletTx wtx {NULL, tx};
7176! return wtx;
7177 }
7178
7179 TEST(wallet_tests, setup_datadir_location_run_as_first_test) {
7180--- 69,85 ----
7181 };
7182
7183 CWalletTx GetValidReceive(const libzcash::SpendingKey& sk, CAmount value, bool randomInputs) {
7184! return GetValidReceive(*params, sk, value, randomInputs);
7185 }
7186
7187 libzcash::Note GetNote(const libzcash::SpendingKey& sk,
7188 const CTransaction& tx, size_t js, size_t n) {
7189! return GetNote(*params, sk, tx, js, n);
7190 }
7191
7192 CWalletTx GetValidSpend(const libzcash::SpendingKey& sk,
7193 const libzcash::Note& note, CAmount value) {
7194! return GetValidSpend(*params, sk, note, value);
7195 }
7196
7197 TEST(wallet_tests, setup_datadir_location_run_as_first_test) {
7198***************
7199*** 656,662 ****
7200 EXPECT_TRUE((bool) witnesses[1]);
7201
7202 // Until #1302 is implemented, this should triggger an assertion
7203! EXPECT_DEATH(wallet.DecrementNoteWitnesses(),
7204 "Assertion `nWitnessCacheSize > 0' failed.");
7205 }
7206
7207--- 558,564 ----
7208 EXPECT_TRUE((bool) witnesses[1]);
7209
7210 // Until #1302 is implemented, this should triggger an assertion
7211! EXPECT_DEATH(wallet.DecrementNoteWitnesses(&index),
7212 "Assertion `nWitnessCacheSize > 0' failed.");
7213 }
7214
7215***************
7216*** 729,735 ****
7217
7218 // Decrementing should give us the previous anchor
7219 uint256 anchor3;
7220! wallet.DecrementNoteWitnesses();
7221 witnesses.clear();
7222 wallet.GetNoteWitnesses(notes, witnesses, anchor3);
7223 EXPECT_FALSE((bool) witnesses[0]);
7224--- 631,637 ----
7225
7226 // Decrementing should give us the previous anchor
7227 uint256 anchor3;
7228! wallet.DecrementNoteWitnesses(&index2);
7229 witnesses.clear();
7230 wallet.GetNoteWitnesses(notes, witnesses, anchor3);
7231 EXPECT_FALSE((bool) witnesses[0]);
7232***************
7233*** 754,759 ****
7234--- 656,871 ----
7235 }
7236 }
7237
7238+ TEST(wallet_tests, CachedWitnessesDecrementFirst) {
7239+ TestWallet wallet;
7240+ uint256 anchor2;
7241+ CBlock block2;
7242+ CBlockIndex index2(block2);
7243+ ZCIncrementalMerkleTree tree;
7244+
7245+ auto sk = libzcash::SpendingKey::random();
7246+ wallet.AddSpendingKey(sk);
7247+
7248+ {
7249+ // First transaction (case tested in _empty_chain)
7250+ auto wtx = GetValidReceive(sk, 10, true);
7251+ auto note = GetNote(sk, wtx, 0, 1);
7252+ auto nullifier = note.nullifier(sk);
7253+
7254+ mapNoteData_t noteData;
7255+ JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
7256+ CNoteData nd {sk.address(), nullifier};
7257+ noteData[jsoutpt] = nd;
7258+ wtx.SetNoteData(noteData);
7259+ wallet.AddToWallet(wtx, true, NULL);
7260+
7261+ // First block (case tested in _empty_chain)
7262+ CBlock block1;
7263+ block1.vtx.push_back(wtx);
7264+ CBlockIndex index1(block1);
7265+ index1.nHeight = 1;
7266+ wallet.IncrementNoteWitnesses(&index1, &block1, tree);
7267+ }
7268+
7269+ {
7270+ // Second transaction (case tested in _chain_tip)
7271+ auto wtx = GetValidReceive(sk, 50, true);
7272+ auto note = GetNote(sk, wtx, 0, 1);
7273+ auto nullifier = note.nullifier(sk);
7274+
7275+ mapNoteData_t noteData;
7276+ JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
7277+ CNoteData nd {sk.address(), nullifier};
7278+ noteData[jsoutpt] = nd;
7279+ wtx.SetNoteData(noteData);
7280+ wallet.AddToWallet(wtx, true, NULL);
7281+
7282+ std::vector<JSOutPoint> notes {jsoutpt};
7283+ std::vector<boost::optional<ZCIncrementalWitness>> witnesses;
7284+
7285+ // Second block (case tested in _chain_tip)
7286+ block2.vtx.push_back(wtx);
7287+ index2.nHeight = 2;
7288+ wallet.IncrementNoteWitnesses(&index2, &block2, tree);
7289+ // Called to fetch anchor
7290+ wallet.GetNoteWitnesses(notes, witnesses, anchor2);
7291+ }
7292+
7293+ {
7294+ // Third transaction - never mined
7295+ auto wtx = GetValidReceive(sk, 20, true);
7296+ auto note = GetNote(sk, wtx, 0, 1);
7297+ auto nullifier = note.nullifier(sk);
7298+
7299+ mapNoteData_t noteData;
7300+ JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
7301+ CNoteData nd {sk.address(), nullifier};
7302+ noteData[jsoutpt] = nd;
7303+ wtx.SetNoteData(noteData);
7304+ wallet.AddToWallet(wtx, true, NULL);
7305+
7306+ std::vector<JSOutPoint> notes {jsoutpt};
7307+ std::vector<boost::optional<ZCIncrementalWitness>> witnesses;
7308+ uint256 anchor3;
7309+
7310+ wallet.GetNoteWitnesses(notes, witnesses, anchor3);
7311+ EXPECT_FALSE((bool) witnesses[0]);
7312+
7313+ // Decrementing (before the transaction has ever seen an increment)
7314+ // should give us the previous anchor
7315+ uint256 anchor4;
7316+ wallet.DecrementNoteWitnesses(&index2);
7317+ witnesses.clear();
7318+ wallet.GetNoteWitnesses(notes, witnesses, anchor4);
7319+ EXPECT_FALSE((bool) witnesses[0]);
7320+ // Should not equal second anchor because none of these notes had witnesses
7321+ EXPECT_NE(anchor2, anchor4);
7322+
7323+ // Re-incrementing with the same block should give the same result
7324+ uint256 anchor5;
7325+ wallet.IncrementNoteWitnesses(&index2, &block2, tree);
7326+ witnesses.clear();
7327+ wallet.GetNoteWitnesses(notes, witnesses, anchor5);
7328+ EXPECT_FALSE((bool) witnesses[0]);
7329+ EXPECT_EQ(anchor3, anchor5);
7330+ }
7331+ }
7332+
7333+ TEST(wallet_tests, CachedWitnessesCleanIndex) {
7334+ TestWallet wallet;
7335+ CBlock block1;
7336+ CBlock block2;
7337+ CBlock block3;
7338+ CBlockIndex index1(block1);
7339+ CBlockIndex index2(block2);
7340+ CBlockIndex index3(block3);
7341+ ZCIncrementalMerkleTree tree;
7342+
7343+ auto sk = libzcash::SpendingKey::random();
7344+ wallet.AddSpendingKey(sk);
7345+
7346+ {
7347+ // First transaction (case tested in _empty_chain)
7348+ auto wtx = GetValidReceive(sk, 10, true);
7349+ auto note = GetNote(sk, wtx, 0, 1);
7350+ auto nullifier = note.nullifier(sk);
7351+
7352+ mapNoteData_t noteData;
7353+ JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
7354+ CNoteData nd {sk.address(), nullifier};
7355+ noteData[jsoutpt] = nd;
7356+ wtx.SetNoteData(noteData);
7357+ wallet.AddToWallet(wtx, true, NULL);
7358+
7359+ // First block (case tested in _empty_chain)
7360+ block1.vtx.push_back(wtx);
7361+ index1.nHeight = 1;
7362+ wallet.IncrementNoteWitnesses(&index1, &block1, tree);
7363+ }
7364+
7365+ {
7366+ // Second transaction (case tested in _chain_tip)
7367+ auto wtx = GetValidReceive(sk, 50, true);
7368+ auto note = GetNote(sk, wtx, 0, 1);
7369+ auto nullifier = note.nullifier(sk);
7370+
7371+ mapNoteData_t noteData;
7372+ JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
7373+ CNoteData nd {sk.address(), nullifier};
7374+ noteData[jsoutpt] = nd;
7375+ wtx.SetNoteData(noteData);
7376+ wallet.AddToWallet(wtx, true, NULL);
7377+
7378+ // Second block (case tested in _chain_tip)
7379+ block2.vtx.push_back(wtx);
7380+ index2.nHeight = 2;
7381+ wallet.IncrementNoteWitnesses(&index2, &block2, tree);
7382+ }
7383+
7384+ {
7385+ // Third transaction
7386+ auto wtx = GetValidReceive(sk, 20, true);
7387+ auto note = GetNote(sk, wtx, 0, 1);
7388+ auto nullifier = note.nullifier(sk);
7389+
7390+ mapNoteData_t noteData;
7391+ JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
7392+ CNoteData nd {sk.address(), nullifier};
7393+ noteData[jsoutpt] = nd;
7394+ wtx.SetNoteData(noteData);
7395+ wallet.AddToWallet(wtx, true, NULL);
7396+
7397+ std::vector<JSOutPoint> notes {jsoutpt};
7398+ std::vector<boost::optional<ZCIncrementalWitness>> witnesses;
7399+ uint256 anchor3;
7400+
7401+ // Third block
7402+ block3.vtx.push_back(wtx);
7403+ index3.nHeight = 3;
7404+ wallet.IncrementNoteWitnesses(&index3, &block3, tree);
7405+ wallet.GetNoteWitnesses(notes, witnesses, anchor3);
7406+
7407+ // Now pretend we are reindexing: the chain is cleared, and each block is
7408+ // used to increment witnesses again.
7409+ wallet.IncrementNoteWitnesses(&index1, &block1, tree);
7410+ uint256 anchor3a;
7411+ witnesses.clear();
7412+ wallet.GetNoteWitnesses(notes, witnesses, anchor3a);
7413+ EXPECT_TRUE((bool) witnesses[0]);
7414+ // Should equal third anchor because witness cache unaffected
7415+ EXPECT_EQ(anchor3, anchor3a);
7416+
7417+ wallet.IncrementNoteWitnesses(&index2, &block2, tree);
7418+ uint256 anchor3b;
7419+ witnesses.clear();
7420+ wallet.GetNoteWitnesses(notes, witnesses, anchor3b);
7421+ EXPECT_TRUE((bool) witnesses[0]);
7422+ EXPECT_EQ(anchor3, anchor3b);
7423+
7424+ // Pretend a reorg happened that was recorded in the block files
7425+ wallet.DecrementNoteWitnesses(&index2);
7426+ uint256 anchor3c;
7427+ witnesses.clear();
7428+ wallet.GetNoteWitnesses(notes, witnesses, anchor3c);
7429+ EXPECT_TRUE((bool) witnesses[0]);
7430+ EXPECT_EQ(anchor3, anchor3c);
7431+
7432+ wallet.IncrementNoteWitnesses(&index2, &block2, tree);
7433+ uint256 anchor3d;
7434+ witnesses.clear();
7435+ wallet.GetNoteWitnesses(notes, witnesses, anchor3d);
7436+ EXPECT_TRUE((bool) witnesses[0]);
7437+ EXPECT_EQ(anchor3, anchor3d);
7438+
7439+ wallet.IncrementNoteWitnesses(&index3, &block3, tree);
7440+ uint256 anchor3e;
7441+ witnesses.clear();
7442+ wallet.GetNoteWitnesses(notes, witnesses, anchor3e);
7443+ EXPECT_TRUE((bool) witnesses[0]);
7444+ EXPECT_EQ(anchor3, anchor3e);
7445+ }
7446+ }
7447+
7448 TEST(wallet_tests, ClearNoteWitnessCache) {
7449 TestWallet wallet;
7450
7451***************
7452*** 761,766 ****
7453--- 873,879 ----
7454 wallet.AddSpendingKey(sk);
7455
7456 auto wtx = GetValidReceive(sk, 10, true);
7457+ auto hash = wtx.GetHash();
7458 auto note = GetNote(sk, wtx, 0, 0);
7459 auto nullifier = note.nullifier(sk);
7460
7461***************
7462*** 774,779 ****
7463--- 887,894 ----
7464 // Pretend we mined the tx by adding a fake witness
7465 ZCIncrementalMerkleTree tree;
7466 wtx.mapNoteData[jsoutpt].witnesses.push_front(tree.witness());
7467+ wtx.mapNoteData[jsoutpt].witnessHeight = 1;
7468+ wallet.nWitnessCacheSize = 1;
7469
7470 wallet.AddToWallet(wtx, true, NULL);
7471
7472***************
7473*** 785,790 ****
7474--- 900,907 ----
7475 wallet.GetNoteWitnesses(notes, witnesses, anchor2);
7476 EXPECT_TRUE((bool) witnesses[0]);
7477 EXPECT_FALSE((bool) witnesses[1]);
7478+ EXPECT_EQ(1, wallet.mapWallet[hash].mapNoteData[jsoutpt].witnessHeight);
7479+ EXPECT_EQ(1, wallet.nWitnessCacheSize);
7480
7481 // After clearing, we should not have a witness for either note
7482 wallet.ClearNoteWitnessCache();
7483***************
7484*** 792,802 ****
7485--- 909,922 ----
7486 wallet.GetNoteWitnesses(notes, witnesses, anchor2);
7487 EXPECT_FALSE((bool) witnesses[0]);
7488 EXPECT_FALSE((bool) witnesses[1]);
7489+ EXPECT_EQ(-1, wallet.mapWallet[hash].mapNoteData[jsoutpt].witnessHeight);
7490+ EXPECT_EQ(0, wallet.nWitnessCacheSize);
7491 }
7492
7493 TEST(wallet_tests, WriteWitnessCache) {
7494 TestWallet wallet;
7495 MockWalletDB walletdb;
7496+ CBlockLocator loc;
7497
7498 auto sk = libzcash::SpendingKey::random();
7499 wallet.AddSpendingKey(sk);
7500***************
7501*** 807,813 ****
7502 // TxnBegin fails
7503 EXPECT_CALL(walletdb, TxnBegin())
7504 .WillOnce(Return(false));
7505! wallet.WriteWitnessCache(walletdb);
7506 EXPECT_CALL(walletdb, TxnBegin())
7507 .WillRepeatedly(Return(true));
7508
7509--- 927,933 ----
7510 // TxnBegin fails
7511 EXPECT_CALL(walletdb, TxnBegin())
7512 .WillOnce(Return(false));
7513! wallet.SetBestChain(walletdb, loc);
7514 EXPECT_CALL(walletdb, TxnBegin())
7515 .WillRepeatedly(Return(true));
7516
7517***************
7518*** 816,829 ****
7519 .WillOnce(Return(false));
7520 EXPECT_CALL(walletdb, TxnAbort())
7521 .Times(1);
7522! wallet.WriteWitnessCache(walletdb);
7523
7524 // WriteTx throws
7525 EXPECT_CALL(walletdb, WriteTx(wtx.GetHash(), wtx))
7526 .WillOnce(ThrowLogicError());
7527 EXPECT_CALL(walletdb, TxnAbort())
7528 .Times(1);
7529! wallet.WriteWitnessCache(walletdb);
7530 EXPECT_CALL(walletdb, WriteTx(wtx.GetHash(), wtx))
7531 .WillRepeatedly(Return(true));
7532
7533--- 936,949 ----
7534 .WillOnce(Return(false));
7535 EXPECT_CALL(walletdb, TxnAbort())
7536 .Times(1);
7537! wallet.SetBestChain(walletdb, loc);
7538
7539 // WriteTx throws
7540 EXPECT_CALL(walletdb, WriteTx(wtx.GetHash(), wtx))
7541 .WillOnce(ThrowLogicError());
7542 EXPECT_CALL(walletdb, TxnAbort())
7543 .Times(1);
7544! wallet.SetBestChain(walletdb, loc);
7545 EXPECT_CALL(walletdb, WriteTx(wtx.GetHash(), wtx))
7546 .WillRepeatedly(Return(true));
7547
7548***************
7549*** 832,857 ****
7550 .WillOnce(Return(false));
7551 EXPECT_CALL(walletdb, TxnAbort())
7552 .Times(1);
7553! wallet.WriteWitnessCache(walletdb);
7554
7555 // WriteWitnessCacheSize throws
7556 EXPECT_CALL(walletdb, WriteWitnessCacheSize(0))
7557 .WillOnce(ThrowLogicError());
7558 EXPECT_CALL(walletdb, TxnAbort())
7559 .Times(1);
7560! wallet.WriteWitnessCache(walletdb);
7561 EXPECT_CALL(walletdb, WriteWitnessCacheSize(0))
7562 .WillRepeatedly(Return(true));
7563
7564 // TxCommit fails
7565 EXPECT_CALL(walletdb, TxnCommit())
7566 .WillOnce(Return(false));
7567! wallet.WriteWitnessCache(walletdb);
7568 EXPECT_CALL(walletdb, TxnCommit())
7569 .WillRepeatedly(Return(true));
7570
7571 // Everything succeeds
7572! wallet.WriteWitnessCache(walletdb);
7573 }
7574
7575 TEST(wallet_tests, UpdateNullifierNoteMap) {
7576--- 952,993 ----
7577 .WillOnce(Return(false));
7578 EXPECT_CALL(walletdb, TxnAbort())
7579 .Times(1);
7580! wallet.SetBestChain(walletdb, loc);
7581
7582 // WriteWitnessCacheSize throws
7583 EXPECT_CALL(walletdb, WriteWitnessCacheSize(0))
7584 .WillOnce(ThrowLogicError());
7585 EXPECT_CALL(walletdb, TxnAbort())
7586 .Times(1);
7587! wallet.SetBestChain(walletdb, loc);
7588 EXPECT_CALL(walletdb, WriteWitnessCacheSize(0))
7589 .WillRepeatedly(Return(true));
7590
7591+ // WriteBestBlock fails
7592+ EXPECT_CALL(walletdb, WriteBestBlock(loc))
7593+ .WillOnce(Return(false));
7594+ EXPECT_CALL(walletdb, TxnAbort())
7595+ .Times(1);
7596+ wallet.SetBestChain(walletdb, loc);
7597+
7598+ // WriteBestBlock throws
7599+ EXPECT_CALL(walletdb, WriteBestBlock(loc))
7600+ .WillOnce(ThrowLogicError());
7601+ EXPECT_CALL(walletdb, TxnAbort())
7602+ .Times(1);
7603+ wallet.SetBestChain(walletdb, loc);
7604+ EXPECT_CALL(walletdb, WriteBestBlock(loc))
7605+ .WillRepeatedly(Return(true));
7606+
7607 // TxCommit fails
7608 EXPECT_CALL(walletdb, TxnCommit())
7609 .WillOnce(Return(false));
7610! wallet.SetBestChain(walletdb, loc);
7611 EXPECT_CALL(walletdb, TxnCommit())
7612 .WillRepeatedly(Return(true));
7613
7614 // Everything succeeds
7615! wallet.SetBestChain(walletdb, loc);
7616 }
7617
7618 TEST(wallet_tests, UpdateNullifierNoteMap) {
7619***************
7620*** 913,918 ****
7621--- 1049,1055 ----
7622 // Pretend we mined the tx by adding a fake witness
7623 ZCIncrementalMerkleTree tree;
7624 wtx.mapNoteData[jsoutpt].witnesses.push_front(tree.witness());
7625+ wtx.mapNoteData[jsoutpt].witnessHeight = 100;
7626
7627 // Now pretend we added the key for the second note, and
7628 // the tx was "added" to the wallet again to update it.
7629***************
7630*** 925,935 ****
7631--- 1062,1074 ----
7632 // The txs should initially be different
7633 EXPECT_NE(wtx.mapNoteData, wtx2.mapNoteData);
7634 EXPECT_EQ(1, wtx.mapNoteData[jsoutpt].witnesses.size());
7635+ EXPECT_EQ(100, wtx.mapNoteData[jsoutpt].witnessHeight);
7636
7637 // After updating, they should be the same
7638 EXPECT_TRUE(wallet.UpdatedNoteData(wtx2, wtx));
7639 EXPECT_EQ(wtx.mapNoteData, wtx2.mapNoteData);
7640 EXPECT_EQ(1, wtx.mapNoteData[jsoutpt].witnesses.size());
7641+ EXPECT_EQ(100, wtx.mapNoteData[jsoutpt].witnessHeight);
7642 // TODO: The new note should get witnessed (but maybe not here) (#1350)
7643 }
7644
7645diff -crB ./src/wallet/rpcwallet.cpp ../../komodo-jl777/src/wallet/rpcwallet.cpp
7646*** ./src/wallet/rpcwallet.cpp 2017-01-03 10:40:50.431340299 +0000
7647--- ../../komodo-jl777/src/wallet/rpcwallet.cpp 2017-01-03 09:49:08.876507395 +0000
7648***************
7649*** 2622,2627 ****
7650--- 2622,2633 ----
7651 sample_times.push_back(benchmark_verify_equihash());
7652 } else if (benchmarktype == "validatelargetx") {
7653 sample_times.push_back(benchmark_large_tx());
7654+ } else if (benchmarktype == "trydecryptnotes") {
7655+ int nAddrs = params[2].get_int();
7656+ sample_times.push_back(benchmark_try_decrypt_notes(nAddrs));
7657+ } else if (benchmarktype == "incnotewitnesses") {
7658+ int nTxs = params[2].get_int();
7659+ sample_times.push_back(benchmark_increment_note_witnesses(nTxs));
7660 } else {
7661 throw JSONRPCError(RPC_TYPE_ERROR, "Invalid benchmarktype");
7662 }
7663***************
7664*** 2849,2855 ****
7665 vpub_old,
7666 vpub_new);
7667
7668! assert(jsdesc.Verify(*pzcashParams, joinSplitPubKey));
7669
7670 mtx.vjoinsplit.push_back(jsdesc);
7671
7672--- 2855,2864 ----
7673 vpub_old,
7674 vpub_new);
7675
7676! {
7677! auto verifier = libzcash::ProofVerifier::Strict();
7678! assert(jsdesc.Verify(*pzcashParams, verifier, joinSplitPubKey));
7679! }
7680
7681 mtx.vjoinsplit.push_back(jsdesc);
7682
7683***************
7684*** 3310,3326 ****
7685 return ret;
7686 }
7687
7688 Value z_sendmany(const Array& params, bool fHelp)
7689 {
7690 if (!EnsureWalletIsAvailable(fHelp))
7691 return Value::null;
7692
7693! if (fHelp || params.size() < 2 || params.size() > 3)
7694 throw runtime_error(
7695! "z_sendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf )\n"
7696 "\nSend multiple times. Amounts are double-precision floating point numbers."
7697 "\nChange from a taddr flows to a new taddr address, while change from zaddr returns to itself."
7698! "\nWhen sending coinbase UTXOs to a zaddr, change is not alllowed. The entire value of the UTXO(s) must be consumed."
7699 + HelpRequiringPassphrase() + "\n"
7700 "\nArguments:\n"
7701 "1. \"fromaddress\" (string, required) The taddr or zaddr to send the funds from.\n"
7702--- 3319,3347 ----
7703 return ret;
7704 }
7705
7706+
7707+ // Here we define the maximum number of zaddr outputs that can be included in a transaction.
7708+ // If input notes are small, we might actually require more than one joinsplit per zaddr output.
7709+ // For now though, we assume we use one joinsplit per zaddr output (and the second output note is change).
7710+ // We reduce the result by 1 to ensure there is room for non-joinsplit CTransaction data.
7711+ #define Z_SENDMANY_MAX_ZADDR_OUTPUTS ((MAX_TX_SIZE / JSDescription().GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION)) - 1)
7712+
7713+ // transaction.h comment: spending taddr output requires CTxIn >= 148 bytes and typical taddr txout is 34 bytes
7714+ #define CTXIN_SPEND_DUST_SIZE 148
7715+ #define CTXOUT_REGULAR_SIZE 34
7716+
7717 Value z_sendmany(const Array& params, bool fHelp)
7718 {
7719 if (!EnsureWalletIsAvailable(fHelp))
7720 return Value::null;
7721
7722! if (fHelp || params.size() < 2 || params.size() > 4)
7723 throw runtime_error(
7724! "z_sendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf ) ( fee )\n"
7725 "\nSend multiple times. Amounts are double-precision floating point numbers."
7726 "\nChange from a taddr flows to a new taddr address, while change from zaddr returns to itself."
7727! "\nWhen sending coinbase UTXOs to a zaddr, change is not allowed. The entire value of the UTXO(s) must be consumed."
7728! + strprintf("\nCurrently, the maximum number of zaddr outputs is %d due to transaction size limits.\n", Z_SENDMANY_MAX_ZADDR_OUTPUTS)
7729 + HelpRequiringPassphrase() + "\n"
7730 "\nArguments:\n"
7731 "1. \"fromaddress\" (string, required) The taddr or zaddr to send the funds from.\n"
7732***************
7733*** 3331,3336 ****
7734--- 3352,3359 ----
7735 " \"memo\":memo (string, optional) If the address is a zaddr, raw data represented in hexadecimal string format\n"
7736 " }, ... ]\n"
7737 "3. minconf (numeric, optional, default=1) Only use funds confirmed at least this many times.\n"
7738+ "4. fee (numeric, optional, default="
7739+ + strprintf("%s", FormatMoney(ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE)) + ") The fee amount to attach to this transaction.\n"
7740 "\nResult:\n"
7741 "\"operationid\" (string) An operationid to pass to z_getoperationstatus to get the result of the operation.\n"
7742 );
7743***************
7744*** 3371,3376 ****
7745--- 3394,3400 ----
7746 // Recipients
7747 std::vector<SendManyRecipient> taddrRecipients;
7748 std::vector<SendManyRecipient> zaddrRecipients;
7749+ CAmount nTotalOut = 0;
7750
7751 BOOST_FOREACH(Value& output, outputs)
7752 {
7753***************
7754*** 3426,3431 ****
7755--- 3450,3481 ----
7756 } else {
7757 taddrRecipients.push_back( SendManyRecipient(address, nAmount, memo) );
7758 }
7759+
7760+ nTotalOut += nAmount;
7761+ }
7762+
7763+ // Check the number of zaddr outputs does not exceed the limit.
7764+ if (zaddrRecipients.size() > Z_SENDMANY_MAX_ZADDR_OUTPUTS) {
7765+ throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, too many zaddr outputs");
7766+ }
7767+
7768+ // As a sanity check, estimate and verify that the size of the transaction will be valid.
7769+ // Depending on the input notes, the actual tx size may turn out to be larger and perhaps invalid.
7770+ size_t txsize = 0;
7771+ CMutableTransaction mtx;
7772+ mtx.nVersion = 2;
7773+ for (int i = 0; i < zaddrRecipients.size(); i++) {
7774+ mtx.vjoinsplit.push_back(JSDescription());
7775+ }
7776+ CTransaction tx(mtx);
7777+ txsize += tx.GetSerializeSize(SER_NETWORK, tx.nVersion);
7778+ if (fromTaddr) {
7779+ txsize += CTXIN_SPEND_DUST_SIZE;
7780+ txsize += CTXOUT_REGULAR_SIZE; // There will probably be taddr change
7781+ }
7782+ txsize += CTXOUT_REGULAR_SIZE * taddrRecipients.size();
7783+ if (txsize > MAX_TX_SIZE) {
7784+ throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Too many outputs, size of raw transaction would be larger than limit of %d bytes", MAX_TX_SIZE ));
7785 }
7786
7787 // Minimum confirmations
7788***************
7789*** 3437,3445 ****
7790 throw JSONRPCError(RPC_INVALID_PARAMETER, "Minimum number of confirmations cannot be less than 0");
7791 }
7792
7793 // Create operation and add to global queue
7794 std::shared_ptr<AsyncRPCQueue> q = getAsyncRPCQueue();
7795! std::shared_ptr<AsyncRPCOperation> operation( new AsyncRPCOperation_sendmany(fromaddress, taddrRecipients, zaddrRecipients, nMinDepth) );
7796 q->addOperation(operation);
7797 AsyncRPCOperationId operationId = operation->getId();
7798 return operationId;
7799--- 3487,3505 ----
7800 throw JSONRPCError(RPC_INVALID_PARAMETER, "Minimum number of confirmations cannot be less than 0");
7801 }
7802
7803+ // Fee in Zatoshis, not currency format)
7804+ CAmount nFee = ASYNC_RPC_OPERATION_DEFAULT_MINERS_FEE;
7805+ if (params.size() > 3) {
7806+ nFee = AmountFromValue( params[3] );
7807+ // Check that the user specified fee is sane.
7808+ if (nFee > nTotalOut) {
7809+ throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Fee %s is greater than the sum of outputs %s", FormatMoney(nFee), FormatMoney(nTotalOut)));
7810+ }
7811+ }
7812+
7813 // Create operation and add to global queue
7814 std::shared_ptr<AsyncRPCQueue> q = getAsyncRPCQueue();
7815! std::shared_ptr<AsyncRPCOperation> operation( new AsyncRPCOperation_sendmany(fromaddress, taddrRecipients, zaddrRecipients, nMinDepth, nFee) );
7816 q->addOperation(operation);
7817 AsyncRPCOperationId operationId = operation->getId();
7818 return operationId;
7819diff -crB ./src/wallet/wallet.cpp ../../komodo-jl777/src/wallet/wallet.cpp
7820*** ./src/wallet/wallet.cpp 2017-01-03 10:40:50.431340299 +0000
7821--- ../../komodo-jl777/src/wallet/wallet.cpp 2017-01-03 09:49:08.876507395 +0000
7822***************
7823*** 373,386 ****
7824 if (added) {
7825 IncrementNoteWitnesses(pindex, pblock, tree);
7826 } else {
7827! DecrementNoteWitnesses();
7828 }
7829 }
7830
7831 void CWallet::SetBestChain(const CBlockLocator& loc)
7832 {
7833 CWalletDB walletdb(strWalletFile);
7834! walletdb.WriteBestBlock(loc);
7835 }
7836
7837 bool CWallet::SetMinVersion(enum WalletFeature nVersion, CWalletDB* pwalletdbIn, bool fExplicit)
7838--- 373,386 ----
7839 if (added) {
7840 IncrementNoteWitnesses(pindex, pblock, tree);
7841 } else {
7842! DecrementNoteWitnesses(pindex);
7843 }
7844 }
7845
7846 void CWallet::SetBestChain(const CBlockLocator& loc)
7847 {
7848 CWalletDB walletdb(strWalletFile);
7849! SetBestChainINTERNAL(walletdb, loc);
7850 }
7851
7852 bool CWallet::SetMinVersion(enum WalletFeature nVersion, CWalletDB* pwalletdbIn, bool fExplicit)
7853***************
7854*** 630,637 ****
7855--- 630,639 ----
7856 for (std::pair<const uint256, CWalletTx>& wtxItem : mapWallet) {
7857 for (mapNoteData_t::value_type& item : wtxItem.second.mapNoteData) {
7858 item.second.witnesses.clear();
7859+ item.second.witnessHeight = -1;
7860 }
7861 }
7862+ nWitnessCacheSize = 0;
7863 }
7864
7865 void CWallet::IncrementNoteWitnesses(const CBlockIndex* pindex,
7866***************
7867*** 648,654 ****
7868 // Only increment witnesses that are behind the current height
7869 if (nd->witnessHeight < pindex->nHeight) {
7870 // Witnesses being incremented should always be either -1
7871! // (never incremented) or one below pindex
7872 assert((nd->witnessHeight == -1) ||
7873 (nd->witnessHeight == pindex->nHeight - 1));
7874 // Copy the witness for the previous block if we have one
7875--- 650,656 ----
7876 // Only increment witnesses that are behind the current height
7877 if (nd->witnessHeight < pindex->nHeight) {
7878 // Witnesses being incremented should always be either -1
7879! // (never incremented or decremented) or one below pindex
7880 assert((nd->witnessHeight == -1) ||
7881 (nd->witnessHeight == pindex->nHeight - 1));
7882 // Copy the witness for the previous block if we have one
7883***************
7884*** 739,752 ****
7885 }
7886 }
7887
7888! if (fFileBacked) {
7889! CWalletDB walletdb(strWalletFile);
7890! WriteWitnessCache(walletdb);
7891! }
7892 }
7893 }
7894
7895! void CWallet::DecrementNoteWitnesses()
7896 {
7897 extern int32_t KOMODO_REWIND;
7898 {
7899--- 741,753 ----
7900 }
7901 }
7902
7903! // For performance reasons, we write out the witness cache in
7904! // CWallet::SetBestChain() (which also ensures that overall consistency
7905! // of the wallet.dat is maintained).
7906 }
7907 }
7908
7909! void CWallet::DecrementNoteWitnesses(const CBlockIndex* pindex)
7910 {
7911 extern int32_t KOMODO_REWIND;
7912 {
7913***************
7914*** 756,765 ****
7915 CNoteData* nd = &(item.second);
7916 // Check the validity of the cache
7917 assert(nWitnessCacheSize >= nd->witnesses.size());
7918! if (nd->witnesses.size() > 0) {
7919! nd->witnesses.pop_front();
7920 }
7921- nd->witnessHeight -= 1;
7922 }
7923 }
7924 nWitnessCacheSize -= 1;
7925--- 757,775 ----
7926 CNoteData* nd = &(item.second);
7927 // Check the validity of the cache
7928 assert(nWitnessCacheSize >= nd->witnesses.size());
7929! // Only increment witnesses that are not above the current height
7930! if (nd->witnessHeight <= pindex->nHeight) {
7931! // Witnesses being decremented should always be either -1
7932! // (never incremented or decremented) or equal to pindex
7933! assert((nd->witnessHeight == -1) ||
7934! (nd->witnessHeight == pindex->nHeight));
7935! if (nd->witnesses.size() > 0) {
7936! nd->witnesses.pop_front();
7937! }
7938! // pindex is the block being removed, so the new witness cache
7939! // height is one below it.
7940! nd->witnessHeight = pindex->nHeight - 1;
7941 }
7942 }
7943 }
7944 nWitnessCacheSize -= 1;
7945***************
7946*** 770,776 ****
7947 assert(nWitnessCacheSize >= nd->witnesses.size());
7948 }
7949 }
7950- // TODO: If nWitnessCache is zero, we need to regenerate the caches (#1302)
7951 if ( nWitnessCacheSize <= 0 )
7952 {
7953 extern char ASSETCHAINS_SYMBOL[16];
7954--- 780,785 ----
7955***************
7956*** 778,787 ****
7957 }
7958 if ( KOMODO_REWIND == 0 )
7959 assert(nWitnessCacheSize > 0);
7960! if (fFileBacked) {
7961! CWalletDB walletdb(strWalletFile);
7962! WriteWitnessCache(walletdb);
7963! }
7964 }
7965 }
7966
7967--- 787,799 ----
7968 }
7969 if ( KOMODO_REWIND == 0 )
7970 assert(nWitnessCacheSize > 0);
7971! //if (fFileBacked) {
7972! // CWalletDB walletdb(strWalletFile);
7973! // WriteWitnessCache(walletdb);
7974! //}
7975! // For performance reasons, we write out the witness cache in
7976! // CWallet::SetBestChain() (which also ensures that overall consistency
7977! // of the wallet.dat is maintained).
7978 }
7979 }
7980
7981***************
7982*** 1109,1114 ****
7983--- 1121,1127 ----
7984 tmp.at(nd.first).witnesses.assign(
7985 nd.second.witnesses.cbegin(), nd.second.witnesses.cend());
7986 }
7987+ tmp.at(nd.first).witnessHeight = nd.second.witnessHeight;
7988 }
7989 // Now copy over the updated note data
7990 wtx.mapNoteData = tmp;
7991diff -crB ./src/wallet/wallet.h ../../komodo-jl777/src/wallet/wallet.h
7992*** ./src/wallet/wallet.h 2017-01-03 10:40:50.431340299 +0000
7993--- ../../komodo-jl777/src/wallet/wallet.h 2017-01-03 09:49:08.876507395 +0000
7994***************
7995*** 225,231 ****
7996 */
7997 std::list<ZCIncrementalWitness> witnesses;
7998
7999! /** Block height corresponding to the most current witness. */
8000 int witnessHeight;
8001
8002 CNoteData() : address(), nullifier(), witnessHeight {-1} { }
8003--- 225,239 ----
8004 */
8005 std::list<ZCIncrementalWitness> witnesses;
8006
8007! /**
8008! * Block height corresponding to the most current witness.
8009! *
8010! * When we first create a CNoteData in CWallet::FindMyNotes, this is set to
8011! * -1 as a placeholder. The next time CWallet::ChainTip is called, we can
8012! * determine what height the witness cache for this note is valid for (even
8013! * if no witnesses were cached), and so can set the correct value in
8014! * CWallet::IncrementNoteWitnesses and CWallet::DecrementNoteWitnesses.
8015! */
8016 int witnessHeight;
8017
8018 CNoteData() : address(), nullifier(), witnessHeight {-1} { }
8019***************
8020*** 620,660 ****
8021 void ClearNoteWitnessCache();
8022
8023 protected:
8024 void IncrementNoteWitnesses(const CBlockIndex* pindex,
8025 const CBlock* pblock,
8026 ZCIncrementalMerkleTree& tree);
8027! void DecrementNoteWitnesses();
8028
8029 template <typename WalletDB>
8030! void WriteWitnessCache(WalletDB& walletdb) {
8031 if (!walletdb.TxnBegin()) {
8032 // This needs to be done atomically, so don't do it at all
8033! LogPrintf("WriteWitnessCache(): Couldn't start atomic write\n");
8034 return;
8035 }
8036 try {
8037 for (std::pair<const uint256, CWalletTx>& wtxItem : mapWallet) {
8038 if (!walletdb.WriteTx(wtxItem.first, wtxItem.second)) {
8039! LogPrintf("WriteWitnessCache(): Failed to write CWalletTx, aborting atomic write\n");
8040 walletdb.TxnAbort();
8041 return;
8042 }
8043 }
8044 if (!walletdb.WriteWitnessCacheSize(nWitnessCacheSize)) {
8045! LogPrintf("WriteWitnessCache(): Failed to write nWitnessCacheSize, aborting atomic write\n");
8046 walletdb.TxnAbort();
8047 return;
8048 }
8049 } catch (const std::exception &exc) {
8050 // Unexpected failure
8051! LogPrintf("WriteWitnessCache(): Unexpected error during atomic write:\n");
8052 LogPrintf("%s\n", exc.what());
8053 walletdb.TxnAbort();
8054 return;
8055 }
8056 if (!walletdb.TxnCommit()) {
8057 // Couldn't commit all to db, but in-memory state is fine
8058! LogPrintf("WriteWitnessCache(): Couldn't commit atomic write\n");
8059 return;
8060 }
8061 }
8062--- 628,679 ----
8063 void ClearNoteWitnessCache();
8064
8065 protected:
8066+ /**
8067+ * pindex is the new tip being connected.
8068+ */
8069 void IncrementNoteWitnesses(const CBlockIndex* pindex,
8070 const CBlock* pblock,
8071 ZCIncrementalMerkleTree& tree);
8072! /**
8073! * pindex is the old tip being disconnected.
8074! */
8075! void DecrementNoteWitnesses(const CBlockIndex* pindex);
8076
8077 template <typename WalletDB>
8078! void SetBestChainINTERNAL(WalletDB& walletdb, const CBlockLocator& loc) {
8079 if (!walletdb.TxnBegin()) {
8080 // This needs to be done atomically, so don't do it at all
8081! LogPrintf("SetBestChain(): Couldn't start atomic write\n");
8082 return;
8083 }
8084 try {
8085 for (std::pair<const uint256, CWalletTx>& wtxItem : mapWallet) {
8086 if (!walletdb.WriteTx(wtxItem.first, wtxItem.second)) {
8087! LogPrintf("SetBestChain(): Failed to write CWalletTx, aborting atomic write\n");
8088 walletdb.TxnAbort();
8089 return;
8090 }
8091 }
8092 if (!walletdb.WriteWitnessCacheSize(nWitnessCacheSize)) {
8093! LogPrintf("SetBestChain(): Failed to write nWitnessCacheSize, aborting atomic write\n");
8094! walletdb.TxnAbort();
8095! return;
8096! }
8097! if (!walletdb.WriteBestBlock(loc)) {
8098! LogPrintf("SetBestChain(): Failed to write best block, aborting atomic write\n");
8099 walletdb.TxnAbort();
8100 return;
8101 }
8102 } catch (const std::exception &exc) {
8103 // Unexpected failure
8104! LogPrintf("SetBestChain(): Unexpected error during atomic write:\n");
8105 LogPrintf("%s\n", exc.what());
8106 walletdb.TxnAbort();
8107 return;
8108 }
8109 if (!walletdb.TxnCommit()) {
8110 // Couldn't commit all to db, but in-memory state is fine
8111! LogPrintf("SetBestChain(): Couldn't commit atomic write\n");
8112 return;
8113 }
8114 }
8115***************
8116*** 944,949 ****
8117--- 963,969 ----
8118 CAmount GetCredit(const CTransaction& tx, const isminefilter& filter) const;
8119 CAmount GetChange(const CTransaction& tx) const;
8120 void ChainTip(const CBlockIndex *pindex, const CBlock *pblock, ZCIncrementalMerkleTree tree, bool added);
8121+ /** Saves witness caches and best block locator to disk. */
8122 void SetBestChain(const CBlockLocator& loc);
8123
8124 DBErrors LoadWallet(bool& fFirstRunRet);
8125diff -crB ./src/zcash/GenerateParams.cpp ../../komodo-jl777/src/zcash/GenerateParams.cpp
8126*** ./src/zcash/GenerateParams.cpp 2017-01-03 10:40:50.435340501 +0000
8127--- ../../komodo-jl777/src/zcash/GenerateParams.cpp 2017-01-03 09:49:08.876507395 +0000
8128***************
8129*** 9,26 ****
8130 return 1;
8131 }
8132
8133! if(argc != 3) {
8134! std::cerr << "Usage: " << argv[0] << " provingKeyFileName verificationKeyFileName" << std::endl;
8135 return 1;
8136 }
8137
8138 std::string pkFile = argv[1];
8139 std::string vkFile = argv[2];
8140
8141 auto p = ZCJoinSplit::Generate();
8142
8143 p->saveProvingKey(pkFile);
8144 p->saveVerifyingKey(vkFile);
8145
8146 delete p;
8147
8148--- 9,28 ----
8149 return 1;
8150 }
8151
8152! if(argc != 4) {
8153! std::cerr << "Usage: " << argv[0] << " provingKeyFileName verificationKeyFileName r1csFileName" << std::endl;
8154 return 1;
8155 }
8156
8157 std::string pkFile = argv[1];
8158 std::string vkFile = argv[2];
8159+ std::string r1csFile = argv[3];
8160
8161 auto p = ZCJoinSplit::Generate();
8162
8163 p->saveProvingKey(pkFile);
8164 p->saveVerifyingKey(vkFile);
8165+ p->saveR1CS(r1csFile);
8166
8167 delete p;
8168
8169diff -crB ./src/zcash/IncrementalMerkleTree.cpp ../../komodo-jl777/src/zcash/IncrementalMerkleTree.cpp
8170*** ./src/zcash/IncrementalMerkleTree.cpp 2017-01-03 10:40:50.435340501 +0000
8171--- ../../komodo-jl777/src/zcash/IncrementalMerkleTree.cpp 2017-01-03 09:49:08.876507395 +0000
8172***************
8173*** 71,76 ****
8174--- 71,87 ----
8175 }
8176
8177 template<size_t Depth, typename Hash>
8178+ Hash IncrementalMerkleTree<Depth, Hash>::last() const {
8179+ if (right) {
8180+ return *right;
8181+ } else if (left) {
8182+ return *left;
8183+ } else {
8184+ throw std::runtime_error("tree has no cursor");
8185+ }
8186+ }
8187+
8188+ template<size_t Depth, typename Hash>
8189 void IncrementalMerkleTree<Depth, Hash>::append(Hash obj) {
8190 if (is_complete(Depth)) {
8191 throw std::runtime_error("tree is full");
8192diff -crB ./src/zcash/IncrementalMerkleTree.hpp ../../komodo-jl777/src/zcash/IncrementalMerkleTree.hpp
8193*** ./src/zcash/IncrementalMerkleTree.hpp 2017-01-03 10:40:50.435340501 +0000
8194--- ../../komodo-jl777/src/zcash/IncrementalMerkleTree.hpp 2017-01-03 09:49:08.876507395 +0000
8195***************
8196*** 79,84 ****
8197--- 79,85 ----
8198 Hash root() const {
8199 return root(Depth, std::deque<Hash>());
8200 }
8201+ Hash last() const;
8202
8203 IncrementalWitness<Depth, Hash> witness() const {
8204 return IncrementalWitness<Depth, Hash>(*this);
8205***************
8206*** 138,143 ****
8207--- 139,150 ----
8208 return tree.path(partial_path());
8209 }
8210
8211+ // Return the element being witnessed (should be a note
8212+ // commitment!)
8213+ Hash element() const {
8214+ return tree.last();
8215+ }
8216+
8217 Hash root() const {
8218 return tree.root(Depth, partial_path());
8219 }
8220diff -crB ./src/zcash/JoinSplit.cpp ../../komodo-jl777/src/zcash/JoinSplit.cpp
8221*** ./src/zcash/JoinSplit.cpp 2017-01-03 10:40:50.435340501 +0000
8222--- ../../komodo-jl777/src/zcash/JoinSplit.cpp 2017-01-03 09:49:08.876507395 +0000
8223***************
8224*** 16,21 ****
8225--- 16,22 ----
8226 #include "libsnark/gadgetlib1/gadgets/merkle_tree/merkle_tree_check_read_gadget.hpp"
8227
8228 #include "sync.h"
8229+ #include "amount.h"
8230
8231 using namespace libsnark;
8232
8233***************
8234*** 24,30 ****
8235 #include "zcash/circuit/gadget.tcc"
8236
8237 CCriticalSection cs_ParamsIO;
8238! CCriticalSection cs_InitializeParams;
8239
8240 template<typename T>
8241 void saveToFile(std::string path, T& obj) {
8242--- 25,31 ----
8243 #include "zcash/circuit/gadget.tcc"
8244
8245 CCriticalSection cs_ParamsIO;
8246! CCriticalSection cs_LoadKeys;
8247
8248 template<typename T>
8249 void saveToFile(std::string path, T& obj) {
8250***************
8251*** 70,91 ****
8252
8253 boost::optional<r1cs_ppzksnark_proving_key<ppzksnark_ppT>> pk;
8254 boost::optional<r1cs_ppzksnark_verification_key<ppzksnark_ppT>> vk;
8255 boost::optional<std::string> pkPath;
8256
8257 JoinSplitCircuit() {}
8258 ~JoinSplitCircuit() {}
8259
8260- static void initialize() {
8261- LOCK(cs_InitializeParams);
8262-
8263- ppzksnark_ppT::init_public_params();
8264- }
8265-
8266 void setProvingKeyPath(std::string path) {
8267 pkPath = path;
8268 }
8269
8270 void loadProvingKey() {
8271 if (!pk) {
8272 if (!pkPath) {
8273 throw std::runtime_error("proving key path unknown");
8274--- 71,89 ----
8275
8276 boost::optional<r1cs_ppzksnark_proving_key<ppzksnark_ppT>> pk;
8277 boost::optional<r1cs_ppzksnark_verification_key<ppzksnark_ppT>> vk;
8278+ boost::optional<r1cs_ppzksnark_processed_verification_key<ppzksnark_ppT>> vk_precomp;
8279 boost::optional<std::string> pkPath;
8280
8281 JoinSplitCircuit() {}
8282 ~JoinSplitCircuit() {}
8283
8284 void setProvingKeyPath(std::string path) {
8285 pkPath = path;
8286 }
8287
8288 void loadProvingKey() {
8289+ LOCK(cs_LoadKeys);
8290+
8291 if (!pk) {
8292 if (!pkPath) {
8293 throw std::runtime_error("proving key path unknown");
8294***************
8295*** 102,108 ****
8296--- 100,113 ----
8297 }
8298 }
8299 void loadVerifyingKey(std::string path) {
8300+ LOCK(cs_LoadKeys);
8301+
8302 loadFromFile(path, vk);
8303+
8304+ processVerifyingKey();
8305+ }
8306+ void processVerifyingKey() {
8307+ vk_precomp = r1cs_ppzksnark_verifier_process_vk(*vk);
8308 }
8309 void saveVerifyingKey(std::string path) {
8310 if (vk) {
8311***************
8312*** 111,132 ****
8313 throw std::runtime_error("cannot save verifying key; key doesn't exist");
8314 }
8315 }
8316
8317! void generate() {
8318 protoboard<FieldT> pb;
8319
8320 joinsplit_gadget<FieldT, NumInputs, NumOutputs> g(pb);
8321 g.generate_r1cs_constraints();
8322
8323! const r1cs_constraint_system<FieldT> constraint_system = pb.get_constraint_system();
8324 r1cs_ppzksnark_keypair<ppzksnark_ppT> keypair = r1cs_ppzksnark_generator<ppzksnark_ppT>(constraint_system);
8325
8326 pk = keypair.pk;
8327 vk = keypair.vk;
8328 }
8329
8330 bool verify(
8331 const ZCProof& proof,
8332 const uint256& pubKeyHash,
8333 const uint256& randomSeed,
8334 const boost::array<uint256, NumInputs>& macs,
8335--- 116,150 ----
8336 throw std::runtime_error("cannot save verifying key; key doesn't exist");
8337 }
8338 }
8339+ void saveR1CS(std::string path) {
8340+ auto r1cs = generate_r1cs();
8341
8342! saveToFile(path, r1cs);
8343! }
8344!
8345! r1cs_constraint_system<FieldT> generate_r1cs() {
8346 protoboard<FieldT> pb;
8347
8348 joinsplit_gadget<FieldT, NumInputs, NumOutputs> g(pb);
8349 g.generate_r1cs_constraints();
8350
8351! return pb.get_constraint_system();
8352! }
8353!
8354! void generate() {
8355! LOCK(cs_LoadKeys);
8356!
8357! const r1cs_constraint_system<FieldT> constraint_system = generate_r1cs();
8358 r1cs_ppzksnark_keypair<ppzksnark_ppT> keypair = r1cs_ppzksnark_generator<ppzksnark_ppT>(constraint_system);
8359
8360 pk = keypair.pk;
8361 vk = keypair.vk;
8362+ processVerifyingKey();
8363 }
8364
8365 bool verify(
8366 const ZCProof& proof,
8367+ ProofVerifier& verifier,
8368 const uint256& pubKeyHash,
8369 const uint256& randomSeed,
8370 const boost::array<uint256, NumInputs>& macs,
8371***************
8372*** 136,142 ****
8373 uint64_t vpub_new,
8374 const uint256& rt
8375 ) {
8376! if (!vk) {
8377 throw std::runtime_error("JoinSplit verifying key not loaded");
8378 }
8379
8380--- 154,160 ----
8381 uint64_t vpub_new,
8382 const uint256& rt
8383 ) {
8384! if (!vk || !vk_precomp) {
8385 throw std::runtime_error("JoinSplit verifying key not loaded");
8386 }
8387
8388***************
8389*** 155,161 ****
8390 vpub_new
8391 );
8392
8393! return r1cs_ppzksnark_verifier_strong_IC<ppzksnark_ppT>(*vk, witness, r1cs_proof);
8394 } catch (...) {
8395 return false;
8396 }
8397--- 173,184 ----
8398 vpub_new
8399 );
8400
8401! return verifier.check(
8402! *vk,
8403! *vk_precomp,
8404! witness,
8405! r1cs_proof
8406! );
8407 } catch (...) {
8408 return false;
8409 }
8410***************
8411*** 181,188 ****
8412 throw std::runtime_error("JoinSplit proving key not loaded");
8413 }
8414
8415! // Compute nullifiers of inputs
8416 for (size_t i = 0; i < NumInputs; i++) {
8417 out_nullifiers[i] = inputs[i].nullifier();
8418 }
8419
8420--- 204,254 ----
8421 throw std::runtime_error("JoinSplit proving key not loaded");
8422 }
8423
8424! if (vpub_old > MAX_MONEY) {
8425! throw std::invalid_argument("nonsensical vpub_old value");
8426! }
8427!
8428! if (vpub_new > MAX_MONEY) {
8429! throw std::invalid_argument("nonsensical vpub_new value");
8430! }
8431!
8432! uint64_t lhs_value = vpub_old;
8433! uint64_t rhs_value = vpub_new;
8434!
8435 for (size_t i = 0; i < NumInputs; i++) {
8436+ // Sanity checks of input
8437+ {
8438+ // If note has nonzero value
8439+ if (inputs[i].note.value != 0) {
8440+ // The witness root must equal the input root.
8441+ if (inputs[i].witness.root() != rt) {
8442+ throw std::invalid_argument("joinsplit not anchored to the correct root");
8443+ }
8444+
8445+ // The tree must witness the correct element
8446+ if (inputs[i].note.cm() != inputs[i].witness.element()) {
8447+ throw std::invalid_argument("witness of wrong element for joinsplit input");
8448+ }
8449+ }
8450+
8451+ // Ensure we have the key to this note.
8452+ if (inputs[i].note.a_pk != inputs[i].key.address().a_pk) {
8453+ throw std::invalid_argument("input note not authorized to spend with given key");
8454+ }
8455+
8456+ // Balance must be sensical
8457+ if (inputs[i].note.value > MAX_MONEY) {
8458+ throw std::invalid_argument("nonsensical input note value");
8459+ }
8460+
8461+ lhs_value += inputs[i].note.value;
8462+
8463+ if (lhs_value > MAX_MONEY) {
8464+ throw std::invalid_argument("nonsensical left hand size of joinsplit balance");
8465+ }
8466+ }
8467+
8468+ // Compute nullifier of input
8469 out_nullifiers[i] = inputs[i].nullifier();
8470 }
8471
8472***************
8473*** 197,208 ****
8474--- 263,291 ----
8475
8476 // Compute notes for outputs
8477 for (size_t i = 0; i < NumOutputs; i++) {
8478+ // Sanity checks of output
8479+ {
8480+ if (outputs[i].value > MAX_MONEY) {
8481+ throw std::invalid_argument("nonsensical output value");
8482+ }
8483+
8484+ rhs_value += outputs[i].value;
8485+
8486+ if (rhs_value > MAX_MONEY) {
8487+ throw std::invalid_argument("nonsensical right hand side of joinsplit balance");
8488+ }
8489+ }
8490+
8491 // Sample r
8492 uint256 r = random_uint256();
8493
8494 out_notes[i] = outputs[i].note(phi, r, i, h_sig);
8495 }
8496
8497+ if (lhs_value != rhs_value) {
8498+ throw std::invalid_argument("invalid joinsplit balance");
8499+ }
8500+
8501 // Compute the output commitments
8502 for (size_t i = 0; i < NumOutputs; i++) {
8503 out_commitments[i] = out_notes[i].cm();
8504***************
8505*** 249,257 ****
8506 );
8507 }
8508
8509! if (!pb.is_satisfied()) {
8510! throw std::invalid_argument("Constraint system not satisfied by inputs");
8511! }
8512
8513 // TODO: These are copies, which is not strictly necessary.
8514 std::vector<FieldT> primary_input = pb.primary_input();
8515--- 331,339 ----
8516 );
8517 }
8518
8519! // The constraint system must be satisfied or there is an unimplemented
8520! // or incorrect sanity check above. Or the constraint system is broken!
8521! assert(pb.is_satisfied());
8522
8523 // TODO: These are copies, which is not strictly necessary.
8524 std::vector<FieldT> primary_input = pb.primary_input();
8525***************
8526*** 275,281 ****
8527 template<size_t NumInputs, size_t NumOutputs>
8528 JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Generate()
8529 {
8530! JoinSplitCircuit<NumInputs, NumOutputs>::initialize();
8531 auto js = new JoinSplitCircuit<NumInputs, NumOutputs>();
8532 js->generate();
8533
8534--- 357,363 ----
8535 template<size_t NumInputs, size_t NumOutputs>
8536 JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Generate()
8537 {
8538! initialize_curve_params();
8539 auto js = new JoinSplitCircuit<NumInputs, NumOutputs>();
8540 js->generate();
8541
8542***************
8543*** 285,291 ****
8544 template<size_t NumInputs, size_t NumOutputs>
8545 JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Unopened()
8546 {
8547! JoinSplitCircuit<NumInputs, NumOutputs>::initialize();
8548 return new JoinSplitCircuit<NumInputs, NumOutputs>();
8549 }
8550
8551--- 367,373 ----
8552 template<size_t NumInputs, size_t NumOutputs>
8553 JoinSplit<NumInputs, NumOutputs>* JoinSplit<NumInputs, NumOutputs>::Unopened()
8554 {
8555! initialize_curve_params();
8556 return new JoinSplitCircuit<NumInputs, NumOutputs>();
8557 }
8558
8559diff -crB ./src/zcash/JoinSplit.hpp ../../komodo-jl777/src/zcash/JoinSplit.hpp
8560*** ./src/zcash/JoinSplit.hpp 2017-01-03 10:40:50.435340501 +0000
8561--- ../../komodo-jl777/src/zcash/JoinSplit.hpp 2017-01-03 09:49:08.876507395 +0000
8562***************
8563*** 62,67 ****
8564--- 62,68 ----
8565 virtual void saveProvingKey(std::string path) = 0;
8566 virtual void loadVerifyingKey(std::string path) = 0;
8567 virtual void saveVerifyingKey(std::string path) = 0;
8568+ virtual void saveR1CS(std::string path) = 0;
8569
8570 virtual ZCProof prove(
8571 const boost::array<JSInput, NumInputs>& inputs,
8572***************
8573*** 82,87 ****
8574--- 83,89 ----
8575
8576 virtual bool verify(
8577 const ZCProof& proof,
8578+ ProofVerifier& verifier,
8579 const uint256& pubKeyHash,
8580 const uint256& randomSeed,
8581 const boost::array<uint256, NumInputs>& hmacs,
8582diff -crB ./src/zcash/Proof.cpp ../../komodo-jl777/src/zcash/Proof.cpp
8583*** ./src/zcash/Proof.cpp 2017-01-03 10:40:50.435340501 +0000
8584--- ../../komodo-jl777/src/zcash/Proof.cpp 2017-01-03 09:49:08.876507395 +0000
8585***************
8586*** 1,6 ****
8587--- 1,7 ----
8588 #include "Proof.hpp"
8589
8590 #include <boost/static_assert.hpp>
8591+ #include <mutex>
8592
8593 #include "crypto/common.h"
8594 #include "libsnark/common/default_types/r1cs_ppzksnark_pp.hpp"
8595***************
8596*** 211,214 ****
8597--- 212,247 ----
8598 return p;
8599 }
8600
8601+ std::once_flag init_public_params_once_flag;
8602+
8603+ void initialize_curve_params()
8604+ {
8605+ std::call_once (init_public_params_once_flag, curve_pp::init_public_params);
8606+ }
8607+
8608+ ProofVerifier ProofVerifier::Strict() {
8609+ initialize_curve_params();
8610+ return ProofVerifier(true);
8611+ }
8612+
8613+ ProofVerifier ProofVerifier::Disabled() {
8614+ initialize_curve_params();
8615+ return ProofVerifier(false);
8616+ }
8617+
8618+ template<>
8619+ bool ProofVerifier::check(
8620+ const r1cs_ppzksnark_verification_key<curve_pp>& vk,
8621+ const r1cs_ppzksnark_processed_verification_key<curve_pp>& pvk,
8622+ const r1cs_primary_input<curve_Fr>& primary_input,
8623+ const r1cs_ppzksnark_proof<curve_pp>& proof
8624+ )
8625+ {
8626+ if (perform_verification) {
8627+ return r1cs_ppzksnark_online_verifier_strong_IC<curve_pp>(pvk, primary_input, proof);
8628+ } else {
8629+ return true;
8630+ }
8631+ }
8632+
8633 }
8634diff -crB ./src/zcash/Proof.hpp ../../komodo-jl777/src/zcash/Proof.hpp
8635*** ./src/zcash/Proof.hpp 2017-01-03 10:40:50.435340501 +0000
8636--- ../../komodo-jl777/src/zcash/Proof.hpp 2017-01-03 09:49:08.876507395 +0000
8637***************
8638*** 235,240 ****
8639--- 235,276 ----
8640 }
8641 };
8642
8643+ void initialize_curve_params();
8644+
8645+ class ProofVerifier {
8646+ private:
8647+ bool perform_verification;
8648+
8649+ ProofVerifier(bool perform_verification) : perform_verification(perform_verification) { }
8650+
8651+ public:
8652+ // ProofVerifier should never be copied
8653+ ProofVerifier(const ProofVerifier&) = delete;
8654+ ProofVerifier& operator=(const ProofVerifier&) = delete;
8655+ ProofVerifier(ProofVerifier&&);
8656+ ProofVerifier& operator=(ProofVerifier&&);
8657+
8658+ // Creates a verification context that strictly verifies
8659+ // all proofs using libsnark's API.
8660+ static ProofVerifier Strict();
8661+
8662+ // Creates a verification context that performs no
8663+ // verification, used when avoiding duplicate effort
8664+ // such as during reindexing.
8665+ static ProofVerifier Disabled();
8666+
8667+ template <typename VerificationKey,
8668+ typename ProcessedVerificationKey,
8669+ typename PrimaryInput,
8670+ typename Proof
8671+ >
8672+ bool check(
8673+ const VerificationKey& vk,
8674+ const ProcessedVerificationKey& pvk,
8675+ const PrimaryInput& pi,
8676+ const Proof& p
8677+ );
8678+ };
8679
8680 }
8681
8682diff -crB ./src/zcbenchmarks.cpp ../../komodo-jl777/src/zcbenchmarks.cpp
8683*** ./src/zcbenchmarks.cpp 2017-01-03 10:40:50.435340501 +0000
8684--- ../../komodo-jl777/src/zcbenchmarks.cpp 2017-01-03 09:49:08.876507395 +0000
8685***************
8686*** 17,22 ****
8687--- 17,23 ----
8688 #include "script/sign.h"
8689 #include "sodium.h"
8690 #include "streams.h"
8691+ #include "utiltest.h"
8692 #include "wallet/wallet.h"
8693
8694 #include "zcbenchmarks.h"
8695***************
8696*** 89,95 ****
8697 0);
8698 double ret = timer_stop(tv_start);
8699
8700! assert(jsdesc.Verify(*pzcashParams, pubKeyHash));
8701 return ret;
8702 }
8703
8704--- 90,97 ----
8705 0);
8706 double ret = timer_stop(tv_start);
8707
8708! auto verifier = libzcash::ProofVerifier::Strict();
8709! assert(jsdesc.Verify(*pzcashParams, verifier, pubKeyHash));
8710 return ret;
8711 }
8712
8713***************
8714*** 98,104 ****
8715 struct timeval tv_start;
8716 timer_start(tv_start);
8717 uint256 pubKeyHash;
8718! joinsplit.Verify(*pzcashParams, pubKeyHash);
8719 return timer_stop(tv_start);
8720 }
8721
8722--- 100,107 ----
8723 struct timeval tv_start;
8724 timer_start(tv_start);
8725 uint256 pubKeyHash;
8726! auto verifier = libzcash::ProofVerifier::Strict();
8727! joinsplit.Verify(*pzcashParams, verifier, pubKeyHash);
8728 return timer_stop(tv_start);
8729 }
8730
8731***************
8732*** 223,225 ****
8733--- 226,301 ----
8734 return timer_stop(tv_start);
8735 }
8736
8737+ double benchmark_try_decrypt_notes(size_t nAddrs)
8738+ {
8739+ CWallet wallet;
8740+ for (int i = 0; i < nAddrs; i++) {
8741+ auto sk = libzcash::SpendingKey::random();
8742+ wallet.AddSpendingKey(sk);
8743+ }
8744+
8745+ auto sk = libzcash::SpendingKey::random();
8746+ auto tx = GetValidReceive(*pzcashParams, sk, 10, true);
8747+
8748+ struct timeval tv_start;
8749+ timer_start(tv_start);
8750+ auto nd = wallet.FindMyNotes(tx);
8751+ return timer_stop(tv_start);
8752+ }
8753+
8754+ double benchmark_increment_note_witnesses(size_t nTxs)
8755+ {
8756+ CWallet wallet;
8757+ ZCIncrementalMerkleTree tree;
8758+
8759+ auto sk = libzcash::SpendingKey::random();
8760+ wallet.AddSpendingKey(sk);
8761+
8762+ // First block
8763+ CBlock block1;
8764+ for (int i = 0; i < nTxs; i++) {
8765+ auto wtx = GetValidReceive(*pzcashParams, sk, 10, true);
8766+ auto note = GetNote(*pzcashParams, sk, wtx, 0, 1);
8767+ auto nullifier = note.nullifier(sk);
8768+
8769+ mapNoteData_t noteData;
8770+ JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
8771+ CNoteData nd {sk.address(), nullifier};
8772+ noteData[jsoutpt] = nd;
8773+
8774+ wtx.SetNoteData(noteData);
8775+ wallet.AddToWallet(wtx, true, NULL);
8776+ block1.vtx.push_back(wtx);
8777+ }
8778+ CBlockIndex index1(block1);
8779+ index1.nHeight = 1;
8780+
8781+ // Increment to get transactions witnessed
8782+ wallet.ChainTip(&index1, &block1, tree, true);
8783+
8784+ // Second block
8785+ CBlock block2;
8786+ block2.hashPrevBlock = block1.GetHash();
8787+ {
8788+ auto wtx = GetValidReceive(*pzcashParams, sk, 10, true);
8789+ auto note = GetNote(*pzcashParams, sk, wtx, 0, 1);
8790+ auto nullifier = note.nullifier(sk);
8791+
8792+ mapNoteData_t noteData;
8793+ JSOutPoint jsoutpt {wtx.GetHash(), 0, 1};
8794+ CNoteData nd {sk.address(), nullifier};
8795+ noteData[jsoutpt] = nd;
8796+
8797+ wtx.SetNoteData(noteData);
8798+ wallet.AddToWallet(wtx, true, NULL);
8799+ block2.vtx.push_back(wtx);
8800+ }
8801+ CBlockIndex index2(block2);
8802+ index2.nHeight = 2;
8803+
8804+ struct timeval tv_start;
8805+ timer_start(tv_start);
8806+ wallet.ChainTip(&index2, &block2, tree, true);
8807+ return timer_stop(tv_start);
8808+ }
8809+
8810diff -crB ./src/zcbenchmarks.h ../../komodo-jl777/src/zcbenchmarks.h
8811*** ./src/zcbenchmarks.h 2017-01-03 10:40:50.435340501 +0000
8812--- ../../komodo-jl777/src/zcbenchmarks.h 2017-01-03 09:49:08.876507395 +0000
8813***************
8814*** 12,16 ****
8815--- 12,18 ----
8816 extern double benchmark_verify_joinsplit(const JSDescription &joinsplit);
8817 extern double benchmark_verify_equihash();
8818 extern double benchmark_large_tx();
8819+ extern double benchmark_try_decrypt_notes(size_t nAddrs);
8820+ extern double benchmark_increment_note_witnesses(size_t nTxs);
8821
8822 #endif
8823diff -crB ./zcutil/build-debian-package.sh ../../komodo-jl777/zcutil/build-debian-package.sh
8824*** ./zcutil/build-debian-package.sh 2017-01-03 10:40:50.435340501 +0000
8825--- ../../komodo-jl777/zcutil/build-debian-package.sh 2017-01-03 09:49:08.876507395 +0000
8826***************
8827*** 23,32 ****
8828 rm -R $BUILD_DIR
8829 fi
8830
8831 DEB_BIN=$BUILD_DIR/usr/bin
8832 DEB_DOC=$BUILD_DIR/usr/share/doc/$PACKAGE_NAME
8833 DEB_MAN=$BUILD_DIR/usr/share/man/man1
8834! mkdir -p $BUILD_DIR/DEBIAN $DEB_BIN $DEB_DOC $DEB_MAN
8835 chmod 0755 -R $BUILD_DIR/*
8836
8837 # Copy control file
8838--- 23,33 ----
8839 rm -R $BUILD_DIR
8840 fi
8841
8842+ DEB_CMP=$BUILD_DIR/etc/bash_completion.d
8843 DEB_BIN=$BUILD_DIR/usr/bin
8844 DEB_DOC=$BUILD_DIR/usr/share/doc/$PACKAGE_NAME
8845 DEB_MAN=$BUILD_DIR/usr/share/man/man1
8846! mkdir -p $BUILD_DIR/DEBIAN $DEB_CMP $DEB_BIN $DEB_DOC $DEB_MAN
8847 chmod 0755 -R $BUILD_DIR/*
8848
8849 # Copy control file
8850***************
8851*** 48,53 ****
8852--- 49,57 ----
8853 # Copy manpages
8854 cp $SRC_DEB/manpages/zcashd.1 $DEB_MAN
8855 cp $SRC_DEB/manpages/zcash-cli.1 $DEB_MAN
8856+ # Copy bash completion files
8857+ cp $SRC_PATH/contrib/bitcoind.bash-completion $DEB_CMP/zcashd
8858+ cp $SRC_PATH/contrib/bitcoin-cli.bash-completion $DEB_CMP/zcash-cli
8859 # Gzip files
8860 gzip --best -n $DEB_DOC/changelog
8861 gzip --best -n $DEB_DOC/changelog.Debian
8862diff -crB ./zcutil/build.sh ../../komodo-jl777/zcutil/build.sh
8863*** ./zcutil/build.sh 2017-01-03 10:40:50.435340501 +0000
8864--- ../../komodo-jl777/zcutil/build.sh 2017-01-03 09:49:08.876507395 +0000
8865***************
8866*** 1,7 ****
8867! #!/bin/bash
8868
8869 set -eu -o pipefail
8870
8871 if [ "x$*" = 'x--help' ]
8872 then
8873 cat <<EOF
8874--- 1,30 ----
8875! #!/usr/bin/env bash
8876
8877 set -eu -o pipefail
8878
8879+ # Allow user overrides to $MAKE. Typical usage for users who need it:
8880+ # MAKE=gmake ./zcutil/build.sh -j$(nproc)
8881+ if [[ -z "${MAKE-}" ]]; then
8882+ MAKE=make
8883+ fi
8884+
8885+ # Allow overrides to $BUILD and $HOST for porters. Most users will not need it.
8886+ # BUILD=i686-pc-linux-gnu ./zcutil/build.sh
8887+ if [[ -z "${BUILD-}" ]]; then
8888+ BUILD=x86_64-unknown-linux-gnu
8889+ fi
8890+ if [[ -z "${HOST-}" ]]; then
8891+ HOST=x86_64-unknown-linux-gnu
8892+ fi
8893+
8894+ # Allow override to $CC and $CXX for porters. Most users will not need it.
8895+ if [[ -z "${CC-}" ]]; then
8896+ CC=gcc
8897+ fi
8898+ if [[ -z "${CXX-}" ]]; then
8899+ CXX=g++
8900+ fi
8901+
8902 if [ "x$*" = 'x--help' ]
8903 then
8904 cat <<EOF
8905***************
8906*** 10,20 ****
8907 $0 --help
8908 Show this help message and exit.
8909
8910! $0 [ --enable-lcov ] [ MAKEARGS... ]
8911 Build Zcash and most of its transitive dependencies from
8912! source. MAKEARGS are applied to both dependencies and Zcash itself. If
8913! --enable-lcov is passed, Zcash is configured to add coverage
8914 instrumentation, thus enabling "make cov" to work.
8915 EOF
8916 exit 0
8917 fi
8918--- 33,45 ----
8919 $0 --help
8920 Show this help message and exit.
8921
8922! $0 [ --enable-lcov || --disable-tests ] [ MAKEARGS... ]
8923 Build Zcash and most of its transitive dependencies from
8924! source. MAKEARGS are applied to both dependencies and Zcash itself.
8925!
8926! If --enable-lcov is passed, Zcash is configured to add coverage
8927 instrumentation, thus enabling "make cov" to work.
8928+ If --disable-tests is passed instead, the Zcash tests are not built.
8929 EOF
8930 exit 0
8931 fi
8932***************
8933*** 25,41 ****
8934 # If --enable-lcov is the first argument, enable lcov coverage support:
8935 LCOV_ARG=''
8936 HARDENING_ARG='--enable-hardening'
8937 if [ "x${1:-}" = 'x--enable-lcov' ]
8938 then
8939 LCOV_ARG='--enable-lcov'
8940 HARDENING_ARG='--disable-hardening'
8941 shift
8942 fi
8943
8944! # BUG: parameterize the platform/host directory:
8945! PREFIX="$(pwd)/depends/x86_64-unknown-linux-gnu/"
8946
8947! HOST=x86_64-unknown-linux-gnu BUILD=x86_64-unknown-linux-gnu make "$@" -C ./depends/ V=1 NO_QT=1
8948 ./autogen.sh
8949! ./configure --prefix="${PREFIX}" --host=x86_64-unknown-linux-gnu --build=x86_64-unknown-linux-gnu --with-gui=no "$HARDENING_ARG" "$LCOV_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Werror -g'
8950! make "$@" V=1
8951--- 50,70 ----
8952 # If --enable-lcov is the first argument, enable lcov coverage support:
8953 LCOV_ARG=''
8954 HARDENING_ARG='--enable-hardening'
8955+ TEST_ARG=''
8956 if [ "x${1:-}" = 'x--enable-lcov' ]
8957 then
8958 LCOV_ARG='--enable-lcov'
8959 HARDENING_ARG='--disable-hardening'
8960 shift
8961+ elif [ "x${1:-}" = 'x--disable-tests' ]
8962+ then
8963+ TEST_ARG='--enable-tests=no'
8964+ shift
8965 fi
8966
8967! PREFIX="$(pwd)/depends/$BUILD/"
8968
8969! HOST="$HOST" BUILD="$BUILD" "$MAKE" "$@" -C ./depends/ V=1 NO_QT=1
8970 ./autogen.sh
8971! CC="$CC" CXX="$CXX" ./configure --prefix="${PREFIX}" --host="$HOST" --build="$BUILD" --with-gui=no "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Werror -g'
8972! "$MAKE" "$@" V=1
8973diff -crB ./zcutil/docker-entrypoint.sh ../../komodo-jl777/zcutil/docker-entrypoint.sh
8974*** ./zcutil/docker-entrypoint.sh 2017-01-03 10:40:50.435340501 +0000
8975--- ../../komodo-jl777/zcutil/docker-entrypoint.sh 2017-01-03 09:49:08.876507395 +0000
8976***************
8977*** 14,25 ****
8978 txindex=1
8979 bind=${listenip:-127.0.0.1}
8980 rpcbind=${listenip:-127.0.0.1}
8981- addnode=5.9.102.210
8982- addnode=78.47.196.146
8983- addnode=178.63.69.164
8984- addnode=88.198.65.74
8985- addnode=5.9.122.241
8986- addnode=144.76.94.38
8987 EOF
8988
8989 cat $HOME/.komodo/komodo.conf
8990--- 14,19 ----
8991***************
8992*** 27,35 ****
8993
8994 echo "...Checking fetch-params"
8995 $HOME/zcutil/fetch-params.sh
8996-
8997 echo "Initialization completed successfully"
8998 echo
8999 if [ $# -gt 0 ]; then
9000
9001 args=("$@")
9002--- 21,30 ----
9003
9004 echo "...Checking fetch-params"
9005 $HOME/zcutil/fetch-params.sh
9006 echo "Initialization completed successfully"
9007 echo
9008+
9009+ # ToDo: Needs some rework. I was sick
9010 if [ $# -gt 0 ]; then
9011
9012 args=("$@")
9013diff -crB ./zcutil/docker-komodo-cli.sh ../../komodo-jl777/zcutil/docker-komodo-cli.sh
9014*** ./zcutil/docker-komodo-cli.sh 2017-01-03 10:40:50.435340501 +0000
9015--- ../../komodo-jl777/zcutil/docker-komodo-cli.sh 2017-01-03 09:49:08.876507395 +0000
9016***************
9017*** 1,11 ****
9018 #!/bin/bash
9019- if [ -z ${assetchain+x} ]; then
9020
9021! /komodo/src/komodo-cli $1 $2 $3 $4
9022
9023! else
9024!
9025! /komodo/src/komodo-cli -ac_name=$assetchain $1 $2 $3 $4
9026!
9027! fi
9028
9029--- 1,6 ----
9030 #!/bin/bash
9031
9032! # ToDo: check for docker arg ac_name
9033
9034! /komodo/src/komodo-cli $1 $2 $3 $4
9035
9036diff -crB ./zcutil/fetch-params.sh ../../komodo-jl777/zcutil/fetch-params.sh
9037*** ./zcutil/fetch-params.sh 2017-01-03 10:40:50.435340501 +0000
9038--- ../../komodo-jl777/zcutil/fetch-params.sh 2017-01-03 09:49:08.876507395 +0000
9039***************
9040*** 67,72 ****
9041--- 67,76 ----
9042 cat <<EOF
9043 Zcash - fetch-params.sh
9044
9045+ This script will fetch the Zcash zkSNARK parameters and verify their
9046+ integrity with sha256sum.
9047+
9048+ If they already exist locally, it will exit now and do nothing else.
9049 EOF
9050
9051 # Now create PARAMS_DIR and insert a README if necessary:
9052***************
9053*** 84,92 ****
9054 # This may be the first time the user's run this script, so give
9055 # them some info, especially about bandwidth usage:
9056 cat <<EOF
9057- This script will fetch the Zcash zkSNARK parameters and verify their
9058- integrity with sha256sum.
9059-
9060 The parameters are currently just under 911MB in size, so plan accordingly
9061 for your bandwidth constraints. If the files are already present and
9062 have the correct sha256sum, no networking is used.
9063--- 88,93 ----
9064***************
9065*** 104,107 ****
9066--- 105,109 ----
9067 }
9068
9069 main
9070+ rm -f /tmp/fetch_params.lock
9071 exit 0
9072Only in ../../komodo-jl777/zcutil: release-notes.py
This page took 0.999826 seconds and 4 git commands to generate.