]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - src/allmydata/test/test_download.py
test_download.py: added 'known-answer-tests', to make sure current code can download...
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / test / test_download.py
1
2 # system-level upload+download roundtrip test, but using shares created from
3 # a previous run. This asserts that the current code is capable of decoding
4 # shares from a previous version.
5
6 import os
7 from twisted.trial import unittest
8 from allmydata import uri, storage
9 from allmydata.util import base32, fileutil
10 from allmydata.immutable import upload
11 from allmydata.test.common import SystemTestMixin
12
13 plaintext = "This is a moderate-sized file.\n" * 10
14
15 # this chunk was generated by create_share(), written to disk, then pasted
16 # into this file. These shares were created by 1.2.0-r3247, a version that's
17 # probably fairly close to 1.3.0 .
18 #--------- BEGIN stored_shares.py --------------
19 immutable_uri = "URI:CHK:ye2ysmghj7lpg5ovicm4lvg2pa:semuurrfflv6f6r6j3kfzczs6euhvq2ulodbzjo3ffpszyr7uyrq:3:10:310"
20 immutable_shares = {
21  0: { # client[0]
22   4: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazniel6dyc2y4selq5g3q3fsmqwl7ez5zu5bnngujv3bbnpzufq3dxcsulgibrvliyxz3ogr4s5nhw33mmlm4srz3ohxynpofjcsrml6lxjw7rrdtf4qcf45jr7c2bi6j6gymjwsv43rvp5iqjqptfq766zwmeuvdnwlgay4maaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxftxuf343nydrqxevhq4zx6brini7korh2b7mcqe745ulw4tk4hgvgaat55bo7g3oa4mfzfj4hgn7qmkdkh2tuj6qp3aubh7hnc5xe2xbzvjqacvkpun3f6fnyz3dvbyc4fwcvznp6o4wknl6xwnsfer4yghvat336maahr3okegsj5cegqafjbcuvq7kyzzujaaoiow3hxqxbegkewsv7skvaakb6tjqxdjkibbwep3ac5pkwmk2vhvrsbw2pc4knr6davra6wtovdaaajsd53ldwhzhl6okhcusnyoyqraissoydm77lcq4hho4ffd54tmpoaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvwozhsop3jvrfbojc2zdg7o257xegzrhec2swrn3betd5kraeu6gaurdmjkcapnmgxibh2pmuotspxcymloyjadpypap6kfwojqxudjfpk2wa"),
23   9: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazmgpjamkxrlhwlfdjvpzi5hfst2dzbjw7d5rlfznrrznyt5vlhcqnzc2ocjmw6b5yd76pclscxvomntygccwaexqwm65njkijkjq46pq2v762rczmsasnyqmlhagatv3gg72t7inn2leq4pydfb3mxvshvejmo7m3spi53piaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfsgfk5w5idl3j6lozxyjkctei6xjrgfaigptt2enmepzja7j5yozmaayrrkxnxka262ps3wn6ckquzchv2mjricbt446rdlbd6kih2podwlaaanv3xibg6ca7t6ywtbzjco3z4m6o24vqqbwygvw6wh25rrex4fwh4aaybvqu3gmlomi3dnf2tum3hoseavpesyia2i2wqgwbmbtrgmotu6oaadirzs2idl54toffh4a2hehvg2e3zoed4dr6pcdpuqpnz2knte7gqqac7gufkkuwa3tktmf7g2lnhpmb4cvzl42pxui7tbyxp2y564vxptm4aaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvwozhsop3jvrfbojc2zdg7o257xegzrhec2swrn3betd5kraeu6gaurdmjkcapnmgxibh2pmuotspxcymloyjadpypap6kfwojqxudjfpk2wa"),
24     },
25  1: { # client[1]
26   3: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazmwbygc64rtlparkjs7mrq5qmt7cygcurakr3vqtundyz4zm5lnibvsgwjh65tqlmf5m42ya55grnmqfhui5m4wtiq7sw74izax6mhtc4f4amjsv64nejtsavtpkiy4tudmrafoq5t4fxxm3lphrfrhz4m6j4q67caqgexapqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxftvgmgcmhjx7v2k7wt6elymxudbyypcq3zztusnavpv732eayus7iaarz66zcgmrzdtweg4oqgzgc36wxsrkf7xwfcaaqsieirc6ldy3ftyaaateh3wwhmpsox44uofje3q5rbcarfe5qgz76wfbyoo5ykkh3zgy64aajrdvnfky53hd5dhpl7hgzaasaomcgo6fmrjwhw2rixnbsqawddlqaajouzqyjq5g76xjl62pyrpbs6qmhdb4kdphgosjucv6x7piqdcsl5aaa6cpv6nqakhbz7ult4pmwttujfmavcvu7uqtha3xlhug5a4vpuhaiaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtbf3v6zafhuglsmoqbz2ohhh2v5ulix7stqluqrzuc5mylop3v5kpuut6vfm5g2efnmvunk7khynlrj3mfbtkejprhgxazi2yie6hvjfpk2wa"),
27   8: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazm4uz4iyzic7t6ktbvjola42pjdturxj55uks5phrbyxo4uqhdk3t5zdn7zkfvbh2mj33bovodak3ou4zbcyyp6mcoro3aqqxszhsgblcc3crznf2zeeofllsgzav5nc4pyh3ocblw3vhs6atocb6j42lovep4dp5zb5epyoqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxftgufkkuwa3tktmf7g2lnhpmb4cvzl42pxui7tbyxp2y564vxptm4aayrrkxnxka262ps3wn6ckquzchv2mjricbt446rdlbd6kih2podwlaaanv3xibg6ca7t6ywtbzjco3z4m6o24vqqbwygvw6wh25rrex4fwh4aaybvqu3gmlomi3dnf2tum3hoseavpesyia2i2wqgwbmbtrgmotu6oaadirzs2idl54toffh4a2hehvg2e3zoed4dr6pcdpuqpnz2knte7gqqac7gufkkuwa3tktmf7g2lnhpmb4cvzl42pxui7tbyxp2y564vxptm4aaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtbf3v6zafhuglsmoqbz2ohhh2v5ulix7stqluqrzuc5mylop3v5kpuut6vfm5g2efnmvunk7khynlrj3mfbtkejprhgxazi2yie6hvjfpk2wa"),
28     },
29  2: { # client[2]
30   1: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazm4looclcc5kqy6qfzzetsrmup5pw2sdecb54uxjhhsvyzin6ibfer76axpoh2vxxgfv34e35r3bfvpnvzqrt72flzskrx323t7ep4l32eir42sbvdswhqqkljxpy2rfa4j7yx4tmxccawhp57odyjzkkaqgcny246hrtdevqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxft2o45oiypn6bqokxqmpynseggmzoempbkssoyyu6puanxitj7rmcaai5q6234vnzjroot3erj2luheqecq5sikw6w6txbslsdvcphzionsaaehu5z24rq634da4vpay7q3eimmzs4iy6cvfe5rrj47ia3orgt7cyeaaezb65vr3d4tv7hfdrkjg4hmiiqejjhmbwp7vriodtxocsr66jwhxaacmi5ljkwhozy7iz327zzwiaeqdtartxrleknr5wukf3imuafqy24aab7c6gvrnd24kyscutnjiybvzgy24wcrqjszirhldprsfeanr4tnzyaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzqye3fh34m6ylyv7auginhhusra6fst3yi5n375nt5vzebwbbule2vxvolhomvqvzaiu2dyykr4da3ogfgvxazpmxe5uv5p2cczfgbjfpk2wa"),
31   6: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazm2y2oc6kqfofytgus6zm7b3e7jnjy2rsnoucuc5jyhwwehcbxnhdkgxr2h2ref4bkf5ufhhjzanmnnhhvbbwf4fmx7qrodh4mcblrofq3mk3olficr4q3owwisjmuzvznajzf5fdeizjq72vjvwz6yijx5tdcj2nphzthwgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfshy43k3bviz3meybqzoukf4kd53nf5osrx7z4gdhrwvmfzhkzbecaajiyd6vrn6vqtmhx5r5pany722qg4etoi2crh5i2euk3eh7globo4qaateh3wwhmpsox44uofje3q5rbcarfe5qgz76wfbyoo5ykkh3zgy64aahr3okegsj5cegqafjbcuvq7kyzzujaaoiow3hxqxbegkewsv7skvaaky7dtnlmgvdhnqtagdf2rixripxnuxv2kg77hqym6g2vqxe5leeqiac2thalz4fpmumxp7kgrgvvuz4hvrwx4smdym7ibalebngkols6fhuaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzqye3fh34m6ylyv7auginhhusra6fst3yi5n375nt5vzebwbbule2vxvolhomvqvzaiu2dyykr4da3ogfgvxazpmxe5uv5p2cczfgbjfpk2wa"),
32     },
33  3: { # client[3]
34   2: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazm4db6fxwaqyebrmu337bw22gluncfkblxbevg4citokkylk35mkzhvcbouvqfov54houq3z2cyqap3nnq2lbowhj25qalpjz5byjdrpyo3n5iqjny7h332alowkyvs5vd3wbycwbc27z43ilxwmhkpepmrnq3yi6mxmiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfth33eizsheooyq3r2a3eylp226kfix66yuiaccjarcelzmpdmwpaaarz66zcgmrzdtweg4oqgzgc36wxsrkf7xwfcaaqsieirc6ldy3ftyaaexkmymeyotp7luv7nh4ixqzpigdrq6fbxtthje2bk7l7xuibrjf6qaajrdvnfky53hd5dhpl7hgzaasaomcgo6fmrjwhw2rixnbsqawddlqaabgipxnmoy7e5pzzi4ksjxb3ccebckj3ant75mkdq453quupxsnr5yaa6cpv6nqakhbz7ult4pmwttujfmavcvu7uqtha3xlhug5a4vpuhaiaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvpjxayjs6a6gsbgtc6alf4btfsknnp2dughizg2mxczvyei43ercpnwkg2elbckugvohnchlib2na6n4vj46wkilwuf34izdqbdp23jfpk2wa"),
35   7: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazmw432y2xbyxpehrm6avy5xdp4bupvhsrezflvnbrf7d2gv4tfyv2c7mw5xfkoaflhtla3p55ld7i5kgyhlk3n5tjlofy6sbzouerqkzfxdvcmhpbksf7zdjyciiv5ur23f4bpre3jv4wk75yta3hz5r4bgex52d6zz4ykglaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfsthalz4fpmumxp7kgrgvvuz4hvrwx4smdym7ibalebngkols6fhuaajiyd6vrn6vqtmhx5r5pany722qg4etoi2crh5i2euk3eh7globo4qaateh3wwhmpsox44uofje3q5rbcarfe5qgz76wfbyoo5ykkh3zgy64aahr3okegsj5cegqafjbcuvq7kyzzujaaoiow3hxqxbegkewsv7skvaaky7dtnlmgvdhnqtagdf2rixripxnuxv2kg77hqym6g2vqxe5leeqiac2thalz4fpmumxp7kgrgvvuz4hvrwx4smdym7ibalebngkols6fhuaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvpjxayjs6a6gsbgtc6alf4btfsknnp2dughizg2mxczvyei43ercpnwkg2elbckugvohnchlib2na6n4vj46wkilwuf34izdqbdp23jfpk2wa"),
36     },
37  4: { # client[4]
38   0: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaazmr6ax5j5zu4cbzbrbkewwiybqrh3a3quqb7g7ijucnyd7gnpj533uao7tber3qvxwy4e5eoorvcrza4zxrx5vvfj23phpvl4u5kdm6dewsz76kehzizg6fj7ij6g2yiepyabade3std5yahnqrgvyarh3mtrubuqr7vizqhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxftc6gvrnd24kyscutnjiybvzgy24wcrqjszirhldprsfeanr4tnzyaaq6txhlsgd3pqmdsv4dd6dmrbrtglrddykuutwgfht5adn2e2p4laqachmhww7flokmltu6zekos5bzebauhmscvxvxu5yms4q5itz6kdtmqaaezb65vr3d4tv7hfdrkjg4hmiiqejjhmbwp7vriodtxocsr66jwhxaacmi5ljkwhozy7iz327zzwiaeqdtartxrleknr5wukf3imuafqy24aab7c6gvrnd24kyscutnjiybvzgy24wcrqjszirhldprsfeanr4tnzyaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdqixmau3cydykhmhyfjeblqbjh6gpstoq2ocybfzpptilivjqlxy2nhddj5kzkovztio3adwgfavjnjf74qbd4w6bfv32hkcmnmgskjfpk2wa"),
39   5: base32.a2b("aaaaaaiaaacyeaaaaaaqaaaaaeaaaadiaaaaa2aaaaaciaaaacgaaaaavqaaaagmaaaab3aaaaaznv7ubsowbjgzwyijzyfhmrn3jcwie7ikmwph5cxdcezxgtnc5ifel5ymjizmz74mbgac7c36xq3dwxabthrqdxysy7sabwu6porqcxbplpjenl2fih3azkg3kthxd6miq2yd3l73xxvvym3rvw4bhuoi3qzhtn6ylmmcohzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacihukhxozmnvny26wmvd6mvaygx5x4wvnslc7e7bgigopq2yjxfqpu2mfy2ksainrd6yaxl2vtcwvj5mmqnwtyxctmpqyfmihvu3viyaady5xfcdje6rcdiacuqrkkypvmm42eqahehlnt3ylqsdfcljk7zfkqacvkpun3f6fnyz3dvbyc4fwcvznp6o4wknl6xwnsfer4yghvat336mabh32c56nw4byylsktyom37ayugupvhit5a7wbicp6o2f3ojvodtktaakb6tjqxdjkibbwep3ac5pkwmk2vhvrsbw2pc4knr6davra6wtovdaaajsd53ldwhzhl6okhcusnyoyqraissoydm77lcq4hho4ffd54tmpoaaaae4gg33emvrv63tbnvstumz2mnzhglddn5sgky27obqxeylnom5dqortgezc2mzngeycyy3spfyhi5dfpb2f62dbonudumzshkhaeai6yewbmsmennxwvqql55q5iwfyxc5zmgh45vi4rq5pwsz4ilddoj4xa5dumv4hix3sn5xxix3imfzwqortgi5eqpiupo5sy3k3rv5mzkh4zkbqnp3pznk3ewf6j6cmqm47bvqtolbmnzswkzdfmrpxg2dbojsxgorrhizsy3tvnvpxgzlhnvsw45dthiytumjmonswo3lfnz2f643jpjstumz2gmyteldtnbqxezk7ojxw65c7nbqxg2b2gmzduo5akwyvfabqfrex62uhosj233eqbcjghkjkgccaelcie2i7zet7frzws6tfhiztumzrgawhiyljnrpwg33emvrv64dbojqw24z2ha5dgmjsfuzs2mjqfr2g65dbnrpxg2dbojsxgorshiytalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdqixmau3cydykhmhyfjeblqbjh6gpstoq2ocybfzpptilivjqlxy2nhddj5kzkovztio3adwgfavjnjf74qbd4w6bfv32hkcmnmgskjfpk2wa"),
40     },
41 }
42 #--------- END stored_shares.py ----------------
43
44 class DownloadTest(SystemTestMixin, unittest.TestCase):
45     def test_download(self):
46         self.basedir = self.mktemp()
47         d = self.set_up_nodes()
48
49         # do this to create the shares
50         #d.addCallback(self.create_shares)
51         #return d
52
53         d.addCallback(self.load_shares)
54         d.addCallback(self.download_immutable)
55         return d
56
57     def create_shares(self, ignored=None):
58         u = upload.Data(plaintext, None)
59         d = self.clients[0].upload(u)
60         def _created_immutable(ur):
61             # write the generated shares and URI to a file, which can then be
62             # incorporated into this one next time.
63             f = open("stored_shares.py", "w")
64             f.write('from allmydata.util import base32\n')
65             f.write('immutable_uri = "%s"\n' % ur.uri)
66             f.write('immutable_shares = {\n')
67             si = uri.from_string(ur.uri).get_storage_index()
68             si_dir = storage.storage_index_to_dir(si)
69             for i,c in enumerate(self.clients):
70                 sharedir = os.path.join(self.getdir("client%d" % i),
71                                         "storage", "shares", si_dir)
72                 shares = {}
73                 for fn in os.listdir(sharedir):
74                     shnum = int(fn)
75                     sharedata = open(os.path.join(sharedir, fn), "rb").read()
76                     shares[shnum] = sharedata
77                 if shares:
78                     f.write(' %d: { # client[%d]\n' % (i, i))
79                     for shnum in sorted(shares.keys()):
80                         f.write('  %d: base32.a2b("%s"),\n' %
81                                 (shnum, base32.b2a(shares[shnum])))
82                     f.write('    },\n')
83             f.write('}\n')
84
85             f.close()
86
87         d.addCallback(_created_immutable)
88         return d
89
90     def load_shares(self, ignored=None):
91         # this uses the data generated by create_shares() to populate the
92         # storage servers with pre-generated shares
93         si = uri.from_string(immutable_uri).get_storage_index()
94         si_dir = storage.storage_index_to_dir(si)
95
96         for clientnum in immutable_shares:
97             shares = immutable_shares[clientnum]
98             for shnum in shares:
99                 dn = os.path.join(self.getdir("client%d" % clientnum),
100                                   "storage", "shares", si_dir)
101                 fileutil.make_dirs(dn)
102                 fn = os.path.join(dn, str(shnum))
103                 f = open(fn, "wb")
104                 f.write(shares[shnum])
105                 f.close()
106
107     def download_immutable(self, ignored=None):
108         n = self.clients[0].create_node_from_uri(immutable_uri)
109         d = n.download_to_data()
110         def _got_data(data):
111             self.failUnlessEqual(data, plaintext)
112         d.addCallback(_got_data)
113         return d
114