diff --git a/crypto/src/hash/poseidon/bls12381/t2/mds_matrix.csv b/crypto/src/hash/poseidon/bls12381/t2/mds_matrix.csv deleted file mode 100644 index ae5dd836b..000000000 --- a/crypto/src/hash/poseidon/bls12381/t2/mds_matrix.csv +++ /dev/null @@ -1,3 +0,0 @@ -1054aa308cbc55d67054b451780938637384c4516c1efde724244827b4a3f517da7dafc71176d4d0d8a389ad443d87bc,193dd99b435bdca5e54d9628f98cf64b4ef15b4e2932f4aaced0306790038fe2a24a129e873b775603e9bcb62d2eb572,197d34c530289f1ee0c78c2549e7b588c17a92540bc14097515c84ca3a1cc5c11c0f28d8dc5a1c45023c79a753fdfe7f -028eb098a4742d219569a8e6a5aa351492f8f10167c20ecb7d772463dcf7235320bcd6c3f573b4886354bd6dc6d142bd,02acacfd528c4a6581b88f99d319114aa570e09304469f24c922e11d53a233b91ede1db5d56bcf351b0c7273d236dc2a,09739ef37c6cd264756f56cc854698c909e36260dab6ba99c0f9f966e6e620c0f3af8c9d9d39259a4772c0ddb846caf0 -0e04c931c0ca356d46e3ead73b18c96b3d0b18d22ed1f65c6083be79a489c4bd37304725f8ee11007cb37f2eaf1ccee1,17f594a2ad8bf7a10bd730eaf750db78dc067b8d79cdf61d0218a9c2dc72986795f6dab8f3bf4512d3cf419146b31266,09605fc485a538747637ede019ed67c220d6e6773430033ca6ab7d7e2df4587ebce624cf90da513633af537ef47fdffa diff --git a/crypto/src/hash/poseidon/bls12381/t2/round_constants.csv b/crypto/src/hash/poseidon/bls12381/t2/round_constants.csv deleted file mode 100644 index b609c7420..000000000 --- a/crypto/src/hash/poseidon/bls12381/t2/round_constants.csv +++ /dev/null @@ -1 +0,0 @@ -154f2457ef0af5d8e80201b00fb2e7651c26e75c552c2bc71f25de7436423909b6431e4c87276409028bdb84cfea977b,17330c2341e58e3255d9f0bbb7d3fee3bb30b80ebebae1f456f6e8b4229c09fffd7052dbc85863015d27a43217f11e3f,05d4688ba8f620e38eeb1f3a1461c89611aadfbff11be1bfa469f461b3c10831d1ca2c237f8a93b0adc90ec14c6df22b,0664a69aa7c2864176cf758dcd71fb255eb5320e93cdabfb32cbcc78d61e913e93ce180bc31041da2930b27c6c91be78,080035cc109d5aab327d8177ed36b620f6e62b598df5c326f87a6bddb9fc301bbfc6f63330037e1a3933b2c68b8d742c,0e46a18007cff8a758623662dfaa6a5907508ca3fdc262b16de7f1021af3471f18073fffa8b62e4d2d65f88d6de82d08,087aa16a5b69dcf5e5dade5483b470ac1fa205c9859c0e7c73fe330cf1f253e3a079470ebd8235cb7945a7f4dd4bda87,0eaa1a2c10012c78d3cfa5449b77b16ad30a2c86b17b95fd7ec0a16041148d3a4404e242dec8ffe1545b0e51ad5aa7ba,0e3b6a0616900c3af65bb6ea9a8b2561b1593ba66d8c1df6dcbb5ff61ddc7a6901e813835804ad93f620f85244186bde,055502e89fb98360ba746aa8f1848539984677f7a92ef1dc69eb9aec78632d2fdffbef65a16e48cb141bfcfeb68b8ff9,1823c8032ea6d122aabb6907adfa011f369b3fe2101022edbc139efbd8dc393c1fd72b4956e3749bd4a05cee0e1bf2e3,16094945fa5310014f8f536673456948fae2965ad3f44cd66680f9c619cb0ab42a46e335ea39f9fd5d0e5434b22d0bae,02c5cce0e00a04d0af53f30c459e60e752f0edee8141702b402d0b04111926d8e8048c9d6d19a4178f5f39d276b6636d,0a0e9eb9c29ab145709137b90d7b784406adcf03be4d5e5cb22168d665c704eae0c59c33d7b39870d7d41ebdae3dba63,14810d3625b41d7d2915009d70f6ff79a360aeaeb4309e3a8c15c31869bfe9281778e98894dfdd3ae3676791fef00d8f,0ac64e116b047832b2d4dde1d59ca7abebd7e165729a9f92da3764c796a3722851a526ff4dd730dbd89aa024d6b90c4f,082810320ae521f905c70d58ab9a9d116025906953aa1ad2b33670e6aee784e97306dff4469aff5030238be5300c4125,06fdddeca6d088b675e48c8edbbe3c668df3486eda775851bfa7d3b30482d9996fb2558589ed56fd81881ef8aa35e463,0d2c62d0f1a1cc18cd3c0b4695da388c5fe4a5f6fa23b7e0f1adad95aa17178b64010ce2ad27952e9de13bdd0f2238f1,05980e4285f89623b4923e10bae8de36eb0790d517a1a13ee2d1e60dd7af4cf77df27202ace93f3cc2d2cd790a359f2f,0651a7a9ef748bab7fb382380615fbec324ec63b8841a762490feae653a22368255845324133fa4d712b908cf23862fe,16aa775e2376ab82ea54406cd3e86b2ae9f3f1940d09419828a47d8792872af6d319f571f8ac52b690d0edb47385adb9,0d2bf7f7d1a3ef3a28f4fd7fb0799b711f0aa0b569e0e39b35f0682041c6bf4313571fc268126803c1cd455926b9f31c,133665f56a0462062926c8758395d53e5f55c8e49b4be0ba504847a9d92da919125eae37ddda7e4f9e54e6030d37f2e6,057d3388086600f182601a3aaf874ad6c9af2e1b6e31fd907735c2a0d2f36d280fe720f7ab68f1619919a59f8034750d,06b8202bd67f29635882c73a2075d20f523f8ca3ef3e5031b749766ac28aadd0e9b42c515f539b6543972950e641c7b7,100f28254f5a526902976d9a0e04aa7c8281ef241b65fa7753609f99e2a65d4ddcf9a6f203f52eca9d8a67eaceab0368,025f8e66fdde4c9b366efb32ac27e8e6929dca3b9221ae63ec3dcc8c1bc0d6fb3faece3d63ff4ae05d93b7d58f2275cd,0e60c2cc4aefb5f9795bbddfa437c39984e7c24c85405c3bd10930fa6cbac400aa3a07de6b3eab999a706e0a7417e7f8,10149037150d9ecb855842788053b978936f376f3faf2688433c69a9bb9a59679e669c510da19b4d7835e9556b128e6c,02e1fe43ed9084dcc74865ae47d59ab7577361ef9d858e183a58081c213a21f36680d051b496ef253ffd90bf93d0b1ef,0b2ffe1b4c9498b46728e35820023a2981f0173ec0c94eb8662a9d93a74ee971a4da683d3e0333e6f0331c299eaf49ae,0365ef61b7d375f28463a1fef5a0fb6ced29471c52245569853fa806b863a0f07ec392377ac459a3554759971da01f80,0828bd548085ad65df11653813e3c7270ab11dc6605071fd1c52905842296b6eac7174c1a9efb80d7829ba6517769acf,01bc698937294df70dc04c1f0c13a191bf2d7f41edbd29a6b6198de6b128066a24663d67e6ad23525d2586602cb0aa2e,18daf786f64570af1e44d387c1819f318e31bd02b1b09eb0eef36e4273bd3346cd12f43ceeb3aa9e6e3fb7104a1acc3a,016fa665700b72fe0d9d4b588f87553cf289e0fc98f3b12aa1429c2c4f5a0f18c46f54186f2b89524e858eec1263cb66,0b67c11fc4788bb2f1517678f71e21e58a0af7cdf9cf821eb36e7fcd7fb6bba9bb57f91bcade43b11865b7147dd4a03f,144aebfa271a685a9e05ba4b98e3fba70493eda456f45c748f3cab0e671caf407e86d1ac129ffe2a7413ce794db30ed2,1247ae67946b588d139e52dcf673c67a41f7be84c2368d6e5e748f9acef42407c7f537abdc0f33d8c4e675f41d38b910,0780000fa29beb94fd07312400d57c40e55fe346c2c68400a1ed5c4c7108859150a7af8f7000d21199cb7fc292c95521,0b2b79069d11eb45b83fd1407ae8e33593844ded02dc62a79117eee92eeae7687ea9ca08eadc8778b24ae6c14582d6ed,099fc7451e0211a1d92b82fbe5b290b370b4c8627cbe9a8ff2e1480d2c520caef7ddc494ca93952d8ba6a57768214b3b,15d38e4a3eb3beec5d21c94b90c98c0c15db24b3910f26286346de7a0a59a262d75436f8b4f45d5759d3bc6284313da7,0df6e591d48b8fe773f1aa940868fede16b46339e656d462a266ab23d75874d55845751942769870ad193ce692d7e122,0733a678e5e6916419c2bd5e8b539ead4187b2af724003182b45de8dcd2e29e888d6af424c8c6ccd520fcc3d19b47c2e,12c6e68e20d7245cf6f95224cc86c1b2eba4ae9a158602d588e73adab495b48b1177798a7eac56179a72dcdb9b948ef4,0e2bf51d224aaff9b09f19e2618dd7a3483af0b1f3593b59fec160c81e51a372f38d3c1fa3668f8e031b30f50ffc6e1a,0d189eafc13611b4d52ed0fece5a1121cc71261c898bfbd0944683ea2fbf93179d6e19fee858c88532a7c0ca0fe48ce0,106ca751523f7746402b0047c4e3c22e6078d5fc846a625d1cdd6f95ab4d75d6f6effd9dfb37508e5a56127e4e5f440e,0e3d7b0b5b18a2d9757a5c537fa1bfc07ebb64e73b3fafac804bdf775030d6b3552d522210538572522021f12204436b,0ca015d9a41111738830bfc8acaec1afbf12a26da30130824d6e30d72934f2bc741324db5308ec300118f6e777d51540,091c3d10ae2deff9699870018f4475adfb1c4bb9a4760487093fef27ac91c691f3062f79593e6758004028144c55cf90,085a8ff1fb23ad3a534df006ce209df11841c0388ead4f874e30ec77c518f57f3fd80c76f91e0d5364d34c0d2c91a226,03b260e0a1428a0afb0880cb00686ea7e7774c419babd0131485b33a19419e9628b2436dc9604a5aa9a48dec14149b37,06e17d6cc8341743f331e8030b5e35acf0f31454d6c46be1834f2db3b2fb5b9d0177d3f437ddbd8d92b60c32fa41ae9f,13458b0422d3a90c0c48c7f8be74c5f6bf43c65eef8a55ed3e4a3150dd14d6e1370a13c63a7bcd9e1c9f5c89d3febb40,009307ba2dea6e150d33935a81b632d36b8a0b45cf638e2c081acf367c4f8316b1c1b5ea9057479f68f17e82c466f954,096d8122739e2ffd19ddbe7c1a7a4584bb7abd8caebc25e476068ee4e757287c4d759c50c62f380add701bb8ab10c20f,19bb476b8629da8924327afd809588d75f7800c6ef6cd7fc8709cee65ab2683ba9cbd2746a20e56af82d89d9b1ed66c5,0c4a08deb88627f5db30d42b5ed83a10180a62cf991258b9bccd142cda9c0168e3b1d5cd848d2a6a7adab709159a5133,0a107ad615c80dc81e38024de9298d60f1dc709cc8b1acecd5e0aa09dc6e48ace7ec3f3327a860ad38f1d8901933849f,146cb92f3254d4fb6ac2f1545e25a295970a0b3d05f8842fcec6f943787b9939e30eb33cf6d754511893a81e94adad7b,0f65ba85a62513668ab9e9ab5b2c5d4f0989d4e2599b5252a60dfc56105987600eb3a64bc10c75b63f3c4f9dae55810f,01efd65006fb91a94748f46dc2297d1e19519a41c75695160e6ca5e71e580486c504907b5161d3d6c61652134f7bcdca,0d43ffd4f33bde32c7630ef4674b07ed12c85aba1229f431cff5d78d68d817b5cc976d69b469ac6cb93177d1486ab199,0f707eaddc3ff387b1457fb20531d5fffe1a25875d3c5e4edbda1343b9e5758ae3114209b14f55d2abfd23a73aa6333b,05db174b4fba7e68d28a642eac6e4909cb8dfb658e4408147dfb70c09243fe5c32129792fd6cd336f1824524a8e37999,0e8334f7b12ba167b0782d1dd7dfa28d51cc83dda20e2bd44548d0c2fc4940689cda542ad609906c4e295d8a1e9f64f6,0e569b7f4fda9c27239da626a37aae1f1f393940f7ffa0238f07e367d0b040cbb3bfd06f86261adde52d52f142711232,0d917e17cbe2994a9f48c754dfcb43824dfc196c4eeaad1ec2c902978d6670b895ca25016db9a720f450fb055b150a70,0211d95a855cc02131117c08419c8a8ea906a00cbc8fdb79c755acd6ec0aa4bd450fca6953fd4b6b0b0009d982c85b5e,026e137be92785d890a8d8d8a4bde4cfa07f29e2b6b148be5f8014ed13034a60801bb003a36971467c9bf91e7a97142e,190d39ddb4050295544700a76b23d3f109c092a80a804e13b66ea795db6fc156986d556f206026a49344e0e5951d98d7,0f1d859aba9fa151727cac9a8567ee9c032c2d8ccf5d8f2724464828b1f673212809e9fa096b2ecdf95b2b2e4fa38a75,091c654a512b8ea08bbab7b6b9fdd78a49b19423345a1465528a0b584e85d23c765bb9f3f1985e6f89ac3009ebf3a99e,0f57fec764855ea7d1624c91f16c4d099166506f304a79e1e0c40bfc57f41c8f361ab15c74ef76eac14edd5c6d5bbceb,0acb488fd42ad53b12c9703361fa00eef33606e804e7a91a2d6c96a5774df2a6bf94aab5973c3aa0b88221aa1a0ecb8f,0a9ba0419b6cc23aeafe149f6d737ddd8aa00e75834dfc1e73901bb9ae25010d85977dcdbf417f82396aa061273f3a5f,016b0bf68515efd0574f287d03010c8fcf8d523102e0654ee51c4132d750ef64ca1b1093503e1c671f382fc1b140a6be,0819566899cba98f5f43cb9dafb062e635ec4193abfcc1aaa8aa34d53efb392b48cca39665d4960e2ca61b8e0df68a42,04c13c6ada21527399abc94e4fdbdb8ffb14b5bb3f774880ff33cb38aa8981319bbfbf6e4941ae7504ab7aeabb0bac34,180ded2033afdbd8f88963e1d1ad4b640875e17a7e720a056a0e61ea1a6f5990cfdd9e8572934743a6cc8e999e784985,091896bbb40a69fc15c9d75556fa08c59450fedcd480cc9e8def435dfb68041ce38b5a800da26e82e67573283fcca177,03f59112fb3048a6a468feb79664872b58f898d9ad36c922858111f42e204aec44997f5a6da233fec053f33b45f4c835,195a78a6b417d24382b40185a29901b956d54c95c9764097420e66e6daa4eff3fba9155c85fea9479611e322f49c9522,06648f2749a55fefb4492e8a4453bea878c65f740665d01084a62deb11bcbdac48e357c9a6f68076cce028faf6865146,07b49d61c947fdcdc7961f981adbcb55924d3e7b68214068b87da133060e7f95ea00e99d70036cd4bbd6749c6932169f,0a3881cd9dd7d8f1163ac6fa761f75df4e0847c9f5da5197dbd3336a995a1dce7106d0b1434a356e248ccd2f105d1a4f,0af02e7b4ba459116765fddd8f761db3cd909446c5afa49e46d4a4bb83ad181a99569e418a5ceccaf00ad29f2d445135,19b5191fdcd2b9d9a7d2fffc1c4187f14b70d6838c0dad3c9b2da8415c19ec97ec3798eb25f32a7226003d8333a422ae,0b388939fcca198ec39c0bd0288b768816f842abc6985e2af35b43bf0db1659b699942873c843072f6d0fdac5b83117e,162dfb8b05e1bdaf3cde4f7cc80dbafa48489c290bc09ec187f98f7cddf220c85ab0885d7cccbfcbae38000c3c870e00,00c2ac6722de06149432bb0c2e5012f1831ea313fa29ed5c93519e8506a1ed32adce2b4a85f07474781b5bbe802a3898,189f182cb112caece3612aef52bde9aba388f7bc4bf4de158ef6540c3923b01eb64671f60cfb8396a56b63c78ee1b081,0434613a56a2a3546baf0459bf1b5cea2edf822bfc5c89ae7cbdb317d5f8d38eeea9dce5c65c49b38aff83206ffe35d5,0dc34d1d79b41e0df0005ff90665357a7314e72b8c89e6c67cd98ac1fd01cd1c0bb57aadeaf2b77b75fdf92f9530caa5,14f38ec06a49dd2a850cf5cc0378f087001ffeb12f12ce075d3d2c7d84a77fc115e7c218c110cdf25d45593b6cdec378,001e794021eb02572e0ace832ea4c863038433ddf439a3d26d2d39bae07e80c84652e23a652858a647698a43737cc253,0cc12818fcec8de2ff6688b8eed64a4e03e3b0d3d1ed5da397ae9cd398329c17579ac9cfe9301e2c119dbc52c286e5b8,08882c9c79b23d992c50156933658218e44a7f27be637947600cf6d132212dacae30c2f42902fbf4e04f21321a10d4bf,0dba2c8dd75397e5094d6cabdf0f430428f0ca20c05a0ae19438fb0cdb3d7475ca278a64262631a2bc2dbf35ffcdf216,1803e2c96c87d7c0fe49bdfc811b32ae4c9ebfcd7d2f02542a7185197c2c3e0bb0744f76bcfea488499654d6a1aa1afa,0eb92031745ae4b6b1e096a9f2a142c40f4fe5995a574d968a5adf8c66bd987297ea7d2e2129aaaf8756ec9ce364e3b3,128bac41ff7a71d26308e5190ed5ea80e80b64d994a7e7c57037007ba178a9983e9d3fdd5e5d59e9abdf1e524187ac6a,00bdf9f6a53be1828b46689987f20baf7a2757853dd80b9da616c749c35e54fe683debd0df062dfbe9c2f1d68365f91c,08a70deb1baad04bf134642ff43baed6b5a0c86e6cec7d4e5f969b85beed1e93bb8d0266c4b23463b7ef72bc26375dca,18fd4a63c62018804a2375a24c4f381ce3f94abf2ebf7340da75f759c78ae91646dbe79bcf8409ee537205765f585582,0398cbf405c66b09bc3bb2df8809a82ad432b66d544ef466fa04d6f2dcc48f12571b1fab34a0286699d923ecbf65676f,15bf34bd747a732510bc10cf2bdd98804e3e5a30bd6884d1f3195dc4398aa0f7fc35e777b20ab8219ec11b4c77f4eddd,0b5f02b361dec84aa3dd7240e410d8b4b2c0768ab9335f71f7f3fedc3e08a9c27c35aa4cf7416af83ef5e2c5f03f4547,1344510bddd17c7b873df49848d445bc8dcf49b03be49dbdc68495f79388b33f521c6f48f137762be2eca8f5dfc7151a,01525dcbfbb85405e0af83b391560fd504652d369ebafd64f1ed4a44e8ff7c4260b561d58a180b5c127faeed06ca48e5,0c2d15aa7b437da7472473a34620850d346a4e52257db90acd823499eeb7008016e63e0f51752f14b336e50dbd9dfee1,0855aad17f483c75a542bbea0e8a9273fe815d1ba3d20b3706dfb4c894d0c7c0c78813dc20f1988bbd2bf1273919f7f2,0406f4ac57671b676e9c2119aad5cc4310b1a07ffb82b11ac494d51c09e41e501547deb1a3f1daf4f51af237ba337c4c,12eb56e33d4f24c74682853c235445de6d2b8a67d8cb9bfd1231ddfc9c1ad30bf09bac2ca348a1b88b997acab6c18404,18dc440193684f025c3633850bf0193f484da7d6d7d967094b51202dff171e18d868e1ac94421e722c166a82c7d62d41,188dedb851df0d743e693a2cc09b2fc3786ca2def266b49b4c95dc266209c47a59121d20afe2fecd6edf3be9cc164028,0579a1e5aaae3f6e02ac1deb913ca82477cbde72b7e6d58b7cc6a91a9319bc9834d550126d18931884ac769c7d821b42,14a9d80e9010b4676e3ced9da437370385daa0874e4636ea63983e766fe96c1a062a715ce03064319c1fb5e2f37d48b4,19f24af0d7dfab02a118e0c873422626c76fd70370eb41af469e0e82b78bcd5255c814f2e7c320418ea8cc55183c51e9,19cef3bcc7428c678d54d3083e6b57e897c273b4472a5301d2498fde11f948f6d9c9f17c8feb4836cdec0a897222719e,0dd4cb77abccccf182405a74ade52dc9efcce0e170e720d510ffd10239621a4502850e3bef113a81bb2252bfb5652268,06d9f3e1dab3438a43e493a7b665b81186bbbd733ab812cf10c563d6b07dbfc62efe2f3c3ffddebc31ec54e5406493d1,13e1fff7de97f3b1df8217108215b8eb41afd06c0f8763025a7ce928afcab6c965a0ebb47a4d572c333f5b4487efa39c,12d303e32afc0b1a430b36e79e1d2ce1a4b41b65e9614b5c73464c77ab705d8162ef31efb15c2363be099c8d8a6938f4,02f89adefb33ef694bf89c794977155c1248662d9493c1bdaef8929e2d9ce97af464ef782a1c55d21f8a419efc9d9bcf diff --git a/crypto/src/hash/poseidon/bls12381/t3/mds_matrix.csv b/crypto/src/hash/poseidon/bls12381/t3/mds_matrix.csv deleted file mode 100644 index ae5dd836b..000000000 --- a/crypto/src/hash/poseidon/bls12381/t3/mds_matrix.csv +++ /dev/null @@ -1,3 +0,0 @@ -1054aa308cbc55d67054b451780938637384c4516c1efde724244827b4a3f517da7dafc71176d4d0d8a389ad443d87bc,193dd99b435bdca5e54d9628f98cf64b4ef15b4e2932f4aaced0306790038fe2a24a129e873b775603e9bcb62d2eb572,197d34c530289f1ee0c78c2549e7b588c17a92540bc14097515c84ca3a1cc5c11c0f28d8dc5a1c45023c79a753fdfe7f -028eb098a4742d219569a8e6a5aa351492f8f10167c20ecb7d772463dcf7235320bcd6c3f573b4886354bd6dc6d142bd,02acacfd528c4a6581b88f99d319114aa570e09304469f24c922e11d53a233b91ede1db5d56bcf351b0c7273d236dc2a,09739ef37c6cd264756f56cc854698c909e36260dab6ba99c0f9f966e6e620c0f3af8c9d9d39259a4772c0ddb846caf0 -0e04c931c0ca356d46e3ead73b18c96b3d0b18d22ed1f65c6083be79a489c4bd37304725f8ee11007cb37f2eaf1ccee1,17f594a2ad8bf7a10bd730eaf750db78dc067b8d79cdf61d0218a9c2dc72986795f6dab8f3bf4512d3cf419146b31266,09605fc485a538747637ede019ed67c220d6e6773430033ca6ab7d7e2df4587ebce624cf90da513633af537ef47fdffa diff --git a/crypto/src/hash/poseidon/bls12381/t3/round_constants.csv b/crypto/src/hash/poseidon/bls12381/t3/round_constants.csv deleted file mode 100644 index 334923549..000000000 --- a/crypto/src/hash/poseidon/bls12381/t3/round_constants.csv +++ /dev/null @@ -1 +0,0 @@ -05ce359a7f1c1482b1f51709cadd64f5a26af15a23f514ddd3f99c1cb19d70b5e3c89c25e6c66c03b24fb5cf098171dd,0cbe7632efbacf28e284698e45f9564427171e953365ce0cea873a09cd5858899109272afc22d0f71632040fef6066e5,06ec4522f086f379aedd419486800c2331968b246ea4fe3c505621f4e8bc4e43126c217b178a2ce037c5d3c62c83cfc1,044d247198740ea72421cdfc31a8cc2b75bb91103d8c8c962bc21374299a2971bc8cc83a8047fbd8ef7f5e9d09a258ff,0420e80c9b9e0bf1732967ee0fd10235ce6095f420b91ec9e05331a563290ed9bade74ad84576e86436f63bb8188327a,0ab070a0f6fb9da6ecb8fc33528002a8460a0ece92b8e43849ebfc6bd1066283f6a3c2b01eef74c36df368a1bff4425a,0acaf97590428902e3c0b935ef0f502b62c7813e1abad1f70bbe0418ee59d97d0038450669d0b8f990d9dbb890bab9d6,02f9455e08ec7eb0a6e298a8d7920dffa93b7c70456e620af26bd2fc3f73f78e7e0d43e94e38a3719d312f10a30ca727,0380838a13c281081d6eb090e6a22e81a80b6ea6999e9cee02b47c466eed788da3f98ed9e4bc766aa8a74510ca933267,0ff56d99a2ac8b53fcb7a73a3b6c3027b3aded2ca607a84d9b21762890a60c0506b3e9674644207aae65dafe97831db9,142c240946c27c075ca9c8185658a20b62b50af30464654b940171e5dc3e80ef890899261fb806fe20eeeaae0295f3de,025afb38bbad1053670447d397a1bcc6f6206eb88b57a992673ef3505523575840119427396ab82fe2bae7188efd12e5,15dcad4ebb0f84e3ddb75c5b26b7777b64c80a00ceedaf69b8aabcea714c4050e589bc68ff17a334b025ae7ff7b565ae,19e9ced254a572f210a23d4bdc969893e21e66dfcea0295a3a9e4932e6aaf10e687d85af3fd1f8018f8f6ee3377398cf,140335a3c89cfe2a895eb0a1f0976f0084d4e7f9742d29359efa35dab5d53b9ca846d09b8ce14744e62456d98fa2b255,03a27061337bf8a6137a3c431114fe68fd10dd67a94c185f227cf3c83169c93a96cc6c2f68e9cedfffc1f7e9b4153ce5,0e9157746dfc2fa80982e8e0a532d96f107780b5531113f9a3bff986bb056d6537ef35ee58260b204df0309cfb09f725,18456e050b97e7bf6e4e5faba129cd0e219148f04a6bf424a98b8526760171217193cfb79cfbbfd0787275ce7f494c25,0f47ea2a57120fec3ba8ff68de76eb961c75678d90b3e167556c0ff90fc924fcf1954c2e6e825deeb7b44634e26e2a5a,0529c46e1812c17588bdf6bb2808723ab13f044ac3611c4904815f4deca65d5de22e58bf27d0a2973df3f9a24d6d7f04,06f7d85299cef8bf7cc0b8400cfaa53da9e2441b688b617953226e484b5b51aa68ecc953a422dbee26bb5628b2dd22a6,02c98c03b1f86a41b940307f49294856fcbeb8adcd203f346846c3ccc804ba9b53a9baf8c7c1139cfe836146f91fde5d,1436ec6bd04bfac09b195dc71c6ec105b7430586d6959ddb2b484f6769b27095651bc56c296cbc7e0b66dec3b347e37b,18714cf905f3f453ddeee24d7458d234ac2db60c25eb32604a7635a373f83d44b10001ef8d554d7ef40db37a68afb6c3,090b7696b7e0fa8d23841f04274971fecb81b57f56bd169f9b0becaec57013dae47948d45ce2800029de77e029dabccb,04cdb2625703e7155cca895075ef92ed738e1c7dd162c91da5584ae970a575a1eb377a4dea47c0bf72f3b2ab0ac4834c,1144cfac1dc4c2d16681d3459db3eb289fe3248677b519b429e813857c6e807e9f7ee2c55fbf66667950f2b78448e21a,09568d718e369742310b1a23e14a5a162c71c0e32e3eaacf6e2e12aa5cef9530cd28fd760ff4d313d44d7afc40a3c7f1,0688822f3bfd78ad70d0e84609e56f5058f8660a3411e9fa73c5d6b8c82dc25cedb79bc1bbe7a68a17c95aa67974e018,15e7b1b72818c77a9ca26eaac3fedf48b57948f8628b1a9516c6d7ae34e61799021ca4891a4a5797c23a2a97b1b3e100,0137553bf56f0b217a6a5ccd16abdc96f1ace6fc82c2fbde179ca3c13f4f633f7f6bb54581ccc5159228950d9d00a781,1781f5f50a747bb7b48c50ff7476a4bf32cb65457ea0af6cc0ef3773dc610acea687048b5d55e7842471e2058331c0a8,03f4c4558ceecffce8f234cf001ff89dca987ea20833751b4ed3753f5f0004c7eb3d1b3cc9982c009a1e47a69060ccc6,18a8dbbd87cb89704250d42245e586055fd978ea444e70fcc9101f341dbdcd88ead49b151225840f2ca3e7e1feba4b4d,0724e331e71ca7b17b4e7d633349acd5d285a582a52013092692d5b3e48395441f2483207b032edcf89b42a419eeb1ac,16adb125d97e06622b91f650a7a7183878e7dfab2a2a123186e5cbb41f07b1f9c8eff6b15491f7db7a910fd8d0cfaf0c,12d84fe1d5fca468d5816a0f2008346252aa2f6cee3eaf5d030a321fa5219889e5ea5a5072a231cd0cba25a7ce6ac48a,098a829e2f358afc1034ede5157c3056acbfbdfb60638335d2fda25c3f26c5341a704cf142579bb1b213595dd59d4428,16489677f6a6bbfba47ac7d04a88d6236e337fac0a73e9cf2d1e5dfc6eae10a91406b157c0c71b6bd1cdd551b9ea800c,07a424aae1b55e5b5f8e3f9a1db819fa5e266e391c7eb3a6c68dad0dea7fda692f075ebeea39c1022c4c113ff7cd14fe,1331a382d571cca0e791eabb10370f5981efbef3db48115cfcd9337bf8eb1ea77851dd705972d4428fcdb80adc3ef993,168a3aece4331b8ac5ba9eb50ff558f94633f2e027dde1f6d4e28bbd5a5e336ba5224c8f2a03ccfe5ed155911e9509e9,01e24ea996889992c1f60510e602c2346a216df585319e01561ab40eadcb83f9dded6138cccfb50bfec6618f6e0678aa,0a913b3c9398f07d7ae4ebfd371be9529874c239ac28a9526b2fcb7aaa5a806af217f239a444c7fd7afc80bcd4125db4,18d58a9abd4588144055b222f75b19a4d04d144056d31a66035e7e039b92dfd38b01dc29a1124481e5a9645ba20eecbb,14a998b9fc42b4c16d84ac55754c45884502854ac8c28fd57d652fab0a9e19316a164d6f741272dfcd77c146cd8b999e,0ef45e044f060a44e83391157a17e0272dcc4b6ba4bcb844b0a554229d18faa4f2dd9526356acb2d6480de3df6e41d20,047ff51bc66d5bdbe62c6d0dbc0b605d8de234acff2976df33d05e66b3d922694caddb59fe72f21a24652853ef46dd00,011bc23a609888f723178e35d7a13b2f21950ee6213890d5f40a6b8926de9b835dd9acf73a8b1d1c3669862fd8c7c590,01dce326b98812b2855e819c34a7c4f16ba9db156e3a83e513cd61556a3ce608e9146abd2a228b104be6c2c6bfb90bd2,1150ef5003c9a54b1b128d7725eba4d7b1436526f834eb073eba8fccd845e107b3c996746443f93165ebf0ec4a8222e1,0cf349aec12bbc5268063e99754741e2d344f31bd0e943893b19efa98fa289674d1d7ac5cdf9626515c264e84b9ddde2,027822348cbff16ec1e397418d3ba95b0204dcd7b22696785581f4b6fbc9ae693133ccbcd022b2499408296559d76d72,1098a88df50b338300498ad27ab9815e63522af879eceda54cedcaad069cc0c206db7d18acb7da340e279569077ae1bf,0540cbf7b242a46c8b2133c287697bc2c67c13699ec4949a789cfa883d0d2c3e792f5757bdc079473ced142f5e158d35,0b2e85a5c568235613b8a3d0f454b6a3371b535aa3a470887c32bb0dcbac7aa8287c625c267da78bf44e54ffedee67ec,0976b0e5e3c2707762844ce0cc4ceb7efbcb7f5d7dbce76b99bb9ea5c4f181ec5cc4b5fb9a0ff4725e775bb6ce2b92ed,0af4715edc994b4c751e1620a7263e0d459addabd7a71f54180abd713a727e507b2653d77c6d8249fb8bdc4e15a2d3c8,0b750e94e19e26998795fb67a4984bb98ddf8f4016eb65f7b1b7856301ef05d030c5e247262241bf96e0e985907a9477,16472b1e2c7b5919d87a39831ef730eacb015b97bfc0e3b7752f4b56c53504187f6b8705a3180b0868d82571260eadf0,037e1a36cedbfc2a72baeee7e012b7176647c23c0422bdf00fcb0cca4f3f8c1af95f65513cc330371b291cf6b2f2bb9c,0729d0cf85334fca0a6714b9a38b34c4969ce5247c6bffde1637cb7d922dd07c16ff430deb7b8de025f39845f74eb64a,030b67b9c66743215b1e15caa3750694de366b6663296fd307d142da9b9027a2e4b334503a26dac8e9173e24f79cbb48,01189e869a4fbabfb8daa5fc56a6da604e775307e22ce093abe44966986e2a0241f35c23114cc44a961b8bd6a1deb32e,049793cdd584aec84b560124989879f6157629a1c717c4873bf45130c6889c7deb77ac9495ec69664a487efed216e3e6,0e38794bed871a15c84833c3e5d42b6d82d70c15da0101c2e7ede9fddc7eae9d7bc979706d07e72aea52005d3226f7ba,10ddf61a15f49cd2b8046cf887da2b6fcac37be7c082c967a8f2fec04b84fa6ba86c8b561ae281b6ed638b445b408df4,09aebc19964ee60b7aefb2c251a4a094196f7034dd9d0ed187da0533a7e1f1ab97b28307346e35072f69b67350f0ee1a,0f320be802ad88035a89faf94d270437014388134a75436d8b3af5e25c5d12d1cdd0edcb8aea0712857246bf834a4502,105cd93cb9fd0be6bcbdc07d961d2cdb349ef76b1e16a9d44d7bfadcf05b47f4d31d7d15bf666d8a6a8087b0b2ab29cc,0df20a9ae9e01da18a21b35680972b90910a3e304db3db50f8cf83d4d6922afa2e55682c1dc3be3a860f0200d4b4cf4e,04e24a87315876e95619ac8322319953b7f84323bad52509ffe05eb4a5667b06a166f18b365a8f4cdfd858674c12c40a,0b8875acdb187fa263f2dac90dea8dff052a325450a4367c219cd731a577b92428107a53f5bc4a2b154624556bb5949f,0b4635d1a1cd2f1b96d32bdb651f15dcbce50502464f7a3c7311a20822a909c46ae3a3ec92a31ea13d68a9f973681bdb,0f19b257050abf57d718f651451eea67f97a84f05272411cc2afc97410c12d0989cafa47937b4153c6129e1564312e57,077a54e3d0e43947a52707ab3221dffc0de858cd5413b5c8f750ce02bd79ee754b32f40bd88f9bd62e9a13fe79b1d5b4,184664091abd54bf15ffb03364be946daf37e354a2a9962570f79b64d8670470b84240761e558f343ea7649254cbd013,145d1651d59327f204514a21a711183710f1686f1a990ce2d44b4a65ed7a3285985cbc6de91a56b691612e5e2ee02a57,0007d55524a36b12d267e95a962fde3bd5ba34314fa37810ded7a8626cf98672d7bd4b48f3218ce5e86edf0289088ea3,10b0097cfef9ce88b164db30ac2ac77f597c9fc1822cdae7014a6789a4716e25f595c2ed0516fcadd4ef20e29bdf31c6,066ad87f0efb7c7a307bba84459d5316a11920642c42d992b592c3d517d29095a2cd07600f676d750cbbc4b04edfbc16,00fb9b5f9e70c20e78a020d555465fb232e696dd9f38d82d968f164bd2d98d092dc1d5320dfa9a5b3d490066c85dba45,024953f8badbf9211686c44a673d69f85f6158ac34eca9ce2dba1455d837a2de9642d36d8a2f8854a0b364aa3bd79d01,18e11bcc334b279a3ce4ba62a7f2980a7064fdc67f77429412440ca13c0ff0312f5a08eac1310dce3a42ab1c73833533,04e5a1e6d15868d4e4f0c6c442e9c52d9fbf96f565242b66d8e66e152d3607566259ba63ede6d6fa8d6973e022835d27,147bd4798b157ed4d3e736743faa1d103ceb6989447e9248d452f91b2043de17160383ea97c135009c47cc15624d671a,118befecbd3b48fb946cc1a4dfc8f52929b98f395676095daf690ef9386a6fdefe3c8a4aa3f8eaa9e7585f00aeebe697,09a73b5eb2ace9b5f62b8affe9a79143bb265d07b95142263a5fc980c1146d235f6a89f8af94911741d891e4cd721d27,171c08e7e2709c99f886df082e1e0cd4118719239dbbdb18d228dc988eb85926b2c6adb9472e7122aed118ef5135dfd0,09f272c7d746ef7f598dbdd118b9b06d5361d4dcfa8086f928018e531219571a370843bd577c634cf5de6faebcd3126e,0d128a38bc3d48a31e11195332b8c5a8a204e3e59034b9681a4c3d9514f27af90e92004b37c530101298f34a6466bffb,18382300aee2678a4519f4b17a7092a7f76b4b2af42b13523245579b0aa20e0653efe994864e38412e82fb487a663ebb,0d68d7d180ddf70c7fa2469f4e7851c493d48af1ffedc7f4a6d4a02b63ce2949fc878ea9758f74943b101e9e794d5448,078c2d00f1bbbabf2b58e4d8a49709cc5996d0a176789f9f92754706950facb57c0cff1dd784d2ce887d9f2e3262114b,0909ccd7e72c7952bd434a11d4246535cb3aae2fadb6cff08afed4a32d973bdb32e418ba754861de12f7c3636792522e,0b6ec5064386034726d53e63d3a1d9bff848d4e008c265205e2815af9e2ed50deda6fe04f64c388f94876eb7fd3445c9,185f4aa3b9050e21671ca2960f025ec50d4bc1fe8d3ad4f569deb98fe99c5cd3319cc066d9093674428126c6750a6cec,00e7e3595109c6563e01fd54867800943b3e38152e6d0a32115d3422e5d80ba612a5fe3d800a273531d6274578516c13,166530b6115e4d43c758ee5a687e39c358426f8159a41e92e748b80a2d8cd9c0d351b05dd98f84122f4ef20d94171749,07eb14319e034abda996289dea0c891d64cc3fdde9e9e2b6676d2fe96f00ffba9668c5d856ef07530567fb3aef17aaa5,0b95d8d4de0bbdad8b7f458f9da28b830910c5624e29aa83460ffc8498f7830d0b255e5e1525d5564bed8ae17d583afd,03a47d2d2ec8d2fa7837147495c4a6143be8e58f91c91e6412748a32dd1a33bda48b5c9ed69216c57effa187b0c8aa9f,077f7bc717b2560b8773d5c3fc03525a01a941ff72a929b286e317b7495de2ce43d653d40ce31e994b080cd8183a0515,0be1b0962fe93fe7946bf1df923fd12cf9cdc7b07fa99d0553ffbe1ce32b9de9144ff6b4cc7c62a3d64679ec32dc9f0c,01dd6422670a60d2e916294d5dea985d46ea96a63b27737121410e322e1847d4e7b9e3dd6aa8e04ee245d7e1a7f13241,0f21590653671d78043e9c6d372c41865f679415b366554879241718bc95a2c7a2e04b1b61c0e9c112985c6e10f4fdf1,0422fd1be4147d4ec040770fd1aa4e70ba92943e10659272d771e4fb37d9536e1dc3996cdb45bc4fa523d34b58ef08d2,00b1467dbb2645c2ef8e16e8b5cbd179b1580b475f1d32bfd400a4e99f23c172c5676cfc8e4f9adad1232f489a340c1b,08ec6ea940732f09b5e8de3a6fd9958fddef903d8a3ff2dece0d264bc1ea5ec6472e17951eab3103023ab50b4f52194a,160aa6c14a31c79c1b1915ff1addebe23dfcdacbd95117bce04ed9d99dea33e9de2d9e97c1cc1a5f1fb91ffd5aa0023c,164a82fd9ed676818d029d5fe2596d384b85f3fa5086f23007dcd0f023b16dcf2c0b3ae43e32f1d91334363c2629ec96,0f0efea1d3bffbe1cc4ea82b15f41b2f28eb7b53e7ce7e944b456f4fe1669a2c938c7eec5d7ceeaa53c03dcd81ce767c,149354064804e1cea886906f2b3fe96ee00e0fc0c2603f82a56649a9c864b3c41c81b0f2c49a07f5a3c852e447b9c2fb,10d1564cb621de7d0604671236207c9ac39cbb193f9a725d22cb4c963968aa00d8174bdab906e03a1d5740be06f0fb89,128a6d9c3bc0f94309faefed95bb0d6b52b0ca9f9bce23eecb6774a732df16aca5e670d9d7e565c3cb152cbff1606e83,094776371d549361ec26a30cbf335bcce648ea666b2ac471608be1d1beaca9f07c0839cbb7aa8a00a24c5259f76d610b,0fff2c4159ba172de6f30cf0de74a485a38a0cc96a62e11a26fc82d99d401247ee8e1e3c7e907c633d28589f35231861,057efd21c274e1a15400b8f10a12948a3a8bf9a65a23446774ece8e8c8c7618e8032e4ea03ad3fa333ce1405b8394478,0e04cfe3451c08b9dc5238d2bf6c762711ccc09b40eb02a875f04882af5f4e48a7ba43cd54b22c5a740cf5e902fe5364,19a96116dde9c7eb3a84604bb5bd793e469c4415792a968f40d92bf41c7b477a8f3c9629054f150acad0cd65148daca5,0bd81f5e316b869464fe73c0a45202be3ba6e1b4254c7679c6789b4a0dc25c84dbbf3b05db21923fd83109479f888a23,00c464080153a13a83bea0c2a695a3c6467e2a03e2c0cc0bf16bd959db9804b2e42ccc517bce1c157771aa780161e7ac,178c7d0319260818f645a76b4815fcaf51f6531bdccd2ba552b68b30d79cbab01b52a0613f21972fecd9c4785c011c48,011393ba528a7067b330eaa8207770fc08bd34ffd26a112f74000f33b2e006d870407df2a625fc36be7e23a658a105d0,136877999cdcb25ae6d76b70b66557d5bbc74fe30668dec3cceb6dcb5b70ca9536baa618319e917c082dbf073fe35021,185ba3019fb2636c7beedf173badc49671b4b4e65b8baf141d16a49c74644050623e3fd2749a64a2721fc216284288c9,0c615df42da5777100ac4ab6075e634177426a7a2e406def9a879c63a170bbb84228df9e54ee4925f56bd40a20c5def6,0c47d568e12d8bbe0b34017d377ad40a89e2718a41176c0f1a99a6b6519c3a1780ea0c3574aba2b10547866f39c72c40,03c69a7ccbc473c3d2b8e35733c2567b04528c05a71ef19096e2e7cc9084b10f3aade165ef193232f4d1ac785bfdcddd,163f55581d9f16a5207bb93fb636877a260ff5c45acca10c0fb7a0f61c977a8637ffdc404e3630ea8475bcf8ddee3e3d,0d28e185da6408d9f3dcc88854bed1543de7d0dd3089a835b93a79b022dc9b2f51a97b3b0611d8a0bcb6236b0015567a,00303e9dcbb98689b6e887d6845a5fcefcb5adc23e5407a877bdd41a365e2e81030479e5ab1bf47203c279745539d5e7,07cac622a80947ec9ce438dd8436ded7f877bdd395e6ee37ed0fa680e6c72fc36bfece086fd67d5b30707e760b7e15c0,16e80d030d026fd9f22bb0d590386ee5cd0694d0bb359c646006d60a6ed27f1b2a164f669a3fc92d7b5b160216baa5fd,167b0dede70310c5c65cd2974413dabf46359d51b9d5ed5ed30d4ef96b4618a0b36cb972cd4711854549e87e8ad9da68,08c0723287967b2a67079556ca108d9b9eba5799509f4f1a4141d272487399bc25d0c8ba3cffedc223f68a89e7405cce,164e1e59ad8df72a45c656818e54571e710755f0501d7a07842df612e959228e0fb0343f6c41eefd290c14530e51902e,01d21d2438240516072aef2dc5a41f8e0a8fcf10d8a5e99c5b73983a9c7ed8e6b8b4268c9f083713d73b8d2bd08a55c4,07f18232bc05c1e17761f47e32ddf4aa7c1668f4450477e96620f5fd9466a022b670d778da0fff772501d2f94646c1bb,051d52281e61ce46473de7d0b81c0730a65201aab9162a37f8828b693c7ae9b68cc0a3331810792b6be004852bcbbf3d,15d888836f26821caecc48881cead8ecaf161772cbccaa7660f38a73abe81c3f1090522a8948d42237883904bfce2841,119f6aa29426a19848984997573acbf1cded87be680ecce8ccfc39e7e58bad54942151f00a3370c64e5a7bfcd79a7585,00ee43e73d460496b140ddea7c269d9e5f9c7667c097bf294cc12029e48adad5a951f3db1ec99f5536a825fb8e4ae18a,1744de6f243aad17f7956e73f10f05e311a5073ddb7e086d795a09d648d9967d1ac149edb7d9b894f2b809ce281597f8,0964c43fde732ba6d2e7e504c30d1e5bca4b7fae88154c7714b500cc9ec2515c79d18c2f1841b5679ce4024b1dfb8120,0a0e278a3a14f3a4abf74a50df67d94259997461a3f04456bec24bcf8f5e766eedf4c5cec98bb3e5c8aae70d677f915b,0a519f934edf38e363f63d5cb7d7ef42d79b0c40bedf5ee476ba59c2982a448f4ff5b2e85155344ce537c4068fe20eae,0d7e48d6a4d0b760fd348b80522bc44099ffd4c113c9dfae7dd1965254fd6349cfe367a13a03e9c59b845a6a182be3f9,14a92ff29e69681828ab2349f07b282efeaf9041617ef528446da683632f543aef7c1adf6ef3a86762ef5207f2167566,0b402bda56cfbacc5df30977f2abe5f2c124707517a87e1be1581daced1dc76656dc7dd7c1444f30d6d231152304f458,0859044cfcbd98680091b4273c8bad57680ad0d8ec94d15d47e56b3a4d0556fbc1e9c202528e3d1eb381073154c75466,0d936bb51d78851f14c7f59aa40c1393513739175654a237289487f0c7769a920cf95d7f7b7f33f01db8c9c5a7152808,083eefdf26479e4ab22eb29f63c8e7a0396f8d68cf2490727869fcfef4a28c0cc60a10af6f3ebe94e36b3f27c9445f15,192fa334e28c89f0497f0efe3852710679846219f31350aab9878a9564fab8ec6b0f80e7059185eb1e21c95fde7acc0d,1284b780a63069963fa52dcad439221b7a989275191e5ccd51ac6f7cdd5afea693d8b80d667ba1faa0ff153ff8945907,120a4ceca1b79d90bc87937ce162bf5afb526c933af83c002897bb714ec76e104d50bf5f075435fe9e4d1df7768ec976,14f969981137edcae8c51ec84fecd9854d38b2d7ab36b90d9bfd2b1939f0d8e1711189b7bc0a0786d3a1d7f5a82808c1,1574e558dd57b7bb88e8947b2873e9a0b1e2ac91ffa36a43c2a7ad447a473d090e6c31562916ec75f9ae6e7f23e1d183,055bbd9217e7c4219eb23ef4f41ea00988c536238747574ff6130c852f8abfec73af0429dcea5cd9a3309179186f829f,00c9bdf50f0d1d4aad99c034a62221ae790c9c3d8d9e6393accf2dbf7191561e8fa8a03d0eba83b1fe84d4e72183215b,0748f478ef452544d34388175c0e37969515bd3c2f198028aa4d3a6b294f5cb11e5d6c4442379475eed8a44eba5ce779,1891fd758f4122852f4856e9c4177570fe8205218402aaf5398ff255852b8438af1d07d8d5f0472a4827291ff32ca9d0,10a71032a784fc7e89734b3f66f5bb640c5377cfa762b8d71a418739f2a6f7e6dbf750f2177138f099bbf866dd2527d5,04c19b663c45ff653d582e6694c1332b4feada37b28910714a834f2f6c2bc6ac238d0a80e18905e9c5e8a069cb79e202,01addecfb6ae315271349cbc54eec9788caea8e42b25ab5f5a9dc3e7001fc01184be5daac997fea2757cfe618d30a766,17e29412f7863adf73ed5e02424d84f6d8b50e2e3e4cbc67d82c40fec6cdcaa1f4e6dcab2b7e353f672b99e1a066587c,06a4526cbd242edfb340bbba5ca7c834343237d9a3558f7d8d7a5aa515f9ff209239178f9c7dc5dcf487300ec3a2ae0c,0029bc8185dbd1843263e0f4eba5c30b6faec72895f62d2f8365ab446fe001b4f826bfa1640ae82029e0563f0eda59b8,0ee70e93a57b6644d75fe29187c2599beb930f9ca9c69d6474f04d0a1fcda71a02ae9e8916655fa042c515aa4ceb6655,00500e8c34d680ae0d43a3e84a2a4d6a1dad05d7fc7a6db8fceb2febe2f9d899937ee3d7b5dfa2af7248dc6920809e37,05e2496094e498bdfa05aa676973b7a7fcd9f70cfd859ad342e1ac3480998e150c5ffba8d750b0ca51f88b1d1c34706c,1196e116c4f6ae092a3308122ccd09e8fee95277a6d5cd4c33ed084895d4b1e40dd650fb7db009b69a86a33b725cc39a,0b8745eee6cec3513b8e142d7d122813c4ef51a856d533093bb6d74ed6073264dc9f4bcd889b7dc034ed0b578d3658c0,110815b3ed5cfcccc993eda5e6272573b7b73a62bb27a85b3d5edf6f41a186cdd3e0bbd52b92c1ecba182cc120eabd54,080d6fd19269b333a206819d21bac42bafca7acb748363112098d357bd863eac44d694aa20bbfc88dc4430e292e4a01b,02d355830be701ae5dc0e04149e258f16208c5e5a771ca5a3827baf837d8ebdb6497db7fe13e14b2bf368380119b66c4,0057973cff03522b3031fda563891aa942125320be89b1226bc646e69e219a16274ae48396aa8b45be38e3c691247361,04c15f4475385a4c8da5e854ee22047d557dc0e5a902d9cf1b7a15f675e494a5279ceca134a291fa0c90bdd669269a4f,0adef7e30f15446e0d0308b19760dfa878fada2bbbf847a360b8333a7f488a49d1f61b11209139d9dfd18238b3f2e7bb,03e9674ca3e94c1493106228dd36dc08e3f1054b045cc8ce0c2b441fded4d512e81ebb082a83810d9d5a97ea213a158b,00a840ddebd2809998cd943ecf635e944116135576cf781014bc7ff02e0cd13e6a88bbb9082cd0f70eb0d1f58afa4cb3,172e5019a2315b706dbe6c391f0d652b7f8dad9bca83e08adf20e20577c6d6fa67c3939d809337bb29f5ae1796e959e4,0436f10695b5d8484e67eb3260c5a4b721c9ece0a72239cf081d1c6fce80c3940b1e3f65791529bbe71b55ba94b4de1f,05cc3e4936c915ff2c4c28b2de8097719af68b3d5eae1f7e991ec722e98b3a6c9b0acd1fb5f6ce4a3267c01bdbb419ca,16e6b6a08e681348604162bc3ae75a17a0305f3707672375380b70d19d0af7c06425887492f8ffc486c437da6de36104,101fc082e1e4eb3b500a781ef2de5fc54e349d643e9bed315a22c169a11d0df3deee571312839966147e28395e287cc4,07052111a043a47127fb3e71018fbb62e4b0fdde669f7e0fbe28533121c7123bdb201b506a3d8a20c0b0f5623a2af612,044f2c9171fb093f42a2a5cf2764e88aa245d6327e6294ad41d72971a86f00e83af2d03d9887b855cc5bddb5182352b0,023bc737af1675138e33c7d70651a78e49c5d639c2ec98e5c96144edb4298f9f9ddc16e949f187daa802334cc467f777,1656d48494cc233d331bebf1f7e6896573b298c6fe1ffb215a7b071e6a776951d1f6461b7efe9a2d9324234a1f0e47c4,1031229bccd53f2b33fa7567acb6f4e192fb04847c20ae8ed0502a72177857178ef9a71533e8a1e782978bebf35daa7b,0cb412e1f0533ef873afde5ff9ea56a03ec8d9316400a299532d54af94f71245a8df168682cb0219db57d6eeaca403d4 diff --git a/crypto/src/hash/poseidon/mod.rs b/crypto/src/hash/poseidon/mod.rs index d628fea3e..a8dc8cd36 100644 --- a/crypto/src/hash/poseidon/mod.rs +++ b/crypto/src/hash/poseidon/mod.rs @@ -1,310 +1 @@ -use crate::merkle_tree::traits::IsMerkleTreeBackend; - -/// Poseidon implementation for curve BLS12381 -use self::parameters::Parameters; - -use lambdaworks_math::{ - elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::BLS12381PrimeField, - field::{element::FieldElement, traits::IsField}, -}; -use std::ops::{Add, Mul}; -mod parameters; pub mod starknet; - -pub struct Poseidon { - params: Parameters, -} - -impl Poseidon { - pub fn new() -> Self { - Self { - params: Parameters::with_t2() - .expect("Error loading parameters for Posedon BLS12381 hasher"), - } - } -} - -impl Default for Poseidon { - fn default() -> Self { - Self::new() - } -} - -impl IsMerkleTreeBackend for Poseidon { - type Node = FieldElement; - type Data = Self::Node; - - fn hash_data( - &self, - input: &FieldElement, - ) -> FieldElement { - // return first element of the state (unwraps to be removed after trait changes to return Result<>) - // This clone could be removed - self.hash(&[input.clone()]) - .unwrap() - .first() - .unwrap() - .clone() - } - - fn hash_new_parent( - &self, - left: &FieldElement, - right: &FieldElement, - ) -> FieldElement { - // return first element of the state (unwraps to be removed after trait changes to return Result<>) - self.hash(&[left.clone(), right.clone()]) - .unwrap() - .first() - .unwrap() - .clone() - } -} - -impl Poseidon -where - F: IsField, -{ - pub fn new_with_params(params: Parameters) -> Self { - Poseidon { params } - } - - pub fn ark(&self, state: &mut [FieldElement], round_number: usize) { - let state_size = state.len(); - for (i, state) in state.iter_mut().enumerate() { - *state += self.params.round_constants[round_number * state_size + i].clone(); - } - } - - pub fn sbox(&self, state: &mut [FieldElement], round_number: usize) { - let is_full_round = round_number < self.params.n_full_rounds / 2 - || round_number >= self.params.n_full_rounds / 2 + self.params.n_partial_rounds; - - if is_full_round { - // full s-box - for current_state in state.iter_mut() { - *current_state = current_state.pow(self.params.alpha); - } - } else { - // partial s-box - let last_state_index = state.len() - 1; - state[last_state_index] = state[last_state_index].pow(self.params.alpha); - } - } - - pub fn mix(&self, state: &mut [FieldElement]) { - let mut new_state: Vec> = Vec::with_capacity(state.len()); - for i in 0..state.len() { - new_state.push(FieldElement::zero()); - for (j, current_state) in state.iter().enumerate() { - let mut mij = self.params.mds_matrix[i][j].clone(); - mij = mij.mul(current_state); - new_state[i] = new_state[i].clone().add(&mij); - } - } - state.clone_from_slice(&new_state[0..state.len()]); - } - - fn permute(&self, state: &mut [FieldElement]) { - for i in 0..(self.params.n_full_rounds + self.params.n_partial_rounds) { - self.ark(state, i); - self.sbox(state, i); - self.mix(state); - } - } - - fn ensure_permuted(&self, state: &mut [FieldElement], offset: &mut usize) { - // offset should be <= rate, so really testing for equality - if *offset >= self.params.rate { - self.permute(state); - *offset = 0; - } - } - - pub fn hash(&self, inputs: &[FieldElement]) -> Result>, String> - where - F: IsField, - { - let t = self.params.rate + self.params.capacity; - if inputs.is_empty() || inputs.len() >= self.params.n_partial_rounds - 1 { - return Err("Wrong input length".to_string()); - } - - let mut state = vec![FieldElement::zero(); t]; - let mut offset: usize = 0; - - let n_remaining = inputs.len() % self.params.rate; - if n_remaining != 0 { - return Err(format!( - "Input length {} must be a multiple of the hash rate {}", - inputs.len(), - self.params.rate - )); - } - - // absorb - for input in inputs { - self.ensure_permuted(&mut state, &mut offset); - state[offset] += input.clone(); - offset += 1; - } - - // squeeze - let mut result = vec![FieldElement::zero(); self.params.rate]; - for result_element in result.iter_mut().take(self.params.rate) { - self.ensure_permuted(&mut state, &mut offset); - *result_element = state[offset].clone(); - offset += 1; - } - - Ok(result) - } -} - -// Test values and parameters are taken from https://github.com/keep-starknet-strange/poseidon-rs/blob/f01ff35ab4dca63a9d6feb7ff3f46c9b04b28b04/src/permutation.rs#L136 -// (values are parsed from decimals and have been converted to hex in our mod) -// The field that these tests use is defined below, and parameters are stored under /s128b -#[cfg(test)] -mod tests { - use lambdaworks_math::{ - field::fields::montgomery_backed_prime_fields::{IsModulus, U384PrimeField}, - unsigned_integer::element::U384, - }; - - use super::*; - - #[derive(Clone, Debug)] - pub struct TestFieldModulus; - impl IsModulus for TestFieldModulus { - const MODULUS: U384 = U384::from_hex_unchecked( - "2000000000000080000000000000000000000000000000000000000000000001", - ); - } - - pub type PoseidonTestField = U384PrimeField; - type TestFieldElement = FieldElement; - - pub fn load_test_parameters() -> Result, String> { - let round_constants_csv = include_str!("s128b/round_constants.csv"); - let mds_constants_csv = include_str!("s128b/mds_matrix.csv"); - - let round_constants = round_constants_csv - .split(',') - .map(|c| TestFieldElement::new(U384::from_hex_unchecked(c.trim()))) - .collect(); - - let mut mds_matrix = vec![]; - - for line in mds_constants_csv.lines() { - let matrix_line = line - .split(',') - .map(|c| TestFieldElement::new(U384::from_hex_unchecked(c.trim()))) - .collect(); - - mds_matrix.push(matrix_line); - } - - Ok(Parameters { - rate: 2, - capacity: 1, - alpha: 3, - n_full_rounds: 8, - n_partial_rounds: 83, - round_constants, - mds_matrix, - }) - } - - #[test] - fn test_poseidon_s128b_t() { - let mut state = [ - TestFieldElement::new(U384::from_u64(7)), - TestFieldElement::new(U384::from_u64(98)), - TestFieldElement::new(U384::from_u64(0)), - ]; - let poseidon = Poseidon::new_with_params(load_test_parameters().unwrap()); - - poseidon.ark(&mut state, 0); - let expected = [ - TestFieldElement::new(U384::from_hex_unchecked( - "16861759ea5568dd39dd92f9562a30b9e58e2ad98109ae4780b7fd8eac77fe8a", - )), - TestFieldElement::new(U384::from_hex_unchecked( - "13827681995D5ADFFFC8397A3D00425A3DA43F76ABF28A64E4AB1A22F275092B", - )), - TestFieldElement::new(U384::from_hex_unchecked( - "BA3956D2FAD4469E7F760A2277DC7CB2CAC75DC279B2D687A0DBE17704A8310", - )), - ]; - assert_eq!(state, expected); - } - - #[test] - fn test_mix() { - let mut state = [ - TestFieldElement::new(U384::from_hex_unchecked( - "13f891b043b3b740cc3e1b3051127d335f08e488322f360a776b3810b7dc690a", - )), - TestFieldElement::new(U384::from_hex_unchecked( - "1bd24b7cb99acf0dbea719ff4007bd60105bcefef21ec509d2f8d4f9bb6a3a1a", - )), - TestFieldElement::new(U384::from_hex_unchecked( - "110853eb2ebee0d940454fe420229a2a0974e666d16c92bab9f36cbd1a0eded", - )), - ]; - - let poseidon = Poseidon::new_with_params(load_test_parameters().unwrap()); - - poseidon.mix(&mut state); - - let expected = [ - TestFieldElement::new(U384::from_hex_unchecked( - "1d30b34b465f8cddc8dc468f137891659c7e32b510cf41cec3aac0b26741681d", - )), - TestFieldElement::new(U384::from_hex_unchecked( - "c445fa4dd2af583994272bede589b06b98fe9cd6d868bf718f6748ba6165620", - )), - TestFieldElement::new(U384::from_hex_unchecked( - "1ed95ae0ea03bb892691f5200fb5902957ac17b3466afa62be808682801f97f9", - )), - ]; - assert_eq!(state, expected); - } - - #[test] - fn test_hash() { - let poseidon: Poseidon = Poseidon::new(); - - let a = FieldElement::one(); - let b = FieldElement::zero(); - - poseidon.hash_new_parent(&a, &b); - } - - #[test] - fn test_permutation() { - let poseidon = Poseidon::new_with_params(load_test_parameters().unwrap()); - - let mut state = [ - TestFieldElement::new(U384::from_u64(7)), - TestFieldElement::new(U384::from_u64(98)), - TestFieldElement::new(U384::from_u64(0)), - ]; - - poseidon.permute(&mut state); - - let expected = [ - TestFieldElement::new(U384::from_hex_unchecked( - "18700783647721BB9AD092B176BBEB5348401C21132CCF83C30134DFAB5A2DEB", - )), - TestFieldElement::new(U384::from_hex_unchecked( - "1CC8856652601B3C81139AD5EC13E4A3A8F4A5DB242555521A09E002E7A10B2B", - )), - TestFieldElement::new(U384::from_hex_unchecked( - "3DCB1CEC811FC2D7401CA7B9B084D167F33B6983D4428C8E0534C9C3CECF46D", - )), - ]; - - assert_eq!(state, expected); - } -} diff --git a/crypto/src/hash/poseidon/parameters.rs b/crypto/src/hash/poseidon/parameters.rs deleted file mode 100644 index a09a150e4..000000000 --- a/crypto/src/hash/poseidon/parameters.rs +++ /dev/null @@ -1,82 +0,0 @@ -use lambdaworks_math::{ - elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::BLS12381PrimeField, - field::{element::FieldElement, traits::IsField}, -}; - -type PoseidonConstants = (Vec>, Vec>>); - -pub struct Parameters { - pub rate: usize, - pub capacity: usize, - pub alpha: u32, - pub n_full_rounds: usize, - pub n_partial_rounds: usize, - pub round_constants: Vec>, - pub mds_matrix: Vec>>, -} - -/// Implements hashing for BLS 12381's field. -/// Alpha = 5 and parameters are predefined for secure implementations -impl Parameters { - // t = 3 means width of input is 2 - // sage generate_params_poseidon.sage 1 0 381 3 5 128 - // Params: n=381, t=3, alpha=5, M=128, R_F=8, R_P=56 - pub fn with_t3() -> Result { - let round_constants_csv = include_str!("bls12381/t3/round_constants.csv"); - let mds_constants_csv = include_str!("bls12381/t3/mds_matrix.csv"); - - let (round_constants, mds_matrix) = Self::parse(round_constants_csv, mds_constants_csv)?; - Ok(Parameters { - rate: 2, - capacity: 1, - alpha: 5, - n_full_rounds: 8, - n_partial_rounds: 56, - round_constants, - mds_matrix, - }) - } - - // t = 2 means width of input size is 1 - // sage generate_params_poseidon.sage 1 0 381 2 5 128 - // Params: n=381, t=2, alpha=5, M=128, R_F=8, R_P=56 - pub fn with_t2() -> Result, String> { - let round_constants_csv = include_str!("bls12381/t2/round_constants.csv"); - let mds_constants_csv = include_str!("bls12381/t2/mds_matrix.csv"); - - let (round_constants, mds_matrix) = Self::parse(round_constants_csv, mds_constants_csv)?; - - Ok(Parameters { - rate: 1, - capacity: 1, - alpha: 5, - n_full_rounds: 8, - n_partial_rounds: 56, - round_constants, - mds_matrix, - }) - } - - pub fn parse( - round_constants_csv: &str, - mds_constants_csv: &str, - ) -> Result, String> { - let round_constants = round_constants_csv - .split(',') - .map(|c| FieldElement::::new_base(c.trim())) - .collect(); - - let mut mds_matrix = vec![]; - - for line in mds_constants_csv.lines() { - let matrix_line = line - .split(',') - .map(|c| FieldElement::::new_base(c.trim())) - .collect(); - - mds_matrix.push(matrix_line); - } - - Ok((round_constants, mds_matrix)) - } -} diff --git a/crypto/src/hash/poseidon/s128b/mds_matrix.csv b/crypto/src/hash/poseidon/s128b/mds_matrix.csv deleted file mode 100644 index d3c6af6e3..000000000 --- a/crypto/src/hash/poseidon/s128b/mds_matrix.csv +++ /dev/null @@ -1,3 +0,0 @@ -cf637e74647c1797112d9a892ab349f752a41d0786fe3ccfe8aa8b19100e8c2,1126899aecd525518a149bd72873b63a2e63ddce2beeb008b174602d5627e37a,12c89bb904f498c2b93b27b25de1ecb92fceed11ac0edc9e4fa579ab59dbbb68, -5755e4439812879f5de90df763ea97b39ec65d17d51029fa43766692a018caf,e40fb0bb50b31f195cd880c9fa733623e9ade8ba440998a89648cfa4986d1fe,58516197c95d98f783f2e5f2cfb295278c521f10e79022aed0a4e95234400f5, -4d1d1386e0cf786cbe76072195538fde6ad46f5d2a56130a3eebb204210c046,173b460d8dcb542a860598f41981a1be0a33473a94dc67168c5a4ab66d5d29eb,13c5fbb65e8c090e2395fb03b71da4ad138e18486882a863f9a090fbe53c063d, diff --git a/crypto/src/hash/poseidon/s128b/round_constants.csv b/crypto/src/hash/poseidon/s128b/round_constants.csv deleted file mode 100644 index ffa5cbc40..000000000 --- a/crypto/src/hash/poseidon/s128b/round_constants.csv +++ /dev/null @@ -1 +0,0 @@ -16861759ea5568dd39dd92f9562a30b9e58e2ad98109ae4780b7fd8eac77fe83,13827681995d5adfffc8397a3d00425a3da43f76abf28a64e4ab1a22f27508c9,ba3956d2fad4469e7f760a2277dc7cb2cac75dc279b2d687a0dbe17704a8310,1e26c47a7d421f24f13c4282214aa759291c78f926a2d1c6882031afe67ef4dc,f8985f8e16505145bd6df5518cfd41f2d327fcc948d772cadfe17baca05d6a7,1d427f108675136e204c659875341243c6e26a68b456dc1d142dcf3434169714,15af083f36e4c70f454361733f0883c5847cd2c5d9d4cb8b0465e60edce699dc,fd71701bde3cf8e54fa3f74f7b352a52d3975f92ff84b1ac77e709bfd38888f,603da06882017d49c26f8a6320a1c5eac1b64f699ffea44e39584467a6b1d4d,1c332a6f6bde2f1f8e79ce13f47ad1cdeebd8870fd13a36b613b9721f6453a63,1d3d0ebf61664c9b5310a04c4dec2e7e4b9a813aaeff60d6c9e8caeb5cba78ea,d346a688948442c5ae5ebcb88028d2a6c82f99f928494ee1bfc2d15eaabfecf,1d50a9e24176501da7631ccaecb7a4ab8694ab61f238797098147e69dd91e5af,1a19dcccb783b05aaa62773fedd3570e0f48ad3ed77c8b262b5794daa2687018,1cb085eb1df424933453cc97445954bf3433b6ab9dd5a99592864c00f54a3fac,d3e8a8e8a404bad3af2bf3c03e420ea5a465939d04b6c72e2da084e5aabb797,15ca045c1312c00b1bd14d2537fe5c19fb4049cb137faf5df4f9ada962be8cb3,7c74922a4567ec444997e959f27a5b06820b1ed97596a969939c46c16251806,8c0bba6880d2e3d6bf5088614b9684ff2526a20f91670435dc6f519bb7ab843,4526bcaec43e837d708dd07234c1b2dc1a6203741decd72843849cd0f879353,9cc9a17b00d3564d81efaea5a75a434bef44d92edc6d5b0bfe1ec7f01d613f7,828b1e269b84bd912aa8cdbead0bc1ce1eb7284e2b28ed90bc7b4a4fde8f026,1e2af2f41d76c3f01d9a2482fbdaf6590c19656bcb945b58bb724dc7a994499c,1dcfd7e44946dad9b2618213b0d1bf4a2269bed2dc0d4dbf59e285eee627df1d,7ff2afb40f32e6456fdd1b94da8d3bbcf0312ab9f16ac9bc31955dc8386a75c,1dcd236bdc15b4fc83e90bab8ae37f8aab40efae6fa9cd919b3248ee326e92a5,5463841390e22d60c946418bf0e5822bd999084e30688e741a90bbd53a698a,1a4c940fff3fe757b2021f13eb4d71747efd44a4e51890ae8226e7406144f81d,4e50cb07b3872728dc88f05393d9d03153ca4c02172dd1d7fc77d45e1b0455e,e2ca053e4da0f257b430e53238d2bab1d9b499c35f375d7d0b32e1189b6dcbf,f19f20ac59d1da1aaf37fe0b851bc2419cd89100adff965951bff3d3d7e11a1,17645ca5e87a9f776a82fe5bb90807f44050ac92ca52f5c798935cf47d55a902,95b8aeaca96aab0200eed38d248ecda23d4b71d17133438015391ca63663771,1853d94dbbca7bf5aa8252f106292ac3b98799e908f928c196c1b658bf10b2f1,1a8f90b403e24034c6f4c0a3b70edbb3942b447c615c0f033913831c34de2d2d,2485167dc233a02e1161c4d0bf025159699dd2feb36e3e5b70ae6e770e22096,19c8b08a90d6ed89ff7de548541dd26988f7fdaacdd58698e938607a5feca6f7,105c3bf5cba23fc66b75e79d146f9880c7c4df5ecdad643ce05b16901c48830,a38019787f4cc1c627a65a21bef2106d5015b85dfbd77b2965418b02dbc6bd8,15e624d7698fd09b73dce29a5f24c465c15b52dec8172923a6ebc99a6ddc5ed,5d3688ba56f34fdf56bc056ad8bf740ca0c2efef23b04a479f612fde5800a0a,a29abdef3fef7839e67ed336e82dc6c2e26d872d98b3cce811c69ae363b4451,1be8096ecfcbce15ee400801a56f236db2c43d1e33c92b57ac58daf2d3fc44de,1bad5fec670d6ec8108d605aae834c7ce6a7cd4e1b47bf6a02265352c57db9d5,fcf4598c0cf131d75877afdbb4df6794ef597fff1f98557adca32046aeaef1a,58aecc0081b545f4a4d1c4c8f27932e4170c37841fef49aca0ec7a123c00adf,f57b4b7ee98dffe5460b71995790396e4ef3c859db5b714ec09308d65d2ca6b,16b82800937f87fff3cd974f43322169963d2b54fd2b7ed348dc6cc226718b74,103a915b1814709473427e34ab8fbb7ca044f14088fedae9606b34a60b1e9c66,d4afbf1bd98ff28f9bc01028ff44195c0bb609d367b76269a627689547bfbff,1de1ceb846fe12b1b9524c7d014931072c3852df2d991470b08375edf6e762d3,ff751f98968213fbe5dff3ce06e8cb916709e0c48e3020c6b2b01c1bec0814c,36f6b64463f7afdfc3180616e340536bea7f01d226b68b6d45cd6dfbff811f3,161135c9846fadf3b4511d74fe8de8b48dd4d0e469d6703d7ed4fe4fe8e0dbc0,8b58921a3fbdb4e59b78f6acfca9a21a4ba83cc6e0ae3527fbaad907fc912bf,22a4f8a5cdc7438b9d16b61c2973847211d84eb2fb27b816e52821c2e2b1b21,c1cf6db5d6145fefeccbbc9a50b2ceedeb1765c61516ffcb112f810ad670370,10be44689973d9e51cfc05fa8f4aec6fac6a0ff2fdfab744ade9de11416b6845,1b9bf209c4e117606489cda45128096d6d148a237142dc4951df0b8239be1497,1a09cf541e5f74f32b93310b8ce37b092a58282643860b5707c7eb980ea03a0c,6b562e6005f334a0bdc218ba681b6ba7232e122287036d18c22dd5afa953282,180e8103a23902b55dc6d5f59253a627a2a39c8aca11a914670e7a35dea38c95,6a3725548c6648506bdc1b4d5f9bed83ef8ca7468d68f4fbbf345de2d552f78,e7fcd6997472d37605d0f01a8eccc5f11a45c0aa21eb4ebb447b4af006a4a4a,a6144c95c8de1d04075784d28c06c162a44366f77792d4064c95db6ecb5d006,15b173c8b0eb7ebe4b3a874eb6307cda6fd875e3725061df895dc1466f35023b,17e1c2d6fde8ac8587bae06ad491d391c448f877e53298b6370f2165c3d54de0,1cdb779f3e5b7367996f451b156fe4e28f74d61e7771f9e3fa433b57ca6627b8,bb930d8a6c6493713435ec06b6fed7825c3f71114acb93e240eed6970993e9,c472d73b28304fed708467e9296fb5599d3a08814c31c4189e9579c046e8796,1fba9c303dfee1679e10e3c883ca5ce5614d23739b7cb2052cc23612b11170fa,121c0e3319ede3390425dc9b2c1ed30e6356cb133e97579b822548eb9c4dc4cb,acfd61139e50c4a37b09933816e2a0932e53b7dc4f4947565c1d41e877eb1a7,dabea18941a47e3844544d92ee0eca65bdd10b3f170b0dc2f30acd37e26d8fd,1f7088fdb015c7137a6265e44fef6f724ea28ae28b26e6eee5a751b7ce6bcc2d,babdc9d677230535b3e3c43cfd443076b4ce33cddbc8446120dce84e6122b80,a250f430b7fe72e2e5d00b6b83e52a52ca94879ccfab81a7a602662c2d62c57,1dc92ef479c11a801fb24ef76d57912b12660e7bd156d6cabbb1efb79a258630,1235ec59739163f9510f616fa8b87900fd08fd4208a785cffcf784a63a0fd5d1,1ced4e872eb7e72d207be77e9d11e38f396b5c0ba3376e855523c00b372cc66e,15f9406febca3823b756ef3f6331890b3d46afa705908f68fb7d861c4f275a23,19d9c501d9ff1efd621a9f61b68873c05f17b0384661f06d97edf441abdaa4ac,14b0de22bbd0a43f34982c8e28d2f6e169e37ba694774c4dfa530f41c5359542,9b4d48bd38a3e6b02186aabb291eca0d319f0e3648b2574c49d6fd1b033d913,f558bbea55584d01725d8aa67ddba626b6596bbd2f4e65719702cefcead4bac,11108f1a9500a3e9561ea174600e266a70b157d56ece95b60a44cf7a3eef17d2,8913d96a4f35c12becb92b4b6ae3f8c209fb90caab6668567289b67087bf6c,1e502262c51ad8ed16926346857dec8cca2e99f5742b6bf223f4d8a6f32867ac,fcb5fcdc00891662889280505c915bde962ea034378b343cd3a5931d2ec0e62,12eb919524a898a4f90be9781a1515145baea3bc96b8cd1f01b221c4d2a1ce9e,58efb6272921ad5eada46635e3567dced0662c0161223e3c1c63e8de3ec3d7f,1e2fcd49ca9c7452b436d205ffc2a39594254a1ac34acd46d6955e7844d4f8a3,e3589533083872be62d9acce0b625f885e5941e54bd3a2106fcf837aef5314b,7da445b81e9b31f6d47a5f4d23b92a378a17f119d5e6e70629f8b41fefb12ec,2b22dab62f0817e9fc5737e189d5096a9027882bef1738943b7016256118343,19af01472348f224bacdfed1d27664d0d5bdea769be8fcb8fbef432b790e50ed,76b172dbbeec4b31de313b9390f79ec9284163c8e4986bc5b682e5ac6360315,1070efaeae36f6590f362f6cb423d2009b30ddb4178d46def0bdb2905b3e086a,186cb99b36e5203b0a39872686b84ee1d28c4942b8036a1c25a0e4117ccaeef7,1a9fd44305a5a99e0bbf9674e544bda0fb3d0fe5bb3aa743fd1b8a4fc1dc605b,106b447ded1045663629b184d8c36db3a11a6778d8848142aa6363d6619f977b,642a8b4be4ba722cbfcf55a77339b5d357cceb6946fdc51c14b58f5b8989b65,1c89e0a26f65a0f5cc6cc6aa5b6e775cbc51a73700bd794a7acd79ae1d95883c,bb19d4ef195967cbf78ab5dc2fd1d24816428f45a06293c1b9d57b9a02e920d,1fd2dd994756ea86a576b74790b2194971596f9cd59e55ad2884c52039013dfe,1922810cc08f493f300df869823b9f18b3327e29e9e765002970ef0f2e8c5f9,52f3afaf7c90f3f1d46e1d79a70745b39c04376aafff05771cbd4a88ed418b8,17ccfc88e44a03fda95260f44203086e89552bbe53dcc46b376c5bcab6ea789f,a949125939e69464100228beff83823f5157dd8e067bc8819e40a1ab008ddb2,16cb64e3a0d37a504273ce4ee6929ba372d6811dde135af4078ba6e1912e1019,10d63b53707acf3362f05f688129bf30ad43714257949cd9ded4bf5953837fb6,18bcb1549c9cab70d13bb968b4ea22d0bb7d7460a6965702942092b32ef152dd,13d1c5233657cddbf5ead698fe76f6492792a7205ba0531a0ca25b8d8fe798c9,12240b9755182e57066c2808b1e16ea448e26a83074558d9279f450b79f97521,8cc203d8b0f90400fe8e54f343cef59fe8d70882137de70c9b43ab6615a6476,310c6cc475d91a2e061bacdc175ea9e119e937dea9d2100fa68e03c1f779120,ff84b639f52e45920bc947defced0d8cbdbe033f578699397b83667049106d7,1584ca7f01262b51d89c4562f57139f47e9f038cb32ec35abe4e1da8de3e165b,1135eefaf69b540af7d02f562868be3e02fdc72e01e9510531f9afa78abbbf3,372082b8a6c07100a50a3d33805827ad350c88b56f62c6d36a0d876856a99e8,17c3c12b819a8acf87499bac1a143fc59674f132e33898f0c119e3d12462dfe8,4f1354c51e8f5a05b84157cfeff6822c056ce9e29d602eb46bd9b75a23836db,ada9f26a82714c6075739ba206507a08ac360150e849950ef3973548fbd2fe0,1287173956a2bd2f11b5ec29195e38cc3f6a65ff50801aa75fd78dd55070285a,7273101c190fe38212420095a51c8411c7f3227f6a7a4a64ae6ba7f9201e135,2dbf2a6b56b26d23ebeb61e500687de749b03d3d349169699258ee4c98005fc,885b6cbb29739b7808e67f00ab89b52ab89ef8d92530394e4b910efd706c7fc,bd55b5f1171ef731dacbcbadfd5b910b493fa9589fd937e3e06ce26b08925aa,10aaedaa6ef2f9667d16b3b295410c0e44f7a2f8135c207824f6ae2a9b16e91d,6aca6ebf70b1c006c6331e9f1a5c4cc89b80f8adc5d18915c1cd0d496ccf5ea,1678602af36a84abb010f831d403d94d5e90003e6d37c677e9dd157fb27776,2022036bdf687b441b547fefdf36d4c2cd3f4b0526a88aafe60a0a8f508bad5,87bfc350957c979ca664397414bdfb8f9b8dfe49fb63e32353d4e2e8d1d4af7,12d639cbd418ca95c24ea29ccd1d15ab81f43a499b27a06d3c5e2176f7ad79c0,ecdea7f959a3e488403d5b39687a1fe0dee3369e5fbc0f4779569f64506e18,bf656bdc4fefda3b70658e2f1992ef9f22e5f2d28c490e21d4e34357154b559,10d1b8cb1561ee7d2319638ccab9033dfec47596f8a6f4ce6594e19fddd5925c,1758ffc77c62e312f86ef6ea01545ad76f281ec2941da7222d1e8b4e2ec1f1a0,1a0315ca07956f6e995386e96aeaa1b4596aacd28f83c32f29a591c95e6fcadd,3e55cf341e7c280cb05f3d6ff9c8d9f2cfe76b84a9d1b0f54884b316b740d8d,14d56feb32cde735eede9749739be452e92c029007a06f6e67c81203bf650c6d,1cee807aa678a8ab33b6171eaa6a2544497f7599fb8145d7e8089f465403c8ad,1a5d2bacc8f1ed4048cb5f394de2cb6e1f365e56a1bc579d0f9a8ad2ef2b3836,1df573de597ce1679fc20051f6501268cd4b278811924af1f237d15feb17bd4f,b0297c3c54a4ecc5826a280e053cf7a3c1e84a1dcf8b33c682cf85ddac86e01,1af5e9c47c9a862343c7526a59783f03c6bc79b69b8709fe6a052b93a8339af7,19bf75c7a739da4829f9c23065ff8ccb1da7deec83e130bcd4a27a416c72b854,e0563d5f852ad6c5989017bd5c4cfdc29cd27fc4e91eeabdb8e864df3c3c685,fa4b1d70885a92b0969635468daec94f8156c20e3131bd71005be1cd16ccfb1,1b47bb025695e416f1e201cd62aa4600b8b85cf718cd1d400f39c10e59cc585e,e783ab1e1ef97189e7f9381eb6ab0de2c4c9c2de413691ba8aa666292e9e221,933e0280c6de7b77b3870a07823c081fd9c4cb99d534debd6a7bfb4e5b0dd59,8865d450ce29d212fb5db72460b3560a2f093695573dff94fd0216eb925bef6,11de023f840e053035526dabacf0dee948efba06bcbb414ecd81a6b301664e5c,855fc1e341bfcdc805015a96f724c5ac7cc7b892a292d38190631ab1a5388d4,12df6557bfd4a4cde7b27bf51552d2b5162706a3e624faca01a307ef8d53285d,913a8a66962cdddd92a6bd3e9c1d55ef8f226da95e4d629046d73d0507f6275,1a71577d6ee9f9027f2c889874ba5b44ca1076033db5c2de4f3367b08c008e68,b396b33911218d7b0365c09348a561ef1ccb956fc673bc5291d311866538581,19e1392f2da08450c8a7d89e899189306170baa3c3436e6a5398f69c8f321648,1e6154508103200adf118e1d6e7c61a333e313b1a9a5b6d69c876bd2e7d694d0,6b14294e71cd7bf776edbd432d20eb8f66d00533574e46573516f0cacdeec8b,f252fbbb06c2769338b1c41df31e4e51fe2a18e2406c671915cab6eb1a1d4ff,13ccf71be7cc2abcbcf5a09807c69679430c03645747621b7f5327cb00ff99dc,a9778dc707503a36a9f7c97b4ceef0a9b39001d034441617757cd816dac91ad,1b9473f6f06bb82d33590d34e3bae36e491f7bbf86a26aa55a8f5b27bb98d4dd,7ba7c32f875b62b895caa0215f996fd4ad92bab187e81417063dde91c08c033,1b7c1367e49cbf0703b22aac82abf83b0ed083148a5f4c92839e5d769bdab6c5,1dc9eb899931d1fbb53ffcf833cdfa05c2068375ff933eb37ae34157c0b2d963,15f6054a4d486938c27772fb50a7d2e5c1557ffdc1ffd07331f2ca26c6e3b669,20e6d62a2fe0f35b0fab83e8c7d1e8bfd0fec827960e40a91df64664dcd777d,16290a56a489abd0120c426fe0e409c2ff17adf51f528cafb0d026d14ffd6ac3,1b703f16f99033332267a6f7ece342705a32ca4c101417286279f6fc315edc8e,5194962daf666e79a0c32b5a9a307ba92e2c630f70e439195b680dd296df406,e8eae20a79a7c1242c34617b01340fb5fd4bea2aa58b98d2400d9b515ee5e2,b69058169d62f3aae28bfb28def7cd8d00dd7c2894fae4ffec65242afa5cd58,418c963bc9717f274077503ee472f22cfdff0973190ab189c7b93103fd78179,168d07a3eefc78865b28b3f4dc93167fb8c97112d14a25b4d4db55972015638e,1d17e892228df1dbf15a3c4241c98ba25ba0b5557375003f8748583a61836384,5cc0f0f6cf9bda4a150116e7932f8fe74ac20ad8100c41dc9c99538792e27a7,53d5d7863434afe29bdb1f8a648e4820883543e821f0f5c1668884c0be41eda,18a158126b89e5f3a600bf53f8101707b072218912dd0d9df2528f67de24fe04,1eb53b80726538b1e582069a698323d44c204bed60672b8d8d073bed2fede506,11097fb448406b606de0877efd58c01be53be83bde9601a9acc9e0ca2091fda5,18cbc0ff7239d2f53902396389d67b3049ce1fefde66333ce37ca441f5a31bf8,1f9a3d91dd8a2f2b632eb43d57b5c5d838ceebd64603f68a8141ebef84280e8a,823fb472fe573bc5300f74e8f6de8fe1185078218eceb938900e7598a368dcc,17ac73134016d2caa4c63a6b9494c0bd7a6ba87cc33e8a8e23ebda18bfb67c2c,199a16068c3eab2b03f1b5c5ee2485ccc163d9ab17bb035d5df6e31c3dcf8f2c,1f24b4356a6ba954d4ef9fd1634752820ee86a925725ac392134d90def073fc,803e44e7f7aed13add59b6b4d11c60a528fb70727f35d817305971592333d4c,df93b02f82672bd14535a511ed3eb4fe85987ae57bc9807cbd94cd7513d3961,8f0a0a88db990b4d71c3d51d4197fa3fd1cc76e670607e35ca2d3bada295250,13432226916d3125acac1e211431fd4cd2b6f2e80626af6564bdde3e77608dbe,1d5625941bfea5838175192845a7ad74b0b82940ef5f393ca3830528d59cf931,8ddf48695b204587dfe4f8cb3ef1b39783e9b92f9276b858e2e585e318e20a5,a60730a657ff88c8851a679ab2a1490434ee50d4953e7c5d3194578b08ae8ea,1ccfd231373aa37496283840bdb79ba6d7132775b398d324bcd206842b961abb,1b203843c41cd396f14fa0bc0b2191a27ebc659e74fd48f981e963de57eff26c,802c2f6ae5624a6fb8435d1c86bf76c260f5e77a54b006293705872e647cc4a,f80225456e63770b3e561384ef2e73a85b0e142b69752381535022014765f1c,7f602ec1a80a051fd21b07f8e2960613082fc954b9a9ff641cc432a75c81887,162561b0a0a720f3b60f6aaf7022b7d323fe77cd7c1ab432f0c8c118ca7e6bde,1604fe5a6a22337ca69b05dea16b1cf22450c186d093754cb9b84a8a03b70bd6,11cf9987a40446c0d3dc140bf5f9b76f6eada5995905189f8682eaf88aef2b83,16bc0b2487c1ed883db47a4bdd60cf69debee233e91b50e9ee42ce22cbfbacd3,af5dbb5055eb66aa11403b93e90338b7620c51356d2c6adcbf87ab7ea0792f3,446328f4dddacc129743c43883d59c45f63b8a623a9cf318489e5fc4a550f76,4ba30c5240cde5bca6c4010fb4b481a25817b43d358399958584d2c48f5af25,df5275f76425982c89209117734ae85708351d2cf19af5fe39a32f89c2c8a9f,d76f3b5156f45d0e18c7f98df3b2f7b993cdda4eb8cb92415e1be8e6af2fc2d,191dc3f15cba92bded5a44b55a5b026df84a61719ed5adbb93c0e8e12d35ef40,44c40e6bd52e8a2d9896403ae4f543ae1c1d9ea047d75f8a6442b8feda04dd0,1836d733a540012bd0ccbf4974e80ac1954bf90fe9ea4e2c914ad01166026e7,bc553be9776b585a8159d306ef084727611df8037761f00f84ca02ce731b3b6,186ce94781c1a1fada1c7b87e0436b1b401ae11a6d757843e342f5017076a062,1381ec71fbdef2480253be9f00f4e6b9e107f457812effb7371cc2daa0acd0fb,9844da9cc0ee9856490d847320d9f3cd4fb574aa687bafdfe0ffa7bf2a8f1b4,7a8bf471f902d5abb27fea5b401483dedf97101047459682acfd7f9b65a812f,1633b6fb004de51a41915fb51ac174456f5a9cdff7aecb6e6b0d063839e56338,1979ee5cec4961c7771200382bfc6d17bbe546ba88fed8b17535fd70fbc50ab9,a806c07861857f3ea9891b42d565256b0312446f07435ac2cae194330bf8c58,c38703d9487079390c7a6b8af194b8b603bb2cdfd26bfa356ac9bb6ee0413a3,1a4446628f5602587153bd3a482b7f6e1c56f4e02225c628a585d58a920035b8,1cc2a76e5ce83177b0685cdeeea3a253ae48f6606790d817bd96025e5435e271,1f8a2332352098c492933c079b148aed57d5e4ce1ab122d370983b8caa0e030c,f9ca6c5e102598e51144ea5937dd07cadce1aa691b19e6db87070ba51ec22d6,16b2e4a46e37ae6ef952d9d34f8d6bd84a442ebfd1ac5d17314e48922af79c6b,305d6cd95cc1beb6805d93d3d8d74e1ca7d443f11e34a18e3529e0d03435d1,1e097b4b8b90dacfb39743ed23f8956cabb7aea70cc624a415c7c17b37fbf9b2,1064e1b3f16c25be845bdb98373e77dad3bdcc90865b0f0af96288707c188950,1e49fafe673f21a123384d841221b73421c56014af2ffdf57f1579ae911fd33e,1fd806dccbf1a1346b294404e849722f2baa2f4d19005a49d1ba288a77fefe45,1d951a37da53e3eec0b3e2db1a9a235d7a03f48f443be6d659119c44aafc7525,ed87fa479fb59274d1912c3554ae3d010496a31bdacb542c816a1607a907735,9451cccd4200f06d473ad73466b4e8c0a712a0b12bb6fc9462a3ac892acc9bc,bca1b6400b3e52107642535f1ca9b03832ca0faa15e1c4ed82dd1efdc0763db,1d2c55735b2f0a2060ad1516a8f13592b0dd024ff4162539f993a99c7a1a4d9e,fe04de60aa8008ff0149d1dee29617de750bd5ce3e9fa5e62951d65f6b924d7,18271784e6920a9be47c4c8fab71c8f8303ef29e26f289223edf63291c0a5498,dc7c19061a84d2e60a04b8f0adaa603c8afe93f17b7f0e56b49514af43d0c6d,1972db5affe7823e419da337cb79061e090943c2959dea1b38e4436f5482eb16,1518b7975a6d8c270eac9fe4082916f021a7ecbadf18809746a9e061a2cb9467,120c5539dc45dc10d4bbc2440a9f5061d74b8ae5e37b34e8755a0315f1e196ef,19ea6f5fb309fa7d08bc7d516e80efc3a977b47208283cf35a9d8bc213b90b17,d0ce323c5128d9cfdd8ddd8ba9cfe2efd424b5de167c7257d1f766541e29df1,401e37d0e2763a3695538b41d3c28215b865f5b7d1b497a8919284c613cb7ed,e45a0de30acc2e67f2893056fc5880255daa12cc61261cc0fab9cf57c57397f,69bc3841eb0a25cd9e988d75f09f698d4fdc9d0d69219f676b66ae7fa3d4964,102684bbe315ad124bdd47c38fe72db47cf0ae0c455cda5484baf523f136bdcb,11e0f83c547c96c68202e8d34e5595a88858c2afa664365e4acb821fd8a13fa,1caf4a7635f8c6585966567ceec34315d0f86ac66c1e5a5ecac945f1097b8301,cfba58cf8aaf4223cb7158908ccc18b1dc48894d2bb46225c72b11f4c74b278,397c4c1691159a28cc90da2e664f8c29a7f89be0ead679a38b0f44c8a2a0e35,6563b9ebb643a5bad397fa5dd13c501f326dd7f32be22e20998f59ec7bad11,b76edb238f7b641ea81d307f4c79f9afec48562076dd09c36cd79e9cb817166,60d4208bb50ea9df29ed22addcd50a1b337504039690eb858584cda96e2e067,1ea37d569d2fbb7adbff1019dc3465ec0f30da46918ab020344a52f1df9a9222,d3b174c7290c6bf412083ff35d23821dc512f1df073c1b429130371ac63b1a,a26ed3d7634762a4b46eb2a5c3b814634d974919689fb489fe55e525b980383,15f3997e7dafcb13e0e7a23d33d2fd9ef06f4d79bd7ffa1930e8b0080d218518,17c5eec716d944ee434df335a10bbac504f886f7f9d3c1648348c3fae8fdf161,53cc30d7fe0f84e7e24fd22c0f9ad68a89da85553f871ef63d2f55f57e1a7c,368821ee335d6dc19b95769f47418569474a24f6e83b268fefa4cd58c4ec8fd,85334f75b052b5f35119816883040da72c6d0a61538bdfff46d6a242bfeb7ab,dd0af4fcbd9dfefc1020cca9d871ae68f80ee4af2ec6547cd49d6dca50aa438,1b0131bce2fba4e84114a19c46d24e00b4699dc00f1d53ba5ab99537901b1e71,5646a95a7c1add2b34c0750ed2e641c538f93f13161be3c4957660f2e78896e,14b9f291d7b430ad9fac36230a11f43e78581f5259692b52c90df47b7d4ec01f,5006d393d347fc81a98f19127072dc83e00becf6ceb4d73d890e74abae01a22,e2c9d42199f3a470e7cb8a115143106acf4f702e6b346fd202dc3b26a679d8d,1d1274d092db5018f180b1a8a13b7f2c7606836eabd8af54bf1d9ac2dc5717b1,1e1fc552b8eb75247ad0fb7aaa4ca528f415e14f0d9cdbed861a8db0bfff0c6a diff --git a/examples/merkle-tree-cli/src/main.rs b/examples/merkle-tree-cli/src/main.rs index 9817bf39d..661bd73c9 100644 --- a/examples/merkle-tree-cli/src/main.rs +++ b/examples/merkle-tree-cli/src/main.rs @@ -1,13 +1,11 @@ mod commands; use clap::Parser; use commands::{MerkleArgs, MerkleEntity}; -use lambdaworks_crypto::{ - hash::poseidon::Poseidon, - merkle_tree::{merkle::MerkleTree, proof::Proof}, +use lambdaworks_crypto::merkle_tree::{ + backends::field_element::TreePoseidon, merkle::MerkleTree, proof::Proof, }; -use lambdaworks_math::{ - elliptic_curve::short_weierstrass::curves::bls12_381::field_extension::BLS12381PrimeField, - field::element::FieldElement, +use lambdaworks_math::field::{ + element::FieldElement, fields::fft_friendly::stark_252_prime_field::Stark252PrimeField, }; use std::io::BufWriter; use std::{ @@ -15,7 +13,7 @@ use std::{ io::{self, Write}, }; -type FE = FieldElement; +type FE = FieldElement; fn load_fe_from_file(file_path: &String) -> Result { FE::from_hex(&fs::read_to_string(file_path)?.replace('\n', "")) @@ -32,7 +30,7 @@ fn load_tree_values(tree_path: &String) -> Result, io::Error> { fn generate_merkle_tree(tree_path: String) -> Result<(), io::Error> { let values: Vec = load_tree_values(&tree_path)?; - let merkle_tree = MerkleTree::>::build(&values); + let merkle_tree = MerkleTree::>::build(&values); let root = merkle_tree.root.representative().to_string(); println!("Generated merkle tree with root: {:?}", root); @@ -46,7 +44,7 @@ fn generate_merkle_tree(tree_path: String) -> Result<(), io::Error> { fn generate_merkle_proof(tree_path: String, pos: usize) -> Result<(), io::Error> { let values: Vec = load_tree_values(&tree_path)?; - let merkle_tree = MerkleTree::>::build(&values); + let merkle_tree = MerkleTree::>::build(&values); let Some(proof) = merkle_tree.get_proof_by_pos(pos) else { return Err(io::Error::new(io::ErrorKind::Other, "Index out of bounds")); @@ -72,7 +70,7 @@ fn verify_merkle_proof( let file_str = fs::read_to_string(proof_path)?; let proof: Proof = serde_json::from_str(&file_str)?; - match proof.verify::>(&root_hash, index, &leaf) { + match proof.verify::>(&root_hash, index, &leaf) { true => println!("\x1b[32mMerkle proof verified succesfully\x1b[0m"), false => println!("\x1b[31mMerkle proof failed verifying\x1b[0m"), }