From 8a6f920dacd30dcb28126687a342823c56e07ab3 Mon Sep 17 00:00:00 2001 From: Louka Date: Wed, 1 Feb 2023 14:48:51 +0100 Subject: [PATCH 01/28] Ajout d'un jeu de tests --- tests/500-worst-passwords.txt | 499 +++++++++++++++++++++++++++++++++ tests/blake-test.py | 32 +++ tests/blake2s-valid-hashes.txt | 499 +++++++++++++++++++++++++++++++++ 3 files changed, 1030 insertions(+) create mode 100644 tests/500-worst-passwords.txt create mode 100755 tests/blake-test.py create mode 100644 tests/blake2s-valid-hashes.txt diff --git a/tests/500-worst-passwords.txt b/tests/500-worst-passwords.txt new file mode 100644 index 000000000..a33ca4719 --- /dev/null +++ b/tests/500-worst-passwords.txt @@ -0,0 +1,499 @@ +123456 +password +12345678 +1234 +pussy +12345 +dragon +qwerty +696969 +mustang +letmein +baseball +master +michael +football +shadow +monkey +abc123 +pass +fuckme +6969 +jordan +harley +ranger +iwantu +jennifer +hunter +fuck +2000 +test +batman +trustno1 +thomas +tigger +robert +access +love +buster +1234567 +soccer +hockey +killer +george +sexy +andrew +charlie +superman +asshole +fuckyou +dallas +jessica +panties +pepper +1111 +austin +william +daniel +golfer +summer +heather +hammer +yankees +joshua +maggie +biteme +enter +ashley +thunder +cowboy +silver +richard +fucker +orange +merlin +michelle +corvette +bigdog +cheese +matthew +121212 +patrick +martin +freedom +ginger +blowjob +nicole +sparky +yellow +camaro +secret +dick +falcon +taylor +111111 +131313 +123123 +bitch +hello +scooter +please +porsche +guitar +chelsea +black +diamond +nascar +jackson +cameron +654321 +computer +amanda +wizard +xxxxxxxx +money +phoenix +mickey +bailey +knight +iceman +tigers +purple +andrea +horny +dakota +aaaaaa +player +sunshine +morgan +starwars +boomer +cowboys +edward +charles +girls +booboo +coffee +xxxxxx +bulldog +ncc1701 +rabbit +peanut +john +johnny +gandalf +spanky +winter +brandy +compaq +carlos +tennis +james +mike +brandon +fender +anthony +blowme +ferrari +cookie +chicken +maverick +chicago +joseph +diablo +sexsex +hardcore +666666 +willie +welcome +chris +panther +yamaha +justin +banana +driver +marine +angels +fishing +david +maddog +hooters +wilson +butthead +dennis +fucking +captain +bigdick +chester +smokey +xavier +steven +viking +snoopy +blue +eagles +winner +samantha +house +miller +flower +jack +firebird +butter +united +turtle +steelers +tiffany +zxcvbn +tomcat +golf +bond007 +bear +tiger +doctor +gateway +gators +angel +junior +thx1138 +porno +badboy +debbie +spider +melissa +booger +1212 +flyers +fish +porn +matrix +teens +scooby +jason +walter +cumshot +boston +braves +yankee +lover +barney +victor +tucker +princess +mercedes +5150 +doggie +zzzzzz +gunner +horney +bubba +2112 +fred +johnson +xxxxx +tits +member +boobs +donald +bigdaddy +bronco +penis +voyager +rangers +birdie +trouble +white +topgun +bigtits +bitches +green +super +qazwsx +magic +lakers +rachel +slayer +scott +2222 +asdf +video +london +7777 +marlboro +srinivas +internet +action +carter +jasper +monster +teresa +jeremy +11111111 +bill +crystal +peter +pussies +cock +beer +rocket +theman +oliver +prince +beach +amateur +7777777 +muffin +redsox +star +testing +shannon +murphy +frank +hannah +dave +eagle1 +11111 +mother +nathan +raiders +steve +forever +angela +viper +ou812 +jake +lovers +suckit +gregory +buddy +whatever +young +nicholas +lucky +helpme +jackie +monica +midnight +college +baby +cunt +brian +mark +startrek +sierra +leather +232323 +4444 +beavis +bigcock +happy +sophie +ladies +naughty +giants +booty +blonde +fucked +golden +0 +fire +sandra +pookie +packers +einstein +dolphins +chevy +winston +warrior +sammy +slut +8675309 +zxcvbnm +nipples +power +victoria +asdfgh +vagina +toyota +travis +hotdog +paris +rock +xxxx +extreme +redskins +erotic +dirty +ford +freddy +arsenal +access14 +wolf +nipple +iloveyou +alex +florida +eric +legend +movie +success +rosebud +jaguar +great +cool +cooper +1313 +scorpio +mountain +madison +987654 +brazil +lauren +japan +naked +squirt +stars +apple +alexis +aaaa +bonnie +peaches +jasmine +kevin +matt +qwertyui +danielle +beaver +4321 +4128 +runner +swimming +dolphin +gordon +casper +stupid +shit +saturn +gemini +apples +august +3333 +canada +blazer +cumming +hunting +kitty +rainbow +112233 +arthur +cream +calvin +shaved +surfer +samson +kelly +paul +mine +king +racing +5555 +eagle +hentai +newyork +little +redwings +smith +sticky +cocacola +animal +broncos +private +skippy +marvin +blondes +enjoy +girl +apollo +parker +qwert +time +sydney +women +voodoo +magnum +juice +abgrtyu +777777 +dreams +maxwell +music +rush2112 +russia +scorpion +rebecca +tester +mistress +phantom +billy +6666 +albert diff --git a/tests/blake-test.py b/tests/blake-test.py new file mode 100755 index 000000000..5fd054f24 --- /dev/null +++ b/tests/blake-test.py @@ -0,0 +1,32 @@ +#!/usr/bin/python3 + +import hashlib +import base64 + +# Python script to create dataset of passwords/hashes for testing + +PASSWD_FILE = "500-worst-passwords.txt" +VALID_HASHES_FILE = "blake2s-valid-hashes.txt" + +# Password source file : https://github.com/danielmiessler/SecLists/blob/master/Passwords/500-worst-passwords.txt + +def createBlake2sDataset(inputFile, outputFile): + # open password and hashes file + passwd = open(inputFile, 'r') + hashes = open(outputFile, 'wb') + # for each password in file + for line in passwd.readlines(): + # compute Blake2s hash + d = hashlib.blake2s() + d.update(line.encode()) + # encode in base64 and write it + encodedHash = base64.b64encode(d.digest()) + hashes.write(encodedHash + b'\n') + print("Done") + +def main(): + createBlake2sDataset(PASSWD_FILE, VALID_HASHES_FILE) + +# entry +if __name__ == "__main__": + main() diff --git a/tests/blake2s-valid-hashes.txt b/tests/blake2s-valid-hashes.txt new file mode 100644 index 000000000..e73826e24 --- /dev/null +++ b/tests/blake2s-valid-hashes.txt @@ -0,0 +1,499 @@ +ugjpsNMcWk7sPwuv0rHJ5jqG8Upu0dqJHldfFl7487s= +bPWEqShWee3KgiUkxM6Lm1DENkK9AAGq3Vs4KZvApXw= +Efp8EQM3T/F+XQ5Z5DOwdDKEF3vg7hT9Jjmt0QLE8CA= +hzYfwu4KAVXxR45AJQQ8YuQzVPEdaUoxjgJzvyuVwLo= +HD8ARELR4MX8LFCfqGw5cFKxw6k0MYE39hpKYohIZC8= +cJ3LptLbaM3G1NNnTPg4J1W29tZzxorS2BMtXqwKVMw= +2LWd9pdJ/dmn6a1qkVQ2fyjthM5t8Okb05gsFOmCeG0= +QYog7cUBgVaJGNeY6GLkvWomRx42Itgbo0mwmBKrQAY= +hWptd/ap+Tu250mOZzGx8E+1EYYQqs3Jr7kOrTsEL6w= +bZQGPMCuCZvQ4S+Ubz8tV3x5aeD/5AfV7n2ebO+mCII= +iPc2Bz5zt1PcYtc/GJjDBhFDLf43XaygUF0n9kEvRjA= +bONtqw/HWgjH3WgNjnnG/qBRIZwZJiyL8ok5QD8uStw= +2ktUNbDOO9Z7NHtoanpvlG2NOcPGauf1bhaoKXNY2hk= +d/xi1a3Ejgyt42QZq1GikMqnKO5ifXHsYzv9ogkPqD4= +G+RwSFsJQWv6M3j0okhYeHuAlDboMwV+YcJvCuv2xOw= +FQq+fqQp5cE+62csb2BBR9RZuGKeaVCA7wldtiRkPWI= +Jr1QdbWJ2Q69hX4LhOllg5dkr6Jh66QZUClrRA16HBQ= +iwy4udDC9Ch9HlsIKD/qaaBONrJGej3Mc+Sq2sqhLqY= +8HHr8Q11MF6LcMWdLok4UV5xrGEDmHMJnoA6AHv0xY8= +zIexLYod6WEA6MJL2qybV80tztlCaypEaPfd/JjUBk4= +KoW/TRU26X8xRmNQIrJ6/F/+yxJQwOvslb3Qn0QF/SU= +gjxYg6Sj8as0PNpXRlKcom0E1uiY8ZGyGl/CoWwzqK0= +u91hMetSSDSOO1X2WCHvIYd6X5uA+FnTabmw98AbaCA= +jPcglIYrNBTw7+mcWWkmhvNxjr853SnOhU7O3zFkaiA= +UWg1O/7wuLZ52HKfz55U/v4F7leqgoc7/VBkcOFyOdc= +d9Ch+wsHOPMiaEHGTV3X4pyCrrBC+K4dw1onAYdLmd8= +dqAF0VjsS7HieTT4zb3h5dDiKC+mX2lG26vYUk+XZBk= +rthaZ6WDTEotqJMr/ePXaBrdUqCZ1TeU03ej2HkRIjA= +awDjyoidpuZvu5MlUj2Kh+MxDlBAxOHzp0ioINn6L44= +l1xjE9PLT64/8S/szDSmi4cZ4nk3KDd7PzL6++Obin8= +1A46mnVRDviwcUiwWWT0PFcVey9tf9Tt211e6ywenWA= +iuBceczyQsyVT7NlhLIYHMkjYoagOC5ptRbyzvO6WQI= +7SZWEHFeUZHDcezk3migRToxiYoXyisfIcKFd9Mczgc= +HrmeX/Gx+VZ99Xkr++2RiAfDK7jSayx8hsl1scV9AUo= +brKESxet5Fa1PsIk9tR2Kos8sLjDSSALWLEf/n07GGc= +gfo/TkiY4H2IJSMl3pqGp8N7SS7hHEhTYQ0a9yQBMIc= +E1Pbgpy2v0uK2fFlP204UAkwbhnBn6b92UODuRJB5Zo= +LQgC56xjbxayPXcZiqm6D4n9YNdM0HvoyOpEi/niqx8= +Cw9BmGaUTtTXvMOPsrBm0CD3T0H6J2AOXZnkAd3JgIU= +6ai0m/Y9inS0jZfHMAgpkn0UMGqvIr73BWPTlbbLCm4= +fXxK5BTQ+Ku2T0XEmwyHj/iBZVaR7VEkysP6l/Jgoms= +V34dCz10cGScZ5xSgiEPY8G5FosrIcebcmhXYwSM9as= +zeNxXrSbMjEOPBoSLYtiQYYGZwsZFhk/S1ErAmFfpXo= +Yrrx4x6gqraLSarJIU9S2PB69top8/O+pjgQPV5eBn0= +Ip6JL5i/N0dqivx27ppv0W+jj31yu/d7QeQG3rTUY/4= +lOuXwSVoZStmUxC+4thgJuP9pv3T5AayPs5VEVucqBw= +dyKT5e7KTeWgSpJvl/DyXflt1eAvO/CXwGEhk3SyIMo= +qzEDzKjRzXXZJyjcPkeTNkCfZZQPdgyRgqSStMROlX4= +vblTK2VEFx7eLe2c54R+8wE11piWVm9cGIwn4Lj8mbA= +VqDdI2JdgrYxAraRXFYHOsIEgdd68O37hL9d1KmmFdQ= +ZHjNhOySflzgIZ1IeVchbBR+0oc6YwiV6P/WYBNltbg= +TLm5Y6qsXc/MKD7yTlyJ+WjD2+D34WQNmx0kbSkJL1c= +u1r5mupyLK1S5+10QT5WcduNhqj51Djv83zzql6WMjY= +9It2jk/J+FNUiyTXyoQR12W7kQcdgRQsjT3v3ZfcNyY= +QwmqnV4MSA0EQFGObZ05MZJirOu88elYwppR74ubs20= +oj2GCI56dSas8C8PXGIW2kOqG9t4knIccQrt+V+M8wQ= +FzAh+AKVkAsWdOpx8U1jNSrcb5T0sqFVhiIKrCXy0XA= +ooHRYS1AyZW4tX35RPbH5CwH7CCuqEuSDVjAC0IrMR4= +mBQ5E/Jz2JYlb6hi6ZERkuLxX2Zyj9v12PuDu/fU6eA= +OUTRiniNq1GxAAHjLCKoVZCuarCSoSpdOHfQwkD6C3U= +flKBgG79uJNanhgBhH/NZBcnzYP4uzNZSFixR/CG9wI= +PxYhyFd34Y8DZ7KR5e6hrOEHGi2kJPtHm2AY3dpCL5k= +KUztPzoU3wmKq7N8alM4KqsK+CEwRZXUbhec5CEbIM4= +YsUYgGpkO1LpfBTjklU13WTIs34V6l1CJPrhx9nIPGQ= +O2tfdQsdUOJ/6u42HKc8YHijHXCi7hmkF1t8pE1+KVk= +s0ZOFrdZgh5bPfK4ZsCSobBEEIxxUOvFd8JJHkHZ4lE= +CwsYwHJulxIXYNMq6kkEcBWVQaNKgY6dPXQD+S5reqw= +m1mJOinLYelp7nq+JsrvOGHWrhLLT8R/kGIjb+YTNJ0= +p057ayp96DCHfTtCTrgnK7NiWQR7vlbI9eYYi0AFDGQ= +kzNaseRmuL2HFM5D3sCO7aSxK/sv+XJuKg6NocfZgTc= +dqVqIazLS5FqnwlwKcui/WkV5fS2eHkUwr3rJaidehU= +imtZRY2B+PcicdR+zWd+CvtVjMXv8tJARngdV/z/Mp4= +FrYFmxCJtrWhvfS/rl+7IBpa+RnkvLHH5m5Dq0ChSfE= +oWT7MqtWycKVCSJNwxKE9uMMrUTqRf/y4NvG6cN3XFI= +KY4o+UgimWui8B71u6KCRR8TpPR0uyh9a8Sf+d7+5kM= +DnPwVYCMdoNCIgcTM9Ofy9HH3W8tx6++q+dgI7FgnXU= +vkQvFo8hbVwWJXhd7oPyMeJIFdF9MuuMLrMaChOW40s= +9EIeRh1D8acgJQzd8Jgn2p6MQee+Gfq8SoiWcX8PCHA= +zOdocuXZoRjBo8ePbthBSnRSrC85pBF+9ySUYKkI8Hk= +ogDbc4Vh5vk5ImdwF0M42S8ASuZter4PFThgJXRKeFE= +yIm/l2SJ8tXZg4rqQ2/725/6LS1XR9leSs4AyYDzUMo= +j0EY8M1JTHN1QkEXaCAKCUkcYks1w1DrYfKW4IVDnNA= +k5g147onCU8cKFGWHA3wazZD5Vg3/ZompvW5cqytBeA= +67q/gmJiszVlYn/5UTpUpGr6ecmbU3wD4RmzBOehH10= +AZIRedS8dhRNVWl7THXHkLw9xL0BgQ+r2wSh3uxsEAE= +js/hM5wkyCxiyL0Za2wgec0k/ZYC1Zyg9Q5jJfhG4lw= +ll3HSO1q/mAx05tpeNpu5cEspf2rB3P/cX5Ltx8ZSoA= +aIHAmD4lGWkkfw0OY1G7WwHU7vl4Ks3lrK8YqWAZW6w= +UXqMkiNFgXKMe4CvH1KXk0zliuxL82FzRtvL0BAEXKA= +hnwV8FTG3htvF9LGOr49oYHJT/Kiuqudg10uaYi52qE= +ILIxe05ojmlNm6luCXcyXRWA7PPuijhbJtxiIXJ7Igc= +1woA862RH/5zosgGWz5NreH7MCQjsg2+GyfIPAM01nw= +T7pGmMUNxz6C5eo5VKqM2uYmOC0NCGqPnkpy9CoH9iU= +gqxxyeKYX7uTYeT0N5oHuTTpu0uf7q3trWBylSME2As= +Yb/Td6FzUKVbsGvvj977vykX/tUlaOsCqtprP3vJ3f8= +aEjXYh+ClbNBlt4xr8R8Y2Jjp4ovJuirwlktdRFR0co= +dOMdSAKfVZi/oVHrLN/h14OKitDrsdiJu1aeGiEugRw= +OWmzkmZUBllmtvjZpleJsPdtVuHiq2fdlPqncJWRh8o= +sP9UotDczM5yAPCoABsCTv0KnpVQviNpAKEtINCSHoY= +UUVger+UC/O9knNVncVBTqs2DyJZgNeeFj0VerR+gvw= +DEyg5q3rpEnvnmonXYHXGGvXifQ8O568B/JZdUaB1Do= +zub+szCnqIwisFvHFn5yUvCE9br5GVXIq2tYF4jvZNE= +LJ7owgngPKdepIxo4icjhl2BY9ciIbVlMcyLDotixGA= +3ONfmtnjFz5tJGr181nOeC8pzxou55LiV9K5pM0TDDE= +LF3Pxos7TkocddTyAtSrquj/IaCryR4NwbFe4lvVCXo= +1aY7c92g76VF84rt9ICjqrwGDG3NuMKh5lQG+JBj4yE= +IIGwE2JIfxOoEqiGgZCdNwoW66bN9RVcI/7LB2UPDxc= +9qqRCQByGQBecev5qte16I5WzAS+5QEjymwEGUhNCgA= +M4DoWUtxrO2CUo4BZVSTXGZCbp0XvGHwg9XElJ0Rk0g= +G9CIdDSH84JllMF/ImCQa9BEaILdssatND3kpU1kcn8= +SLRwVRoTo6H89GShs8QjMZRE/TDNbil1u1WDvIlcshM= +3K6ddhHcMpmhDPr2TH8n4apgxhhLJwAzPPLMuGpbfJ4= +6ZRO/d2gwJidWIQiWvRKopmbYePbHdxKE4guOaEvLao= +WyLJhCzRIMhCUzAEFuGf9byEciR9RP1U+UMRd6YYnrg= +prqXDNl6XbTmQjhhgpRuhMIkfhsWS4JEA4MDZfTNQw0= +CJ8wKxj8SWl8WtclTmzb36s9AAVuIvdGaCEz5eqITlY= +2xHoxrQVZfAbuIoTSMy1Gn6+WZD0YMHSvAWJKgQBqwk= +qv1fkxAi9oI8DlxCLTIXcfiHxHKiL7xFHAgOGjVVU7w= +X7aAU4pNGEgkV4SJV234YUcE12oqMM/cjCJUW8igqo0= +TtofLz5auedvSeNoKdLWatz1ZCFsYUJKwVJvJM1i2MI= +GWc6Fa4nkYv8RglTUDrn76cvM+u9pwXuCjEzp6Sw6co= +idrSd86JnN4IYj8gbyltEbQhg4D9ZW38xzKbLVSKLE8= +8mSZzCxYziykBZgpA9wo4Gu4PerBGuX4LAPRawS4dso= +g7y0I6vo5O9fwW12buW9ORzIr7yTyZ5pEyeOWhwwSmY= +QzciKCEr8+7O2IU8AjJJ7N9Y7fdSnGpQUzJyTrDXMLY= +kkFshEg6ofF2sPy5JIKKiViwNIOZSB6lqusRFQC/+jM= +43huA4seyypEnwjDNzZ6aUKQ08wsW2Fge/IjJbAmKVM= +IxbfSeLS9TWELCGW53jGaalxXEG9n/xRtgfVpJK6Zwo= +wSAQnpj1NdQ4Dd5pUI+xRz7YqXfT7pjW0rEG+8HfIPs= +TnpwKKpG8BGvIP77vVbULDNjIsmyAwuCcQYYzX6xnbI= +lZYy5CFBHWuUMGHck7V8hmm12u4+o26locwMhejK+M0= +2KGJrO9YuWJbqUZ/MPNE+nhlAQCjKvJVdiq/xFWXkQM= +lB55Bd6XY3kgm2DrThgJ1AhmJ5Qw64W91dUdbxKpW6w= +u7g1rUWJWawJXH/Njkz2XzT9PdAGps+rLoVFHY2sr7k= +qtchikib4bpMv7kBeA5LBogCnQIDcZ5cayV0mZxuC9s= +6mgfWXQlj9lLUwQ9usUnX1YmJ5clJvpdjiTMtNmJcAk= +KQ1m8IsvJM7AwMz7p4airoQt6FmXJBc2vOZMqCGYMGo= +vfhjQ2v48snEGDuS7p/hbxIe4eDgJrjVls1kJP0kg+E= +7e+2kTAAaQ/O+2iFOOOmS0DOOSmksLAfJr3RT/MV7VI= +0Ja7ePUll0i9r0esHmoxCvywU4+5FH+DUPQbkkxDOX0= +LfQMptGPSGAecE3aK6+pxWJQ2Ww9XNpnY53thkF7Uw4= +Cst7T2Dy4EIzj8HruzfVY4OG7512DqRIO47sSGSou/4= ++UZcysj9dADvx0S/kg9jO0mWuz3pE7oObk7LfMs7VEY= +AObliwxracGls37FdPzocDiXo42lf0g+p4M+tjBqeh8= +1r4b8r9TW9dMO8pbTBXthIYgdhSIOMALfTCQD9GOT3E= +ZLjWatXWAAtl6LFOvW/WJkcFLHEuuoolgcOSYCHQgOw= +Kn3/hDPJluMD0GeXqA3weIGZzKb5LiVtW1JcBk0W3Lo= +/Ieob43s0PkFUplmA2j0Y0sY4wMqyAScQsGBW9XIM6g= +7//dXcwv3v5kLq4yje5NNOt2IEUgTS140etiXZ6/k9w= +pF+4hKxlzbRVmyuwsXAWu/6gFpHqqlMo1u9DF4WRP3E= +WCJcb7AUSchE5TNz7Xq/p2CZnNnKKw5P2cKWpZuh6mI= +OJophdYYu0/NM24/+7bYKojo+398DfZo7uXmbkZW7bc= +jRZpZan7IaO9iYENd0vuf0zf4cNz8ia5is6u1c2akeQ= +BL+f2UIEAOZbaA4TctdVq0zKd1PWTi8gnYc1ArspiU8= +2tzF9wLv+RvJpE9SYoHPwHhg9CxKEvfEt+kuzfm6SQw= +qDb5awmxpp5HUFdwFClFJS7jDgPIWWifFYp7VOKaVF8= +zVuQSIN+0Y9B1p/io4X0LgZGuguA31A5u1jflfERF5Y= +LOc+ZA9Xiy9FeuzWcqtjUQDqmnd9zjlHTYfVCRIRUn0= +v6hngBqfYf6J3c/0CBVjCTC8GTgdvkGJEfSnorHOIhs= +EZNKgZKMJfNqMWt+gr2AZTJXlCCiyYAq3U3bYe7w68w= +jqqt1VcHunQUExyeQTZuEBpsWQEutbgJ2si3+O7hmaQ= +lUKeAYvZ9GFtos4rRv8emHUrZQEzCWcs7LAZHQUObd8= +SkghXqiR2wjWk7qCYWn45Zw8OoWbLJKmj0LLsj4Uy/c= +i8R7jUMd/gUJFw/CY3MEmkzhKOPr+1kCLY9bsiAAAtE= +Aw+Tgpj7In0gVPCGSJ9TzT5Vf+EEViXT6JmLRKeutt4= +33L30WIKPxMA44E20Ca4hjeTic7oQPKvY1ZB3kZrwK0= +bl1Z3Zfk0lsEq6Nzas3oTtOIrHv1jpauFfV/RFIK2cA= +sD8aVordKyrkqncTrGjgtVxSbCLCqHtegaM8JxzvHnw= +rDsdh4AUQ285KlwIOEoKge1kx1nalF3YCO/PoxMOz9w= +2VdRk1L9ocmS5ryh9kHYIByjizeczfq0Mx63F6+4CQQ= +dddhe3ZGlykoq4r6Wj/gI+1ZT6FPCDUNi1qhBkkOpB4= +YjdVshvyZ4A6M8ChAQxm9Y9dS8oAFMNlXuxAQlfZB24= +TTk0evyGbFVWQf8/Ac32fFW/KUHC0wi9hVXq+aNhKuQ= +G7YKzM3c4i1vGuclnkX8aoOiRDktAWvYe2tr8arK5gw= +fTDa8jXgtubWfZMGi3IW52ufLHAjZDD4auFSfpDN7Qw= +6xqFS+Btdck19EUest9YQLZ98yjAjiqRvX6ZOUVLMjU= +a1MY45b80Pk/+LgiwA1p4JAulRBxNHAbbj1/K19yAbU= +y44E4uZwXKCx+yQSaOPTGqKOTllUerYVlXd94ucSTqo= +q+999FsWNWwWz7RYdFvAZF2jvqWDJjNnEWU4fxWX2cY= +f79lijOutkw+x7GgdUOfARFb62Du7ZpOWu60tW6UQY4= +EChxRIXBZjruyGAhtPUSRTDMv8H6Dhm+DZfi82O0anE= +1GD2zj9JCBRC2rca6VTssXdfVzcSuk68qD9EdR1byVg= +tO+KrFnyn23YdzEnVE/bMCKODRw4ypMa6pZRBrKEfwA= +2cELY+FHdWctc8aa3mobfPkAK+nFcqDUeQTA1XBEyl4= +s475i8tptt9B8UYYF86prqPh5v67BTqApOIncTANt/g= +OGnQ3dX9IRZHjuwEgaSR1p4mf59tW79jbiIogNsa6a4= +ARTFE/fiJkIMx1GGkAGMmIVg3jPiwS4nXeGMZk3FQvk= +z1cR41YgwWf3hxBYXpd/tTgAseW09yw/+Es36vtcNBM= +q2aLVM2Wd2G5SSgROXOAfWwCyZVcgiYPGJ80Y2gXeT8= +6ClpLR/EhU2uUMKY+zsW1d/wL5JqrYodNcggOyvLOt8= +x4u/TGBvp3MWHGaOBTbqZ0hgPmVv0UP1h5AFFkjzAxA= +6sOcauY3ZdLGqR0FTsY8Sm/TBaqzURPrdmMZ3E8Vd7o= +97r/b8hNx/4U1sdz7m7UDIfsJihZpz0Mvi8056Ux3TY= +gPgIA6bakiBo7K+byZpWkeCMd0AwiUwm9C/cZylGJ3w= +UwoUK/lC9Jm8/S0ykrKZOipsef992KhB7REEklxkw2M= +2z9UOR0tVkuPI/jcrLn4rBNWEGMjyrjwbK9TU1YQ5ls= +Xl5G/udIhf2Ds3eR/2tYyGWzq0QXfVF9RWY1QhjXSlI= +A4pHch8/DN2RAJqx7qN3/x096nz+Z9gERHdZd36StqM= +xS4LO8u+CIxtZsNUw7xHi5lePxl1zTVcfCVPPih4qwE= +ftCTpoWybE+cT5EXyaIkirtchPt/U9w/8120iNoFcw0= +8KLlUHdUZ7aCj3EBGCK55OAxUs75B3alw80eyofiYTQ= +pu25bOmqtSh1pnl2wb98DZs9O2jPurDKJkYfFrOLYms= +YCohtJ8+EsD6VuM1+bTFeDjarUYcKorH1331pP8R/U0= +YVJaRc2sxQ2AeB3841vexCScWTWlsM+3hQHi8MV0vbI= ++Zcb+f7T63vaNBLHUWAnRX0HkURbjvLjbHWSoF2uqcE= +0GRJVsN0xPZ3Vi75hgo7mLbR7AymZi1tyFkg072jRbo= +KzEsZH/pF5uVSeDOT+t8oJnbcgQuGSyugE6w95uUscs= +2ADFxUyVD7dbIBV07yU9fTZfyuWlh8TD1EGF/5CpEw0= +VtlyCbYKXZPuKDhlb7Ds3stdkEd7AzTEpzQRyuqqoQs= +2jkPdA51XcZxIaIo3t10dLyzvClzsjB6q/8fbrdG5Z0= +V8pniitun4MRalbw5AI0nqSouXor/1oRlVh4DK7P5QI= +jS0uHv9MIpEH3WCIKiStDB4gw9J7fB0hlAyMmJB0KzY= +Xgz1+oxfsuJO/QW8OCVBVVCC91sFbTVQ0AIrTUumLec= +uCOegWwbboMICW/zzGczjjmAnWLP6N9ZfJhcJCfvvM0= +yR/U5ZfYCU1HNCSKnYGN0IFqtgjEfHBVKgFqsEOgADA= +4s3dQydmA1YepHrQr6PIGJ7aD2HtmwD094z1dSDNplk= +7OEbek68uabQ4TJpAGzqtw80M6N6dQdXdW1tNuDIQ6g= +Ik1ABU6lhedNaKFLJ9Qqo659EbvIeDYqpvnliNPCZQk= +Qo8qx58gmXwcXkGeycJssEWfkVoWCKBTReopECEG1K0= +1U7yE51gj0ArkuPjHa+bOCeBOq5MmZKsEAS+EPoEv5I= +IcbawCxj3btZ44R57Manh4MlRa6ruI/jWmlnhRfh2Kc= +GmiSSYtY8m8V7Ht24/NXV0EzmGzK8nTWyq0eygHeuQc= +6VN20rSVAYLy80vJvvuwmBVtOglkdVxs9o3wD1j2Sl0= +Z4ii7r2U71bnC+eK9BJB7uOEAbMpZKMyl63oJKQlPpw= +yxGFuyvrGJoX5hof98Cclto21yZAtetr3ccfJDvPZrI= +YrawfRwsnQpFWi+RjZXYE4QixosJuYlmd//GpJY1Flw= +h35n5injGP+eSQdSHbMuYPPwFgohZwm+8MTEaAY13/I= +s+2ikNkddctCPrx0bwr7fmVpwAPCKYwGhQTu19A0PAk= +fQUgTO7hwiexgULkcQdkyc3Js+SkQWxkmU8qLJwn1xg= +9xvh4s6sjxDbmubgmCgpEnXcpEOulhdVaWIoAuzwoGg= +NJbHroYboZZ8OjfBeFV+UXEhr20ITTKeq77ohOjNs2w= +7L3NSFSNs4CAkVmiyu4NZAUw1blAY5XvGEJA+KWhBBk= +1Ze7F8PoqnDQMMtE8RnkDPx8MXc2+hGWqtEYbP+bKEE= +77Q8ishs1VJge5LKNn2ubMJsVRmSaYLrVXbrYAAA+fY= +5PzW1eZKXIw92y1VRMb2RT+Q9ZigS51GedV3nUFF90Q= +w11AbJujAoaDYPWBv6a3m28sR9XFaYQDL7efaP2Y5m8= +pbAB6rHDBI5uSbwZcKHVPomUHD6exAiTWvJo7HUm+0w= +VzYBwEyKs0z9/Ah3Lb3cjRHgW01SiICFvVwXshw3rKY= +hmW/6Zhlsvt2F3RaPKQRnsu+/0y2XEKD/yVQkUHx1Vc= +sbT/WGmAb6jAFB8P3IzQ4AIzINIDDzAx53qnz6I/Dno= +xpoY5psbaPJXo9GByzcdQQmtxDn9OD9enGpm/GwTueU= +yaS2BKajDq61tOn4dRcZVnUNVuXgQEqH2qEhm6foofI= +tPcDpHID9es6y3TcdUCswMYR/WVF1bU4+jMQPCN1DXg= +wo8NUue62oAXSvdvOXdwNRyz0C/Qvb/sgNjgrXgO5y4= +xyLvTAEZHkd8Q4tdqdhmqXbLb4WHxxmVskECv2x7+zY= +DnuIl9BlJcFwgfrtf8oPUvI+t2Sr5OHH39iRzInrC/g= +xjvARZDnJh5plkpbBWjMAhL6RrmsHR5QqIWY40rP1zo= +6MsxXLkPHMjIascFiTD5pFU7+f2Afrbw82BR4tUlizM= +KhrC4QCHK/u6a84fa+vW0jwN94SOHjk7wFDP/52/IQc= +qYahy4jezP5K3Db1bzATPe7shdh3lruDKp5ZjQOtJTU= +0YOiOIVBxXJ7jpIRatCYanyEv4tbApppLpfWjon4su8= +YEGAiLhJCU98wWIAwvbRSyOk2SbGROE3PXGVgzjntf8= ++b6Zkf/e4VWIf6aH4w7s/D6HpNfjgBIkqPj1vWkYmh4= +OR7t1UE2/dGoAOE5K62NnMFrrStT3optiPpC+AzB/yk= +3tSNxS3heKBt+ZPaps04gd5ThWVv3Hgk0kui7Hp5Dwo= +HbLmtevMHW6ltKFbCCHvlHP5YOikRF7xKxAboiqbLp4= +01+UoH4VcUWicjGobnQx1fxwiGC2LxaYkZh2puoOubY= +SiA5em63tqb9Vp8IW1AN6PlBF1HCRWhYClfuYkPdLrw= +ScXHrYlKfvt0P3JL/OTvauI75oTCM7RDiHdcr/CnGxE= +ap21NPQz9OXI11t7/MQESFEScte9rYnEzXll6zTqo1g= +72/fbQApaVxr18hIuh5FwN+IqeslPZoNEi+mBAzhQew= +P+r92lWADA0lDFRBp4ohKwUttGDGvXCJHLZFmjAnrUY= +Quyy0GDaFCQfMrhghKaTmF3ETzDiEtQT5Kfmoi5B4vU= +YCobzKFRvokLx59GhW+U8GhDJ6FOKZXUZd6H5PBzn00= +69l+bRYsJa0a38PMoB2F4OBQiVT5T/sXVPziWL2ZfAs= +XO+3oT0MyGbmjnX/mBRjozELB+21EVGSVBCLHbJ08jw= +FveemCku3Tps9KdF5RG/sLm27m55yPYhealO800NMV8= +4vQdheFqJCEdxUjcrurQdy38Ivk9Yd/oc6VdCI4uQLc= +DVg1NJWWSQwpXlONOcw+jvknqrO/6f5flNSiOMCaf2s= +2HA7wQMQWNUFQx833UnFXxhsEdEBpTJhJQZU/Akkiq0= +g9JjvLtqaNrhLbQlpZeYMKeAMvugNb7pSpx4p25JPwY= +dotiRgCcK6m3qTIsX7VvTSFWDd0yrxZA6yEOvXDjg/8= +EBNgxTd86yW4y8RCDimuB64dE0LoT/6HTIThAGVLfJs= +IUCSpwqfuQIh6RwoGDj0vB6qBjEIufPDvaWSDBcoTi0= +QGUjsSXc8bHsodRz2OzVDFP1JGRVOEwgpJAd9EbXOXw= +yIx5TTmdh902JIZQ/Y5NCSvNq1y5193M90uykYULY1M= +DCe4M2eEhCuhM2z/wz2dVoWj+GrA/Zfw96cTfo4lQlw= +PcMW+D+86OCA+owsJd6ac/wmoq0ncG/O43Xo9tlKi9w= +n7dy6t53/qR8WIb1HSvHnfVLFZ00ZMTK/amyhQWq2KI= +0Fozoq8rfWbb6jpSlLVoWaWsCtxunov/hTYpDg+tjjs= +jdcY/bvAyvNrnBZgnpM34BvnD2bFEFL5ruUp4F6ZZVw= +YRCOd9h0w2fEb85TCamTs+H9QDV9abRVlBFYQLfrTcA= +u49mKDfDCcXbUihEtHs5FN6FcSfTD1GaR3CFKgtLWHU= +sj1FEbv6A8bFD6riYfd1fIXo6m1cZSIA0WJ2HG6EYYQ= +CGS7vPA1goUpOCxT6PnT6ntlDs66LlpHwDIoGFNMRT4= +MdKfrHE3W68Qvuu/Qub85/gNpDRhZ7BNwuI5DZGOZWk= +pGFScIc07mq/OMBC9qcmFkxE+lGILCSnNrMSxTY4+ZA= +8kk9AIRhtIzQvjI70AulCTTG0YpWvf/SPfwX6XLhUfY= +5fmqnyLDVNzIl5E/qgsKD26ATgrwopbxiep2bTP2KTw= +HtbtOCJgEYLOUxSqqrl8C8P9vPFAnAmu1kff/LiVdZw= +YSeQ61PxyXhg+0TgEKsgBe/OaykndMMs1GZKXk25xPA= +0y2Dqn1fBS2F6NgGlpbYJ3D0aqa0WflA2Fqln71JVds= +8wQjv2acjdDyi98u7ehnvQ528li7kepJOZHc1oV/2w4= +E7L7pb8j6eSc/qtSMdL98CZfjoWIOHpDoERu2CvY0Mw= +ikzhwtQO2pjVbAn7+q5ovo8A2SCXOKYXFCIu7A8b994= +b+HqvHxuA/py0+yQPUxyhUy3C8HMbx8fMy2mjh221OI= ++0Z1D2uu2XADeNIvwKz/JLiIbYp3d+piqGPRNuCLXM4= +NuJVOPlnkiD0uIXb9arB7N2RIO3RhQEK1L8HWEDkr9M= +5G1DHWlZntPyxXO4PS+MQNP51BSK3f3jXcOLGd9K7A0= +u0dXGbS1ykF0+Wwe2s219yC5L9FEoD4IcVU3OFVMlrU= ++7hm7hAHChB8CLuAwGJ8T2VQsubeknkYDWO4U7XV88s= +M55Odb9j1x1l+mOMiPs6m6UT19BFC8C1PNkgWVDffkU= +up5XGB2ZhYJrq10wsCsbyPZFevPO3PyKzaB3tmP+n4Y= +V9ISvwiuvulQxu9KFplAOsFeVLQ6YLFJq5JBnjZjBs4= +uLPmYIzGX7NLacRVOgcI4Qwnu/H8bDoaqJoG2TODvkI= +umLs5mx82WyXZkFCjmHpd3FLqT4Blmgke2AufMm7Dso= +t8PAVe3hAtfzT5BXUrEcPX8hlvEQsrFud3lrGJD/ysE= +xXV6F7y1RJzo6b/wJp/dBwQvS2W5OxwG+Jses9fWMoc= ++kfheRy2qBMfuafbUe3fF3RrHnc039FWeYBjQxKDrK8= +dZEzeLV8YrpyXBo8wNWIVY/3T1c7+UfTXkSsYgjVnxg= +r52hf/wCnSjy4XTGZ+0y6oic679uVZah3DfB5EkU1qI= +2JC3kB4/nCtLsVwvrmd5G0Fl7Z5px7/mnroPE7Bif0g= +62fCoq3aOvgiAjp+XbiuSHTE7a352ahdlqpayGGMKWY= +mbXM/p4o9v9yz68t9SfOZOmm06ZlSki47BNqxZizjO4= +fsL5HrcphxVQF9AoVtvx12t77FhPE4joeB1iHUxGh8o= +fFMEgfDH2WoaXxV7BBJUK1s9HSDutTfDV/1ffroKLPM= +8L7nOs58eZ5DTVd5Abs3DlCrBICjC4Ooa5Aq//KbrgE= +9WRPQgtKShg177JvZ/EMglw9TNCLmPhfjeeofx3AyAQ= +dIBEvUiLX2SLsfjSWwO798Wlczb+5lPffTCCptVlWmg= +BVuvvwD++iltwebzapXREUYaUJ5uV4jbQdW1K8nfTh0= +zvVCrHvLHaITYnhpBLKmkUoC8wZD5fUxLvvRZmlM3fE= +r19PxTSdYPHJNHZSFzup0R9LE/iUE4UvL2D/fDx3cv0= +0HSC3sTslUyEnc+2h/jkgRmSpE7moRKHeOYqs1Eon5g= +oAGsJi/JLpaa3Osq+b1GIbgXJ1W8+1pAtyi8OOrDcJk= +wjAGVn++Z4AWYWLKX5JRKQMZaARupbbBUajc4Tt3tVY= +jAtbW2hpsUrOvjXM5hLYnyKCy/5nisODfv3HONVpZvU= +Q3GFs9FFYHJ3mIkSgX3A8tuaGwZGvZ+dugczjYlQ2eU= +NrojVzM3eirdCrmF3B9NGL6OVVt8Dzxwm19lqtEmuXg= +XShF5rMfrnatXWnaF0uDNyLhXnaA8EEJOXkGsKEbo8A= +HLbQyVIhjR/4KF0DpMfQe4yUaEKje7MtdR2laUnjzMc= +aIOvxQ5wNkNSf8U3APX6pVl/80AKbpD8TDkiZPujJbs= +ug2bJtifTJmOdtInISIstRqSh+jNCQAN3L6yL6iY63w= +RAiKwwWD926O7c3WGEVt3MlWuyRY2Tl6vjG8ojNay2Y= +PaNnTS8cP9nBYCF6psJ99bFDF/vD/vaNu71+sWBcZuM= +KLAnn6LukYAy57JMFhNPuca96PiN7UmEBw3EfXtWeNE= +J0ZRrnUY4OrIlbH0+GIvQaH/G9glo/L38ASSHg+E4ks= +DR23e+THKDIXLoIzLj0YR7+M+cdkCn2coYioV1IfzVo= +02+XYgmuVNER5G7nBn7qfb2xTJ+sGCDxeMle05Hb15Q= +OkNorapSlscRE9cTseryeWExzQMkrnqDgtDE2PZyKrk= +yQsNq4ZGa6YuqCXyiuiv0On/mLYpDQFO+hNiA3WuIJg= +keJPb3iEZ4gyNzjMLAaF4YM5zSOgkl51kAQwLFRWoQw= +7IVEDCSqldx9jiTPmvzTNPxkC8yBaxQTvF+zgDpRb+c= +nXCTPVL9sU7YnUW/sxZD6jASZDQahrtM7OuK00FQQ5A= +M5oieNKJmW4EIvz7Ql10ZDPXWxqDgOeHB3T4JJ8NqAU= +mbz75MZcwt/X6w1sy9w3FqiWmByh40wWZL7IKdXjxEo= +zpbJZiCS5t3uM6XAvWp/hGqwpVHWxxbM3PtWuPbDIB4= +l5vu7/plmFh3y+GrHYj45wC2Imv/YPxiLSMf7lUNwGc= +lIu8x3D58zPY85f2e4g7Gvu6EZtYfwcSm+op2GSDGuA= +ner0mKrVdpI4fajIjoL6/3RNnwtsHfC2Yq6stL4LRXk= +kFo5CamxPp6XzEZYqo9quvdK3kKVHz2p5aSLANSSp9U= +vpFkC4gjLWz4DkN/NXrNYbD4PeyJs3A2jNhrcg0ONuc= +PSCva4qaJVwXlpgJU9Tz+sj45ippHoTejSZGeA7grnI= +0OOpq5J7iu5AE+SiUbjK8fO4B0apURkIDLuebRGc11Q= +ezyo/pg6UK3rIcvJGXnRv5n8KoJopU3OPQqcGw/eXyM= +o4bcv4Z1/WM6DOQRyDaCBGGH9tViRWRuJTJCNtCkjbQ= +yWy0ltgFMZXFWq2w1WADV9T51SIshVsr09fMUTITQss= +1aUxpHpllC237bavxzD5vWRmQjSgbtbFnghDos0p5yM= +JHPYTmmMxOp3OPmcb3UhEwmjueurfTUavL1FLRrdqu8= +AGI5HQAOjx5TkXwT1JfH9drO/UK6tg8XoOZw3ahcDK0= +w05S4oTK0PL9oZ6LGako+RZkj7oD9vf8EVKSXJ4gUIM= +VNUKS2uXR4L1kciQzxv/vehjVP285q6S9tAVEnmjaJ4= +3gwRg4mkE+uGipxrQiL+s/aESmoR01P+8F20ea7C/e0= +5/tRWQHQmt+HPKIMueEzpqjTEopfx2FYKfap2E7Tl3E= +Ocbn8/6zSX0iMEYkI1og0N1m8U2SGHN755gzIDCPSV0= +ARRu/KqDdUSUy/qpqhWRJbQgG+CdvjV0QwjVTZqspo4= +gkpt9tbukV7+cbLuvRo30jYJLNl3Pq/DSM9ASLx+teQ= +4xKiiGvEpVcsGfNjozWqJUPstfMW/A6zJA245KQTM+Q= +JBxnq+kN60GNEYkW7qQCHx9RneCSiFQo6xMArs+VoLo= +rjPmzNBIFpJpE/XJaW7j+gzocGWAGZtUwB8j0vlYAJo= +DqVkpdDLuOMKqBWp8Ba9kN0X/fan3bezdta6wTY6p3w= +HOF79LJLQFOekPXb6hWIPhJ6m/i/GbHVBsZ2EdXt8gU= +ElUkRxtmL1ws24xgWj8L2r6+kl936AyKSvOKD9FupZU= +FNWd3zt/S8LGb7T2rq0yBQMsyKuA8yFG66CDZ1kqI80= +QtOWbnHt4X0YrK5y0QuQyZF03XDIkhNUdxEsDE5BSC0= +FWkS7+aOA0U2qQr0tw+2Q9xaH5To2l92O0BWxR/rNhM= +PQYtToD/OK8t8sFKcyeujziE2BRpTMeUnyaC574mS90= +aYgzJNnH2Xqe0smSn1QcjJYeQSRHr6fApiPLjL47S/Y= +MCCvRQeu6wPi0F1muNJjPJw9vScZj9/91W9qqDJHr44= +MixV+98IGsGyc+jecZ5ekrEVH5YvIYdmniE0AgMxydc= +JUPRZBXgzK5QepiS7phZbrX3mn67zKAjalwxd7AJyFo= +BqWahmRIktMFJgjtjNgCCDw3bZr3/TAa7lUhfgSF5wg= +6j+Ky0d4zL9rQupo87QZ/L/nm8KWJ6Y9zd44nUwaKIM= +b/B12vvR3rYYbSwBXnE75x7H2krJA+aF/7F5XfcOHd8= +piP/xGuL8sMeXwpSs5m3sCZsOX6O63D90dMKHqTl6kY= +QYL70eboAekb/jVluWWcnsgx+M2+CG5Xa3ZJm/1CkRw= +bNbwHv30cQ/TcdeOqP0uQJNN4HDDDWoRKwFfBVWtajI= +WwmRu3N5TG7jF1/WWXnBezU2bSYtMqd97EktIgq9Bp4= +1VqFhRx2/iGViM4FQQuEVO8Zyw2FH+Wqm8Qn9Q99oBE= +OlxoMtve+/wbIDis2V4XJzqJBhnECtn1eG0t3f3CYdw= +LOP4ArYSUgVC+e4Y/QEdGqsWfSDWAW3sSGI3NtqoieA= +1bQqyp+C+0rWfCAnPdl9whg0TrghLrlhVrQwcjoMpMs= +FGDzjV5EHVulklGC4Y1RbAjZcZ+4oLPoy8Fkjv768WM= +WBi9u1bwTQwX8taNX36AGSE8HuxlrgyQjDLZkp8hifU= +ZrWMv6rDwxZ2wR02OEFAEVr2c4eVlE5N1+7zNOZCAlI= +edC4/hOnGjQ9d3mveeUUBB+zaO7HuMG8HvCxiKq8aVc= +6NJQEkoO/4RuvmEMCILrWbEF55Aqc+W2WKDgIli5ECU= +r4TbqO+RXode6SoQLtNDpjp+rzPGfp4TJhFTZgiNgpM= +BURUEZJsExOcCtR1MYWlSD10XFFPJ2eigpkN2UkG0FQ= +qCNbVEPd2LcZlsW9PknAHffUbJjpwc+/9RFGJGgjV5k= +SqYpnvZ9wWd8B2k/TEEj7u7Vs0zq226j14GQKXMB7gA= +Hcl5Q90zrYI3lIEMnQ+8j68/174bwLShjEBRpE5/DtI= +0kSrk7YDC6wu1OKzM6B4rp9u6kJm41TZfvHuHNf92/o= +sKNnckJ6hv+MDtNQpP5P7iRdsmRU3dbDjmcFzh5Vb8U= +bRb7+V3zorR13S150edP5ByzmuNoEIhMrFJ7xm/p8Oc= +FEUdk9WIdSXhEziTptaJE/PQ7bYT4AFY7P/V2vCImsI= +LowTRy+0P018XuRd5ZG54W1k09jb84Yl+3wK/vAGGD8= +8q7Ecj8MLVbI/HzGbuOryRx8rg73HSFDwk2FN7gNkkg= +jwVZBeoSXnINtyW+WBDHxXhrdH7NdnIeIrecoC3G2oY= +laUrOZeJiMYmbDHZ4/66fXhoLQezy8Vb3bS76yPbdkU= +1O9KErAMUSq+H+VLKQj8yqzrUBtFqU9uO9qTnyMSohc= +AVyYqrIZrKECuFYKSI9cF2lcXN5MSnI+zvxZKyiGztE= +QtPATMFTognqmxH61TTzwd0SciSHgeGf/K46eNG9bo0= +IpGwl4PE2fNmPcjpw7asVGI3GzdFbY6+sb8MzglvqWM= +vD182xhWHUV3mO7TohS3lPxWrxJZ0CT6TrcCR7/2OG8= +X62l5UHIQO3LpF+xtVj8EkNWK7Rw0jAveh32SrBuG8M= +X1ng3ZGIgkbuwA2qLCSV7zNFYbAWEPwqmTXYBdOpShc= +0qSu5Rbhxe0WMvguDbJDxl8g9fhsw5sHrTVOIIarrlw= +z8DhVRzbgqLI+8n3dgTaWilCLPa0Q6FbEMAjxOicpbM= +WMGjk0lhjiIxQC+oDExfd9hqQK6BE/zrOt9kMDLAnjY= +6l7lGiNrFPe70+wV6nQ3jBf+CQmDDvawl+jng0m46jc= +5mwEOWMTTnZUIn3Pp0mOSqY6juKz+3UicGiv9ySIJLM= +vKIwrFWxEWWRF9gEug886gq7HTL9iI6rsc+lzqFJmz8= +CsZZt7c+m8UTq6AB98ObTOLYjazS80EVOwau6YAHfdM= +tlH625fDDwBIL0q81BtSktLVUzjD69/+jSXtxjstrLA= +HJBjrQgKu4gJR4c1M4Z+Hj2h6/NK5ClVGD8MRkJMJ10= +xvDGxTqT+onnL70j3bwVr+RuEUWXxzVLqsesPhIBRp0= +xVhFXiB6N3R+Q+qOpQ0puX1RQBFsdydmX98jFvU6RuA= +jbiT2psjJO69bqAE7kRHI2tMzTWykDfJDfAa+8YV9D0= +im0pu+KJqVt8OOyeRkXqob+ca4YL5IxzaRIMgpWoz3k= +RKPkYE73079mss077MNpuj7V9WshyoRBz6RPBx1Leng= +jcx/xDJ771XkxKmxEA03iKOQ5sHzFSnoXg1TkUSkPDU= +pIFtLUryLPdWoHAdpti4w2NngqhQ6PmGgzS++Pea/hw= +Wr1sR72I2OS0lV3WitOdpgt67tFFqfFyxrFxb7jCPDw= +QbcSn6TiFoblQ5ADeT44vmtTljEA8UkLM6c/GiDwmdo= +pNWU85KYslmKB9JHNnwQP7IgOGWPLKQNtC8A+ADfulc= +s6a+nA6RK/WXMOo6jwgPYlNyfK9MfxfEV3zvtckLGmQ= +hazr0/ulet1nW8HPTA+L+d68zG08gE02BhD2VfBX1OE= +KGUAsdd5Z8/qs09ISBbv/m4eI4E9169DY2pJio6mUQ8= +QHrS5QwgAwgKUFL9JFajdczFUPiPo2uAjNzzvvDfb44= +8/VEDpzrdGWlW8MxYXYLsAxMMKLg5Q8ofW81gCsnnWE= +84zGg0HS6PZi2yyq6wDh0PtJY1AGa7whYnjqbhDz3hQ= +nHC89EJurzXeqTRt56VUkmKe0FVrkgY2dd45+HE/NcI= +CuI8IrpHAxl5k1eqFmKitneZoKS8+2xz3zeKoM33grc= +N2OvcbC9HNVZJl2sTZFdkOj9pWqDptaun0ntLKWRMHg= +dTHh1oH9BKWRCBI8roxxohbt1JI4OP0zjtl1km7SlYM= +YpzX9sCHK6CsL/l3gpqRolKMpejKV5NUgIJ/yQyblvw= +QKWSt6cZWngq+EajRfKSW7ajJJYfd1qjESpDfZPxhyo= +3veNDBW0CxhtMzw+INwUUeVCjnPj6R35hihb3tszWv8= +Tw7K/B8pC1Knf3FNSEOKfbB3vyyVJCmhcIDXEVqzOtw= +oZQsviSrBTYllv5dCtvwQbbD/+6vgm+NCOxmobqz2oA= +wso70W5EA28/WFPIf3Uv7pDmD6gUKBMw0opO3owcv/s= +ZDFaYLj45vBgXx7H5c6NpT282stdwGkuEyewps5plsQ= +c7cVjMRXq/wfp63L5fWThhKsvUODCmpOmUxP2Ycum2M= +sCiRH9P+d1yZlPXY4Hgqqm9jysjSWjO07UPXds/kP08= +xK6oZYprPqia4ob4OkPGoGd0doI0DgxdYId5E6CeC4I= +es4H/pTMAVN5/AXp0+zRoFzL4PO1EUDI8H55caucQqw= +vO38A8k0QUGL88FfLTfiY6JuToNbnGoJzqr/KCIdU9E= +Q2YYe856Vm0e9pmiuL6sUmi3OHxv4JO8APucILKjpqQ= +Q5kpb0d9utvn1I88JZBKrZx+km/BkW8XZTDIM03kdhQ= +sOxB6UtNozoKPUnPQ4d3J7KUqX8K2P8fYAdDxq3tVgo= +0TnfHzpbv4k5oHbGg66yu23DzZH8Mv00fCZZVGGNzS4= +SA9O2cFjyuRYbEVt/NICx4/8Ba2oG5WE52/UV3XAHHw= +Gb4CyBH+TipEkhU5USr7d/z5KVSSRnx/G9Qz/TJ8dxg= +1Z+Nv3ol36hI3DWGayfe14F7YFXATjuPwWrIsQ4W3n4= +rc/0GHm0QUbAyA90wE7G8cHluKfZZgxfjxqWuzYuUcc= +gpOu4nwrZx4BpPcYMi41WnYq3d+iQfHlyQioPfZBe5E= +VEPbP9YHeyJcV8/YMPvwwnWHhE09uZpr9N2WIUMD4oY= +5XWi8aOacs8ffCRKWoL7QAdUTtfMDFhshQNx01eHzaI= +UfmVeT5KJ3OHtUh6o/5zPc3tC85Ur/HFxtqSecPpeQc= +cXWppZFRzg6BG4z8KaGu/hyjm5YsiXU45yq4yCTdx34= +DIyLqthqvtIqAjYJNhO5MFF6wXK+yyQdA+bnLWZHUbQ= +QUAHD5MWjKFY6/73bOBrPKmsljNRdIYFOTEejvfSuHM= +gGG3e+IzUestJB/OTpwto98auSFw0JkGuE/EXzLuMwo= +n2nL4sILpLBOBMaO1jvPgFJ5W1hDSIqhyzF26ekD8Z0= +BZ++RwWO0rgEGxF2i+ViLhTq5bpJLNUB5WKg5cR9F4c= +6qXk8pHSBPSts0rfiHRbL5irvfC8rsSN0OoFiElMN14= +TPAn3tVrzNcSJzb/P2F1L2h6Gl/i76UJuLzLfyQi0eI= +4+kfpB5UCN/XJ+AkXzOEQUUb2Lv+659QtRvJmgBAqBI= +d45yw0wTLjM5S0oorUZJzu61OtgV5shbeWFy8pi+2Oc= +lkOO3XqQUPOZ+kVj0XdygbTLzxR16KEIluR5FAfMXc4= +6WK1/Yoy0FkwE3qfPXQgodeHbqfe13AeyLy1xx/1EXA= +17c39U04IRwfLSfmifx1PDD9LgRWXBeA3mwgek3E4Rc= +7mSIFVk/3x4P5b+jXKbRmmb+mpKoG/Im1va2Gk6JAws= +/GWl3iy3EIPxdOM66BxOm4Dm/KvFuX+UMUPsvxZYWCU= +/M43PrwBjmtzbv/GWouB2OpLSvwaioJE2nX3CRYsqFM= +q282jsy2bohY9ijfVlBvb9pqUJPj4aDKa4huvJ1NtaQ= +T5yHdI9Tnd5ioR2WPY2/OGWfP7jhhcXVfiUoUUlplKU= +ML67ZU5iDlbhaAF39/QJnB67/5H7tCZZdSZZoe17JSg= +Nw0mrKMCytSn6kJrcjUu3Aw734X180nKnuyo41nBxOw= +anJEkNWn8VXilO/6QuMdEhaAMrtVBtxGWFrjeaoaDKg= +V9TzDkmBrnP0cf9plHFMkxO5iYqBRcdwdh6Cj2gWvic= +flcNAZEfspZwJss82G0eoaQrKV3R5xW2IUTIebxRr3w= +VCn0Zonza3c6eZoZL0E4cLqddF41N+/C3gJrY+PWwq8= +bafBm25sCLWbpMz8JZu57nSrnynFzCW5O/enHai1Gw8= +ZDCLO0QmBsfSRVuP+fZAPgbfQtZL4c5QSgGs4F9Frg0= +VbeiLoNPUAe1780zrFswGf7/1J2p5gGcIP7X5y/QcL0= +jC/oLEmnR4/BhE6mTO1E7aASTm6kuxuawyuxk1XQkb4= +Cyu9vJx83ZXB9fCKhbTxUa5+ujCPqJ6FwGfmp+Q7tCI= +yJHQLlyVnn/3ij2qrenjcPQvhEhsCFh7de82YyAjXlY= From 4e9299b4c73adb19a5674e9fe5259da19cf733e3 Mon Sep 17 00:00:00 2001 From: Louka Date: Thu, 2 Feb 2023 09:52:43 +0100 Subject: [PATCH 02/28] Remove test dataset --- tests/500-worst-passwords.txt | 499 --------------------------------- tests/blake-test.py | 32 --- tests/blake2s-valid-hashes.txt | 499 --------------------------------- 3 files changed, 1030 deletions(-) delete mode 100644 tests/500-worst-passwords.txt delete mode 100755 tests/blake-test.py delete mode 100644 tests/blake2s-valid-hashes.txt diff --git a/tests/500-worst-passwords.txt b/tests/500-worst-passwords.txt deleted file mode 100644 index a33ca4719..000000000 --- a/tests/500-worst-passwords.txt +++ /dev/null @@ -1,499 +0,0 @@ -123456 -password -12345678 -1234 -pussy -12345 -dragon -qwerty -696969 -mustang -letmein -baseball -master -michael -football -shadow -monkey -abc123 -pass -fuckme -6969 -jordan -harley -ranger -iwantu -jennifer -hunter -fuck -2000 -test -batman -trustno1 -thomas -tigger -robert -access -love -buster -1234567 -soccer -hockey -killer -george -sexy -andrew -charlie -superman -asshole -fuckyou -dallas -jessica -panties -pepper -1111 -austin -william -daniel -golfer -summer -heather -hammer -yankees -joshua -maggie -biteme -enter -ashley -thunder -cowboy -silver -richard -fucker -orange -merlin -michelle -corvette -bigdog -cheese -matthew -121212 -patrick -martin -freedom -ginger -blowjob -nicole -sparky -yellow -camaro -secret -dick -falcon -taylor -111111 -131313 -123123 -bitch -hello -scooter -please -porsche -guitar -chelsea -black -diamond -nascar -jackson -cameron -654321 -computer -amanda -wizard -xxxxxxxx -money -phoenix -mickey -bailey -knight -iceman -tigers -purple -andrea -horny -dakota -aaaaaa -player -sunshine -morgan -starwars -boomer -cowboys -edward -charles -girls -booboo -coffee -xxxxxx -bulldog -ncc1701 -rabbit -peanut -john -johnny -gandalf -spanky -winter -brandy -compaq -carlos -tennis -james -mike -brandon -fender -anthony -blowme -ferrari -cookie -chicken -maverick -chicago -joseph -diablo -sexsex -hardcore -666666 -willie -welcome -chris -panther -yamaha -justin -banana -driver -marine -angels -fishing -david -maddog -hooters -wilson -butthead -dennis -fucking -captain -bigdick -chester -smokey -xavier -steven -viking -snoopy -blue -eagles -winner -samantha -house -miller -flower -jack -firebird -butter -united -turtle -steelers -tiffany -zxcvbn -tomcat -golf -bond007 -bear -tiger -doctor -gateway -gators -angel -junior -thx1138 -porno -badboy -debbie -spider -melissa -booger -1212 -flyers -fish -porn -matrix -teens -scooby -jason -walter -cumshot -boston -braves -yankee -lover -barney -victor -tucker -princess -mercedes -5150 -doggie -zzzzzz -gunner -horney -bubba -2112 -fred -johnson -xxxxx -tits -member -boobs -donald -bigdaddy -bronco -penis -voyager -rangers -birdie -trouble -white -topgun -bigtits -bitches -green -super -qazwsx -magic -lakers -rachel -slayer -scott -2222 -asdf -video -london -7777 -marlboro -srinivas -internet -action -carter -jasper -monster -teresa -jeremy -11111111 -bill -crystal -peter -pussies -cock -beer -rocket -theman -oliver -prince -beach -amateur -7777777 -muffin -redsox -star -testing -shannon -murphy -frank -hannah -dave -eagle1 -11111 -mother -nathan -raiders -steve -forever -angela -viper -ou812 -jake -lovers -suckit -gregory -buddy -whatever -young -nicholas -lucky -helpme -jackie -monica -midnight -college -baby -cunt -brian -mark -startrek -sierra -leather -232323 -4444 -beavis -bigcock -happy -sophie -ladies -naughty -giants -booty -blonde -fucked -golden -0 -fire -sandra -pookie -packers -einstein -dolphins -chevy -winston -warrior -sammy -slut -8675309 -zxcvbnm -nipples -power -victoria -asdfgh -vagina -toyota -travis -hotdog -paris -rock -xxxx -extreme -redskins -erotic -dirty -ford -freddy -arsenal -access14 -wolf -nipple -iloveyou -alex -florida -eric -legend -movie -success -rosebud -jaguar -great -cool -cooper -1313 -scorpio -mountain -madison -987654 -brazil -lauren -japan -naked -squirt -stars -apple -alexis -aaaa -bonnie -peaches -jasmine -kevin -matt -qwertyui -danielle -beaver -4321 -4128 -runner -swimming -dolphin -gordon -casper -stupid -shit -saturn -gemini -apples -august -3333 -canada -blazer -cumming -hunting -kitty -rainbow -112233 -arthur -cream -calvin -shaved -surfer -samson -kelly -paul -mine -king -racing -5555 -eagle -hentai -newyork -little -redwings -smith -sticky -cocacola -animal -broncos -private -skippy -marvin -blondes -enjoy -girl -apollo -parker -qwert -time -sydney -women -voodoo -magnum -juice -abgrtyu -777777 -dreams -maxwell -music -rush2112 -russia -scorpion -rebecca -tester -mistress -phantom -billy -6666 -albert diff --git a/tests/blake-test.py b/tests/blake-test.py deleted file mode 100755 index 5fd054f24..000000000 --- a/tests/blake-test.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/python3 - -import hashlib -import base64 - -# Python script to create dataset of passwords/hashes for testing - -PASSWD_FILE = "500-worst-passwords.txt" -VALID_HASHES_FILE = "blake2s-valid-hashes.txt" - -# Password source file : https://github.com/danielmiessler/SecLists/blob/master/Passwords/500-worst-passwords.txt - -def createBlake2sDataset(inputFile, outputFile): - # open password and hashes file - passwd = open(inputFile, 'r') - hashes = open(outputFile, 'wb') - # for each password in file - for line in passwd.readlines(): - # compute Blake2s hash - d = hashlib.blake2s() - d.update(line.encode()) - # encode in base64 and write it - encodedHash = base64.b64encode(d.digest()) - hashes.write(encodedHash + b'\n') - print("Done") - -def main(): - createBlake2sDataset(PASSWD_FILE, VALID_HASHES_FILE) - -# entry -if __name__ == "__main__": - main() diff --git a/tests/blake2s-valid-hashes.txt b/tests/blake2s-valid-hashes.txt deleted file mode 100644 index e73826e24..000000000 --- a/tests/blake2s-valid-hashes.txt +++ /dev/null @@ -1,499 +0,0 @@ -ugjpsNMcWk7sPwuv0rHJ5jqG8Upu0dqJHldfFl7487s= -bPWEqShWee3KgiUkxM6Lm1DENkK9AAGq3Vs4KZvApXw= -Efp8EQM3T/F+XQ5Z5DOwdDKEF3vg7hT9Jjmt0QLE8CA= -hzYfwu4KAVXxR45AJQQ8YuQzVPEdaUoxjgJzvyuVwLo= -HD8ARELR4MX8LFCfqGw5cFKxw6k0MYE39hpKYohIZC8= -cJ3LptLbaM3G1NNnTPg4J1W29tZzxorS2BMtXqwKVMw= -2LWd9pdJ/dmn6a1qkVQ2fyjthM5t8Okb05gsFOmCeG0= -QYog7cUBgVaJGNeY6GLkvWomRx42Itgbo0mwmBKrQAY= -hWptd/ap+Tu250mOZzGx8E+1EYYQqs3Jr7kOrTsEL6w= -bZQGPMCuCZvQ4S+Ubz8tV3x5aeD/5AfV7n2ebO+mCII= -iPc2Bz5zt1PcYtc/GJjDBhFDLf43XaygUF0n9kEvRjA= -bONtqw/HWgjH3WgNjnnG/qBRIZwZJiyL8ok5QD8uStw= -2ktUNbDOO9Z7NHtoanpvlG2NOcPGauf1bhaoKXNY2hk= -d/xi1a3Ejgyt42QZq1GikMqnKO5ifXHsYzv9ogkPqD4= -G+RwSFsJQWv6M3j0okhYeHuAlDboMwV+YcJvCuv2xOw= -FQq+fqQp5cE+62csb2BBR9RZuGKeaVCA7wldtiRkPWI= -Jr1QdbWJ2Q69hX4LhOllg5dkr6Jh66QZUClrRA16HBQ= -iwy4udDC9Ch9HlsIKD/qaaBONrJGej3Mc+Sq2sqhLqY= -8HHr8Q11MF6LcMWdLok4UV5xrGEDmHMJnoA6AHv0xY8= -zIexLYod6WEA6MJL2qybV80tztlCaypEaPfd/JjUBk4= -KoW/TRU26X8xRmNQIrJ6/F/+yxJQwOvslb3Qn0QF/SU= -gjxYg6Sj8as0PNpXRlKcom0E1uiY8ZGyGl/CoWwzqK0= -u91hMetSSDSOO1X2WCHvIYd6X5uA+FnTabmw98AbaCA= -jPcglIYrNBTw7+mcWWkmhvNxjr853SnOhU7O3zFkaiA= -UWg1O/7wuLZ52HKfz55U/v4F7leqgoc7/VBkcOFyOdc= -d9Ch+wsHOPMiaEHGTV3X4pyCrrBC+K4dw1onAYdLmd8= -dqAF0VjsS7HieTT4zb3h5dDiKC+mX2lG26vYUk+XZBk= -rthaZ6WDTEotqJMr/ePXaBrdUqCZ1TeU03ej2HkRIjA= -awDjyoidpuZvu5MlUj2Kh+MxDlBAxOHzp0ioINn6L44= -l1xjE9PLT64/8S/szDSmi4cZ4nk3KDd7PzL6++Obin8= -1A46mnVRDviwcUiwWWT0PFcVey9tf9Tt211e6ywenWA= -iuBceczyQsyVT7NlhLIYHMkjYoagOC5ptRbyzvO6WQI= -7SZWEHFeUZHDcezk3migRToxiYoXyisfIcKFd9Mczgc= -HrmeX/Gx+VZ99Xkr++2RiAfDK7jSayx8hsl1scV9AUo= -brKESxet5Fa1PsIk9tR2Kos8sLjDSSALWLEf/n07GGc= -gfo/TkiY4H2IJSMl3pqGp8N7SS7hHEhTYQ0a9yQBMIc= -E1Pbgpy2v0uK2fFlP204UAkwbhnBn6b92UODuRJB5Zo= -LQgC56xjbxayPXcZiqm6D4n9YNdM0HvoyOpEi/niqx8= -Cw9BmGaUTtTXvMOPsrBm0CD3T0H6J2AOXZnkAd3JgIU= -6ai0m/Y9inS0jZfHMAgpkn0UMGqvIr73BWPTlbbLCm4= -fXxK5BTQ+Ku2T0XEmwyHj/iBZVaR7VEkysP6l/Jgoms= -V34dCz10cGScZ5xSgiEPY8G5FosrIcebcmhXYwSM9as= -zeNxXrSbMjEOPBoSLYtiQYYGZwsZFhk/S1ErAmFfpXo= -Yrrx4x6gqraLSarJIU9S2PB69top8/O+pjgQPV5eBn0= -Ip6JL5i/N0dqivx27ppv0W+jj31yu/d7QeQG3rTUY/4= -lOuXwSVoZStmUxC+4thgJuP9pv3T5AayPs5VEVucqBw= -dyKT5e7KTeWgSpJvl/DyXflt1eAvO/CXwGEhk3SyIMo= -qzEDzKjRzXXZJyjcPkeTNkCfZZQPdgyRgqSStMROlX4= -vblTK2VEFx7eLe2c54R+8wE11piWVm9cGIwn4Lj8mbA= -VqDdI2JdgrYxAraRXFYHOsIEgdd68O37hL9d1KmmFdQ= -ZHjNhOySflzgIZ1IeVchbBR+0oc6YwiV6P/WYBNltbg= -TLm5Y6qsXc/MKD7yTlyJ+WjD2+D34WQNmx0kbSkJL1c= -u1r5mupyLK1S5+10QT5WcduNhqj51Djv83zzql6WMjY= -9It2jk/J+FNUiyTXyoQR12W7kQcdgRQsjT3v3ZfcNyY= -QwmqnV4MSA0EQFGObZ05MZJirOu88elYwppR74ubs20= -oj2GCI56dSas8C8PXGIW2kOqG9t4knIccQrt+V+M8wQ= -FzAh+AKVkAsWdOpx8U1jNSrcb5T0sqFVhiIKrCXy0XA= -ooHRYS1AyZW4tX35RPbH5CwH7CCuqEuSDVjAC0IrMR4= -mBQ5E/Jz2JYlb6hi6ZERkuLxX2Zyj9v12PuDu/fU6eA= -OUTRiniNq1GxAAHjLCKoVZCuarCSoSpdOHfQwkD6C3U= -flKBgG79uJNanhgBhH/NZBcnzYP4uzNZSFixR/CG9wI= -PxYhyFd34Y8DZ7KR5e6hrOEHGi2kJPtHm2AY3dpCL5k= -KUztPzoU3wmKq7N8alM4KqsK+CEwRZXUbhec5CEbIM4= -YsUYgGpkO1LpfBTjklU13WTIs34V6l1CJPrhx9nIPGQ= -O2tfdQsdUOJ/6u42HKc8YHijHXCi7hmkF1t8pE1+KVk= -s0ZOFrdZgh5bPfK4ZsCSobBEEIxxUOvFd8JJHkHZ4lE= -CwsYwHJulxIXYNMq6kkEcBWVQaNKgY6dPXQD+S5reqw= -m1mJOinLYelp7nq+JsrvOGHWrhLLT8R/kGIjb+YTNJ0= -p057ayp96DCHfTtCTrgnK7NiWQR7vlbI9eYYi0AFDGQ= -kzNaseRmuL2HFM5D3sCO7aSxK/sv+XJuKg6NocfZgTc= -dqVqIazLS5FqnwlwKcui/WkV5fS2eHkUwr3rJaidehU= -imtZRY2B+PcicdR+zWd+CvtVjMXv8tJARngdV/z/Mp4= -FrYFmxCJtrWhvfS/rl+7IBpa+RnkvLHH5m5Dq0ChSfE= -oWT7MqtWycKVCSJNwxKE9uMMrUTqRf/y4NvG6cN3XFI= -KY4o+UgimWui8B71u6KCRR8TpPR0uyh9a8Sf+d7+5kM= -DnPwVYCMdoNCIgcTM9Ofy9HH3W8tx6++q+dgI7FgnXU= -vkQvFo8hbVwWJXhd7oPyMeJIFdF9MuuMLrMaChOW40s= -9EIeRh1D8acgJQzd8Jgn2p6MQee+Gfq8SoiWcX8PCHA= -zOdocuXZoRjBo8ePbthBSnRSrC85pBF+9ySUYKkI8Hk= -ogDbc4Vh5vk5ImdwF0M42S8ASuZter4PFThgJXRKeFE= -yIm/l2SJ8tXZg4rqQ2/725/6LS1XR9leSs4AyYDzUMo= -j0EY8M1JTHN1QkEXaCAKCUkcYks1w1DrYfKW4IVDnNA= -k5g147onCU8cKFGWHA3wazZD5Vg3/ZompvW5cqytBeA= -67q/gmJiszVlYn/5UTpUpGr6ecmbU3wD4RmzBOehH10= -AZIRedS8dhRNVWl7THXHkLw9xL0BgQ+r2wSh3uxsEAE= -js/hM5wkyCxiyL0Za2wgec0k/ZYC1Zyg9Q5jJfhG4lw= -ll3HSO1q/mAx05tpeNpu5cEspf2rB3P/cX5Ltx8ZSoA= -aIHAmD4lGWkkfw0OY1G7WwHU7vl4Ks3lrK8YqWAZW6w= -UXqMkiNFgXKMe4CvH1KXk0zliuxL82FzRtvL0BAEXKA= -hnwV8FTG3htvF9LGOr49oYHJT/Kiuqudg10uaYi52qE= -ILIxe05ojmlNm6luCXcyXRWA7PPuijhbJtxiIXJ7Igc= -1woA862RH/5zosgGWz5NreH7MCQjsg2+GyfIPAM01nw= -T7pGmMUNxz6C5eo5VKqM2uYmOC0NCGqPnkpy9CoH9iU= -gqxxyeKYX7uTYeT0N5oHuTTpu0uf7q3trWBylSME2As= -Yb/Td6FzUKVbsGvvj977vykX/tUlaOsCqtprP3vJ3f8= -aEjXYh+ClbNBlt4xr8R8Y2Jjp4ovJuirwlktdRFR0co= -dOMdSAKfVZi/oVHrLN/h14OKitDrsdiJu1aeGiEugRw= -OWmzkmZUBllmtvjZpleJsPdtVuHiq2fdlPqncJWRh8o= -sP9UotDczM5yAPCoABsCTv0KnpVQviNpAKEtINCSHoY= -UUVger+UC/O9knNVncVBTqs2DyJZgNeeFj0VerR+gvw= -DEyg5q3rpEnvnmonXYHXGGvXifQ8O568B/JZdUaB1Do= -zub+szCnqIwisFvHFn5yUvCE9br5GVXIq2tYF4jvZNE= -LJ7owgngPKdepIxo4icjhl2BY9ciIbVlMcyLDotixGA= -3ONfmtnjFz5tJGr181nOeC8pzxou55LiV9K5pM0TDDE= -LF3Pxos7TkocddTyAtSrquj/IaCryR4NwbFe4lvVCXo= -1aY7c92g76VF84rt9ICjqrwGDG3NuMKh5lQG+JBj4yE= -IIGwE2JIfxOoEqiGgZCdNwoW66bN9RVcI/7LB2UPDxc= -9qqRCQByGQBecev5qte16I5WzAS+5QEjymwEGUhNCgA= -M4DoWUtxrO2CUo4BZVSTXGZCbp0XvGHwg9XElJ0Rk0g= -G9CIdDSH84JllMF/ImCQa9BEaILdssatND3kpU1kcn8= -SLRwVRoTo6H89GShs8QjMZRE/TDNbil1u1WDvIlcshM= -3K6ddhHcMpmhDPr2TH8n4apgxhhLJwAzPPLMuGpbfJ4= -6ZRO/d2gwJidWIQiWvRKopmbYePbHdxKE4guOaEvLao= -WyLJhCzRIMhCUzAEFuGf9byEciR9RP1U+UMRd6YYnrg= -prqXDNl6XbTmQjhhgpRuhMIkfhsWS4JEA4MDZfTNQw0= -CJ8wKxj8SWl8WtclTmzb36s9AAVuIvdGaCEz5eqITlY= -2xHoxrQVZfAbuIoTSMy1Gn6+WZD0YMHSvAWJKgQBqwk= -qv1fkxAi9oI8DlxCLTIXcfiHxHKiL7xFHAgOGjVVU7w= -X7aAU4pNGEgkV4SJV234YUcE12oqMM/cjCJUW8igqo0= -TtofLz5auedvSeNoKdLWatz1ZCFsYUJKwVJvJM1i2MI= -GWc6Fa4nkYv8RglTUDrn76cvM+u9pwXuCjEzp6Sw6co= -idrSd86JnN4IYj8gbyltEbQhg4D9ZW38xzKbLVSKLE8= -8mSZzCxYziykBZgpA9wo4Gu4PerBGuX4LAPRawS4dso= -g7y0I6vo5O9fwW12buW9ORzIr7yTyZ5pEyeOWhwwSmY= -QzciKCEr8+7O2IU8AjJJ7N9Y7fdSnGpQUzJyTrDXMLY= -kkFshEg6ofF2sPy5JIKKiViwNIOZSB6lqusRFQC/+jM= -43huA4seyypEnwjDNzZ6aUKQ08wsW2Fge/IjJbAmKVM= -IxbfSeLS9TWELCGW53jGaalxXEG9n/xRtgfVpJK6Zwo= -wSAQnpj1NdQ4Dd5pUI+xRz7YqXfT7pjW0rEG+8HfIPs= -TnpwKKpG8BGvIP77vVbULDNjIsmyAwuCcQYYzX6xnbI= -lZYy5CFBHWuUMGHck7V8hmm12u4+o26locwMhejK+M0= -2KGJrO9YuWJbqUZ/MPNE+nhlAQCjKvJVdiq/xFWXkQM= -lB55Bd6XY3kgm2DrThgJ1AhmJ5Qw64W91dUdbxKpW6w= -u7g1rUWJWawJXH/Njkz2XzT9PdAGps+rLoVFHY2sr7k= -qtchikib4bpMv7kBeA5LBogCnQIDcZ5cayV0mZxuC9s= -6mgfWXQlj9lLUwQ9usUnX1YmJ5clJvpdjiTMtNmJcAk= -KQ1m8IsvJM7AwMz7p4airoQt6FmXJBc2vOZMqCGYMGo= -vfhjQ2v48snEGDuS7p/hbxIe4eDgJrjVls1kJP0kg+E= -7e+2kTAAaQ/O+2iFOOOmS0DOOSmksLAfJr3RT/MV7VI= -0Ja7ePUll0i9r0esHmoxCvywU4+5FH+DUPQbkkxDOX0= -LfQMptGPSGAecE3aK6+pxWJQ2Ww9XNpnY53thkF7Uw4= -Cst7T2Dy4EIzj8HruzfVY4OG7512DqRIO47sSGSou/4= -+UZcysj9dADvx0S/kg9jO0mWuz3pE7oObk7LfMs7VEY= -AObliwxracGls37FdPzocDiXo42lf0g+p4M+tjBqeh8= -1r4b8r9TW9dMO8pbTBXthIYgdhSIOMALfTCQD9GOT3E= -ZLjWatXWAAtl6LFOvW/WJkcFLHEuuoolgcOSYCHQgOw= -Kn3/hDPJluMD0GeXqA3weIGZzKb5LiVtW1JcBk0W3Lo= -/Ieob43s0PkFUplmA2j0Y0sY4wMqyAScQsGBW9XIM6g= -7//dXcwv3v5kLq4yje5NNOt2IEUgTS140etiXZ6/k9w= -pF+4hKxlzbRVmyuwsXAWu/6gFpHqqlMo1u9DF4WRP3E= -WCJcb7AUSchE5TNz7Xq/p2CZnNnKKw5P2cKWpZuh6mI= -OJophdYYu0/NM24/+7bYKojo+398DfZo7uXmbkZW7bc= -jRZpZan7IaO9iYENd0vuf0zf4cNz8ia5is6u1c2akeQ= -BL+f2UIEAOZbaA4TctdVq0zKd1PWTi8gnYc1ArspiU8= -2tzF9wLv+RvJpE9SYoHPwHhg9CxKEvfEt+kuzfm6SQw= -qDb5awmxpp5HUFdwFClFJS7jDgPIWWifFYp7VOKaVF8= -zVuQSIN+0Y9B1p/io4X0LgZGuguA31A5u1jflfERF5Y= -LOc+ZA9Xiy9FeuzWcqtjUQDqmnd9zjlHTYfVCRIRUn0= -v6hngBqfYf6J3c/0CBVjCTC8GTgdvkGJEfSnorHOIhs= -EZNKgZKMJfNqMWt+gr2AZTJXlCCiyYAq3U3bYe7w68w= -jqqt1VcHunQUExyeQTZuEBpsWQEutbgJ2si3+O7hmaQ= -lUKeAYvZ9GFtos4rRv8emHUrZQEzCWcs7LAZHQUObd8= -SkghXqiR2wjWk7qCYWn45Zw8OoWbLJKmj0LLsj4Uy/c= -i8R7jUMd/gUJFw/CY3MEmkzhKOPr+1kCLY9bsiAAAtE= -Aw+Tgpj7In0gVPCGSJ9TzT5Vf+EEViXT6JmLRKeutt4= -33L30WIKPxMA44E20Ca4hjeTic7oQPKvY1ZB3kZrwK0= -bl1Z3Zfk0lsEq6Nzas3oTtOIrHv1jpauFfV/RFIK2cA= -sD8aVordKyrkqncTrGjgtVxSbCLCqHtegaM8JxzvHnw= -rDsdh4AUQ285KlwIOEoKge1kx1nalF3YCO/PoxMOz9w= -2VdRk1L9ocmS5ryh9kHYIByjizeczfq0Mx63F6+4CQQ= -dddhe3ZGlykoq4r6Wj/gI+1ZT6FPCDUNi1qhBkkOpB4= -YjdVshvyZ4A6M8ChAQxm9Y9dS8oAFMNlXuxAQlfZB24= -TTk0evyGbFVWQf8/Ac32fFW/KUHC0wi9hVXq+aNhKuQ= -G7YKzM3c4i1vGuclnkX8aoOiRDktAWvYe2tr8arK5gw= -fTDa8jXgtubWfZMGi3IW52ufLHAjZDD4auFSfpDN7Qw= -6xqFS+Btdck19EUest9YQLZ98yjAjiqRvX6ZOUVLMjU= -a1MY45b80Pk/+LgiwA1p4JAulRBxNHAbbj1/K19yAbU= -y44E4uZwXKCx+yQSaOPTGqKOTllUerYVlXd94ucSTqo= -q+999FsWNWwWz7RYdFvAZF2jvqWDJjNnEWU4fxWX2cY= -f79lijOutkw+x7GgdUOfARFb62Du7ZpOWu60tW6UQY4= -EChxRIXBZjruyGAhtPUSRTDMv8H6Dhm+DZfi82O0anE= -1GD2zj9JCBRC2rca6VTssXdfVzcSuk68qD9EdR1byVg= -tO+KrFnyn23YdzEnVE/bMCKODRw4ypMa6pZRBrKEfwA= -2cELY+FHdWctc8aa3mobfPkAK+nFcqDUeQTA1XBEyl4= -s475i8tptt9B8UYYF86prqPh5v67BTqApOIncTANt/g= -OGnQ3dX9IRZHjuwEgaSR1p4mf59tW79jbiIogNsa6a4= -ARTFE/fiJkIMx1GGkAGMmIVg3jPiwS4nXeGMZk3FQvk= -z1cR41YgwWf3hxBYXpd/tTgAseW09yw/+Es36vtcNBM= -q2aLVM2Wd2G5SSgROXOAfWwCyZVcgiYPGJ80Y2gXeT8= -6ClpLR/EhU2uUMKY+zsW1d/wL5JqrYodNcggOyvLOt8= -x4u/TGBvp3MWHGaOBTbqZ0hgPmVv0UP1h5AFFkjzAxA= -6sOcauY3ZdLGqR0FTsY8Sm/TBaqzURPrdmMZ3E8Vd7o= -97r/b8hNx/4U1sdz7m7UDIfsJihZpz0Mvi8056Ux3TY= -gPgIA6bakiBo7K+byZpWkeCMd0AwiUwm9C/cZylGJ3w= -UwoUK/lC9Jm8/S0ykrKZOipsef992KhB7REEklxkw2M= -2z9UOR0tVkuPI/jcrLn4rBNWEGMjyrjwbK9TU1YQ5ls= -Xl5G/udIhf2Ds3eR/2tYyGWzq0QXfVF9RWY1QhjXSlI= -A4pHch8/DN2RAJqx7qN3/x096nz+Z9gERHdZd36StqM= -xS4LO8u+CIxtZsNUw7xHi5lePxl1zTVcfCVPPih4qwE= -ftCTpoWybE+cT5EXyaIkirtchPt/U9w/8120iNoFcw0= -8KLlUHdUZ7aCj3EBGCK55OAxUs75B3alw80eyofiYTQ= -pu25bOmqtSh1pnl2wb98DZs9O2jPurDKJkYfFrOLYms= -YCohtJ8+EsD6VuM1+bTFeDjarUYcKorH1331pP8R/U0= -YVJaRc2sxQ2AeB3841vexCScWTWlsM+3hQHi8MV0vbI= -+Zcb+f7T63vaNBLHUWAnRX0HkURbjvLjbHWSoF2uqcE= -0GRJVsN0xPZ3Vi75hgo7mLbR7AymZi1tyFkg072jRbo= -KzEsZH/pF5uVSeDOT+t8oJnbcgQuGSyugE6w95uUscs= -2ADFxUyVD7dbIBV07yU9fTZfyuWlh8TD1EGF/5CpEw0= -VtlyCbYKXZPuKDhlb7Ds3stdkEd7AzTEpzQRyuqqoQs= -2jkPdA51XcZxIaIo3t10dLyzvClzsjB6q/8fbrdG5Z0= -V8pniitun4MRalbw5AI0nqSouXor/1oRlVh4DK7P5QI= -jS0uHv9MIpEH3WCIKiStDB4gw9J7fB0hlAyMmJB0KzY= -Xgz1+oxfsuJO/QW8OCVBVVCC91sFbTVQ0AIrTUumLec= -uCOegWwbboMICW/zzGczjjmAnWLP6N9ZfJhcJCfvvM0= -yR/U5ZfYCU1HNCSKnYGN0IFqtgjEfHBVKgFqsEOgADA= -4s3dQydmA1YepHrQr6PIGJ7aD2HtmwD094z1dSDNplk= -7OEbek68uabQ4TJpAGzqtw80M6N6dQdXdW1tNuDIQ6g= -Ik1ABU6lhedNaKFLJ9Qqo659EbvIeDYqpvnliNPCZQk= -Qo8qx58gmXwcXkGeycJssEWfkVoWCKBTReopECEG1K0= -1U7yE51gj0ArkuPjHa+bOCeBOq5MmZKsEAS+EPoEv5I= -IcbawCxj3btZ44R57Manh4MlRa6ruI/jWmlnhRfh2Kc= -GmiSSYtY8m8V7Ht24/NXV0EzmGzK8nTWyq0eygHeuQc= -6VN20rSVAYLy80vJvvuwmBVtOglkdVxs9o3wD1j2Sl0= -Z4ii7r2U71bnC+eK9BJB7uOEAbMpZKMyl63oJKQlPpw= -yxGFuyvrGJoX5hof98Cclto21yZAtetr3ccfJDvPZrI= -YrawfRwsnQpFWi+RjZXYE4QixosJuYlmd//GpJY1Flw= -h35n5injGP+eSQdSHbMuYPPwFgohZwm+8MTEaAY13/I= -s+2ikNkddctCPrx0bwr7fmVpwAPCKYwGhQTu19A0PAk= -fQUgTO7hwiexgULkcQdkyc3Js+SkQWxkmU8qLJwn1xg= -9xvh4s6sjxDbmubgmCgpEnXcpEOulhdVaWIoAuzwoGg= -NJbHroYboZZ8OjfBeFV+UXEhr20ITTKeq77ohOjNs2w= -7L3NSFSNs4CAkVmiyu4NZAUw1blAY5XvGEJA+KWhBBk= -1Ze7F8PoqnDQMMtE8RnkDPx8MXc2+hGWqtEYbP+bKEE= -77Q8ishs1VJge5LKNn2ubMJsVRmSaYLrVXbrYAAA+fY= -5PzW1eZKXIw92y1VRMb2RT+Q9ZigS51GedV3nUFF90Q= -w11AbJujAoaDYPWBv6a3m28sR9XFaYQDL7efaP2Y5m8= -pbAB6rHDBI5uSbwZcKHVPomUHD6exAiTWvJo7HUm+0w= -VzYBwEyKs0z9/Ah3Lb3cjRHgW01SiICFvVwXshw3rKY= -hmW/6Zhlsvt2F3RaPKQRnsu+/0y2XEKD/yVQkUHx1Vc= -sbT/WGmAb6jAFB8P3IzQ4AIzINIDDzAx53qnz6I/Dno= -xpoY5psbaPJXo9GByzcdQQmtxDn9OD9enGpm/GwTueU= -yaS2BKajDq61tOn4dRcZVnUNVuXgQEqH2qEhm6foofI= -tPcDpHID9es6y3TcdUCswMYR/WVF1bU4+jMQPCN1DXg= -wo8NUue62oAXSvdvOXdwNRyz0C/Qvb/sgNjgrXgO5y4= -xyLvTAEZHkd8Q4tdqdhmqXbLb4WHxxmVskECv2x7+zY= -DnuIl9BlJcFwgfrtf8oPUvI+t2Sr5OHH39iRzInrC/g= -xjvARZDnJh5plkpbBWjMAhL6RrmsHR5QqIWY40rP1zo= -6MsxXLkPHMjIascFiTD5pFU7+f2Afrbw82BR4tUlizM= -KhrC4QCHK/u6a84fa+vW0jwN94SOHjk7wFDP/52/IQc= -qYahy4jezP5K3Db1bzATPe7shdh3lruDKp5ZjQOtJTU= -0YOiOIVBxXJ7jpIRatCYanyEv4tbApppLpfWjon4su8= -YEGAiLhJCU98wWIAwvbRSyOk2SbGROE3PXGVgzjntf8= -+b6Zkf/e4VWIf6aH4w7s/D6HpNfjgBIkqPj1vWkYmh4= -OR7t1UE2/dGoAOE5K62NnMFrrStT3optiPpC+AzB/yk= -3tSNxS3heKBt+ZPaps04gd5ThWVv3Hgk0kui7Hp5Dwo= -HbLmtevMHW6ltKFbCCHvlHP5YOikRF7xKxAboiqbLp4= -01+UoH4VcUWicjGobnQx1fxwiGC2LxaYkZh2puoOubY= -SiA5em63tqb9Vp8IW1AN6PlBF1HCRWhYClfuYkPdLrw= -ScXHrYlKfvt0P3JL/OTvauI75oTCM7RDiHdcr/CnGxE= -ap21NPQz9OXI11t7/MQESFEScte9rYnEzXll6zTqo1g= -72/fbQApaVxr18hIuh5FwN+IqeslPZoNEi+mBAzhQew= -P+r92lWADA0lDFRBp4ohKwUttGDGvXCJHLZFmjAnrUY= -Quyy0GDaFCQfMrhghKaTmF3ETzDiEtQT5Kfmoi5B4vU= -YCobzKFRvokLx59GhW+U8GhDJ6FOKZXUZd6H5PBzn00= -69l+bRYsJa0a38PMoB2F4OBQiVT5T/sXVPziWL2ZfAs= -XO+3oT0MyGbmjnX/mBRjozELB+21EVGSVBCLHbJ08jw= -FveemCku3Tps9KdF5RG/sLm27m55yPYhealO800NMV8= -4vQdheFqJCEdxUjcrurQdy38Ivk9Yd/oc6VdCI4uQLc= -DVg1NJWWSQwpXlONOcw+jvknqrO/6f5flNSiOMCaf2s= -2HA7wQMQWNUFQx833UnFXxhsEdEBpTJhJQZU/Akkiq0= -g9JjvLtqaNrhLbQlpZeYMKeAMvugNb7pSpx4p25JPwY= -dotiRgCcK6m3qTIsX7VvTSFWDd0yrxZA6yEOvXDjg/8= -EBNgxTd86yW4y8RCDimuB64dE0LoT/6HTIThAGVLfJs= -IUCSpwqfuQIh6RwoGDj0vB6qBjEIufPDvaWSDBcoTi0= -QGUjsSXc8bHsodRz2OzVDFP1JGRVOEwgpJAd9EbXOXw= -yIx5TTmdh902JIZQ/Y5NCSvNq1y5193M90uykYULY1M= -DCe4M2eEhCuhM2z/wz2dVoWj+GrA/Zfw96cTfo4lQlw= -PcMW+D+86OCA+owsJd6ac/wmoq0ncG/O43Xo9tlKi9w= -n7dy6t53/qR8WIb1HSvHnfVLFZ00ZMTK/amyhQWq2KI= -0Fozoq8rfWbb6jpSlLVoWaWsCtxunov/hTYpDg+tjjs= -jdcY/bvAyvNrnBZgnpM34BvnD2bFEFL5ruUp4F6ZZVw= -YRCOd9h0w2fEb85TCamTs+H9QDV9abRVlBFYQLfrTcA= -u49mKDfDCcXbUihEtHs5FN6FcSfTD1GaR3CFKgtLWHU= -sj1FEbv6A8bFD6riYfd1fIXo6m1cZSIA0WJ2HG6EYYQ= -CGS7vPA1goUpOCxT6PnT6ntlDs66LlpHwDIoGFNMRT4= -MdKfrHE3W68Qvuu/Qub85/gNpDRhZ7BNwuI5DZGOZWk= -pGFScIc07mq/OMBC9qcmFkxE+lGILCSnNrMSxTY4+ZA= -8kk9AIRhtIzQvjI70AulCTTG0YpWvf/SPfwX6XLhUfY= -5fmqnyLDVNzIl5E/qgsKD26ATgrwopbxiep2bTP2KTw= -HtbtOCJgEYLOUxSqqrl8C8P9vPFAnAmu1kff/LiVdZw= -YSeQ61PxyXhg+0TgEKsgBe/OaykndMMs1GZKXk25xPA= -0y2Dqn1fBS2F6NgGlpbYJ3D0aqa0WflA2Fqln71JVds= -8wQjv2acjdDyi98u7ehnvQ528li7kepJOZHc1oV/2w4= -E7L7pb8j6eSc/qtSMdL98CZfjoWIOHpDoERu2CvY0Mw= -ikzhwtQO2pjVbAn7+q5ovo8A2SCXOKYXFCIu7A8b994= -b+HqvHxuA/py0+yQPUxyhUy3C8HMbx8fMy2mjh221OI= -+0Z1D2uu2XADeNIvwKz/JLiIbYp3d+piqGPRNuCLXM4= -NuJVOPlnkiD0uIXb9arB7N2RIO3RhQEK1L8HWEDkr9M= -5G1DHWlZntPyxXO4PS+MQNP51BSK3f3jXcOLGd9K7A0= -u0dXGbS1ykF0+Wwe2s219yC5L9FEoD4IcVU3OFVMlrU= -+7hm7hAHChB8CLuAwGJ8T2VQsubeknkYDWO4U7XV88s= -M55Odb9j1x1l+mOMiPs6m6UT19BFC8C1PNkgWVDffkU= -up5XGB2ZhYJrq10wsCsbyPZFevPO3PyKzaB3tmP+n4Y= -V9ISvwiuvulQxu9KFplAOsFeVLQ6YLFJq5JBnjZjBs4= -uLPmYIzGX7NLacRVOgcI4Qwnu/H8bDoaqJoG2TODvkI= -umLs5mx82WyXZkFCjmHpd3FLqT4Blmgke2AufMm7Dso= -t8PAVe3hAtfzT5BXUrEcPX8hlvEQsrFud3lrGJD/ysE= -xXV6F7y1RJzo6b/wJp/dBwQvS2W5OxwG+Jses9fWMoc= -+kfheRy2qBMfuafbUe3fF3RrHnc039FWeYBjQxKDrK8= -dZEzeLV8YrpyXBo8wNWIVY/3T1c7+UfTXkSsYgjVnxg= -r52hf/wCnSjy4XTGZ+0y6oic679uVZah3DfB5EkU1qI= -2JC3kB4/nCtLsVwvrmd5G0Fl7Z5px7/mnroPE7Bif0g= -62fCoq3aOvgiAjp+XbiuSHTE7a352ahdlqpayGGMKWY= -mbXM/p4o9v9yz68t9SfOZOmm06ZlSki47BNqxZizjO4= -fsL5HrcphxVQF9AoVtvx12t77FhPE4joeB1iHUxGh8o= -fFMEgfDH2WoaXxV7BBJUK1s9HSDutTfDV/1ffroKLPM= -8L7nOs58eZ5DTVd5Abs3DlCrBICjC4Ooa5Aq//KbrgE= -9WRPQgtKShg177JvZ/EMglw9TNCLmPhfjeeofx3AyAQ= -dIBEvUiLX2SLsfjSWwO798Wlczb+5lPffTCCptVlWmg= -BVuvvwD++iltwebzapXREUYaUJ5uV4jbQdW1K8nfTh0= -zvVCrHvLHaITYnhpBLKmkUoC8wZD5fUxLvvRZmlM3fE= -r19PxTSdYPHJNHZSFzup0R9LE/iUE4UvL2D/fDx3cv0= -0HSC3sTslUyEnc+2h/jkgRmSpE7moRKHeOYqs1Eon5g= -oAGsJi/JLpaa3Osq+b1GIbgXJ1W8+1pAtyi8OOrDcJk= -wjAGVn++Z4AWYWLKX5JRKQMZaARupbbBUajc4Tt3tVY= -jAtbW2hpsUrOvjXM5hLYnyKCy/5nisODfv3HONVpZvU= -Q3GFs9FFYHJ3mIkSgX3A8tuaGwZGvZ+dugczjYlQ2eU= -NrojVzM3eirdCrmF3B9NGL6OVVt8Dzxwm19lqtEmuXg= -XShF5rMfrnatXWnaF0uDNyLhXnaA8EEJOXkGsKEbo8A= -HLbQyVIhjR/4KF0DpMfQe4yUaEKje7MtdR2laUnjzMc= -aIOvxQ5wNkNSf8U3APX6pVl/80AKbpD8TDkiZPujJbs= -ug2bJtifTJmOdtInISIstRqSh+jNCQAN3L6yL6iY63w= -RAiKwwWD926O7c3WGEVt3MlWuyRY2Tl6vjG8ojNay2Y= -PaNnTS8cP9nBYCF6psJ99bFDF/vD/vaNu71+sWBcZuM= -KLAnn6LukYAy57JMFhNPuca96PiN7UmEBw3EfXtWeNE= -J0ZRrnUY4OrIlbH0+GIvQaH/G9glo/L38ASSHg+E4ks= -DR23e+THKDIXLoIzLj0YR7+M+cdkCn2coYioV1IfzVo= -02+XYgmuVNER5G7nBn7qfb2xTJ+sGCDxeMle05Hb15Q= -OkNorapSlscRE9cTseryeWExzQMkrnqDgtDE2PZyKrk= -yQsNq4ZGa6YuqCXyiuiv0On/mLYpDQFO+hNiA3WuIJg= -keJPb3iEZ4gyNzjMLAaF4YM5zSOgkl51kAQwLFRWoQw= -7IVEDCSqldx9jiTPmvzTNPxkC8yBaxQTvF+zgDpRb+c= -nXCTPVL9sU7YnUW/sxZD6jASZDQahrtM7OuK00FQQ5A= -M5oieNKJmW4EIvz7Ql10ZDPXWxqDgOeHB3T4JJ8NqAU= -mbz75MZcwt/X6w1sy9w3FqiWmByh40wWZL7IKdXjxEo= -zpbJZiCS5t3uM6XAvWp/hGqwpVHWxxbM3PtWuPbDIB4= -l5vu7/plmFh3y+GrHYj45wC2Imv/YPxiLSMf7lUNwGc= -lIu8x3D58zPY85f2e4g7Gvu6EZtYfwcSm+op2GSDGuA= -ner0mKrVdpI4fajIjoL6/3RNnwtsHfC2Yq6stL4LRXk= -kFo5CamxPp6XzEZYqo9quvdK3kKVHz2p5aSLANSSp9U= -vpFkC4gjLWz4DkN/NXrNYbD4PeyJs3A2jNhrcg0ONuc= -PSCva4qaJVwXlpgJU9Tz+sj45ippHoTejSZGeA7grnI= -0OOpq5J7iu5AE+SiUbjK8fO4B0apURkIDLuebRGc11Q= -ezyo/pg6UK3rIcvJGXnRv5n8KoJopU3OPQqcGw/eXyM= -o4bcv4Z1/WM6DOQRyDaCBGGH9tViRWRuJTJCNtCkjbQ= -yWy0ltgFMZXFWq2w1WADV9T51SIshVsr09fMUTITQss= -1aUxpHpllC237bavxzD5vWRmQjSgbtbFnghDos0p5yM= -JHPYTmmMxOp3OPmcb3UhEwmjueurfTUavL1FLRrdqu8= -AGI5HQAOjx5TkXwT1JfH9drO/UK6tg8XoOZw3ahcDK0= -w05S4oTK0PL9oZ6LGako+RZkj7oD9vf8EVKSXJ4gUIM= -VNUKS2uXR4L1kciQzxv/vehjVP285q6S9tAVEnmjaJ4= -3gwRg4mkE+uGipxrQiL+s/aESmoR01P+8F20ea7C/e0= -5/tRWQHQmt+HPKIMueEzpqjTEopfx2FYKfap2E7Tl3E= -Ocbn8/6zSX0iMEYkI1og0N1m8U2SGHN755gzIDCPSV0= -ARRu/KqDdUSUy/qpqhWRJbQgG+CdvjV0QwjVTZqspo4= -gkpt9tbukV7+cbLuvRo30jYJLNl3Pq/DSM9ASLx+teQ= -4xKiiGvEpVcsGfNjozWqJUPstfMW/A6zJA245KQTM+Q= -JBxnq+kN60GNEYkW7qQCHx9RneCSiFQo6xMArs+VoLo= -rjPmzNBIFpJpE/XJaW7j+gzocGWAGZtUwB8j0vlYAJo= -DqVkpdDLuOMKqBWp8Ba9kN0X/fan3bezdta6wTY6p3w= -HOF79LJLQFOekPXb6hWIPhJ6m/i/GbHVBsZ2EdXt8gU= -ElUkRxtmL1ws24xgWj8L2r6+kl936AyKSvOKD9FupZU= -FNWd3zt/S8LGb7T2rq0yBQMsyKuA8yFG66CDZ1kqI80= -QtOWbnHt4X0YrK5y0QuQyZF03XDIkhNUdxEsDE5BSC0= -FWkS7+aOA0U2qQr0tw+2Q9xaH5To2l92O0BWxR/rNhM= -PQYtToD/OK8t8sFKcyeujziE2BRpTMeUnyaC574mS90= -aYgzJNnH2Xqe0smSn1QcjJYeQSRHr6fApiPLjL47S/Y= -MCCvRQeu6wPi0F1muNJjPJw9vScZj9/91W9qqDJHr44= -MixV+98IGsGyc+jecZ5ekrEVH5YvIYdmniE0AgMxydc= -JUPRZBXgzK5QepiS7phZbrX3mn67zKAjalwxd7AJyFo= -BqWahmRIktMFJgjtjNgCCDw3bZr3/TAa7lUhfgSF5wg= -6j+Ky0d4zL9rQupo87QZ/L/nm8KWJ6Y9zd44nUwaKIM= -b/B12vvR3rYYbSwBXnE75x7H2krJA+aF/7F5XfcOHd8= -piP/xGuL8sMeXwpSs5m3sCZsOX6O63D90dMKHqTl6kY= -QYL70eboAekb/jVluWWcnsgx+M2+CG5Xa3ZJm/1CkRw= -bNbwHv30cQ/TcdeOqP0uQJNN4HDDDWoRKwFfBVWtajI= -WwmRu3N5TG7jF1/WWXnBezU2bSYtMqd97EktIgq9Bp4= -1VqFhRx2/iGViM4FQQuEVO8Zyw2FH+Wqm8Qn9Q99oBE= -OlxoMtve+/wbIDis2V4XJzqJBhnECtn1eG0t3f3CYdw= -LOP4ArYSUgVC+e4Y/QEdGqsWfSDWAW3sSGI3NtqoieA= -1bQqyp+C+0rWfCAnPdl9whg0TrghLrlhVrQwcjoMpMs= -FGDzjV5EHVulklGC4Y1RbAjZcZ+4oLPoy8Fkjv768WM= -WBi9u1bwTQwX8taNX36AGSE8HuxlrgyQjDLZkp8hifU= -ZrWMv6rDwxZ2wR02OEFAEVr2c4eVlE5N1+7zNOZCAlI= -edC4/hOnGjQ9d3mveeUUBB+zaO7HuMG8HvCxiKq8aVc= -6NJQEkoO/4RuvmEMCILrWbEF55Aqc+W2WKDgIli5ECU= -r4TbqO+RXode6SoQLtNDpjp+rzPGfp4TJhFTZgiNgpM= -BURUEZJsExOcCtR1MYWlSD10XFFPJ2eigpkN2UkG0FQ= -qCNbVEPd2LcZlsW9PknAHffUbJjpwc+/9RFGJGgjV5k= -SqYpnvZ9wWd8B2k/TEEj7u7Vs0zq226j14GQKXMB7gA= -Hcl5Q90zrYI3lIEMnQ+8j68/174bwLShjEBRpE5/DtI= -0kSrk7YDC6wu1OKzM6B4rp9u6kJm41TZfvHuHNf92/o= -sKNnckJ6hv+MDtNQpP5P7iRdsmRU3dbDjmcFzh5Vb8U= -bRb7+V3zorR13S150edP5ByzmuNoEIhMrFJ7xm/p8Oc= -FEUdk9WIdSXhEziTptaJE/PQ7bYT4AFY7P/V2vCImsI= -LowTRy+0P018XuRd5ZG54W1k09jb84Yl+3wK/vAGGD8= -8q7Ecj8MLVbI/HzGbuOryRx8rg73HSFDwk2FN7gNkkg= -jwVZBeoSXnINtyW+WBDHxXhrdH7NdnIeIrecoC3G2oY= -laUrOZeJiMYmbDHZ4/66fXhoLQezy8Vb3bS76yPbdkU= -1O9KErAMUSq+H+VLKQj8yqzrUBtFqU9uO9qTnyMSohc= -AVyYqrIZrKECuFYKSI9cF2lcXN5MSnI+zvxZKyiGztE= -QtPATMFTognqmxH61TTzwd0SciSHgeGf/K46eNG9bo0= -IpGwl4PE2fNmPcjpw7asVGI3GzdFbY6+sb8MzglvqWM= -vD182xhWHUV3mO7TohS3lPxWrxJZ0CT6TrcCR7/2OG8= -X62l5UHIQO3LpF+xtVj8EkNWK7Rw0jAveh32SrBuG8M= -X1ng3ZGIgkbuwA2qLCSV7zNFYbAWEPwqmTXYBdOpShc= -0qSu5Rbhxe0WMvguDbJDxl8g9fhsw5sHrTVOIIarrlw= -z8DhVRzbgqLI+8n3dgTaWilCLPa0Q6FbEMAjxOicpbM= -WMGjk0lhjiIxQC+oDExfd9hqQK6BE/zrOt9kMDLAnjY= -6l7lGiNrFPe70+wV6nQ3jBf+CQmDDvawl+jng0m46jc= -5mwEOWMTTnZUIn3Pp0mOSqY6juKz+3UicGiv9ySIJLM= -vKIwrFWxEWWRF9gEug886gq7HTL9iI6rsc+lzqFJmz8= -CsZZt7c+m8UTq6AB98ObTOLYjazS80EVOwau6YAHfdM= -tlH625fDDwBIL0q81BtSktLVUzjD69/+jSXtxjstrLA= -HJBjrQgKu4gJR4c1M4Z+Hj2h6/NK5ClVGD8MRkJMJ10= -xvDGxTqT+onnL70j3bwVr+RuEUWXxzVLqsesPhIBRp0= -xVhFXiB6N3R+Q+qOpQ0puX1RQBFsdydmX98jFvU6RuA= -jbiT2psjJO69bqAE7kRHI2tMzTWykDfJDfAa+8YV9D0= -im0pu+KJqVt8OOyeRkXqob+ca4YL5IxzaRIMgpWoz3k= -RKPkYE73079mss077MNpuj7V9WshyoRBz6RPBx1Leng= -jcx/xDJ771XkxKmxEA03iKOQ5sHzFSnoXg1TkUSkPDU= -pIFtLUryLPdWoHAdpti4w2NngqhQ6PmGgzS++Pea/hw= -Wr1sR72I2OS0lV3WitOdpgt67tFFqfFyxrFxb7jCPDw= -QbcSn6TiFoblQ5ADeT44vmtTljEA8UkLM6c/GiDwmdo= -pNWU85KYslmKB9JHNnwQP7IgOGWPLKQNtC8A+ADfulc= -s6a+nA6RK/WXMOo6jwgPYlNyfK9MfxfEV3zvtckLGmQ= -hazr0/ulet1nW8HPTA+L+d68zG08gE02BhD2VfBX1OE= -KGUAsdd5Z8/qs09ISBbv/m4eI4E9169DY2pJio6mUQ8= -QHrS5QwgAwgKUFL9JFajdczFUPiPo2uAjNzzvvDfb44= -8/VEDpzrdGWlW8MxYXYLsAxMMKLg5Q8ofW81gCsnnWE= -84zGg0HS6PZi2yyq6wDh0PtJY1AGa7whYnjqbhDz3hQ= -nHC89EJurzXeqTRt56VUkmKe0FVrkgY2dd45+HE/NcI= -CuI8IrpHAxl5k1eqFmKitneZoKS8+2xz3zeKoM33grc= -N2OvcbC9HNVZJl2sTZFdkOj9pWqDptaun0ntLKWRMHg= -dTHh1oH9BKWRCBI8roxxohbt1JI4OP0zjtl1km7SlYM= -YpzX9sCHK6CsL/l3gpqRolKMpejKV5NUgIJ/yQyblvw= -QKWSt6cZWngq+EajRfKSW7ajJJYfd1qjESpDfZPxhyo= -3veNDBW0CxhtMzw+INwUUeVCjnPj6R35hihb3tszWv8= -Tw7K/B8pC1Knf3FNSEOKfbB3vyyVJCmhcIDXEVqzOtw= -oZQsviSrBTYllv5dCtvwQbbD/+6vgm+NCOxmobqz2oA= -wso70W5EA28/WFPIf3Uv7pDmD6gUKBMw0opO3owcv/s= -ZDFaYLj45vBgXx7H5c6NpT282stdwGkuEyewps5plsQ= -c7cVjMRXq/wfp63L5fWThhKsvUODCmpOmUxP2Ycum2M= -sCiRH9P+d1yZlPXY4Hgqqm9jysjSWjO07UPXds/kP08= -xK6oZYprPqia4ob4OkPGoGd0doI0DgxdYId5E6CeC4I= -es4H/pTMAVN5/AXp0+zRoFzL4PO1EUDI8H55caucQqw= -vO38A8k0QUGL88FfLTfiY6JuToNbnGoJzqr/KCIdU9E= -Q2YYe856Vm0e9pmiuL6sUmi3OHxv4JO8APucILKjpqQ= -Q5kpb0d9utvn1I88JZBKrZx+km/BkW8XZTDIM03kdhQ= -sOxB6UtNozoKPUnPQ4d3J7KUqX8K2P8fYAdDxq3tVgo= -0TnfHzpbv4k5oHbGg66yu23DzZH8Mv00fCZZVGGNzS4= -SA9O2cFjyuRYbEVt/NICx4/8Ba2oG5WE52/UV3XAHHw= -Gb4CyBH+TipEkhU5USr7d/z5KVSSRnx/G9Qz/TJ8dxg= -1Z+Nv3ol36hI3DWGayfe14F7YFXATjuPwWrIsQ4W3n4= -rc/0GHm0QUbAyA90wE7G8cHluKfZZgxfjxqWuzYuUcc= -gpOu4nwrZx4BpPcYMi41WnYq3d+iQfHlyQioPfZBe5E= -VEPbP9YHeyJcV8/YMPvwwnWHhE09uZpr9N2WIUMD4oY= -5XWi8aOacs8ffCRKWoL7QAdUTtfMDFhshQNx01eHzaI= -UfmVeT5KJ3OHtUh6o/5zPc3tC85Ur/HFxtqSecPpeQc= -cXWppZFRzg6BG4z8KaGu/hyjm5YsiXU45yq4yCTdx34= -DIyLqthqvtIqAjYJNhO5MFF6wXK+yyQdA+bnLWZHUbQ= -QUAHD5MWjKFY6/73bOBrPKmsljNRdIYFOTEejvfSuHM= -gGG3e+IzUestJB/OTpwto98auSFw0JkGuE/EXzLuMwo= -n2nL4sILpLBOBMaO1jvPgFJ5W1hDSIqhyzF26ekD8Z0= -BZ++RwWO0rgEGxF2i+ViLhTq5bpJLNUB5WKg5cR9F4c= -6qXk8pHSBPSts0rfiHRbL5irvfC8rsSN0OoFiElMN14= -TPAn3tVrzNcSJzb/P2F1L2h6Gl/i76UJuLzLfyQi0eI= -4+kfpB5UCN/XJ+AkXzOEQUUb2Lv+659QtRvJmgBAqBI= -d45yw0wTLjM5S0oorUZJzu61OtgV5shbeWFy8pi+2Oc= -lkOO3XqQUPOZ+kVj0XdygbTLzxR16KEIluR5FAfMXc4= -6WK1/Yoy0FkwE3qfPXQgodeHbqfe13AeyLy1xx/1EXA= -17c39U04IRwfLSfmifx1PDD9LgRWXBeA3mwgek3E4Rc= -7mSIFVk/3x4P5b+jXKbRmmb+mpKoG/Im1va2Gk6JAws= -/GWl3iy3EIPxdOM66BxOm4Dm/KvFuX+UMUPsvxZYWCU= -/M43PrwBjmtzbv/GWouB2OpLSvwaioJE2nX3CRYsqFM= -q282jsy2bohY9ijfVlBvb9pqUJPj4aDKa4huvJ1NtaQ= -T5yHdI9Tnd5ioR2WPY2/OGWfP7jhhcXVfiUoUUlplKU= -ML67ZU5iDlbhaAF39/QJnB67/5H7tCZZdSZZoe17JSg= -Nw0mrKMCytSn6kJrcjUu3Aw734X180nKnuyo41nBxOw= -anJEkNWn8VXilO/6QuMdEhaAMrtVBtxGWFrjeaoaDKg= -V9TzDkmBrnP0cf9plHFMkxO5iYqBRcdwdh6Cj2gWvic= -flcNAZEfspZwJss82G0eoaQrKV3R5xW2IUTIebxRr3w= -VCn0Zonza3c6eZoZL0E4cLqddF41N+/C3gJrY+PWwq8= -bafBm25sCLWbpMz8JZu57nSrnynFzCW5O/enHai1Gw8= -ZDCLO0QmBsfSRVuP+fZAPgbfQtZL4c5QSgGs4F9Frg0= -VbeiLoNPUAe1780zrFswGf7/1J2p5gGcIP7X5y/QcL0= -jC/oLEmnR4/BhE6mTO1E7aASTm6kuxuawyuxk1XQkb4= -Cyu9vJx83ZXB9fCKhbTxUa5+ujCPqJ6FwGfmp+Q7tCI= -yJHQLlyVnn/3ij2qrenjcPQvhEhsCFh7de82YyAjXlY= From 30d950987801d4ece54c08b6dcdd4f748a85725f Mon Sep 17 00:00:00 2001 From: bacqube2 Date: Thu, 2 Feb 2023 13:22:03 +0100 Subject: [PATCH 03/28] Creation blake2s inc files --- OpenCL/inc_hash_blake2s.cl | 898 +++++++++++++++++++++++++++++++++++++ OpenCL/inc_hash_blake2s.h | 99 ++++ 2 files changed, 997 insertions(+) create mode 100644 OpenCL/inc_hash_blake2s.cl create mode 100644 OpenCL/inc_hash_blake2s.h diff --git a/OpenCL/inc_hash_blake2s.cl b/OpenCL/inc_hash_blake2s.cl new file mode 100644 index 000000000..913ff7ef5 --- /dev/null +++ b/OpenCL/inc_hash_blake2s.cl @@ -0,0 +1,898 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "inc_vendor.h" +#include "inc_types.h" +#include "inc_platform.h" +#include "inc_common.h" +#include "inc_hash_blake2s.h" + +DECLSPEC u32 blake2s_rot16_S (const u32 a) +{ + #if defined IS_NV + + vconv32_t in; + + in.v32 = a; + + vconv32_t out; + + out.v16.a = hc_byte_perm_S (in.v16.b, in.v16.a, 0x1076); + out.v16.b = hc_byte_perm_S (in.v16.b, in.v16.a, 0x5432); + + return out.v64; + + #elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM == 1 + + vconv64_t in; + + in.v64 = a; + + vconv64_t out; + + out.v32.a = hc_byte_perm_S (in.v32.b, in.v32.a, 0x01000706); + out.v32.b = hc_byte_perm_S (in.v32.b, in.v32.a, 0x05040302); + + return out.v64; + + #else + + return hc_rotr64_S (a, 16); + + #endif +} + +DECLSPEC u64x blake2b_rot16 (const u64x a) +{ + u64x r; + + #if VECT_SIZE == 1 + r = blake2b_rot16_S (a); + #endif + + #if VECT_SIZE >= 2 + r.s0 = blake2b_rot16_S (a.s0); + r.s1 = blake2b_rot16_S (a.s1); + #endif + + #if VECT_SIZE >= 4 + r.s2 = blake2b_rot16_S (a.s2); + r.s3 = blake2b_rot16_S (a.s3); + #endif + + #if VECT_SIZE >= 8 + r.s4 = blake2b_rot16_S (a.s4); + r.s5 = blake2b_rot16_S (a.s5); + r.s6 = blake2b_rot16_S (a.s6); + r.s7 = blake2b_rot16_S (a.s7); + #endif + + #if VECT_SIZE >= 16 + r.s8 = blake2b_rot16_S (a.s8); + r.s9 = blake2b_rot16_S (a.s9); + r.sa = blake2b_rot16_S (a.sa); + r.sb = blake2b_rot16_S (a.sb); + r.sc = blake2b_rot16_S (a.sc); + r.sd = blake2b_rot16_S (a.sd); + r.se = blake2b_rot16_S (a.se); + r.sf = blake2b_rot16_S (a.sf); + #endif + + return r; +} + +DECLSPEC u64 blake2b_rot24_S (const u64 a) +{ + #if defined IS_NV + + vconv64_t in; + + in.v64 = a; + + vconv64_t out; + + out.v32.a = hc_byte_perm_S (in.v32.b, in.v32.a, 0x2107); + out.v32.b = hc_byte_perm_S (in.v32.b, in.v32.a, 0x6543); + + return out.v64; + + #elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM == 1 + + vconv64_t in; + + in.v64 = a; + + vconv64_t out; + + out.v32.a = hc_byte_perm_S (in.v32.b, in.v32.a, 0x02010007); + out.v32.b = hc_byte_perm_S (in.v32.b, in.v32.a, 0x06050403); + + return out.v64; + + #else + + return hc_rotr64_S (a, 24); + + #endif +} + +DECLSPEC u64x blake2b_rot24 (const u64x a) +{ + u64x r; + + #if VECT_SIZE == 1 + r = blake2b_rot24_S (a); + #endif + + #if VECT_SIZE >= 2 + r.s0 = blake2b_rot24_S (a.s0); + r.s1 = blake2b_rot24_S (a.s1); + #endif + + #if VECT_SIZE >= 4 + r.s2 = blake2b_rot24_S (a.s2); + r.s3 = blake2b_rot24_S (a.s3); + #endif + + #if VECT_SIZE >= 8 + r.s4 = blake2b_rot24_S (a.s4); + r.s5 = blake2b_rot24_S (a.s5); + r.s6 = blake2b_rot24_S (a.s6); + r.s7 = blake2b_rot24_S (a.s7); + #endif + + #if VECT_SIZE >= 16 + r.s8 = blake2b_rot24_S (a.s8); + r.s9 = blake2b_rot24_S (a.s9); + r.sa = blake2b_rot24_S (a.sa); + r.sb = blake2b_rot24_S (a.sb); + r.sc = blake2b_rot24_S (a.sc); + r.sd = blake2b_rot24_S (a.sd); + r.se = blake2b_rot24_S (a.se); + r.sf = blake2b_rot24_S (a.sf); + #endif + + return r; +} + +DECLSPEC u64 blake2b_rot32_S (const u64 a) +{ + vconv64_t in; + + in.v64 = a; + + vconv64_t out; + + out.v32.a = in.v32.b; + out.v32.b = in.v32.a; + + return out.v64; +} + +DECLSPEC u64x blake2b_rot32 (const u64x a) +{ + u64x r; + + #if VECT_SIZE == 1 + r = blake2b_rot32_S (a); + #endif + + #if VECT_SIZE >= 2 + r.s0 = blake2b_rot32_S (a.s0); + r.s1 = blake2b_rot32_S (a.s1); + #endif + + #if VECT_SIZE >= 4 + r.s2 = blake2b_rot32_S (a.s2); + r.s3 = blake2b_rot32_S (a.s3); + #endif + + #if VECT_SIZE >= 8 + r.s4 = blake2b_rot32_S (a.s4); + r.s5 = blake2b_rot32_S (a.s5); + r.s6 = blake2b_rot32_S (a.s6); + r.s7 = blake2b_rot32_S (a.s7); + #endif + + #if VECT_SIZE >= 16 + r.s8 = blake2b_rot32_S (a.s8); + r.s9 = blake2b_rot32_S (a.s9); + r.sa = blake2b_rot32_S (a.sa); + r.sb = blake2b_rot32_S (a.sb); + r.sc = blake2b_rot32_S (a.sc); + r.sd = blake2b_rot32_S (a.sd); + r.se = blake2b_rot32_S (a.se); + r.sf = blake2b_rot32_S (a.sf); + #endif + + return r; +} + +DECLSPEC void blake2b_transform (PRIVATE_AS u64 *h, PRIVATE_AS const u64 *m, const int len, const u64 f0) +{ + const u64 t0 = hl32_to_64_S (0, len); + + u64 v[16]; + + v[ 0] = h[0]; + v[ 1] = h[1]; + v[ 2] = h[2]; + v[ 3] = h[3]; + v[ 4] = h[4]; + v[ 5] = h[5]; + v[ 6] = h[6]; + v[ 7] = h[7]; + v[ 8] = BLAKE2B_IV_00; + v[ 9] = BLAKE2B_IV_01; + v[10] = BLAKE2B_IV_02; + v[11] = BLAKE2B_IV_03; + v[12] = BLAKE2B_IV_04 ^ t0; + v[13] = BLAKE2B_IV_05; // ^ t1; + v[14] = BLAKE2B_IV_06 ^ f0; + v[15] = BLAKE2B_IV_07; // ^ f1; + + BLAKE2B_ROUND ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + BLAKE2B_ROUND (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); + BLAKE2B_ROUND (11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4); + BLAKE2B_ROUND ( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8); + BLAKE2B_ROUND ( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13); + BLAKE2B_ROUND ( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9); + BLAKE2B_ROUND (12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11); + BLAKE2B_ROUND (13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10); + BLAKE2B_ROUND ( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5); + BLAKE2B_ROUND (10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0); + BLAKE2B_ROUND ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + BLAKE2B_ROUND (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); + + h[0] = h[0] ^ v[0] ^ v[ 8]; + h[1] = h[1] ^ v[1] ^ v[ 9]; + h[2] = h[2] ^ v[2] ^ v[10]; + h[3] = h[3] ^ v[3] ^ v[11]; + h[4] = h[4] ^ v[4] ^ v[12]; + h[5] = h[5] ^ v[5] ^ v[13]; + h[6] = h[6] ^ v[6] ^ v[14]; + h[7] = h[7] ^ v[7] ^ v[15]; +} + +DECLSPEC void blake2b_init (PRIVATE_AS blake2b_ctx_t *ctx) +{ + ctx->h[0] = BLAKE2B_IV_00 ^ 0x01010040; // default output length: 0x40 = 64 bytes + ctx->h[1] = BLAKE2B_IV_01; + ctx->h[2] = BLAKE2B_IV_02; + ctx->h[3] = BLAKE2B_IV_03; + ctx->h[4] = BLAKE2B_IV_04; + ctx->h[5] = BLAKE2B_IV_05; + ctx->h[6] = BLAKE2B_IV_06; + ctx->h[7] = BLAKE2B_IV_07; + + ctx->m[ 0] = 0; + ctx->m[ 1] = 0; + ctx->m[ 2] = 0; + ctx->m[ 3] = 0; + ctx->m[ 4] = 0; + ctx->m[ 5] = 0; + ctx->m[ 6] = 0; + ctx->m[ 7] = 0; + ctx->m[ 8] = 0; + ctx->m[ 9] = 0; + ctx->m[10] = 0; + ctx->m[11] = 0; + ctx->m[12] = 0; + ctx->m[13] = 0; + ctx->m[14] = 0; + ctx->m[15] = 0; + + ctx->len = 0; +} + +DECLSPEC void blake2b_update_128 (PRIVATE_AS blake2b_ctx_t *ctx, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, PRIVATE_AS u32 *w4, PRIVATE_AS u32 *w5, PRIVATE_AS u32 *w6, PRIVATE_AS u32 *w7, const int len) +{ + if (len == 0) return; + + const int pos = ctx->len & 127; + + if (pos == 0) + { + if (ctx->len > 0) // if new block (pos == 0) AND the (old) len is not zero => transform + { + blake2b_transform (ctx->h, ctx->m, ctx->len, BLAKE2B_UPDATE); + } + + ctx->m[ 0] = hl32_to_64_S (w0[1], w0[0]); + ctx->m[ 1] = hl32_to_64_S (w0[3], w0[2]); + ctx->m[ 2] = hl32_to_64_S (w1[1], w1[0]); + ctx->m[ 3] = hl32_to_64_S (w1[3], w1[2]); + ctx->m[ 4] = hl32_to_64_S (w2[1], w2[0]); + ctx->m[ 5] = hl32_to_64_S (w2[3], w2[2]); + ctx->m[ 6] = hl32_to_64_S (w3[1], w3[0]); + ctx->m[ 7] = hl32_to_64_S (w3[3], w3[2]); + ctx->m[ 8] = hl32_to_64_S (w4[1], w4[0]); + ctx->m[ 9] = hl32_to_64_S (w4[3], w4[2]); + ctx->m[10] = hl32_to_64_S (w5[1], w5[0]); + ctx->m[11] = hl32_to_64_S (w5[3], w5[2]); + ctx->m[12] = hl32_to_64_S (w6[1], w6[0]); + ctx->m[13] = hl32_to_64_S (w6[3], w6[2]); + ctx->m[14] = hl32_to_64_S (w7[1], w7[0]); + ctx->m[15] = hl32_to_64_S (w7[3], w7[2]); + } + else + { + if ((pos + len) <= 128) + { + switch_buffer_by_offset_8x4_le_S (w0, w1, w2, w3, w4, w5, w6, w7, pos); + + ctx->m[ 0] |= hl32_to_64_S (w0[1], w0[0]); + ctx->m[ 1] |= hl32_to_64_S (w0[3], w0[2]); + ctx->m[ 2] |= hl32_to_64_S (w1[1], w1[0]); + ctx->m[ 3] |= hl32_to_64_S (w1[3], w1[2]); + ctx->m[ 4] |= hl32_to_64_S (w2[1], w2[0]); + ctx->m[ 5] |= hl32_to_64_S (w2[3], w2[2]); + ctx->m[ 6] |= hl32_to_64_S (w3[1], w3[0]); + ctx->m[ 7] |= hl32_to_64_S (w3[3], w3[2]); + ctx->m[ 8] |= hl32_to_64_S (w4[1], w4[0]); + ctx->m[ 9] |= hl32_to_64_S (w4[3], w4[2]); + ctx->m[10] |= hl32_to_64_S (w5[1], w5[0]); + ctx->m[11] |= hl32_to_64_S (w5[3], w5[2]); + ctx->m[12] |= hl32_to_64_S (w6[1], w6[0]); + ctx->m[13] |= hl32_to_64_S (w6[3], w6[2]); + ctx->m[14] |= hl32_to_64_S (w7[1], w7[0]); + ctx->m[15] |= hl32_to_64_S (w7[3], w7[2]); + } + else + { + u32 c0[4] = { 0 }; + u32 c1[4] = { 0 }; + u32 c2[4] = { 0 }; + u32 c3[4] = { 0 }; + u32 c4[4] = { 0 }; + u32 c5[4] = { 0 }; + u32 c6[4] = { 0 }; + u32 c7[4] = { 0 }; + + switch_buffer_by_offset_8x4_carry_le_S (w0, w1, w2, w3, w4, w5, w6, w7, c0, c1, c2, c3, c4, c5, c6, c7, pos); + + ctx->m[ 0] |= hl32_to_64_S (w0[1], w0[0]); + ctx->m[ 1] |= hl32_to_64_S (w0[3], w0[2]); + ctx->m[ 2] |= hl32_to_64_S (w1[1], w1[0]); + ctx->m[ 3] |= hl32_to_64_S (w1[3], w1[2]); + ctx->m[ 4] |= hl32_to_64_S (w2[1], w2[0]); + ctx->m[ 5] |= hl32_to_64_S (w2[3], w2[2]); + ctx->m[ 6] |= hl32_to_64_S (w3[1], w3[0]); + ctx->m[ 7] |= hl32_to_64_S (w3[3], w3[2]); + ctx->m[ 8] |= hl32_to_64_S (w4[1], w4[0]); + ctx->m[ 9] |= hl32_to_64_S (w4[3], w4[2]); + ctx->m[10] |= hl32_to_64_S (w5[1], w5[0]); + ctx->m[11] |= hl32_to_64_S (w5[3], w5[2]); + ctx->m[12] |= hl32_to_64_S (w6[1], w6[0]); + ctx->m[13] |= hl32_to_64_S (w6[3], w6[2]); + ctx->m[14] |= hl32_to_64_S (w7[1], w7[0]); + ctx->m[15] |= hl32_to_64_S (w7[3], w7[2]); + + // len must be a multiple of 128 (not ctx->len) for BLAKE2B_UPDATE: + + const u32 cur_len = ((ctx->len + len) / 128) * 128; + + blake2b_transform (ctx->h, ctx->m, cur_len, BLAKE2B_UPDATE); + + ctx->m[ 0] = hl32_to_64_S (c0[1], c0[0]); + ctx->m[ 1] = hl32_to_64_S (c0[3], c0[2]); + ctx->m[ 2] = hl32_to_64_S (c1[1], c1[0]); + ctx->m[ 3] = hl32_to_64_S (c1[3], c1[2]); + ctx->m[ 4] = hl32_to_64_S (c2[1], c2[0]); + ctx->m[ 5] = hl32_to_64_S (c2[3], c2[2]); + ctx->m[ 6] = hl32_to_64_S (c3[1], c3[0]); + ctx->m[ 7] = hl32_to_64_S (c3[3], c3[2]); + ctx->m[ 8] = hl32_to_64_S (c4[1], c4[0]); + ctx->m[ 9] = hl32_to_64_S (c4[3], c4[2]); + ctx->m[10] = hl32_to_64_S (c5[1], c5[0]); + ctx->m[11] = hl32_to_64_S (c5[3], c5[2]); + ctx->m[12] = hl32_to_64_S (c6[1], c6[0]); + ctx->m[13] = hl32_to_64_S (c6[3], c6[2]); + ctx->m[14] = hl32_to_64_S (c7[1], c7[0]); + ctx->m[15] = hl32_to_64_S (c7[3], c7[2]); + } + } + + ctx->len += len; +} + +DECLSPEC void blake2b_update (PRIVATE_AS blake2b_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len) +{ + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + u32 w4[4]; + u32 w5[4]; + u32 w6[4]; + u32 w7[4]; + + const int limit = (const int) len - 128; // int type needed, could be negative + + int pos1; + int pos4; + + for (pos1 = 0, pos4 = 0; pos1 < limit; pos1 += 128, pos4 += 32) + { + w0[0] = w[pos4 + 0]; + w0[1] = w[pos4 + 1]; + w0[2] = w[pos4 + 2]; + w0[3] = w[pos4 + 3]; + w1[0] = w[pos4 + 4]; + w1[1] = w[pos4 + 5]; + w1[2] = w[pos4 + 6]; + w1[3] = w[pos4 + 7]; + w2[0] = w[pos4 + 8]; + w2[1] = w[pos4 + 9]; + w2[2] = w[pos4 + 10]; + w2[3] = w[pos4 + 11]; + w3[0] = w[pos4 + 12]; + w3[1] = w[pos4 + 13]; + w3[2] = w[pos4 + 14]; + w3[3] = w[pos4 + 15]; + w4[0] = w[pos4 + 16]; + w4[1] = w[pos4 + 17]; + w4[2] = w[pos4 + 18]; + w4[3] = w[pos4 + 19]; + w5[0] = w[pos4 + 20]; + w5[1] = w[pos4 + 21]; + w5[2] = w[pos4 + 22]; + w5[3] = w[pos4 + 23]; + w6[0] = w[pos4 + 24]; + w6[1] = w[pos4 + 25]; + w6[2] = w[pos4 + 26]; + w6[3] = w[pos4 + 27]; + w7[0] = w[pos4 + 28]; + w7[1] = w[pos4 + 29]; + w7[2] = w[pos4 + 30]; + w7[3] = w[pos4 + 31]; + + blake2b_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); + } + + w0[0] = w[pos4 + 0]; + w0[1] = w[pos4 + 1]; + w0[2] = w[pos4 + 2]; + w0[3] = w[pos4 + 3]; + w1[0] = w[pos4 + 4]; + w1[1] = w[pos4 + 5]; + w1[2] = w[pos4 + 6]; + w1[3] = w[pos4 + 7]; + w2[0] = w[pos4 + 8]; + w2[1] = w[pos4 + 9]; + w2[2] = w[pos4 + 10]; + w2[3] = w[pos4 + 11]; + w3[0] = w[pos4 + 12]; + w3[1] = w[pos4 + 13]; + w3[2] = w[pos4 + 14]; + w3[3] = w[pos4 + 15]; + w4[0] = w[pos4 + 16]; + w4[1] = w[pos4 + 17]; + w4[2] = w[pos4 + 18]; + w4[3] = w[pos4 + 19]; + w5[0] = w[pos4 + 20]; + w5[1] = w[pos4 + 21]; + w5[2] = w[pos4 + 22]; + w5[3] = w[pos4 + 23]; + w6[0] = w[pos4 + 24]; + w6[1] = w[pos4 + 25]; + w6[2] = w[pos4 + 26]; + w6[3] = w[pos4 + 27]; + w7[0] = w[pos4 + 28]; + w7[1] = w[pos4 + 29]; + w7[2] = w[pos4 + 30]; + w7[3] = w[pos4 + 31]; + + blake2b_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - (u32) pos1); +} + +DECLSPEC void blake2b_update_global (PRIVATE_AS blake2b_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len) +{ + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + u32 w4[4]; + u32 w5[4]; + u32 w6[4]; + u32 w7[4]; + + const int limit = (const int) len - 128; // int type needed, could be negative + + int pos1; + int pos4; + + for (pos1 = 0, pos4 = 0; pos1 < limit; pos1 += 128, pos4 += 32) + { + w0[0] = w[pos4 + 0]; + w0[1] = w[pos4 + 1]; + w0[2] = w[pos4 + 2]; + w0[3] = w[pos4 + 3]; + w1[0] = w[pos4 + 4]; + w1[1] = w[pos4 + 5]; + w1[2] = w[pos4 + 6]; + w1[3] = w[pos4 + 7]; + w2[0] = w[pos4 + 8]; + w2[1] = w[pos4 + 9]; + w2[2] = w[pos4 + 10]; + w2[3] = w[pos4 + 11]; + w3[0] = w[pos4 + 12]; + w3[1] = w[pos4 + 13]; + w3[2] = w[pos4 + 14]; + w3[3] = w[pos4 + 15]; + w4[0] = w[pos4 + 16]; + w4[1] = w[pos4 + 17]; + w4[2] = w[pos4 + 18]; + w4[3] = w[pos4 + 19]; + w5[0] = w[pos4 + 20]; + w5[1] = w[pos4 + 21]; + w5[2] = w[pos4 + 22]; + w5[3] = w[pos4 + 23]; + w6[0] = w[pos4 + 24]; + w6[1] = w[pos4 + 25]; + w6[2] = w[pos4 + 26]; + w6[3] = w[pos4 + 27]; + w7[0] = w[pos4 + 28]; + w7[1] = w[pos4 + 29]; + w7[2] = w[pos4 + 30]; + w7[3] = w[pos4 + 31]; + + blake2b_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); + } + + w0[0] = w[pos4 + 0]; + w0[1] = w[pos4 + 1]; + w0[2] = w[pos4 + 2]; + w0[3] = w[pos4 + 3]; + w1[0] = w[pos4 + 4]; + w1[1] = w[pos4 + 5]; + w1[2] = w[pos4 + 6]; + w1[3] = w[pos4 + 7]; + w2[0] = w[pos4 + 8]; + w2[1] = w[pos4 + 9]; + w2[2] = w[pos4 + 10]; + w2[3] = w[pos4 + 11]; + w3[0] = w[pos4 + 12]; + w3[1] = w[pos4 + 13]; + w3[2] = w[pos4 + 14]; + w3[3] = w[pos4 + 15]; + w4[0] = w[pos4 + 16]; + w4[1] = w[pos4 + 17]; + w4[2] = w[pos4 + 18]; + w4[3] = w[pos4 + 19]; + w5[0] = w[pos4 + 20]; + w5[1] = w[pos4 + 21]; + w5[2] = w[pos4 + 22]; + w5[3] = w[pos4 + 23]; + w6[0] = w[pos4 + 24]; + w6[1] = w[pos4 + 25]; + w6[2] = w[pos4 + 26]; + w6[3] = w[pos4 + 27]; + w7[0] = w[pos4 + 28]; + w7[1] = w[pos4 + 29]; + w7[2] = w[pos4 + 30]; + w7[3] = w[pos4 + 31]; + + blake2b_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - (u32) pos1); +} + +DECLSPEC void blake2b_final (PRIVATE_AS blake2b_ctx_t *ctx) +{ + blake2b_transform (ctx->h, ctx->m, ctx->len, BLAKE2B_FINAL); +} + +DECLSPEC void blake2b_transform_vector (PRIVATE_AS u64x *h, PRIVATE_AS const u64x *m, const u32x len, const u64 f0) +{ + const u64x t0 = hl32_to_64 (0, len); + + u64x v[16]; + + v[ 0] = h[0]; + v[ 1] = h[1]; + v[ 2] = h[2]; + v[ 3] = h[3]; + v[ 4] = h[4]; + v[ 5] = h[5]; + v[ 6] = h[6]; + v[ 7] = h[7]; + v[ 8] = BLAKE2B_IV_00; + v[ 9] = BLAKE2B_IV_01; + v[10] = BLAKE2B_IV_02; + v[11] = BLAKE2B_IV_03; + v[12] = make_u64x (BLAKE2B_IV_04) ^ t0; + v[13] = BLAKE2B_IV_05; // ^ t1; + v[14] = make_u64x (BLAKE2B_IV_06) ^ f0; + v[15] = BLAKE2B_IV_07; // ^ f1; + + BLAKE2B_ROUND_VECTOR ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + BLAKE2B_ROUND_VECTOR (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); + BLAKE2B_ROUND_VECTOR (11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4); + BLAKE2B_ROUND_VECTOR ( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8); + BLAKE2B_ROUND_VECTOR ( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13); + BLAKE2B_ROUND_VECTOR ( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9); + BLAKE2B_ROUND_VECTOR (12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11); + BLAKE2B_ROUND_VECTOR (13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10); + BLAKE2B_ROUND_VECTOR ( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5); + BLAKE2B_ROUND_VECTOR (10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0); + BLAKE2B_ROUND_VECTOR ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + BLAKE2B_ROUND_VECTOR (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); + + h[0] = h[0] ^ v[0] ^ v[ 8]; + h[1] = h[1] ^ v[1] ^ v[ 9]; + h[2] = h[2] ^ v[2] ^ v[10]; + h[3] = h[3] ^ v[3] ^ v[11]; + h[4] = h[4] ^ v[4] ^ v[12]; + h[5] = h[5] ^ v[5] ^ v[13]; + h[6] = h[6] ^ v[6] ^ v[14]; + h[7] = h[7] ^ v[7] ^ v[15]; +} + +DECLSPEC void blake2b_init_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx) +{ + ctx->h[0] = BLAKE2B_IV_00 ^ 0x01010040; // default output length: 0x40 = 64 bytes + ctx->h[1] = BLAKE2B_IV_01; + ctx->h[2] = BLAKE2B_IV_02; + ctx->h[3] = BLAKE2B_IV_03; + ctx->h[4] = BLAKE2B_IV_04; + ctx->h[5] = BLAKE2B_IV_05; + ctx->h[6] = BLAKE2B_IV_06; + ctx->h[7] = BLAKE2B_IV_07; + + ctx->m[ 0] = 0; + ctx->m[ 1] = 0; + ctx->m[ 2] = 0; + ctx->m[ 3] = 0; + ctx->m[ 4] = 0; + ctx->m[ 5] = 0; + ctx->m[ 6] = 0; + ctx->m[ 7] = 0; + ctx->m[ 8] = 0; + ctx->m[ 9] = 0; + ctx->m[10] = 0; + ctx->m[11] = 0; + ctx->m[12] = 0; + ctx->m[13] = 0; + ctx->m[14] = 0; + ctx->m[15] = 0; + + ctx->len = 0; +} + +DECLSPEC void blake2b_init_vector_from_scalar (PRIVATE_AS blake2b_ctx_vector_t *ctx, PRIVATE_AS blake2b_ctx_t *ctx0) +{ + ctx->h[0] = ctx0->h[0]; + ctx->h[1] = ctx0->h[1]; + ctx->h[2] = ctx0->h[2]; + ctx->h[3] = ctx0->h[3]; + ctx->h[4] = ctx0->h[4]; + ctx->h[5] = ctx0->h[5]; + ctx->h[6] = ctx0->h[6]; + ctx->h[7] = ctx0->h[7]; + + ctx->m[ 0] = ctx0->m[ 0]; + ctx->m[ 1] = ctx0->m[ 1]; + ctx->m[ 2] = ctx0->m[ 2]; + ctx->m[ 3] = ctx0->m[ 3]; + ctx->m[ 4] = ctx0->m[ 4]; + ctx->m[ 5] = ctx0->m[ 5]; + ctx->m[ 6] = ctx0->m[ 6]; + ctx->m[ 7] = ctx0->m[ 7]; + ctx->m[ 8] = ctx0->m[ 8]; + ctx->m[ 9] = ctx0->m[ 9]; + ctx->m[10] = ctx0->m[10]; + ctx->m[11] = ctx0->m[11]; + ctx->m[12] = ctx0->m[12]; + ctx->m[13] = ctx0->m[13]; + ctx->m[14] = ctx0->m[14]; + ctx->m[15] = ctx0->m[15]; + + ctx->len = ctx0->len; +} + +DECLSPEC void blake2b_update_vector_128 (PRIVATE_AS blake2b_ctx_vector_t *ctx, PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, PRIVATE_AS u32x *w4, PRIVATE_AS u32x *w5, PRIVATE_AS u32x *w6, PRIVATE_AS u32x *w7, const int len) +{ + if (len == 0) return; + + const int pos = ctx->len & 127; + + if (pos == 0) + { + if (ctx->len > 0) // if new block (pos == 0) AND the (old) len is not zero => transform + { + blake2b_transform_vector (ctx->h, ctx->m, (u32x) ctx->len, BLAKE2B_UPDATE); + } + + ctx->m[ 0] = hl32_to_64 (w0[1], w0[0]); + ctx->m[ 1] = hl32_to_64 (w0[3], w0[2]); + ctx->m[ 2] = hl32_to_64 (w1[1], w1[0]); + ctx->m[ 3] = hl32_to_64 (w1[3], w1[2]); + ctx->m[ 4] = hl32_to_64 (w2[1], w2[0]); + ctx->m[ 5] = hl32_to_64 (w2[3], w2[2]); + ctx->m[ 6] = hl32_to_64 (w3[1], w3[0]); + ctx->m[ 7] = hl32_to_64 (w3[3], w3[2]); + ctx->m[ 8] = hl32_to_64 (w4[1], w4[0]); + ctx->m[ 9] = hl32_to_64 (w4[3], w4[2]); + ctx->m[10] = hl32_to_64 (w5[1], w5[0]); + ctx->m[11] = hl32_to_64 (w5[3], w5[2]); + ctx->m[12] = hl32_to_64 (w6[1], w6[0]); + ctx->m[13] = hl32_to_64 (w6[3], w6[2]); + ctx->m[14] = hl32_to_64 (w7[1], w7[0]); + ctx->m[15] = hl32_to_64 (w7[3], w7[2]); + } + else + { + if ((pos + len) <= 128) + { + switch_buffer_by_offset_8x4_le (w0, w1, w2, w3, w4, w5, w6, w7, pos); + + ctx->m[ 0] |= hl32_to_64 (w0[1], w0[0]); + ctx->m[ 1] |= hl32_to_64 (w0[3], w0[2]); + ctx->m[ 2] |= hl32_to_64 (w1[1], w1[0]); + ctx->m[ 3] |= hl32_to_64 (w1[3], w1[2]); + ctx->m[ 4] |= hl32_to_64 (w2[1], w2[0]); + ctx->m[ 5] |= hl32_to_64 (w2[3], w2[2]); + ctx->m[ 6] |= hl32_to_64 (w3[1], w3[0]); + ctx->m[ 7] |= hl32_to_64 (w3[3], w3[2]); + ctx->m[ 8] |= hl32_to_64 (w4[1], w4[0]); + ctx->m[ 9] |= hl32_to_64 (w4[3], w4[2]); + ctx->m[10] |= hl32_to_64 (w5[1], w5[0]); + ctx->m[11] |= hl32_to_64 (w5[3], w5[2]); + ctx->m[12] |= hl32_to_64 (w6[1], w6[0]); + ctx->m[13] |= hl32_to_64 (w6[3], w6[2]); + ctx->m[14] |= hl32_to_64 (w7[1], w7[0]); + ctx->m[15] |= hl32_to_64 (w7[3], w7[2]); + } + else + { + u32x c0[4] = { 0 }; + u32x c1[4] = { 0 }; + u32x c2[4] = { 0 }; + u32x c3[4] = { 0 }; + u32x c4[4] = { 0 }; + u32x c5[4] = { 0 }; + u32x c6[4] = { 0 }; + u32x c7[4] = { 0 }; + + switch_buffer_by_offset_8x4_carry_le (w0, w1, w2, w3, w4, w5, w6, w7, c0, c1, c2, c3, c4, c5, c6, c7, pos); + + ctx->m[ 0] |= hl32_to_64 (w0[1], w0[0]); + ctx->m[ 1] |= hl32_to_64 (w0[3], w0[2]); + ctx->m[ 2] |= hl32_to_64 (w1[1], w1[0]); + ctx->m[ 3] |= hl32_to_64 (w1[3], w1[2]); + ctx->m[ 4] |= hl32_to_64 (w2[1], w2[0]); + ctx->m[ 5] |= hl32_to_64 (w2[3], w2[2]); + ctx->m[ 6] |= hl32_to_64 (w3[1], w3[0]); + ctx->m[ 7] |= hl32_to_64 (w3[3], w3[2]); + ctx->m[ 8] |= hl32_to_64 (w4[1], w4[0]); + ctx->m[ 9] |= hl32_to_64 (w4[3], w4[2]); + ctx->m[10] |= hl32_to_64 (w5[1], w5[0]); + ctx->m[11] |= hl32_to_64 (w5[3], w5[2]); + ctx->m[12] |= hl32_to_64 (w6[1], w6[0]); + ctx->m[13] |= hl32_to_64 (w6[3], w6[2]); + ctx->m[14] |= hl32_to_64 (w7[1], w7[0]); + ctx->m[15] |= hl32_to_64 (w7[3], w7[2]); + + // len must be a multiple of 128 (not ctx->len) for BLAKE2B_UPDATE: + + const u32x cur_len = ((ctx->len + len) / 128) * 128; + + blake2b_transform_vector (ctx->h, ctx->m, cur_len, BLAKE2B_UPDATE); + + ctx->m[ 0] = hl32_to_64 (c0[1], c0[0]); + ctx->m[ 1] = hl32_to_64 (c0[3], c0[2]); + ctx->m[ 2] = hl32_to_64 (c1[1], c1[0]); + ctx->m[ 3] = hl32_to_64 (c1[3], c1[2]); + ctx->m[ 4] = hl32_to_64 (c2[1], c2[0]); + ctx->m[ 5] = hl32_to_64 (c2[3], c2[2]); + ctx->m[ 6] = hl32_to_64 (c3[1], c3[0]); + ctx->m[ 7] = hl32_to_64 (c3[3], c3[2]); + ctx->m[ 8] = hl32_to_64 (c4[1], c4[0]); + ctx->m[ 9] = hl32_to_64 (c4[3], c4[2]); + ctx->m[10] = hl32_to_64 (c5[1], c5[0]); + ctx->m[11] = hl32_to_64 (c5[3], c5[2]); + ctx->m[12] = hl32_to_64 (c6[1], c6[0]); + ctx->m[13] = hl32_to_64 (c6[3], c6[2]); + ctx->m[14] = hl32_to_64 (c7[1], c7[0]); + ctx->m[15] = hl32_to_64 (c7[3], c7[2]); + } + } + + ctx->len += len; +} + +DECLSPEC void blake2b_update_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx, PRIVATE_AS const u32x *w, const int len) +{ + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + u32x w4[4]; + u32x w5[4]; + u32x w6[4]; + u32x w7[4]; + + const int limit = (const int) len - 128; // int type needed, could be negative + + int pos1; + int pos4; + + for (pos1 = 0, pos4 = 0; pos1 < limit; pos1 += 128, pos4 += 32) + { + w0[0] = w[pos4 + 0]; + w0[1] = w[pos4 + 1]; + w0[2] = w[pos4 + 2]; + w0[3] = w[pos4 + 3]; + w1[0] = w[pos4 + 4]; + w1[1] = w[pos4 + 5]; + w1[2] = w[pos4 + 6]; + w1[3] = w[pos4 + 7]; + w2[0] = w[pos4 + 8]; + w2[1] = w[pos4 + 9]; + w2[2] = w[pos4 + 10]; + w2[3] = w[pos4 + 11]; + w3[0] = w[pos4 + 12]; + w3[1] = w[pos4 + 13]; + w3[2] = w[pos4 + 14]; + w3[3] = w[pos4 + 15]; + w4[0] = w[pos4 + 16]; + w4[1] = w[pos4 + 17]; + w4[2] = w[pos4 + 18]; + w4[3] = w[pos4 + 19]; + w5[0] = w[pos4 + 20]; + w5[1] = w[pos4 + 21]; + w5[2] = w[pos4 + 22]; + w5[3] = w[pos4 + 23]; + w6[0] = w[pos4 + 24]; + w6[1] = w[pos4 + 25]; + w6[2] = w[pos4 + 26]; + w6[3] = w[pos4 + 27]; + w7[0] = w[pos4 + 28]; + w7[1] = w[pos4 + 29]; + w7[2] = w[pos4 + 30]; + w7[3] = w[pos4 + 31]; + + blake2b_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); + } + + w0[0] = w[pos4 + 0]; + w0[1] = w[pos4 + 1]; + w0[2] = w[pos4 + 2]; + w0[3] = w[pos4 + 3]; + w1[0] = w[pos4 + 4]; + w1[1] = w[pos4 + 5]; + w1[2] = w[pos4 + 6]; + w1[3] = w[pos4 + 7]; + w2[0] = w[pos4 + 8]; + w2[1] = w[pos4 + 9]; + w2[2] = w[pos4 + 10]; + w2[3] = w[pos4 + 11]; + w3[0] = w[pos4 + 12]; + w3[1] = w[pos4 + 13]; + w3[2] = w[pos4 + 14]; + w3[3] = w[pos4 + 15]; + w4[0] = w[pos4 + 16]; + w4[1] = w[pos4 + 17]; + w4[2] = w[pos4 + 18]; + w4[3] = w[pos4 + 19]; + w5[0] = w[pos4 + 20]; + w5[1] = w[pos4 + 21]; + w5[2] = w[pos4 + 22]; + w5[3] = w[pos4 + 23]; + w6[0] = w[pos4 + 24]; + w6[1] = w[pos4 + 25]; + w6[2] = w[pos4 + 26]; + w6[3] = w[pos4 + 27]; + w7[0] = w[pos4 + 28]; + w7[1] = w[pos4 + 29]; + w7[2] = w[pos4 + 30]; + w7[3] = w[pos4 + 31]; + + blake2b_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - (u32) pos1); +} + +DECLSPEC void blake2b_final_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx) +{ + blake2b_transform_vector (ctx->h, ctx->m, (u32x) ctx->len, BLAKE2B_FINAL); +} diff --git a/OpenCL/inc_hash_blake2s.h b/OpenCL/inc_hash_blake2s.h new file mode 100644 index 000000000..425404a3d --- /dev/null +++ b/OpenCL/inc_hash_blake2s.h @@ -0,0 +1,99 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#ifndef INC_HASH_BLAKE2B_H +#define INC_HASH_BLAKE2B_H + +#define BLAKE2B_UPDATE 0 +#define BLAKE2B_FINAL -1 + +DECLSPEC u64 blake2b_rot16_S (const u64 a); +DECLSPEC u64x blake2b_rot16 (const u64x a); + +DECLSPEC u64 blake2b_rot24_S (const u64 a); +DECLSPEC u64x blake2b_rot24 (const u64x a); + +DECLSPEC u64 blake2b_rot32_S (const u64 a); +DECLSPEC u64x blake2b_rot32 (const u64x a); + +#define BLAKE2B_G(k0,k1,a,b,c,d) \ +{ \ + a = a + b + m[k0]; \ + d = blake2b_rot32_S (d ^ a); \ + c = c + d; \ + b = blake2b_rot24_S (b ^ c); \ + a = a + b + m[k1]; \ + d = blake2b_rot16_S (d ^ a); \ + c = c + d; \ + b = hc_rotr64_S (b ^ c, 63); \ +} + +#define BLAKE2B_ROUND(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,ca,cb,cc,cd,ce,cf) \ +{ \ + BLAKE2B_G (c0, c1, v[0], v[4], v[ 8], v[12]); \ + BLAKE2B_G (c2, c3, v[1], v[5], v[ 9], v[13]); \ + BLAKE2B_G (c4, c5, v[2], v[6], v[10], v[14]); \ + BLAKE2B_G (c6, c7, v[3], v[7], v[11], v[15]); \ + BLAKE2B_G (c8, c9, v[0], v[5], v[10], v[15]); \ + BLAKE2B_G (ca, cb, v[1], v[6], v[11], v[12]); \ + BLAKE2B_G (cc, cd, v[2], v[7], v[ 8], v[13]); \ + BLAKE2B_G (ce, cf, v[3], v[4], v[ 9], v[14]); \ +} + +#define BLAKE2B_G_VECTOR(k0,k1,a,b,c,d) \ +{ \ + a = a + b + m[k0]; \ + d = blake2b_rot32 (d ^ a); \ + c = c + d; \ + b = blake2b_rot24 (b ^ c); \ + a = a + b + m[k1]; \ + d = blake2b_rot16 (d ^ a); \ + c = c + d; \ + b = hc_rotr64 (b ^ c, 63); \ +} + +#define BLAKE2B_ROUND_VECTOR(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,ca,cb,cc,cd,ce,cf) \ +{ \ + BLAKE2B_G_VECTOR (c0, c1, v[0], v[4], v[ 8], v[12]); \ + BLAKE2B_G_VECTOR (c2, c3, v[1], v[5], v[ 9], v[13]); \ + BLAKE2B_G_VECTOR (c4, c5, v[2], v[6], v[10], v[14]); \ + BLAKE2B_G_VECTOR (c6, c7, v[3], v[7], v[11], v[15]); \ + BLAKE2B_G_VECTOR (c8, c9, v[0], v[5], v[10], v[15]); \ + BLAKE2B_G_VECTOR (ca, cb, v[1], v[6], v[11], v[12]); \ + BLAKE2B_G_VECTOR (cc, cd, v[2], v[7], v[ 8], v[13]); \ + BLAKE2B_G_VECTOR (ce, cf, v[3], v[4], v[ 9], v[14]); \ +} + +typedef struct blake2b_ctx +{ + u64 m[16]; // buffer + u64 h[ 8]; // digest + + int len; + +} blake2b_ctx_t; + +typedef struct blake2b_ctx_vector +{ + u64x m[16]; // buffer + u64x h[ 8]; // digest + + int len; + +} blake2b_ctx_vector_t; + +DECLSPEC void blake2b_transform (PRIVATE_AS u64 *h, PRIVATE_AS const u64 *m, const int len, const u64 f0); +DECLSPEC void blake2b_init (PRIVATE_AS blake2b_ctx_t *ctx); +DECLSPEC void blake2b_update (PRIVATE_AS blake2b_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len); +DECLSPEC void blake2b_update_global (PRIVATE_AS blake2b_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len); +DECLSPEC void blake2b_final (PRIVATE_AS blake2b_ctx_t *ctx); + +DECLSPEC void blake2b_transform_vector (PRIVATE_AS u64x *h, PRIVATE_AS const u64x *m, const u32x len, const u64 f0); +DECLSPEC void blake2b_init_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx); +DECLSPEC void blake2b_init_vector_from_scalar (PRIVATE_AS blake2b_ctx_vector_t *ctx, PRIVATE_AS blake2b_ctx_t *ctx0); +DECLSPEC void blake2b_update_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx, PRIVATE_AS const u32x *w, const int len); +DECLSPEC void blake2b_final_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx); + +#endif // INC_HASH_BLAKE2B_H From e42aa771e289c11d12c8d42144b859775790ace7 Mon Sep 17 00:00:00 2001 From: Louka Date: Thu, 2 Feb 2023 13:26:41 +0100 Subject: [PATCH 04/28] First version of module for BLAKE2S-256 --- src/modules/module_35000.c | 247 +++++++++++++++++++++++++++++++++++++ 1 file changed, 247 insertions(+) create mode 100644 src/modules/module_35000.c diff --git a/src/modules/module_35000.c b/src/modules/module_35000.c new file mode 100644 index 000000000..3c36c99a9 --- /dev/null +++ b/src/modules/module_35000.c @@ -0,0 +1,247 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; +static const u32 DGST_POS0 = 1; +static const u32 DGST_POS1 = 0; +static const u32 DGST_POS2 = 3; +static const u32 DGST_POS3 = 2; +static const u32 DGST_SIZE = DGST_SIZE_4_8; +static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_HASH; +static const char *HASH_NAME = "BLAKE2s-256"; +static const u64 KERN_TYPE = 35000; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_32 | OPTI_TYPE_RAW_HASH; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE; +static const u32 SALT_TYPE = SALT_TYPE_NONE; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$BLAKE2$2c719b484789ad5f6fc1739012182169b25484af156adc91d4f64f72400e574a"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) +{ + return ATTACK_EXEC; +} + +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) +{ + return DGST_POS0; +} + +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) +{ + return DGST_POS1; +} + +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) +{ + return DGST_POS2; +} + +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) +{ + return DGST_POS3; +} + +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) +{ + return DGST_SIZE; +} + +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) +{ + return HASH_CATEGORY; +} + +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) +{ + return HASH_NAME; +} + +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) +{ + return KERN_TYPE; +} + +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) +{ + return OPTI_TYPE; +} + +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) +{ + return OPTS_TYPE; +} + +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) +{ + return SALT_TYPE; +} + +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) +{ + return ST_HASH; +} + +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) +{ + return ST_PASS; +} + +static const char *SIGNATURE_BLAKE2S = "$BLAKE2$"; + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t * salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t * hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + token.token_cnt = 2; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_BLAKE2S; + + token.len[0] = 8; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.len[1] = 64; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH | TOKEN_ATTR_VERIFY_HEX; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) + return (rc_tokenizer); + + const u8 *hash_pos = token.buf[1]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + digest[4] = hex_to_u32 (hash_pos + 32); + digest[5] = hex_to_u32 (hash_pos + 40); + digest[6] = hex_to_u32 (hash_pos + 48); + digest[7] = hex_to_u32 (hash_pos + 56); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t * salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t * hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + // we can not change anything in the original buffer, otherwise destroying sorting + // therefore create some local buffer + + u8 *out_buf = (u8 *) line_buf; + + int out_len = strlen (SIGNATURE_BLAKE2S); + + memcpy (out_buf, SIGNATURE_BLAKE2S, out_len); + + u32_to_hex (digest[0], out_buf + out_len); + out_len += 8; + u32_to_hex (digest[1], out_buf + out_len); + out_len += 8; + u32_to_hex (digest[2], out_buf + out_len); + out_len += 8; + u32_to_hex (digest[3], out_buf + out_len); + out_len += 8; + u32_to_hex (digest[4], out_buf + out_len); + out_len += 8; + u32_to_hex (digest[5], out_buf + out_len); + out_len += 8; + u32_to_hex (digest[6], out_buf + out_len); + out_len += 8; + u32_to_hex (digest[7], out_buf + out_len); + out_len += 8; + + return out_len; +} + +void module_init (module_ctx_t * module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = MODULE_DEFAULT; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} From a59cf4ebcfeb77c37a8ef461681fca9354213c3b Mon Sep 17 00:00:00 2001 From: bacqube2 Date: Thu, 2 Feb 2023 13:32:58 +0100 Subject: [PATCH 05/28] modify to S --- OpenCL/inc_hash_blake2s.h | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/OpenCL/inc_hash_blake2s.h b/OpenCL/inc_hash_blake2s.h index 425404a3d..56ac40774 100644 --- a/OpenCL/inc_hash_blake2s.h +++ b/OpenCL/inc_hash_blake2s.h @@ -3,34 +3,37 @@ * License.....: MIT */ -#ifndef INC_HASH_BLAKE2B_H -#define INC_HASH_BLAKE2B_H +#ifndef INC_HASH_BLAKE2S_H +#define INC_HASH_BLAKE2S_H -#define BLAKE2B_UPDATE 0 -#define BLAKE2B_FINAL -1 +#define BLAKE2S_UPDATE 0 +#define BLAKE2S_FINAL -1 -DECLSPEC u64 blake2b_rot16_S (const u64 a); -DECLSPEC u64x blake2b_rot16 (const u64x a); +DECLSPEC u32 blake2s_rot16_S (const u32 a); +DECLSPEC u32x blake2s_rot16 (const u32x a); -DECLSPEC u64 blake2b_rot24_S (const u64 a); -DECLSPEC u64x blake2b_rot24 (const u64x a); +DECLSPEC u32 blake2s_rot24_S (const u32 a); +DECLSPEC u32x blake2s_rot24 (const u32x a); -DECLSPEC u64 blake2b_rot32_S (const u64 a); -DECLSPEC u64x blake2b_rot32 (const u64x a); +DECLSPEC u32 blake2s_rot32_S (const u32 a); +DECLSPEC u32x blake2s_rot32 (const u32x a); -#define BLAKE2B_G(k0,k1,a,b,c,d) \ +DECLSPEC u32 blake2s_rot07_S (const u32 a); +DECLSPEC u32x blake2s_rot07 (const u32x a); + +#define BLAKE2S_G(k0,k1,a,b,c,d) \ { \ a = a + b + m[k0]; \ - d = blake2b_rot32_S (d ^ a); \ + d = blake2s_rot16_S (d ^ a); \ c = c + d; \ - b = blake2b_rot24_S (b ^ c); \ + b = blake2s_rot12_S (b ^ c); \ a = a + b + m[k1]; \ - d = blake2b_rot16_S (d ^ a); \ + d = blake2s_rot8_S (d ^ a); \ c = c + d; \ - b = hc_rotr64_S (b ^ c, 63); \ + b = blake2s_rot7_S (b ^ c); \ } -#define BLAKE2B_ROUND(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,ca,cb,cc,cd,ce,cf) \ +#define BLAKE2S_ROUND(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,ca,cb,cc,cd,ce,cf) \ { \ BLAKE2B_G (c0, c1, v[0], v[4], v[ 8], v[12]); \ BLAKE2B_G (c2, c3, v[1], v[5], v[ 9], v[13]); \ From 33762965f6e5a40f8120ccc420e50f5d2e7760b1 Mon Sep 17 00:00:00 2001 From: bacqube2 Date: Thu, 2 Feb 2023 14:53:04 +0100 Subject: [PATCH 06/28] modify to S --- OpenCL/inc_hash_blake2s.cl | 56 ++++++++++++++++++-------------------- OpenCL/inc_hash_blake2s.h | 14 +++++----- 2 files changed, 33 insertions(+), 37 deletions(-) diff --git a/OpenCL/inc_hash_blake2s.cl b/OpenCL/inc_hash_blake2s.cl index 913ff7ef5..18b197c7b 100644 --- a/OpenCL/inc_hash_blake2s.cl +++ b/OpenCL/inc_hash_blake2s.cl @@ -22,18 +22,18 @@ DECLSPEC u32 blake2s_rot16_S (const u32 a) out.v16.a = hc_byte_perm_S (in.v16.b, in.v16.a, 0x1076); out.v16.b = hc_byte_perm_S (in.v16.b, in.v16.a, 0x5432); - return out.v64; + return out.v32; #elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM == 1 - vconv64_t in; + vconv32_t in; - in.v64 = a; + in.v32 = a; - vconv64_t out; + vconv32_t out; - out.v32.a = hc_byte_perm_S (in.v32.b, in.v32.a, 0x01000706); - out.v32.b = hc_byte_perm_S (in.v32.b, in.v32.a, 0x05040302); + out.v16.a = hc_byte_perm_S (in.v16.b, in.v16.a, 0x01000706); + out.v16.b = hc_byte_perm_S (in.v16.b, in.v16.a, 0x05040302); return out.v64; @@ -233,18 +233,16 @@ DECLSPEC void blake2b_transform (PRIVATE_AS u64 *h, PRIVATE_AS const u64 *m, con v[14] = BLAKE2B_IV_06 ^ f0; v[15] = BLAKE2B_IV_07; // ^ f1; - BLAKE2B_ROUND ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); - BLAKE2B_ROUND (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); - BLAKE2B_ROUND (11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4); - BLAKE2B_ROUND ( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8); - BLAKE2B_ROUND ( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13); - BLAKE2B_ROUND ( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9); - BLAKE2B_ROUND (12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11); - BLAKE2B_ROUND (13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10); - BLAKE2B_ROUND ( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5); - BLAKE2B_ROUND (10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0); - BLAKE2B_ROUND ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); - BLAKE2B_ROUND (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); + BLAKE2S_ROUND ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + BLAKE2S_ROUND (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); + BLAKE2S_ROUND (11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4); + BLAKE2S_ROUND ( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8); + BLAKE2S_ROUND ( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13); + BLAKE2S_ROUND ( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9); + BLAKE2S_ROUND (12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11); + BLAKE2S_ROUND (13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10); + BLAKE2S_ROUND ( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5); + BLAKE2S_ROUND (10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0); h[0] = h[0] ^ v[0] ^ v[ 8]; h[1] = h[1] ^ v[1] ^ v[ 9]; @@ -606,18 +604,16 @@ DECLSPEC void blake2b_transform_vector (PRIVATE_AS u64x *h, PRIVATE_AS const u64 v[14] = make_u64x (BLAKE2B_IV_06) ^ f0; v[15] = BLAKE2B_IV_07; // ^ f1; - BLAKE2B_ROUND_VECTOR ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); - BLAKE2B_ROUND_VECTOR (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); - BLAKE2B_ROUND_VECTOR (11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4); - BLAKE2B_ROUND_VECTOR ( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8); - BLAKE2B_ROUND_VECTOR ( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13); - BLAKE2B_ROUND_VECTOR ( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9); - BLAKE2B_ROUND_VECTOR (12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11); - BLAKE2B_ROUND_VECTOR (13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10); - BLAKE2B_ROUND_VECTOR ( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5); - BLAKE2B_ROUND_VECTOR (10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0); - BLAKE2B_ROUND_VECTOR ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); - BLAKE2B_ROUND_VECTOR (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); + BLAKE2S_ROUND_VECTOR ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + BLAKE2S_ROUND_VECTOR (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); + BLAKE2S_ROUND_VECTOR (11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4); + BLAKE2S_ROUND_VECTOR ( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8); + BLAKE2S_ROUND_VECTOR ( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13); + BLAKE2S_ROUND_VECTOR ( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9); + BLAKE2S_ROUND_VECTOR (12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11); + BLAKE2S_ROUND_VECTOR (13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10); + BLAKE2S_ROUND_VECTOR ( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5); + BLAKE2S_ROUND_VECTOR (10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0); h[0] = h[0] ^ v[0] ^ v[ 8]; h[1] = h[1] ^ v[1] ^ v[ 9]; diff --git a/OpenCL/inc_hash_blake2s.h b/OpenCL/inc_hash_blake2s.h index 56ac40774..a6ef95d27 100644 --- a/OpenCL/inc_hash_blake2s.h +++ b/OpenCL/inc_hash_blake2s.h @@ -28,9 +28,9 @@ DECLSPEC u32x blake2s_rot07 (const u32x a); c = c + d; \ b = blake2s_rot12_S (b ^ c); \ a = a + b + m[k1]; \ - d = blake2s_rot8_S (d ^ a); \ + d = blake2s_rot08_S (d ^ a); \ c = c + d; \ - b = blake2s_rot7_S (b ^ c); \ + b = blake2s_rot07_S (b ^ c); \ } #define BLAKE2S_ROUND(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,ca,cb,cc,cd,ce,cf) \ @@ -45,16 +45,16 @@ DECLSPEC u32x blake2s_rot07 (const u32x a); BLAKE2B_G (ce, cf, v[3], v[4], v[ 9], v[14]); \ } -#define BLAKE2B_G_VECTOR(k0,k1,a,b,c,d) \ +#define BLAKE2S_G_VECTOR(k0,k1,a,b,c,d) \ { \ a = a + b + m[k0]; \ - d = blake2b_rot32 (d ^ a); \ + d = blake2s_rot16 (d ^ a); \ c = c + d; \ - b = blake2b_rot24 (b ^ c); \ + b = blake2s_rot12 (b ^ c); \ a = a + b + m[k1]; \ - d = blake2b_rot16 (d ^ a); \ + d = blake2s_rot08 (d ^ a); \ c = c + d; \ - b = hc_rotr64 (b ^ c, 63); \ + b = blake2s_rot07 (b ^ c); \ } #define BLAKE2B_ROUND_VECTOR(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,ca,cb,cc,cd,ce,cf) \ From 12821a968bb76669e12deed7ae86c21382f19842 Mon Sep 17 00:00:00 2001 From: Louka Date: Mon, 6 Feb 2023 15:27:07 +0100 Subject: [PATCH 07/28] Finishing inc_hash_blake2s and starting to write kernels --- OpenCL/inc_hash_blake2s.cl | 758 ++++++++++++++----------------------- OpenCL/inc_hash_blake2s.h | 90 ++--- OpenCL/inc_types.h | 13 + OpenCL/m35000_a0-pure.cl | 111 ++++++ src/Makefile | 2 +- 5 files changed, 450 insertions(+), 524 deletions(-) create mode 100644 OpenCL/m35000_a0-pure.cl diff --git a/OpenCL/inc_hash_blake2s.cl b/OpenCL/inc_hash_blake2s.cl index 18b197c7b..9b9ecaf91 100644 --- a/OpenCL/inc_hash_blake2s.cl +++ b/OpenCL/inc_hash_blake2s.cl @@ -10,6 +10,59 @@ #include "inc_hash_blake2s.h" DECLSPEC u32 blake2s_rot16_S (const u32 a) +{ + vconv32_t in; + + in.v32 = a; + + vconv32_t out; + + out.v16.a = in.v16.b; + out.v16.b = in.v16.a; + + return out.v32; +} + +DECLSPEC u32x blake2s_rot16 (const u32x a) +{ + u32x r; + + #if VECT_SIZE == 1 + r = blake2s_rot16_S (a); + #endif + + #if VECT_SIZE >= 2 + r.s0 = blake2s_rot16_S (a.s0); + r.s1 = blake2s_rot16_S (a.s1); + #endif + + #if VECT_SIZE >= 4 + r.s2 = blake2s_rot16_S (a.s2); + r.s3 = blake2s_rot16_S (a.s3); + #endif + + #if VECT_SIZE >= 8 + r.s4 = blake2s_rot16_S (a.s4); + r.s5 = blake2s_rot16_S (a.s5); + r.s6 = blake2s_rot16_S (a.s6); + r.s7 = blake2s_rot16_S (a.s7); + #endif + + #if VECT_SIZE >= 16 + r.s8 = blake2s_rot16_S (a.s8); + r.s9 = blake2s_rot16_S (a.s9); + r.sa = blake2s_rot16_S (a.sa); + r.sb = blake2s_rot16_S (a.sb); + r.sc = blake2s_rot16_S (a.sc); + r.sd = blake2s_rot16_S (a.sd); + r.se = blake2s_rot16_S (a.se); + r.sf = blake2s_rot16_S (a.sf); + #endif + + return r; +} + +DECLSPEC u32 blake2s_rot08_S (const u32 a) { #if defined IS_NV @@ -19,8 +72,7 @@ DECLSPEC u32 blake2s_rot16_S (const u32 a) vconv32_t out; - out.v16.a = hc_byte_perm_S (in.v16.b, in.v16.a, 0x1076); - out.v16.b = hc_byte_perm_S (in.v16.b, in.v16.a, 0x5432); + out.v32 = hc_byte_perm_S (in.v32.b, in.v32.a, 0x0321); return out.v32; @@ -32,189 +84,61 @@ DECLSPEC u32 blake2s_rot16_S (const u32 a) vconv32_t out; - out.v16.a = hc_byte_perm_S (in.v16.b, in.v16.a, 0x01000706); - out.v16.b = hc_byte_perm_S (in.v16.b, in.v16.a, 0x05040302); + out.v32 = hc_byte_perm_S (in.v32.b, in.v32.a, 0x00030201); - return out.v64; + return out.v32; #else - return hc_rotr64_S (a, 16); + return hc_rotr32_S (a, 8); #endif } -DECLSPEC u64x blake2b_rot16 (const u64x a) +DECLSPEC u32x blake2S_rot08 (const u32x a) { - u64x r; + u32x r; #if VECT_SIZE == 1 - r = blake2b_rot16_S (a); + r = blake2s_rot08_S (a); #endif #if VECT_SIZE >= 2 - r.s0 = blake2b_rot16_S (a.s0); - r.s1 = blake2b_rot16_S (a.s1); + r.s0 = blake2s_rot08_S (a.s0); + r.s1 = blake2s_rot08_S (a.s1); #endif #if VECT_SIZE >= 4 - r.s2 = blake2b_rot16_S (a.s2); - r.s3 = blake2b_rot16_S (a.s3); + r.s2 = blake2s_rot08_S (a.s2); + r.s3 = blake2s_rot08_S (a.s3); #endif #if VECT_SIZE >= 8 - r.s4 = blake2b_rot16_S (a.s4); - r.s5 = blake2b_rot16_S (a.s5); - r.s6 = blake2b_rot16_S (a.s6); - r.s7 = blake2b_rot16_S (a.s7); + r.s4 = blake2s_rot08_S (a.s4); + r.s5 = blake2s_rot08_S (a.s5); + r.s6 = blake2s_rot08_S (a.s6); + r.s7 = blake2s_rot08_S (a.s7); #endif #if VECT_SIZE >= 16 - r.s8 = blake2b_rot16_S (a.s8); - r.s9 = blake2b_rot16_S (a.s9); - r.sa = blake2b_rot16_S (a.sa); - r.sb = blake2b_rot16_S (a.sb); - r.sc = blake2b_rot16_S (a.sc); - r.sd = blake2b_rot16_S (a.sd); - r.se = blake2b_rot16_S (a.se); - r.sf = blake2b_rot16_S (a.sf); + r.s8 = blake2s_rot08_S (a.s8); + r.s9 = blake2s_rot08_S (a.s9); + r.sa = blake2s_rot08_S (a.sa); + r.sb = blake2s_rot08_S (a.sb); + r.sc = blake2s_rot08_S (a.sc); + r.sd = blake2s_rot08_S (a.sd); + r.se = blake2s_rot08_S (a.se); + r.sf = blake2s_rot08_S (a.sf); #endif return r; } -DECLSPEC u64 blake2b_rot24_S (const u64 a) +DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, const int len, const u32 f0) { - #if defined IS_NV + const u32 t0 = len; - vconv64_t in; - - in.v64 = a; - - vconv64_t out; - - out.v32.a = hc_byte_perm_S (in.v32.b, in.v32.a, 0x2107); - out.v32.b = hc_byte_perm_S (in.v32.b, in.v32.a, 0x6543); - - return out.v64; - - #elif (defined IS_AMD || defined IS_HIP) && HAS_VPERM == 1 - - vconv64_t in; - - in.v64 = a; - - vconv64_t out; - - out.v32.a = hc_byte_perm_S (in.v32.b, in.v32.a, 0x02010007); - out.v32.b = hc_byte_perm_S (in.v32.b, in.v32.a, 0x06050403); - - return out.v64; - - #else - - return hc_rotr64_S (a, 24); - - #endif -} - -DECLSPEC u64x blake2b_rot24 (const u64x a) -{ - u64x r; - - #if VECT_SIZE == 1 - r = blake2b_rot24_S (a); - #endif - - #if VECT_SIZE >= 2 - r.s0 = blake2b_rot24_S (a.s0); - r.s1 = blake2b_rot24_S (a.s1); - #endif - - #if VECT_SIZE >= 4 - r.s2 = blake2b_rot24_S (a.s2); - r.s3 = blake2b_rot24_S (a.s3); - #endif - - #if VECT_SIZE >= 8 - r.s4 = blake2b_rot24_S (a.s4); - r.s5 = blake2b_rot24_S (a.s5); - r.s6 = blake2b_rot24_S (a.s6); - r.s7 = blake2b_rot24_S (a.s7); - #endif - - #if VECT_SIZE >= 16 - r.s8 = blake2b_rot24_S (a.s8); - r.s9 = blake2b_rot24_S (a.s9); - r.sa = blake2b_rot24_S (a.sa); - r.sb = blake2b_rot24_S (a.sb); - r.sc = blake2b_rot24_S (a.sc); - r.sd = blake2b_rot24_S (a.sd); - r.se = blake2b_rot24_S (a.se); - r.sf = blake2b_rot24_S (a.sf); - #endif - - return r; -} - -DECLSPEC u64 blake2b_rot32_S (const u64 a) -{ - vconv64_t in; - - in.v64 = a; - - vconv64_t out; - - out.v32.a = in.v32.b; - out.v32.b = in.v32.a; - - return out.v64; -} - -DECLSPEC u64x blake2b_rot32 (const u64x a) -{ - u64x r; - - #if VECT_SIZE == 1 - r = blake2b_rot32_S (a); - #endif - - #if VECT_SIZE >= 2 - r.s0 = blake2b_rot32_S (a.s0); - r.s1 = blake2b_rot32_S (a.s1); - #endif - - #if VECT_SIZE >= 4 - r.s2 = blake2b_rot32_S (a.s2); - r.s3 = blake2b_rot32_S (a.s3); - #endif - - #if VECT_SIZE >= 8 - r.s4 = blake2b_rot32_S (a.s4); - r.s5 = blake2b_rot32_S (a.s5); - r.s6 = blake2b_rot32_S (a.s6); - r.s7 = blake2b_rot32_S (a.s7); - #endif - - #if VECT_SIZE >= 16 - r.s8 = blake2b_rot32_S (a.s8); - r.s9 = blake2b_rot32_S (a.s9); - r.sa = blake2b_rot32_S (a.sa); - r.sb = blake2b_rot32_S (a.sb); - r.sc = blake2b_rot32_S (a.sc); - r.sd = blake2b_rot32_S (a.sd); - r.se = blake2b_rot32_S (a.se); - r.sf = blake2b_rot32_S (a.sf); - #endif - - return r; -} - -DECLSPEC void blake2b_transform (PRIVATE_AS u64 *h, PRIVATE_AS const u64 *m, const int len, const u64 f0) -{ - const u64 t0 = hl32_to_64_S (0, len); - - u64 v[16]; + u32 v[16]; v[ 0] = h[0]; v[ 1] = h[1]; @@ -224,14 +148,14 @@ DECLSPEC void blake2b_transform (PRIVATE_AS u64 *h, PRIVATE_AS const u64 *m, con v[ 5] = h[5]; v[ 6] = h[6]; v[ 7] = h[7]; - v[ 8] = BLAKE2B_IV_00; - v[ 9] = BLAKE2B_IV_01; - v[10] = BLAKE2B_IV_02; - v[11] = BLAKE2B_IV_03; - v[12] = BLAKE2B_IV_04 ^ t0; - v[13] = BLAKE2B_IV_05; // ^ t1; - v[14] = BLAKE2B_IV_06 ^ f0; - v[15] = BLAKE2B_IV_07; // ^ f1; + v[ 8] = BLAKE2S_IV_00; + v[ 9] = BLAKE2S_IV_01; + v[10] = BLAKE2S_IV_02; + v[11] = BLAKE2S_IV_03; + v[12] = BLAKE2S_IV_04 ^ t0; + v[13] = BLAKE2S_IV_05; // ^ t1; + v[14] = BLAKE2S_IV_06 ^ f0; + v[15] = BLAKE2S_IV_07; // ^ f1; BLAKE2S_ROUND ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); BLAKE2S_ROUND (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); @@ -254,16 +178,16 @@ DECLSPEC void blake2b_transform (PRIVATE_AS u64 *h, PRIVATE_AS const u64 *m, con h[7] = h[7] ^ v[7] ^ v[15]; } -DECLSPEC void blake2b_init (PRIVATE_AS blake2b_ctx_t *ctx) +DECLSPEC void blake2s_init (PRIVATE_AS blake2s_ctx_t *ctx) { - ctx->h[0] = BLAKE2B_IV_00 ^ 0x01010040; // default output length: 0x40 = 64 bytes - ctx->h[1] = BLAKE2B_IV_01; - ctx->h[2] = BLAKE2B_IV_02; - ctx->h[3] = BLAKE2B_IV_03; - ctx->h[4] = BLAKE2B_IV_04; - ctx->h[5] = BLAKE2B_IV_05; - ctx->h[6] = BLAKE2B_IV_06; - ctx->h[7] = BLAKE2B_IV_07; + ctx->h[0] = BLAKE2S_IV_00 ^ 0x01010020; // default output length: 0x20 = 32 bytes + ctx->h[1] = BLAKE2S_IV_01; + ctx->h[2] = BLAKE2S_IV_02; + ctx->h[3] = BLAKE2S_IV_03; + ctx->h[4] = BLAKE2S_IV_04; + ctx->h[5] = BLAKE2S_IV_05; + ctx->h[6] = BLAKE2S_IV_06; + ctx->h[7] = BLAKE2S_IV_07; ctx->m[ 0] = 0; ctx->m[ 1] = 0; @@ -285,58 +209,58 @@ DECLSPEC void blake2b_init (PRIVATE_AS blake2b_ctx_t *ctx) ctx->len = 0; } -DECLSPEC void blake2b_update_128 (PRIVATE_AS blake2b_ctx_t *ctx, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, PRIVATE_AS u32 *w4, PRIVATE_AS u32 *w5, PRIVATE_AS u32 *w6, PRIVATE_AS u32 *w7, const int len) +DECLSPEC void blake2s_update_64 (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const int len) { if (len == 0) return; - const int pos = ctx->len & 127; + const int pos = ctx->len & 63; if (pos == 0) { if (ctx->len > 0) // if new block (pos == 0) AND the (old) len is not zero => transform { - blake2b_transform (ctx->h, ctx->m, ctx->len, BLAKE2B_UPDATE); + blake2s_transform (ctx->h, ctx->m, ctx->len, BLAKE2S_UPDATE); } - ctx->m[ 0] = hl32_to_64_S (w0[1], w0[0]); - ctx->m[ 1] = hl32_to_64_S (w0[3], w0[2]); - ctx->m[ 2] = hl32_to_64_S (w1[1], w1[0]); - ctx->m[ 3] = hl32_to_64_S (w1[3], w1[2]); - ctx->m[ 4] = hl32_to_64_S (w2[1], w2[0]); - ctx->m[ 5] = hl32_to_64_S (w2[3], w2[2]); - ctx->m[ 6] = hl32_to_64_S (w3[1], w3[0]); - ctx->m[ 7] = hl32_to_64_S (w3[3], w3[2]); - ctx->m[ 8] = hl32_to_64_S (w4[1], w4[0]); - ctx->m[ 9] = hl32_to_64_S (w4[3], w4[2]); - ctx->m[10] = hl32_to_64_S (w5[1], w5[0]); - ctx->m[11] = hl32_to_64_S (w5[3], w5[2]); - ctx->m[12] = hl32_to_64_S (w6[1], w6[0]); - ctx->m[13] = hl32_to_64_S (w6[3], w6[2]); - ctx->m[14] = hl32_to_64_S (w7[1], w7[0]); - ctx->m[15] = hl32_to_64_S (w7[3], w7[2]); + ctx->m[ 0] = w0[0]; + ctx->m[ 1] = w0[1]; + ctx->m[ 2] = w0[2]; + ctx->m[ 3] = w0[3]; + ctx->m[ 4] = w1[0]; + ctx->m[ 5] = w1[1]; + ctx->m[ 6] = w1[2]; + ctx->m[ 7] = w1[3]; + ctx->m[ 8] = w2[0]; + ctx->m[ 9] = w2[1]; + ctx->m[10] = w2[2]; + ctx->m[11] = w2[3]; + ctx->m[12] = w3[0]; + ctx->m[13] = w3[1]; + ctx->m[14] = w3[2]; + ctx->m[15] = w3[3]; } else { - if ((pos + len) <= 128) + if ((pos + len) <= 64) { - switch_buffer_by_offset_8x4_le_S (w0, w1, w2, w3, w4, w5, w6, w7, pos); + switch_buffer_by_offset_le_S (w0, w1, w2, w3, pos); - ctx->m[ 0] |= hl32_to_64_S (w0[1], w0[0]); - ctx->m[ 1] |= hl32_to_64_S (w0[3], w0[2]); - ctx->m[ 2] |= hl32_to_64_S (w1[1], w1[0]); - ctx->m[ 3] |= hl32_to_64_S (w1[3], w1[2]); - ctx->m[ 4] |= hl32_to_64_S (w2[1], w2[0]); - ctx->m[ 5] |= hl32_to_64_S (w2[3], w2[2]); - ctx->m[ 6] |= hl32_to_64_S (w3[1], w3[0]); - ctx->m[ 7] |= hl32_to_64_S (w3[3], w3[2]); - ctx->m[ 8] |= hl32_to_64_S (w4[1], w4[0]); - ctx->m[ 9] |= hl32_to_64_S (w4[3], w4[2]); - ctx->m[10] |= hl32_to_64_S (w5[1], w5[0]); - ctx->m[11] |= hl32_to_64_S (w5[3], w5[2]); - ctx->m[12] |= hl32_to_64_S (w6[1], w6[0]); - ctx->m[13] |= hl32_to_64_S (w6[3], w6[2]); - ctx->m[14] |= hl32_to_64_S (w7[1], w7[0]); - ctx->m[15] |= hl32_to_64_S (w7[3], w7[2]); + ctx->m[ 0] |= w0[0]; + ctx->m[ 1] |= w0[1]; + ctx->m[ 2] |= w0[2]; + ctx->m[ 3] |= w0[3]; + ctx->m[ 4] |= w1[0]; + ctx->m[ 5] |= w1[1]; + ctx->m[ 6] |= w1[2]; + ctx->m[ 7] |= w1[3]; + ctx->m[ 8] |= w2[0]; + ctx->m[ 9] |= w2[1]; + ctx->m[10] |= w2[2]; + ctx->m[11] |= w2[3]; + ctx->m[12] |= w3[0]; + ctx->m[13] |= w3[1]; + ctx->m[14] |= w3[2]; + ctx->m[15] |= w3[3]; } else { @@ -344,75 +268,67 @@ DECLSPEC void blake2b_update_128 (PRIVATE_AS blake2b_ctx_t *ctx, PRIVATE_AS u32 u32 c1[4] = { 0 }; u32 c2[4] = { 0 }; u32 c3[4] = { 0 }; - u32 c4[4] = { 0 }; - u32 c5[4] = { 0 }; - u32 c6[4] = { 0 }; - u32 c7[4] = { 0 }; - switch_buffer_by_offset_8x4_carry_le_S (w0, w1, w2, w3, w4, w5, w6, w7, c0, c1, c2, c3, c4, c5, c6, c7, pos); + switch_buffer_by_offset_carry_le_S (w0, w1, w2, w3, c0, c1, c2, c3, pos); - ctx->m[ 0] |= hl32_to_64_S (w0[1], w0[0]); - ctx->m[ 1] |= hl32_to_64_S (w0[3], w0[2]); - ctx->m[ 2] |= hl32_to_64_S (w1[1], w1[0]); - ctx->m[ 3] |= hl32_to_64_S (w1[3], w1[2]); - ctx->m[ 4] |= hl32_to_64_S (w2[1], w2[0]); - ctx->m[ 5] |= hl32_to_64_S (w2[3], w2[2]); - ctx->m[ 6] |= hl32_to_64_S (w3[1], w3[0]); - ctx->m[ 7] |= hl32_to_64_S (w3[3], w3[2]); - ctx->m[ 8] |= hl32_to_64_S (w4[1], w4[0]); - ctx->m[ 9] |= hl32_to_64_S (w4[3], w4[2]); - ctx->m[10] |= hl32_to_64_S (w5[1], w5[0]); - ctx->m[11] |= hl32_to_64_S (w5[3], w5[2]); - ctx->m[12] |= hl32_to_64_S (w6[1], w6[0]); - ctx->m[13] |= hl32_to_64_S (w6[3], w6[2]); - ctx->m[14] |= hl32_to_64_S (w7[1], w7[0]); - ctx->m[15] |= hl32_to_64_S (w7[3], w7[2]); + ctx->m[ 0] |= w0[0]; + ctx->m[ 1] |= w0[1]; + ctx->m[ 2] |= w0[2]; + ctx->m[ 3] |= w0[3]; + ctx->m[ 4] |= w1[0]; + ctx->m[ 5] |= w1[1]; + ctx->m[ 6] |= w1[2]; + ctx->m[ 7] |= w1[3]; + ctx->m[ 8] |= w2[0]; + ctx->m[ 9] |= w2[1]; + ctx->m[10] |= w2[2]; + ctx->m[11] |= w2[3]; + ctx->m[12] |= w3[0]; + ctx->m[13] |= w3[1]; + ctx->m[14] |= w3[2]; + ctx->m[15] |= w3[3]; - // len must be a multiple of 128 (not ctx->len) for BLAKE2B_UPDATE: + // len must be a multiple of 64 (not ctx->len) for BLAKE2S_UPDATE: - const u32 cur_len = ((ctx->len + len) / 128) * 128; + const u32 cur_len = ((ctx->len + len) / 64) * 64; - blake2b_transform (ctx->h, ctx->m, cur_len, BLAKE2B_UPDATE); + blake2s_transform (ctx->h, ctx->m, cur_len, BLAKE2S_UPDATE); - ctx->m[ 0] = hl32_to_64_S (c0[1], c0[0]); - ctx->m[ 1] = hl32_to_64_S (c0[3], c0[2]); - ctx->m[ 2] = hl32_to_64_S (c1[1], c1[0]); - ctx->m[ 3] = hl32_to_64_S (c1[3], c1[2]); - ctx->m[ 4] = hl32_to_64_S (c2[1], c2[0]); - ctx->m[ 5] = hl32_to_64_S (c2[3], c2[2]); - ctx->m[ 6] = hl32_to_64_S (c3[1], c3[0]); - ctx->m[ 7] = hl32_to_64_S (c3[3], c3[2]); - ctx->m[ 8] = hl32_to_64_S (c4[1], c4[0]); - ctx->m[ 9] = hl32_to_64_S (c4[3], c4[2]); - ctx->m[10] = hl32_to_64_S (c5[1], c5[0]); - ctx->m[11] = hl32_to_64_S (c5[3], c5[2]); - ctx->m[12] = hl32_to_64_S (c6[1], c6[0]); - ctx->m[13] = hl32_to_64_S (c6[3], c6[2]); - ctx->m[14] = hl32_to_64_S (c7[1], c7[0]); - ctx->m[15] = hl32_to_64_S (c7[3], c7[2]); + ctx->m[ 0] = c0[0]; + ctx->m[ 1] = c0[1]; + ctx->m[ 2] = c0[2]; + ctx->m[ 3] = c0[3]; + ctx->m[ 4] = c1[0]; + ctx->m[ 5] = c1[1]; + ctx->m[ 6] = c1[2]; + ctx->m[ 7] = c1[3]; + ctx->m[ 8] = c2[0]; + ctx->m[ 9] = c2[1]; + ctx->m[10] = c2[2]; + ctx->m[11] = c2[3]; + ctx->m[12] = c3[0]; + ctx->m[13] = c3[1]; + ctx->m[14] = c3[2]; + ctx->m[15] = c3[3]; } } ctx->len += len; } -DECLSPEC void blake2b_update (PRIVATE_AS blake2b_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len) +DECLSPEC void blake2s_update (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; - u32 w4[4]; - u32 w5[4]; - u32 w6[4]; - u32 w7[4]; - const int limit = (const int) len - 128; // int type needed, could be negative + const int limit = (const int) len - 64; // int type needed, could be negative int pos1; int pos4; - for (pos1 = 0, pos4 = 0; pos1 < limit; pos1 += 128, pos4 += 32) + for (pos1 = 0, pos4 = 0; pos1 < limit; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; @@ -430,24 +346,8 @@ DECLSPEC void blake2b_update (PRIVATE_AS blake2b_ctx_t *ctx, PRIVATE_AS const u3 w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; - w4[0] = w[pos4 + 16]; - w4[1] = w[pos4 + 17]; - w4[2] = w[pos4 + 18]; - w4[3] = w[pos4 + 19]; - w5[0] = w[pos4 + 20]; - w5[1] = w[pos4 + 21]; - w5[2] = w[pos4 + 22]; - w5[3] = w[pos4 + 23]; - w6[0] = w[pos4 + 24]; - w6[1] = w[pos4 + 25]; - w6[2] = w[pos4 + 26]; - w6[3] = w[pos4 + 27]; - w7[0] = w[pos4 + 28]; - w7[1] = w[pos4 + 29]; - w7[2] = w[pos4 + 30]; - w7[3] = w[pos4 + 31]; - - blake2b_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); + + blake2s_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; @@ -466,43 +366,23 @@ DECLSPEC void blake2b_update (PRIVATE_AS blake2b_ctx_t *ctx, PRIVATE_AS const u3 w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; - w4[0] = w[pos4 + 16]; - w4[1] = w[pos4 + 17]; - w4[2] = w[pos4 + 18]; - w4[3] = w[pos4 + 19]; - w5[0] = w[pos4 + 20]; - w5[1] = w[pos4 + 21]; - w5[2] = w[pos4 + 22]; - w5[3] = w[pos4 + 23]; - w6[0] = w[pos4 + 24]; - w6[1] = w[pos4 + 25]; - w6[2] = w[pos4 + 26]; - w6[3] = w[pos4 + 27]; - w7[0] = w[pos4 + 28]; - w7[1] = w[pos4 + 29]; - w7[2] = w[pos4 + 30]; - w7[3] = w[pos4 + 31]; - blake2b_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - (u32) pos1); + blake2s_update_64 (ctx, w0, w1, w2, w3, len - (u32) pos1); } -DECLSPEC void blake2b_update_global (PRIVATE_AS blake2b_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len) +DECLSPEC void blake2s_update_global (PRIVATE_AS blake2s_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len) { u32 w0[4]; u32 w1[4]; u32 w2[4]; u32 w3[4]; - u32 w4[4]; - u32 w5[4]; - u32 w6[4]; - u32 w7[4]; - const int limit = (const int) len - 128; // int type needed, could be negative + const int limit = (const int) len - 64; // int type needed, could be negative int pos1; int pos4; - for (pos1 = 0, pos4 = 0; pos1 < limit; pos1 += 128, pos4 += 32) + for (pos1 = 0, pos4 = 0; pos1 < limit; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; @@ -520,24 +400,8 @@ DECLSPEC void blake2b_update_global (PRIVATE_AS blake2b_ctx_t *ctx, GLOBAL_AS co w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; - w4[0] = w[pos4 + 16]; - w4[1] = w[pos4 + 17]; - w4[2] = w[pos4 + 18]; - w4[3] = w[pos4 + 19]; - w5[0] = w[pos4 + 20]; - w5[1] = w[pos4 + 21]; - w5[2] = w[pos4 + 22]; - w5[3] = w[pos4 + 23]; - w6[0] = w[pos4 + 24]; - w6[1] = w[pos4 + 25]; - w6[2] = w[pos4 + 26]; - w6[3] = w[pos4 + 27]; - w7[0] = w[pos4 + 28]; - w7[1] = w[pos4 + 29]; - w7[2] = w[pos4 + 30]; - w7[3] = w[pos4 + 31]; - blake2b_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); + blake2s_update_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; @@ -556,36 +420,20 @@ DECLSPEC void blake2b_update_global (PRIVATE_AS blake2b_ctx_t *ctx, GLOBAL_AS co w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; - w4[0] = w[pos4 + 16]; - w4[1] = w[pos4 + 17]; - w4[2] = w[pos4 + 18]; - w4[3] = w[pos4 + 19]; - w5[0] = w[pos4 + 20]; - w5[1] = w[pos4 + 21]; - w5[2] = w[pos4 + 22]; - w5[3] = w[pos4 + 23]; - w6[0] = w[pos4 + 24]; - w6[1] = w[pos4 + 25]; - w6[2] = w[pos4 + 26]; - w6[3] = w[pos4 + 27]; - w7[0] = w[pos4 + 28]; - w7[1] = w[pos4 + 29]; - w7[2] = w[pos4 + 30]; - w7[3] = w[pos4 + 31]; - blake2b_update_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - (u32) pos1); + blake2s_update_64 (ctx, w0, w1, w2, w3, len - (u32) pos1); } -DECLSPEC void blake2b_final (PRIVATE_AS blake2b_ctx_t *ctx) +DECLSPEC void blake2s_final (PRIVATE_AS blake2s_ctx_t *ctx) { - blake2b_transform (ctx->h, ctx->m, ctx->len, BLAKE2B_FINAL); + blake2s_transform (ctx->h, ctx->m, ctx->len, BLAKE2S_FINAL); } -DECLSPEC void blake2b_transform_vector (PRIVATE_AS u64x *h, PRIVATE_AS const u64x *m, const u32x len, const u64 f0) +DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32x *m, const u32x len, const u32 f0) { - const u64x t0 = hl32_to_64 (0, len); + const u32x t0 = len; - u64x v[16]; + u32x v[16]; v[ 0] = h[0]; v[ 1] = h[1]; @@ -595,14 +443,14 @@ DECLSPEC void blake2b_transform_vector (PRIVATE_AS u64x *h, PRIVATE_AS const u64 v[ 5] = h[5]; v[ 6] = h[6]; v[ 7] = h[7]; - v[ 8] = BLAKE2B_IV_00; - v[ 9] = BLAKE2B_IV_01; - v[10] = BLAKE2B_IV_02; - v[11] = BLAKE2B_IV_03; - v[12] = make_u64x (BLAKE2B_IV_04) ^ t0; - v[13] = BLAKE2B_IV_05; // ^ t1; - v[14] = make_u64x (BLAKE2B_IV_06) ^ f0; - v[15] = BLAKE2B_IV_07; // ^ f1; + v[ 8] = BLAKE2S_IV_00; + v[ 9] = BLAKE2S_IV_01; + v[10] = BLAKE2S_IV_02; + v[11] = BLAKE2S_IV_03; + v[12] = BLAKE2S_IV_04 ^ t0; + v[13] = BLAKE2S_IV_05; // ^ t1; + v[14] = BLAKE2S_IV_06 ^ f0; + v[15] = BLAKE2S_IV_07; // ^ f1; BLAKE2S_ROUND_VECTOR ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); BLAKE2S_ROUND_VECTOR (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); @@ -625,16 +473,16 @@ DECLSPEC void blake2b_transform_vector (PRIVATE_AS u64x *h, PRIVATE_AS const u64 h[7] = h[7] ^ v[7] ^ v[15]; } -DECLSPEC void blake2b_init_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx) +DECLSPEC void blake2s_init_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) { - ctx->h[0] = BLAKE2B_IV_00 ^ 0x01010040; // default output length: 0x40 = 64 bytes - ctx->h[1] = BLAKE2B_IV_01; - ctx->h[2] = BLAKE2B_IV_02; - ctx->h[3] = BLAKE2B_IV_03; - ctx->h[4] = BLAKE2B_IV_04; - ctx->h[5] = BLAKE2B_IV_05; - ctx->h[6] = BLAKE2B_IV_06; - ctx->h[7] = BLAKE2B_IV_07; + ctx->h[0] = BLAKE2S_IV_00 ^ 0x01010020; // default output length: 0x20 = 32 bytes + ctx->h[1] = BLAKE2S_IV_01; + ctx->h[2] = BLAKE2S_IV_02; + ctx->h[3] = BLAKE2S_IV_03; + ctx->h[4] = BLAKE2S_IV_04; + ctx->h[5] = BLAKE2S_IV_05; + ctx->h[6] = BLAKE2S_IV_06; + ctx->h[7] = BLAKE2S_IV_07; ctx->m[ 0] = 0; ctx->m[ 1] = 0; @@ -656,7 +504,7 @@ DECLSPEC void blake2b_init_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx) ctx->len = 0; } -DECLSPEC void blake2b_init_vector_from_scalar (PRIVATE_AS blake2b_ctx_vector_t *ctx, PRIVATE_AS blake2b_ctx_t *ctx0) +DECLSPEC void blake2s_init_vector_from_scalar (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS blake2s_ctx_t *ctx0) { ctx->h[0] = ctx0->h[0]; ctx->h[1] = ctx0->h[1]; @@ -687,58 +535,58 @@ DECLSPEC void blake2b_init_vector_from_scalar (PRIVATE_AS blake2b_ctx_vector_t * ctx->len = ctx0->len; } -DECLSPEC void blake2b_update_vector_128 (PRIVATE_AS blake2b_ctx_vector_t *ctx, PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, PRIVATE_AS u32x *w4, PRIVATE_AS u32x *w5, PRIVATE_AS u32x *w6, PRIVATE_AS u32x *w7, const int len) +DECLSPEC void blake2s_update_vector_64 (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, const int len) { if (len == 0) return; - const int pos = ctx->len & 127; + const int pos = ctx->len & 63; if (pos == 0) { if (ctx->len > 0) // if new block (pos == 0) AND the (old) len is not zero => transform { - blake2b_transform_vector (ctx->h, ctx->m, (u32x) ctx->len, BLAKE2B_UPDATE); + blake2s_transform_vector (ctx->h, ctx->m, (u32x) ctx->len, BLAKE2S_UPDATE); } - ctx->m[ 0] = hl32_to_64 (w0[1], w0[0]); - ctx->m[ 1] = hl32_to_64 (w0[3], w0[2]); - ctx->m[ 2] = hl32_to_64 (w1[1], w1[0]); - ctx->m[ 3] = hl32_to_64 (w1[3], w1[2]); - ctx->m[ 4] = hl32_to_64 (w2[1], w2[0]); - ctx->m[ 5] = hl32_to_64 (w2[3], w2[2]); - ctx->m[ 6] = hl32_to_64 (w3[1], w3[0]); - ctx->m[ 7] = hl32_to_64 (w3[3], w3[2]); - ctx->m[ 8] = hl32_to_64 (w4[1], w4[0]); - ctx->m[ 9] = hl32_to_64 (w4[3], w4[2]); - ctx->m[10] = hl32_to_64 (w5[1], w5[0]); - ctx->m[11] = hl32_to_64 (w5[3], w5[2]); - ctx->m[12] = hl32_to_64 (w6[1], w6[0]); - ctx->m[13] = hl32_to_64 (w6[3], w6[2]); - ctx->m[14] = hl32_to_64 (w7[1], w7[0]); - ctx->m[15] = hl32_to_64 (w7[3], w7[2]); + ctx->m[ 0] = w0[0]; + ctx->m[ 1] = w0[1]; + ctx->m[ 2] = w0[2]; + ctx->m[ 3] = w0[3]; + ctx->m[ 4] = w1[0]; + ctx->m[ 5] = w1[1]; + ctx->m[ 6] = w1[2]; + ctx->m[ 7] = w1[3]; + ctx->m[ 8] = w2[0]; + ctx->m[ 9] = w2[1]; + ctx->m[10] = w2[2]; + ctx->m[11] = w2[3]; + ctx->m[12] = w3[0]; + ctx->m[13] = w3[1]; + ctx->m[14] = w3[2]; + ctx->m[15] = w3[3]; } else { - if ((pos + len) <= 128) + if ((pos + len) <= 64) { - switch_buffer_by_offset_8x4_le (w0, w1, w2, w3, w4, w5, w6, w7, pos); + switch_buffer_by_offset_le (w0, w1, w2, w3, pos); - ctx->m[ 0] |= hl32_to_64 (w0[1], w0[0]); - ctx->m[ 1] |= hl32_to_64 (w0[3], w0[2]); - ctx->m[ 2] |= hl32_to_64 (w1[1], w1[0]); - ctx->m[ 3] |= hl32_to_64 (w1[3], w1[2]); - ctx->m[ 4] |= hl32_to_64 (w2[1], w2[0]); - ctx->m[ 5] |= hl32_to_64 (w2[3], w2[2]); - ctx->m[ 6] |= hl32_to_64 (w3[1], w3[0]); - ctx->m[ 7] |= hl32_to_64 (w3[3], w3[2]); - ctx->m[ 8] |= hl32_to_64 (w4[1], w4[0]); - ctx->m[ 9] |= hl32_to_64 (w4[3], w4[2]); - ctx->m[10] |= hl32_to_64 (w5[1], w5[0]); - ctx->m[11] |= hl32_to_64 (w5[3], w5[2]); - ctx->m[12] |= hl32_to_64 (w6[1], w6[0]); - ctx->m[13] |= hl32_to_64 (w6[3], w6[2]); - ctx->m[14] |= hl32_to_64 (w7[1], w7[0]); - ctx->m[15] |= hl32_to_64 (w7[3], w7[2]); + ctx->m[ 0] |= w0[0]; + ctx->m[ 1] |= w0[1]; + ctx->m[ 2] |= w0[2]; + ctx->m[ 3] |= w0[3]; + ctx->m[ 4] |= w1[0]; + ctx->m[ 5] |= w1[1]; + ctx->m[ 6] |= w1[2]; + ctx->m[ 7] |= w1[3]; + ctx->m[ 8] |= w2[0]; + ctx->m[ 9] |= w2[1]; + ctx->m[10] |= w2[2]; + ctx->m[11] |= w2[3]; + ctx->m[12] |= w3[0]; + ctx->m[13] |= w3[1]; + ctx->m[14] |= w3[2]; + ctx->m[15] |= w3[3]; } else { @@ -746,75 +594,67 @@ DECLSPEC void blake2b_update_vector_128 (PRIVATE_AS blake2b_ctx_vector_t *ctx, P u32x c1[4] = { 0 }; u32x c2[4] = { 0 }; u32x c3[4] = { 0 }; - u32x c4[4] = { 0 }; - u32x c5[4] = { 0 }; - u32x c6[4] = { 0 }; - u32x c7[4] = { 0 }; - switch_buffer_by_offset_8x4_carry_le (w0, w1, w2, w3, w4, w5, w6, w7, c0, c1, c2, c3, c4, c5, c6, c7, pos); + switch_buffer_by_offset_carry_le (w0, w1, w2, w3, c0, c1, c2, c3, pos); - ctx->m[ 0] |= hl32_to_64 (w0[1], w0[0]); - ctx->m[ 1] |= hl32_to_64 (w0[3], w0[2]); - ctx->m[ 2] |= hl32_to_64 (w1[1], w1[0]); - ctx->m[ 3] |= hl32_to_64 (w1[3], w1[2]); - ctx->m[ 4] |= hl32_to_64 (w2[1], w2[0]); - ctx->m[ 5] |= hl32_to_64 (w2[3], w2[2]); - ctx->m[ 6] |= hl32_to_64 (w3[1], w3[0]); - ctx->m[ 7] |= hl32_to_64 (w3[3], w3[2]); - ctx->m[ 8] |= hl32_to_64 (w4[1], w4[0]); - ctx->m[ 9] |= hl32_to_64 (w4[3], w4[2]); - ctx->m[10] |= hl32_to_64 (w5[1], w5[0]); - ctx->m[11] |= hl32_to_64 (w5[3], w5[2]); - ctx->m[12] |= hl32_to_64 (w6[1], w6[0]); - ctx->m[13] |= hl32_to_64 (w6[3], w6[2]); - ctx->m[14] |= hl32_to_64 (w7[1], w7[0]); - ctx->m[15] |= hl32_to_64 (w7[3], w7[2]); + ctx->m[ 0] |= w0[0]; + ctx->m[ 1] |= w0[1]; + ctx->m[ 2] |= w0[2]; + ctx->m[ 3] |= w0[3]; + ctx->m[ 4] |= w1[0]; + ctx->m[ 5] |= w1[1]; + ctx->m[ 6] |= w1[2]; + ctx->m[ 7] |= w1[3]; + ctx->m[ 8] |= w2[0]; + ctx->m[ 9] |= w2[1]; + ctx->m[10] |= w2[2]; + ctx->m[11] |= w2[3]; + ctx->m[12] |= w3[0]; + ctx->m[13] |= w3[1]; + ctx->m[14] |= w3[2]; + ctx->m[15] |= w3[3]; - // len must be a multiple of 128 (not ctx->len) for BLAKE2B_UPDATE: + // len must be a multiple of 64 (not ctx->len) for BLAKE2S_UPDATE: - const u32x cur_len = ((ctx->len + len) / 128) * 128; + const u32x cur_len = ((ctx->len + len) / 64) * 64; - blake2b_transform_vector (ctx->h, ctx->m, cur_len, BLAKE2B_UPDATE); + blake2s_transform_vector (ctx->h, ctx->m, cur_len, BLAKE2S_UPDATE); - ctx->m[ 0] = hl32_to_64 (c0[1], c0[0]); - ctx->m[ 1] = hl32_to_64 (c0[3], c0[2]); - ctx->m[ 2] = hl32_to_64 (c1[1], c1[0]); - ctx->m[ 3] = hl32_to_64 (c1[3], c1[2]); - ctx->m[ 4] = hl32_to_64 (c2[1], c2[0]); - ctx->m[ 5] = hl32_to_64 (c2[3], c2[2]); - ctx->m[ 6] = hl32_to_64 (c3[1], c3[0]); - ctx->m[ 7] = hl32_to_64 (c3[3], c3[2]); - ctx->m[ 8] = hl32_to_64 (c4[1], c4[0]); - ctx->m[ 9] = hl32_to_64 (c4[3], c4[2]); - ctx->m[10] = hl32_to_64 (c5[1], c5[0]); - ctx->m[11] = hl32_to_64 (c5[3], c5[2]); - ctx->m[12] = hl32_to_64 (c6[1], c6[0]); - ctx->m[13] = hl32_to_64 (c6[3], c6[2]); - ctx->m[14] = hl32_to_64 (c7[1], c7[0]); - ctx->m[15] = hl32_to_64 (c7[3], c7[2]); + ctx->m[ 0] = c0[0]; + ctx->m[ 1] = c0[1]; + ctx->m[ 2] = c0[2]; + ctx->m[ 3] = c0[3]; + ctx->m[ 4] = c1[0]; + ctx->m[ 5] = c1[1]; + ctx->m[ 6] = c1[2]; + ctx->m[ 7] = c1[3]; + ctx->m[ 8] = c2[0]; + ctx->m[ 9] = c2[1]; + ctx->m[10] = c2[2]; + ctx->m[11] = c2[3]; + ctx->m[12] = c3[0]; + ctx->m[13] = c3[1]; + ctx->m[14] = c3[2]; + ctx->m[15] = c3[3]; } } ctx->len += len; } -DECLSPEC void blake2b_update_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx, PRIVATE_AS const u32x *w, const int len) +DECLSPEC void blake2s_update_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS const u32x *w, const int len) { u32x w0[4]; u32x w1[4]; u32x w2[4]; u32x w3[4]; - u32x w4[4]; - u32x w5[4]; - u32x w6[4]; - u32x w7[4]; - const int limit = (const int) len - 128; // int type needed, could be negative + const int limit = (const int) len - 64; // int type needed, could be negative int pos1; int pos4; - for (pos1 = 0, pos4 = 0; pos1 < limit; pos1 += 128, pos4 += 32) + for (pos1 = 0, pos4 = 0; pos1 < limit; pos1 += 64, pos4 += 16) { w0[0] = w[pos4 + 0]; w0[1] = w[pos4 + 1]; @@ -832,24 +672,8 @@ DECLSPEC void blake2b_update_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx, PRIVA w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; - w4[0] = w[pos4 + 16]; - w4[1] = w[pos4 + 17]; - w4[2] = w[pos4 + 18]; - w4[3] = w[pos4 + 19]; - w5[0] = w[pos4 + 20]; - w5[1] = w[pos4 + 21]; - w5[2] = w[pos4 + 22]; - w5[3] = w[pos4 + 23]; - w6[0] = w[pos4 + 24]; - w6[1] = w[pos4 + 25]; - w6[2] = w[pos4 + 26]; - w6[3] = w[pos4 + 27]; - w7[0] = w[pos4 + 28]; - w7[1] = w[pos4 + 29]; - w7[2] = w[pos4 + 30]; - w7[3] = w[pos4 + 31]; - blake2b_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); + blake2s_update_vector_64 (ctx, w0, w1, w2, w3, 64); } w0[0] = w[pos4 + 0]; @@ -868,27 +692,11 @@ DECLSPEC void blake2b_update_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx, PRIVA w3[1] = w[pos4 + 13]; w3[2] = w[pos4 + 14]; w3[3] = w[pos4 + 15]; - w4[0] = w[pos4 + 16]; - w4[1] = w[pos4 + 17]; - w4[2] = w[pos4 + 18]; - w4[3] = w[pos4 + 19]; - w5[0] = w[pos4 + 20]; - w5[1] = w[pos4 + 21]; - w5[2] = w[pos4 + 22]; - w5[3] = w[pos4 + 23]; - w6[0] = w[pos4 + 24]; - w6[1] = w[pos4 + 25]; - w6[2] = w[pos4 + 26]; - w6[3] = w[pos4 + 27]; - w7[0] = w[pos4 + 28]; - w7[1] = w[pos4 + 29]; - w7[2] = w[pos4 + 30]; - w7[3] = w[pos4 + 31]; - blake2b_update_vector_128 (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - (u32) pos1); + blake2s_update_vector_64 (ctx, w0, w1, w2, w3, len - (u32) pos1); } -DECLSPEC void blake2b_final_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx) +DECLSPEC void blake2s_final_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) { - blake2b_transform_vector (ctx->h, ctx->m, (u32x) ctx->len, BLAKE2B_FINAL); + blake2s_transform_vector (ctx->h, ctx->m, (u32x) ctx->len, BLAKE2S_FINAL); } diff --git a/OpenCL/inc_hash_blake2s.h b/OpenCL/inc_hash_blake2s.h index a6ef95d27..63f2942f1 100644 --- a/OpenCL/inc_hash_blake2s.h +++ b/OpenCL/inc_hash_blake2s.h @@ -12,37 +12,31 @@ DECLSPEC u32 blake2s_rot16_S (const u32 a); DECLSPEC u32x blake2s_rot16 (const u32x a); -DECLSPEC u32 blake2s_rot24_S (const u32 a); -DECLSPEC u32x blake2s_rot24 (const u32x a); - -DECLSPEC u32 blake2s_rot32_S (const u32 a); -DECLSPEC u32x blake2s_rot32 (const u32x a); - -DECLSPEC u32 blake2s_rot07_S (const u32 a); -DECLSPEC u32x blake2s_rot07 (const u32x a); +DECLSPEC u32 blake2s_rot08_S (const u32 a); +DECLSPEC u32x blake2s_rot08 (const u32x a); #define BLAKE2S_G(k0,k1,a,b,c,d) \ { \ a = a + b + m[k0]; \ d = blake2s_rot16_S (d ^ a); \ c = c + d; \ - b = blake2s_rot12_S (b ^ c); \ + b = hc_rotr32_S (b ^ c, 12); \ a = a + b + m[k1]; \ d = blake2s_rot08_S (d ^ a); \ c = c + d; \ - b = blake2s_rot07_S (b ^ c); \ + b = hc_rotr32_S (b ^ c, 7); \ } #define BLAKE2S_ROUND(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,ca,cb,cc,cd,ce,cf) \ { \ - BLAKE2B_G (c0, c1, v[0], v[4], v[ 8], v[12]); \ - BLAKE2B_G (c2, c3, v[1], v[5], v[ 9], v[13]); \ - BLAKE2B_G (c4, c5, v[2], v[6], v[10], v[14]); \ - BLAKE2B_G (c6, c7, v[3], v[7], v[11], v[15]); \ - BLAKE2B_G (c8, c9, v[0], v[5], v[10], v[15]); \ - BLAKE2B_G (ca, cb, v[1], v[6], v[11], v[12]); \ - BLAKE2B_G (cc, cd, v[2], v[7], v[ 8], v[13]); \ - BLAKE2B_G (ce, cf, v[3], v[4], v[ 9], v[14]); \ + BLAKE2S_G (c0, c1, v[0], v[4], v[ 8], v[12]); \ + BLAKE2S_G (c2, c3, v[1], v[5], v[ 9], v[13]); \ + BLAKE2S_G (c4, c5, v[2], v[6], v[10], v[14]); \ + BLAKE2S_G (c6, c7, v[3], v[7], v[11], v[15]); \ + BLAKE2S_G (c8, c9, v[0], v[5], v[10], v[15]); \ + BLAKE2S_G (ca, cb, v[1], v[6], v[11], v[12]); \ + BLAKE2S_G (cc, cd, v[2], v[7], v[ 8], v[13]); \ + BLAKE2S_G (ce, cf, v[3], v[4], v[ 9], v[14]); \ } #define BLAKE2S_G_VECTOR(k0,k1,a,b,c,d) \ @@ -50,53 +44,53 @@ DECLSPEC u32x blake2s_rot07 (const u32x a); a = a + b + m[k0]; \ d = blake2s_rot16 (d ^ a); \ c = c + d; \ - b = blake2s_rot12 (b ^ c); \ + b = hc_rotr32 (b ^ c, 12); \ a = a + b + m[k1]; \ d = blake2s_rot08 (d ^ a); \ c = c + d; \ - b = blake2s_rot07 (b ^ c); \ + b = hc_rotr32 (b ^ c, 7); \ } -#define BLAKE2B_ROUND_VECTOR(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,ca,cb,cc,cd,ce,cf) \ +#define BLAKE2S_ROUND_VECTOR(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,ca,cb,cc,cd,ce,cf) \ { \ - BLAKE2B_G_VECTOR (c0, c1, v[0], v[4], v[ 8], v[12]); \ - BLAKE2B_G_VECTOR (c2, c3, v[1], v[5], v[ 9], v[13]); \ - BLAKE2B_G_VECTOR (c4, c5, v[2], v[6], v[10], v[14]); \ - BLAKE2B_G_VECTOR (c6, c7, v[3], v[7], v[11], v[15]); \ - BLAKE2B_G_VECTOR (c8, c9, v[0], v[5], v[10], v[15]); \ - BLAKE2B_G_VECTOR (ca, cb, v[1], v[6], v[11], v[12]); \ - BLAKE2B_G_VECTOR (cc, cd, v[2], v[7], v[ 8], v[13]); \ - BLAKE2B_G_VECTOR (ce, cf, v[3], v[4], v[ 9], v[14]); \ + BLAKE2S_G_VECTOR (c0, c1, v[0], v[4], v[ 8], v[12]); \ + BLAKE2S_G_VECTOR (c2, c3, v[1], v[5], v[ 9], v[13]); \ + BLAKE2S_G_VECTOR (c4, c5, v[2], v[6], v[10], v[14]); \ + BLAKE2S_G_VECTOR (c6, c7, v[3], v[7], v[11], v[15]); \ + BLAKE2S_G_VECTOR (c8, c9, v[0], v[5], v[10], v[15]); \ + BLAKE2S_G_VECTOR (ca, cb, v[1], v[6], v[11], v[12]); \ + BLAKE2S_G_VECTOR (cc, cd, v[2], v[7], v[ 8], v[13]); \ + BLAKE2S_G_VECTOR (ce, cf, v[3], v[4], v[ 9], v[14]); \ } -typedef struct blake2b_ctx +typedef struct blake2s_ctx { - u64 m[16]; // buffer - u64 h[ 8]; // digest + u32 m[16]; // buffer + u32 h[ 8]; // digest int len; -} blake2b_ctx_t; +} blake2s_ctx_t; -typedef struct blake2b_ctx_vector +typedef struct blake2s_ctx_vector { - u64x m[16]; // buffer - u64x h[ 8]; // digest + u32x m[16]; // buffer + u32x h[ 8]; // digest int len; -} blake2b_ctx_vector_t; +} blake2s_ctx_vector_t; -DECLSPEC void blake2b_transform (PRIVATE_AS u64 *h, PRIVATE_AS const u64 *m, const int len, const u64 f0); -DECLSPEC void blake2b_init (PRIVATE_AS blake2b_ctx_t *ctx); -DECLSPEC void blake2b_update (PRIVATE_AS blake2b_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len); -DECLSPEC void blake2b_update_global (PRIVATE_AS blake2b_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len); -DECLSPEC void blake2b_final (PRIVATE_AS blake2b_ctx_t *ctx); +DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, const int len, const u32 f0); +DECLSPEC void blake2s_init (PRIVATE_AS blake2s_ctx_t *ctx); +DECLSPEC void blake2s_update (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len); +DECLSPEC void blake2s_update_global (PRIVATE_AS blake2s_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len); +DECLSPEC void blake2s_final (PRIVATE_AS blake2s_ctx_t *ctx); -DECLSPEC void blake2b_transform_vector (PRIVATE_AS u64x *h, PRIVATE_AS const u64x *m, const u32x len, const u64 f0); -DECLSPEC void blake2b_init_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx); -DECLSPEC void blake2b_init_vector_from_scalar (PRIVATE_AS blake2b_ctx_vector_t *ctx, PRIVATE_AS blake2b_ctx_t *ctx0); -DECLSPEC void blake2b_update_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx, PRIVATE_AS const u32x *w, const int len); -DECLSPEC void blake2b_final_vector (PRIVATE_AS blake2b_ctx_vector_t *ctx); +DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32x *m, const u32x len, const u32 f0); +DECLSPEC void blake2s_init_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx); +DECLSPEC void blake2s_init_vector_from_scalar (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS blake2s_ctx_t *ctx0); +DECLSPEC void blake2s_update_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS const u32x *w, const int len); +DECLSPEC void blake2s_final_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx); -#endif // INC_HASH_BLAKE2B_H +#endif // INC_HASH_BLAKE2S_H diff --git a/OpenCL/inc_types.h b/OpenCL/inc_types.h index 0adcbc5df..575b1538f 100644 --- a/OpenCL/inc_types.h +++ b/OpenCL/inc_types.h @@ -1666,6 +1666,19 @@ typedef enum blake2b_constants } blake2b_constants_t; +typedef enum blake2s_constants +{ + BLAKE2S_IV_00=0x6a09e667, + BLAKE2S_IV_01=0xbb67ae85, + BLAKE2S_IV_02=0x3c6ef372, + BLAKE2S_IV_03=0xa54ff53a, + BLAKE2S_IV_04=0x510e527f, + BLAKE2S_IV_05=0x9b05688c, + BLAKE2S_IV_06=0x1f83d9ab, + BLAKE2S_IV_07=0x5be0cd19 + +} blake2s_constants_t; + typedef enum combinator_mode { COMBINATOR_MODE_BASE_LEFT = 10001, diff --git a/OpenCL/m35000_a0-pure.cl b/OpenCL/m35000_a0-pure.cl new file mode 100644 index 000000000..9e2e4b5f1 --- /dev/null +++ b/OpenCL/m35000_a0-pure.cl @@ -0,0 +1,111 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp.h) +#include M2S(INCLUDE_PATH/inc_rp.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) +#endif + +KERNEL_FQ void m35000_mxx (KERN_ATTR_RULES ()) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + COPY_PW (pws[gid]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + blake2s_ctx_t ctx; + + blake2s_init (&ctx); + blake2s_update (&ctx, tmp.i, tmp.pw_len); + blake2s_final (&ctx); + + const u32 r0 = h32_from_64_S (ctx.h[0]); + const u32 r1 = l32_from_64_S (ctx.h[0]); + const u32 r2 = h32_from_64_S (ctx.h[1]); + const u32 r3 = l32_from_64_S (ctx.h[1]); + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m35000_sxx (KERN_ATTR_RULES ()) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + COPY_PW (pws[gid]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + blake2s_ctx_t ctx; + + blake2s_init (&ctx); + blake2s_update (&ctx, tmp.i, tmp.pw_len); + blake2s_final (&ctx); + + const u32 r0 = h32_from_64_S (ctx.h[0]); + const u32 r1 = l32_from_64_S (ctx.h[0]); + const u32 r2 = h32_from_64_S (ctx.h[1]); + const u32 r3 = l32_from_64_S (ctx.h[1]); + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/src/Makefile b/src/Makefile index 04c1f7a0b..ab10c236f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -4,7 +4,7 @@ ## SHARED ?= 0 -DEBUG := 0 +DEBUG := 1 PRODUCTION := 0 PRODUCTION_VERSION := v6.2.6 ENABLE_CUBIN ?= 1 From 6492beb83e29e0ee346ca3c5a9d132a10d1737be Mon Sep 17 00:00:00 2001 From: Louka Date: Mon, 6 Feb 2023 16:51:53 +0100 Subject: [PATCH 08/28] add tests --- tests/500-worst-passwords.txt | 499 +++++++++++++++++++++++++++++++++ tests/blake-test.py | 32 +++ tests/blake2s-valid-hashes.txt | 499 +++++++++++++++++++++++++++++++++ tests/dico.txt | 1 + tests/password.txt | 1 + tests/password2.txt | 1 + tests/sm3-test.py | 32 +++ tests/sm3-valid-hashes.txt | 499 +++++++++++++++++++++++++++++++++ 8 files changed, 1564 insertions(+) create mode 100644 tests/500-worst-passwords.txt create mode 100755 tests/blake-test.py create mode 100644 tests/blake2s-valid-hashes.txt create mode 100644 tests/dico.txt create mode 100644 tests/password.txt create mode 100644 tests/password2.txt create mode 100755 tests/sm3-test.py create mode 100644 tests/sm3-valid-hashes.txt diff --git a/tests/500-worst-passwords.txt b/tests/500-worst-passwords.txt new file mode 100644 index 000000000..a33ca4719 --- /dev/null +++ b/tests/500-worst-passwords.txt @@ -0,0 +1,499 @@ +123456 +password +12345678 +1234 +pussy +12345 +dragon +qwerty +696969 +mustang +letmein +baseball +master +michael +football +shadow +monkey +abc123 +pass +fuckme +6969 +jordan +harley +ranger +iwantu +jennifer +hunter +fuck +2000 +test +batman +trustno1 +thomas +tigger +robert +access +love +buster +1234567 +soccer +hockey +killer +george +sexy +andrew +charlie +superman +asshole +fuckyou +dallas +jessica +panties +pepper +1111 +austin +william +daniel +golfer +summer +heather +hammer +yankees +joshua +maggie +biteme +enter +ashley +thunder +cowboy +silver +richard +fucker +orange +merlin +michelle +corvette +bigdog +cheese +matthew +121212 +patrick +martin +freedom +ginger +blowjob +nicole +sparky +yellow +camaro +secret +dick +falcon +taylor +111111 +131313 +123123 +bitch +hello +scooter +please +porsche +guitar +chelsea +black +diamond +nascar +jackson +cameron +654321 +computer +amanda +wizard +xxxxxxxx +money +phoenix +mickey +bailey +knight +iceman +tigers +purple +andrea +horny +dakota +aaaaaa +player +sunshine +morgan +starwars +boomer +cowboys +edward +charles +girls +booboo +coffee +xxxxxx +bulldog +ncc1701 +rabbit +peanut +john +johnny +gandalf +spanky +winter +brandy +compaq +carlos +tennis +james +mike +brandon +fender +anthony +blowme +ferrari +cookie +chicken +maverick +chicago +joseph +diablo +sexsex +hardcore +666666 +willie +welcome +chris +panther +yamaha +justin +banana +driver +marine +angels +fishing +david +maddog +hooters +wilson +butthead +dennis +fucking +captain +bigdick +chester +smokey +xavier +steven +viking +snoopy +blue +eagles +winner +samantha +house +miller +flower +jack +firebird +butter +united +turtle +steelers +tiffany +zxcvbn +tomcat +golf +bond007 +bear +tiger +doctor +gateway +gators +angel +junior +thx1138 +porno +badboy +debbie +spider +melissa +booger +1212 +flyers +fish +porn +matrix +teens +scooby +jason +walter +cumshot +boston +braves +yankee +lover +barney +victor +tucker +princess +mercedes +5150 +doggie +zzzzzz +gunner +horney +bubba +2112 +fred +johnson +xxxxx +tits +member +boobs +donald +bigdaddy +bronco +penis +voyager +rangers +birdie +trouble +white +topgun +bigtits +bitches +green +super +qazwsx +magic +lakers +rachel +slayer +scott +2222 +asdf +video +london +7777 +marlboro +srinivas +internet +action +carter +jasper +monster +teresa +jeremy +11111111 +bill +crystal +peter +pussies +cock +beer +rocket +theman +oliver +prince +beach +amateur +7777777 +muffin +redsox +star +testing +shannon +murphy +frank +hannah +dave +eagle1 +11111 +mother +nathan +raiders +steve +forever +angela +viper +ou812 +jake +lovers +suckit +gregory +buddy +whatever +young +nicholas +lucky +helpme +jackie +monica +midnight +college +baby +cunt +brian +mark +startrek +sierra +leather +232323 +4444 +beavis +bigcock +happy +sophie +ladies +naughty +giants +booty +blonde +fucked +golden +0 +fire +sandra +pookie +packers +einstein +dolphins +chevy +winston +warrior +sammy +slut +8675309 +zxcvbnm +nipples +power +victoria +asdfgh +vagina +toyota +travis +hotdog +paris +rock +xxxx +extreme +redskins +erotic +dirty +ford +freddy +arsenal +access14 +wolf +nipple +iloveyou +alex +florida +eric +legend +movie +success +rosebud +jaguar +great +cool +cooper +1313 +scorpio +mountain +madison +987654 +brazil +lauren +japan +naked +squirt +stars +apple +alexis +aaaa +bonnie +peaches +jasmine +kevin +matt +qwertyui +danielle +beaver +4321 +4128 +runner +swimming +dolphin +gordon +casper +stupid +shit +saturn +gemini +apples +august +3333 +canada +blazer +cumming +hunting +kitty +rainbow +112233 +arthur +cream +calvin +shaved +surfer +samson +kelly +paul +mine +king +racing +5555 +eagle +hentai +newyork +little +redwings +smith +sticky +cocacola +animal +broncos +private +skippy +marvin +blondes +enjoy +girl +apollo +parker +qwert +time +sydney +women +voodoo +magnum +juice +abgrtyu +777777 +dreams +maxwell +music +rush2112 +russia +scorpion +rebecca +tester +mistress +phantom +billy +6666 +albert diff --git a/tests/blake-test.py b/tests/blake-test.py new file mode 100755 index 000000000..bb9b9d104 --- /dev/null +++ b/tests/blake-test.py @@ -0,0 +1,32 @@ +#!/usr/bin/python3 + +import hashlib + +# Python script to create dataset of passwords/hashes for testing + +PASSWD_FILE = "500-worst-passwords.txt" +VALID_HASHES_FILE = "blake2s-valid-hashes.txt" +BLAKE2S_HEADER = "$BLAKE2$" + +# Password source file : https://github.com/danielmiessler/SecLists/blob/master/Passwords/500-worst-passwords.txt + +def createBlake2sDataset(inputFile, outputFile): + # open password and hashes file + passwd = open(inputFile, 'r') + hashes = open(outputFile, 'w') + # for each password in file + for line in passwd.readlines(): + # compute Blake2s hash + d = hashlib.blake2s() + d.update(line.encode()) + # encode in base64 and write it + formattedHash = BLAKE2S_HEADER + d.hexdigest() + hashes.write(formattedHash + '\n') + print("Done") + +def main(): + createBlake2sDataset(PASSWD_FILE, VALID_HASHES_FILE) + +# entry +if __name__ == "__main__": + main() diff --git a/tests/blake2s-valid-hashes.txt b/tests/blake2s-valid-hashes.txt new file mode 100644 index 000000000..230f4a6f9 --- /dev/null +++ b/tests/blake2s-valid-hashes.txt @@ -0,0 +1,499 @@ +$BLAKE2$ba08e9b0d31c5a4eec3f0bafd2b1c9e63a86f14a6ed1da891e575f165ef8f3bb +$BLAKE2$6cf584a9285679edca822524c4ce8b9b50c43642bd0001aadd5b38299bc0a57c +$BLAKE2$11fa7c1103374ff17e5d0e59e433b0743284177be0ee14fd2639add102c4f020 +$BLAKE2$87361fc2ee0a0155f1478e4025043c62e43354f11d694a318e0273bf2b95c0ba +$BLAKE2$1c3f004442d1e0c5fc2c509fa86c397052b1c3a934318137f61a4a628848642f +$BLAKE2$709dcba6d2db68cdc6d4d3674cf8382755b6f6d673c68ad2d8132d5eac0a54cc +$BLAKE2$d8b59df69749fdd9a7e9ad6a9154367f28ed84ce6df0e91bd3982c14e982786d +$BLAKE2$418a20edc50181568918d798e862e4bd6a26471e3622d81ba349b09812ab4006 +$BLAKE2$856a6d77f6a9f93bb6e7498e6731b1f04fb5118610aacdc9afb90ead3b042fac +$BLAKE2$6d94063cc0ae099bd0e12f946f3f2d577c7969e0ffe407d5ee7d9e6cefa60882 +$BLAKE2$88f736073e73b753dc62d73f1898c30611432dfe375daca0505d27f6412f4630 +$BLAKE2$6ce36dab0fc75a08c7dd680d8e79c6fea051219c19262c8bf28939403f2e4adc +$BLAKE2$da4b5435b0ce3bd67b347b686a7a6f946d8d39c3c66ae7f56e16a8297358da19 +$BLAKE2$77fc62d5adc48e0cade36419ab51a290caa728ee627d71ec633bfda2090fa83e +$BLAKE2$1be470485b09416bfa3378f4a24858787b809436e833057e61c26f0aebf6c4ec +$BLAKE2$150abe7ea429e5c13eeb672c6f604147d459b8629e695080ef095db624643d62 +$BLAKE2$26bd5075b589d90ebd857e0b84e965839764afa261eba41950296b440d7a1c14 +$BLAKE2$8b0cb8b9d0c2f4287d1e5b08283fea69a04e36b2467a3dcc73e4aadacaa12ea6 +$BLAKE2$f071ebf10d75305e8b70c59d2e8938515e71ac61039873099e803a007bf4c58f +$BLAKE2$cc87b12d8a1de96100e8c24bdaac9b57cd2dced9426b2a4468f7ddfc98d4064e +$BLAKE2$2a85bf4d1536e97f3146635022b27afc5ffecb1250c0ebec95bdd09f4405fd25 +$BLAKE2$823c5883a4a3f1ab343cda5746529ca26d04d6e898f191b21a5fc2a16c33a8ad +$BLAKE2$bbdd6131eb5248348e3b55f65821ef21877a5f9b80f859d369b9b0f7c01b6820 +$BLAKE2$8cf72094862b3414f0efe99c59692686f3718ebf39dd29ce854ecedf31646a20 +$BLAKE2$5168353bfef0b8b679d8729fcf9e54fefe05ee57aa82873bfd506470e17239d7 +$BLAKE2$77d0a1fb0b0738f3226841c64d5dd7e29c82aeb042f8ae1dc35a2701874b99df +$BLAKE2$76a005d158ec4bb1e27934f8cdbde1e5d0e2282fa65f6946dbabd8524f976419 +$BLAKE2$aed85a67a5834c4a2da8932bfde3d7681add52a099d53794d377a3d879112230 +$BLAKE2$6b00e3ca889da6e66fbb9325523d8a87e3310e5040c4e1f3a748a820d9fa2f8e +$BLAKE2$975c6313d3cb4fae3ff12feccc34a68b8719e2793728377b3f32fafbe39b8a7f +$BLAKE2$d40e3a9a75510ef8b07148b05964f43c57157b2f6d7fd4eddb5d5eeb2c1e9d60 +$BLAKE2$8ae05c79ccf242cc954fb36584b2181cc9236286a0382e69b516f2cef3ba5902 +$BLAKE2$ed265610715e5191c371ece4de68a0453a31898a17ca2b1f21c28577d31cce07 +$BLAKE2$1eb99e5ff1b1f9567df5792bfbed918807c32bb8d26b2c7c86c975b1c57d014a +$BLAKE2$6eb2844b17ade456b53ec224f6d4762a8b3cb0b8c349200b58b11ffe7d3b1867 +$BLAKE2$81fa3f4e4898e07d88252325de9a86a7c37b492ee11c4853610d1af724013087 +$BLAKE2$1353db829cb6bf4b8ad9f1653f6d385009306e19c19fa6fdd94383b91241e59a +$BLAKE2$2d0802e7ac636f16b23d77198aa9ba0f89fd60d74cd07be8c8ea448bf9e2ab1f +$BLAKE2$0b0f419866944ed4d7bcc38fb2b066d020f74f41fa27600e5d99e401ddc98085 +$BLAKE2$e9a8b49bf63d8a74b48d97c7300829927d14306aaf22bef70563d395b6cb0a6e +$BLAKE2$7d7c4ae414d0f8abb64f45c49b0c878ff881655691ed5124cac3fa97f260a26b +$BLAKE2$577e1d0b3d7470649c679c5282210f63c1b9168b2b21c79b72685763048cf5ab +$BLAKE2$cde3715eb49b32310e3c1a122d8b62418606670b1916193f4b512b02615fa57a +$BLAKE2$62baf1e31ea0aab68b49aac9214f52d8f07af6da29f3f3bea638103d5e5e067d +$BLAKE2$229e892f98bf37476a8afc76ee9a6fd16fa38f7d72bbf77b41e406deb4d463fe +$BLAKE2$94eb97c12568652b665310bee2d86026e3fda6fdd3e406b23ece55115b9ca81c +$BLAKE2$772293e5eeca4de5a04a926f97f0f25df96dd5e02f3bf097c061219374b220ca +$BLAKE2$ab3103cca8d1cd75d92728dc3e479336409f65940f760c9182a492b4c44e957e +$BLAKE2$bdb9532b6544171ede2ded9ce7847ef30135d69896566f5c188c27e0b8fc99b0 +$BLAKE2$56a0dd23625d82b63102b6915c56073ac20481d77af0edfb84bf5dd4a9a615d4 +$BLAKE2$6478cd84ec927e5ce0219d487957216c147ed2873a630895e8ffd6601365b5b8 +$BLAKE2$4cb9b963aaac5dcfcc283ef24e5c89f968c3dbe0f7e1640d9b1d246d29092f57 +$BLAKE2$bb5af99aea722cad52e7ed74413e5671db8d86a8f9d438eff37cf3aa5e963236 +$BLAKE2$f48b768e4fc9f853548b24d7ca8411d765bb91071d81142c8d3defdd97dc3726 +$BLAKE2$4309aa9d5e0c480d0440518e6d9d39319262acebbcf1e958c29a51ef8b9bb36d +$BLAKE2$a23d86088e7a7526acf02f0f5c6216da43aa1bdb7892721c710aedf95f8cf304 +$BLAKE2$173021f80295900b1674ea71f14d63352adc6f94f4b2a15586220aac25f2d170 +$BLAKE2$a281d1612d40c995b8b57df944f6c7e42c07ec20aea84b920d58c00b422b311e +$BLAKE2$98143913f273d896256fa862e9911192e2f15f66728fdbf5d8fb83bbf7d4e9e0 +$BLAKE2$3944d18a788dab51b10001e32c22a85590ae6ab092a12a5d3877d0c240fa0b75 +$BLAKE2$7e5281806efdb8935a9e1801847fcd641727cd83f8bb33594858b147f086f702 +$BLAKE2$3f1621c85777e18f0367b291e5eea1ace1071a2da424fb479b6018ddda422f99 +$BLAKE2$294ced3f3a14df098aabb37c6a53382aab0af821304595d46e179ce4211b20ce +$BLAKE2$62c518806a643b52e97c14e3925535dd64c8b37e15ea5d4224fae1c7d9c83c64 +$BLAKE2$3b6b5f750b1d50e27feaee361ca73c6078a31d70a2ee19a4175b7ca44d7e2959 +$BLAKE2$b3464e16b759821e5b3df2b866c092a1b044108c7150ebc577c2491e41d9e251 +$BLAKE2$0b0b18c0726e97121760d32aea490470159541a34a818e9d3d7403f92e6b7aac +$BLAKE2$9b59893a29cb61e969ee7abe26caef3861d6ae12cb4fc47f9062236fe613349d +$BLAKE2$a74e7b6b2a7de830877d3b424eb8272bb36259047bbe56c8f5e6188b40050c64 +$BLAKE2$93335ab1e466b8bd8714ce43dec08eeda4b12bfb2ff9726e2a0e8da1c7d98137 +$BLAKE2$76a56a21accb4b916a9f097029cba2fd6915e5f4b6787914c2bdeb25a89d7a15 +$BLAKE2$8a6b59458d81f8f72271d47ecd677e0afb558cc5eff2d24046781d57fcff329e +$BLAKE2$16b6059b1089b6b5a1bdf4bfae5fbb201a5af919e4bcb1c7e66e43ab40a149f1 +$BLAKE2$a164fb32ab56c9c29509224dc31284f6e30cad44ea45fff2e0dbc6e9c3775c52 +$BLAKE2$298e28f94822996ba2f01ef5bba282451f13a4f474bb287d6bc49ff9defee643 +$BLAKE2$0e73f055808c76834222071333d39fcbd1c7dd6f2dc7afbeabe76023b1609d75 +$BLAKE2$be442f168f216d5c1625785dee83f231e24815d17d32eb8c2eb31a0a1396e34b +$BLAKE2$f4421e461d43f1a720250cddf09827da9e8c41e7be19fabc4a8896717f0f0870 +$BLAKE2$cce76872e5d9a118c1a3c78f6ed8414a7452ac2f39a4117ef7249460a908f079 +$BLAKE2$a200db738561e6f939226770174338d92f004ae66d7abe0f15386025744a7851 +$BLAKE2$c889bf976489f2d5d9838aea436ffbdb9ffa2d2d5747d95e4ace00c980f350ca +$BLAKE2$8f4118f0cd494c737542411768200a09491c624b35c350eb61f296e085439cd0 +$BLAKE2$939835e3ba27094f1c2851961c0df06b3643e55837fd9a26a6f5b972acad05e0 +$BLAKE2$ebbabf826262b33565627ff9513a54a46afa79c99b537c03e119b304e7a11f5d +$BLAKE2$01921179d4bc76144d55697b4c75c790bc3dc4bd01810fabdb04a1deec6c1001 +$BLAKE2$8ecfe1339c24c82c62c8bd196b6c2079cd24fd9602d59ca0f50e6325f846e25c +$BLAKE2$965dc748ed6afe6031d39b6978da6ee5c12ca5fdab0773ff717e4bb71f194a80 +$BLAKE2$6881c0983e251969247f0d0e6351bb5b01d4eef9782acde5acaf18a960195bac +$BLAKE2$517a8c92234581728c7b80af1f5297934ce58aec4bf3617346dbcbd010045ca0 +$BLAKE2$867c15f054c6de1b6f17d2c63abe3da181c94ff2a2baab9d835d2e6988b9daa1 +$BLAKE2$20b2317b4e688e694d9ba96e0977325d1580ecf3ee8a385b26dc6221727b2207 +$BLAKE2$d70a00f3ad911ffe73a2c8065b3e4dade1fb302423b20dbe1b27c83c0334d67c +$BLAKE2$4fba4698c50dc73e82e5ea3954aa8cdae626382d0d086a8f9e4a72f42a07f625 +$BLAKE2$82ac71c9e2985fbb9361e4f4379a07b934e9bb4b9feeadedad6072952304d80b +$BLAKE2$61bfd377a17350a55bb06bef8fdefbbf2917fed52568eb02aada6b3f7bc9ddff +$BLAKE2$6848d7621f8295b34196de31afc47c636263a78a2f26e8abc2592d751151d1ca +$BLAKE2$74e31d48029f5598bfa151eb2cdfe1d7838a8ad0ebb1d889bb569e1a212e811c +$BLAKE2$3969b3926654065966b6f8d9a65789b0f76d56e1e2ab67dd94faa770959187ca +$BLAKE2$b0ff54a2d0dcccce7200f0a8001b024efd0a9e9550be236900a12d20d0921e86 +$BLAKE2$5145607abf940bf3bd9273559dc5414eab360f225980d79e163d157ab47e82fc +$BLAKE2$0c4ca0e6adeba449ef9e6a275d81d7186bd789f43c3b9ebc07f259754681d43a +$BLAKE2$cee6feb330a7a88c22b05bc7167e7252f084f5baf91955c8ab6b581788ef64d1 +$BLAKE2$2c9ee8c209e03ca75ea48c68e22723865d8163d72221b56531cc8b0e8b62c460 +$BLAKE2$dce35f9ad9e3173e6d246af5f359ce782f29cf1a2ee792e257d2b9a4cd130c31 +$BLAKE2$2c5dcfc68b3b4e4a1c75d4f202d4abaae8ff21a0abc91e0dc1b15ee25bd5097a +$BLAKE2$d5a63b73dda0efa545f38aedf480a3aabc060c6dcdb8c2a1e65406f89063e321 +$BLAKE2$2081b01362487f13a812a88681909d370a16eba6cdf5155c23fecb07650f0f17 +$BLAKE2$f6aa9109007219005e71ebf9aad7b5e88e56cc04bee50123ca6c0419484d0a00 +$BLAKE2$3380e8594b71aced82528e016554935c66426e9d17bc61f083d5c4949d119348 +$BLAKE2$1bd088743487f3826594c17f2260906bd0446882ddb2c6ad343de4a54d64727f +$BLAKE2$48b470551a13a3a1fcf464a1b3c423319444fd30cd6e2975bb5583bc895cb213 +$BLAKE2$dcae9d7611dc3299a10cfaf64c7f27e1aa60c6184b2700333cf2ccb86a5b7c9e +$BLAKE2$e9944efddda0c0989d5884225af44aa2999b61e3db1ddc4a13882e39a12f2daa +$BLAKE2$5b22c9842cd120c84253300416e19ff5bc8472247d44fd54f9431177a6189eb8 +$BLAKE2$a6ba970cd97a5db4e642386182946e84c2247e1b164b824403830365f4cd430d +$BLAKE2$089f302b18fc49697c5ad7254e6cdbdfab3d00056e22f746682133e5ea884e56 +$BLAKE2$db11e8c6b41565f01bb88a1348ccb51a7ebe5990f460c1d2bc05892a0401ab09 +$BLAKE2$aafd5f931022f6823c0e5c422d321771f887c472a22fbc451c080e1a355553bc +$BLAKE2$5fb680538a4d184824578489576df8614704d76a2a30cfdc8c22545bc8a0aa8d +$BLAKE2$4eda1f2f3e5ab9e76f49e36829d2d66adcf564216c61424ac1526f24cd62d8c2 +$BLAKE2$19673a15ae27918bfc460953503ae7efa72f33ebbda705ee0a3133a7a4b0e9ca +$BLAKE2$89dad277ce899cde08623f206f296d11b4218380fd656dfcc7329b2d548a2c4f +$BLAKE2$f26499cc2c58ce2ca405982903dc28e06bb83deac11ae5f82c03d16b04b876ca +$BLAKE2$83bcb423abe8e4ef5fc16d766ee5bd391cc8afbc93c99e6913278e5a1c304a66 +$BLAKE2$43372228212bf3eeced8853c023249ecdf58edf7529c6a505332724eb0d730b6 +$BLAKE2$92416c84483aa1f176b0fcb924828a8958b0348399481ea5aaeb111500bffa33 +$BLAKE2$e3786e038b1ecb2a449f08c337367a694290d3cc2c5b61607bf22325b0262953 +$BLAKE2$2316df49e2d2f535842c2196e778c669a9715c41bd9ffc51b607d5a492ba670a +$BLAKE2$c120109e98f535d4380dde69508fb1473ed8a977d3ee98d6d2b106fbc1df20fb +$BLAKE2$4e7a7028aa46f011af20fefbbd56d42c336322c9b2030b82710618cd7eb19db2 +$BLAKE2$959632e421411d6b943061dc93b57c8669b5daee3ea36ea5a1cc0c85e8caf8cd +$BLAKE2$d8a189acef58b9625ba9467f30f344fa78650100a32af255762abfc455979103 +$BLAKE2$941e7905de976379209b60eb4e1809d40866279430eb85bdd5d51d6f12a95bac +$BLAKE2$bbb835ad458959ac095c7fcd8e4cf65f34fd3dd006a6cfab2e85451d8dacafb9 +$BLAKE2$aad7218a489be1ba4cbfb901780e4b0688029d0203719e5c6b2574999c6e0bdb +$BLAKE2$ea681f5974258fd94b53043dbac5275f562627972526fa5d8e24ccb4d9897009 +$BLAKE2$290d66f08b2f24cec0c0ccfba786a2ae842de85997241736bce64ca82198306a +$BLAKE2$bdf863436bf8f2c9c4183b92ee9fe16f121ee1e0e026b8d596cd6424fd2483e1 +$BLAKE2$edefb6913000690fcefb688538e3a64b40ce3929a4b0b01f26bdd14ff315ed52 +$BLAKE2$d096bb78f5259748bdaf47ac1e6a310afcb0538fb9147f8350f41b924c43397d +$BLAKE2$2df40ca6d18f48601e704dda2bafa9c56250d96c3d5cda67639ded86417b530e +$BLAKE2$0acb7b4f60f2e042338fc1ebbb37d5638386ef9d760ea4483b8eec4864a8bbfe +$BLAKE2$f9465ccac8fd7400efc744bf920f633b4996bb3de913ba0e6e4ecb7ccb3b5446 +$BLAKE2$00e6e58b0c6b69c1a5b37ec574fce8703897a38da57f483ea7833eb6306a7a1f +$BLAKE2$d6be1bf2bf535bd74c3bca5b4c15ed84862076148838c00b7d30900fd18e4f71 +$BLAKE2$64b8d66ad5d6000b65e8b14ebd6fd62647052c712eba8a2581c3926021d080ec +$BLAKE2$2a7dff8433c996e303d06797a80df0788199cca6f92e256d5b525c064d16dcba +$BLAKE2$fc87a86f8decd0f9055299660368f4634b18e3032ac8049c42c1815bd5c833a8 +$BLAKE2$efffdd5dcc2fdefe642eae328dee4d34eb762045204d2d78d1eb625d9ebf93dc +$BLAKE2$a45fb884ac65cdb4559b2bb0b17016bbfea01691eaaa5328d6ef431785913f71 +$BLAKE2$58225c6fb01449c844e53373ed7abfa760999cd9ca2b0e4fd9c296a59ba1ea62 +$BLAKE2$389a2985d618bb4fcd336e3ffbb6d82a88e8fb7f7c0df668eee5e66e4656edb7 +$BLAKE2$8d166965a9fb21a3bd89810d774bee7f4cdfe1c373f226b98aceaed5cd9a91e4 +$BLAKE2$04bf9fd9420400e65b680e1372d755ab4cca7753d64e2f209d873502bb29894f +$BLAKE2$dadcc5f702eff91bc9a44f526281cfc07860f42c4a12f7c4b7e92ecdf9ba490c +$BLAKE2$a836f96b09b1a69e47505770142945252ee30e03c859689f158a7b54e29a545f +$BLAKE2$cd5b9048837ed18f41d69fe2a385f42e0646ba0b80df5039bb58df95f1111796 +$BLAKE2$2ce73e640f578b2f457aecd672ab635100ea9a777dce39474d87d5091211527d +$BLAKE2$bfa867801a9f61fe89ddcff40815630930bc19381dbe418911f4a7a2b1ce221b +$BLAKE2$11934a81928c25f36a316b7e82bd806532579420a2c9802add4ddb61eef0ebcc +$BLAKE2$8eaaadd55707ba7414131c9e41366e101a6c59012eb5b809dac8b7f8eee199a4 +$BLAKE2$95429e018bd9f4616da2ce2b46ff1e98752b65013309672cecb0191d050e6ddf +$BLAKE2$4a48215ea891db08d693ba826169f8e59c3c3a859b2c92a68f42cbb23e14cbf7 +$BLAKE2$8bc47b8d431dfe0509170fc26373049a4ce128e3ebfb59022d8f5bb2200002d1 +$BLAKE2$030f938298fb227d2054f086489f53cd3e557fe1045625d3e8998b44a7aeb6de +$BLAKE2$df72f7d1620a3f1300e38136d026b886379389cee840f2af635641de466bc0ad +$BLAKE2$6e5d59dd97e4d25b04aba3736acde84ed388ac7bf58e96ae15f57f44520ad9c0 +$BLAKE2$b03f1a568add2b2ae4aa7713ac68e0b55c526c22c2a87b5e81a33c271cef1e7c +$BLAKE2$ac3b1d878014436f392a5c08384a0a81ed64c759da945dd808efcfa3130ecfdc +$BLAKE2$d957519352fda1c992e6bca1f641d8201ca38b379ccdfab4331eb717afb80904 +$BLAKE2$75d7617b7646972928ab8afa5a3fe023ed594fa14f08350d8b5aa106490ea41e +$BLAKE2$623755b21bf267803a33c0a1010c66f58f5d4bca0014c3655eec404257d9076e +$BLAKE2$4d39347afc866c555641ff3f01cdf67c55bf2941c2d308bd8555eaf9a3612ae4 +$BLAKE2$1bb60acccddce22d6f1ae7259e45fc6a83a244392d016bd87b6b6bf1aacae60c +$BLAKE2$7d30daf235e0b6e6d67d93068b7216e76b9f2c70236430f86ae1527e90cded0c +$BLAKE2$eb1a854be06d75c935f4451eb2df5840b67df328c08e2a91bd7e9939454b3235 +$BLAKE2$6b5318e396fcd0f93ff8b822c00d69e0902e95107134701b6e3d7f2b5f7201b5 +$BLAKE2$cb8e04e2e6705ca0b1fb241268e3d31aa28e4e59547ab61595777de2e7124eaa +$BLAKE2$abef7df45b16356c16cfb458745bc0645da3bea5832633671165387f1597d9c6 +$BLAKE2$7fbf658a33aeb64c3ec7b1a075439f01115beb60eeed9a4e5aeeb4b56e94418e +$BLAKE2$1028714485c1663aeec86021b4f5124530ccbfc1fa0e19be0d97e2f363b46a71 +$BLAKE2$d460f6ce3f49081442dab71ae954ecb1775f573712ba4ebca83f44751d5bc958 +$BLAKE2$b4ef8aac59f29f6dd8773127544fdb30228e0d1c38ca931aea965106b2847f00 +$BLAKE2$d9c10b63e14775672d73c69ade6a1b7cf9002be9c572a0d47904c0d57044ca5e +$BLAKE2$b38ef98bcb69b6df41f1461817cea9aea3e1e6febb053a80a4e22771300db7f8 +$BLAKE2$3869d0ddd5fd2116478eec0481a491d69e267f9f6d5bbf636e222880db1ae9ae +$BLAKE2$0114c513f7e226420cc7518690018c988560de33e2c12e275de18c664dc542f9 +$BLAKE2$cf5711e35620c167f78710585e977fb53800b1e5b4f72c3ff84b37eafb5c3413 +$BLAKE2$ab668b54cd967761b94928113973807d6c02c9955c82260f189f34636817793f +$BLAKE2$e829692d1fc4854dae50c298fb3b16d5dff02f926aad8a1d35c8203b2bcb3adf +$BLAKE2$c78bbf4c606fa773161c668e0536ea6748603e656fd143f58790051648f30310 +$BLAKE2$eac39c6ae63765d2c6a91d054ec63c4a6fd305aab35113eb766319dc4f1577ba +$BLAKE2$f7baff6fc84dc7fe14d6c773ee6ed40c87ec262859a73d0cbe2f34e7a531dd36 +$BLAKE2$80f80803a6da922068ecaf9bc99a5691e08c774030894c26f42fdc672946277c +$BLAKE2$530a142bf942f499bcfd2d3292b2993a2a6c79ff7dd8a841ed1104925c64c363 +$BLAKE2$db3f54391d2d564b8f23f8dcacb9f8ac1356106323cab8f06caf53535610e65b +$BLAKE2$5e5e46fee74885fd83b37791ff6b58c865b3ab44177d517d4566354218d74a52 +$BLAKE2$038a47721f3f0cdd91009ab1eea377ff1d3dea7cfe67d804447759777e92b6a3 +$BLAKE2$c52e0b3bcbbe088c6d66c354c3bc478b995e3f1975cd355c7c254f3e2878ab01 +$BLAKE2$7ed093a685b26c4f9c4f9117c9a2248abb5c84fb7f53dc3ff35db488da05730d +$BLAKE2$f0a2e550775467b6828f71011822b9e4e03152cef90776a5c3cd1eca87e26134 +$BLAKE2$a6edb96ce9aab52875a67976c1bf7c0d9b3d3b68cfbab0ca26461f16b38b626b +$BLAKE2$602a21b49f3e12c0fa56e335f9b4c57838daad461c2a8ac7d77df5a4ff11fd4d +$BLAKE2$61525a45cdacc50d80781dfce35bdec4249c5935a5b0cfb78501e2f0c574bdb2 +$BLAKE2$f9971bf9fed3eb7bda3412c7516027457d0791445b8ef2e36c7592a05daea9c1 +$BLAKE2$d0644956c374c4f677562ef9860a3b98b6d1ec0ca6662d6dc85920d3bda345ba +$BLAKE2$2b312c647fe9179b9549e0ce4feb7ca099db72042e192cae804eb0f79b94b1cb +$BLAKE2$d800c5c54c950fb75b201574ef253d7d365fcae5a587c4c3d44185ff90a9130d +$BLAKE2$56d97209b60a5d93ee2838656fb0ecdecb5d90477b0334c4a73411caeaaaa10b +$BLAKE2$da390f740e755dc67121a228dedd7474bcb3bc2973b2307aabff1f6eb746e59d +$BLAKE2$57ca678a2b6e9f83116a56f0e402349ea4a8b97a2bff5a119558780caecfe502 +$BLAKE2$8d2d2e1eff4c229107dd60882a24ad0c1e20c3d27b7c1d21940c8c9890742b36 +$BLAKE2$5e0cf5fa8c5fb2e24efd05bc382541555082f75b056d3550d0022b4d4ba62de7 +$BLAKE2$b8239e816c1b6e8308096ff3cc67338e39809d62cfe8df597c985c2427efbccd +$BLAKE2$c91fd4e597d8094d4734248a9d818dd0816ab608c47c70552a016ab043a00030 +$BLAKE2$e2cddd43276603561ea47ad0afa3c8189eda0f61ed9b00f4f78cf57520cda659 +$BLAKE2$ece11b7a4ebcb9a6d0e13269006ceab70f3433a37a750757756d6d36e0c843a8 +$BLAKE2$224d40054ea585e74d68a14b27d42aa3ae7d11bbc878362aa6f9e588d3c26509 +$BLAKE2$428f2ac79f20997c1c5e419ec9c26cb0459f915a1608a05345ea29102106d4ad +$BLAKE2$d54ef2139d608f402b92e3e31daf9b3827813aae4c9992ac1004be10fa04bf92 +$BLAKE2$21c6dac02c63ddbb59e38479ecc6a787832545aeabb88fe35a69678517e1d8a7 +$BLAKE2$1a6892498b58f26f15ec7b76e3f357574133986ccaf274d6caad1eca01deb907 +$BLAKE2$e95376d2b4950182f2f34bc9befbb098156d3a0964755c6cf68df00f58f64a5d +$BLAKE2$6788a2eebd94ef56e70be78af41241eee38401b32964a33297ade824a4253e9c +$BLAKE2$cb1185bb2beb189a17e61a1ff7c09c96da36d72640b5eb6bddc71f243bcf66b2 +$BLAKE2$62b6b07d1c2c9d0a455a2f918d95d8138422c68b09b9896677ffc6a49635165c +$BLAKE2$877e67e629e318ff9e4907521db32e60f3f0160a216709bef0c4c4680635dff2 +$BLAKE2$b3eda290d91d75cb423ebc746f0afb7e6569c003c2298c068504eed7d0343c09 +$BLAKE2$7d05204ceee1c227b18142e4710764c9cdc9b3e4a4416c64994f2a2c9c27d718 +$BLAKE2$f71be1e2ceac8f10db9ae6e09828291275dca443ae96175569622802ecf0a068 +$BLAKE2$3496c7ae861ba1967c3a37c178557e517121af6d084d329eabbee884e8cdb36c +$BLAKE2$ecbdcd48548db380809159a2caee0d640530d5b9406395ef184240f8a5a10419 +$BLAKE2$d597bb17c3e8aa70d030cb44f119e40cfc7c317736fa1196aad1186cff9b2841 +$BLAKE2$efb43c8ac86cd552607b92ca367dae6cc26c5519926982eb5576eb600000f9f6 +$BLAKE2$e4fcd6d5e64a5c8c3ddb2d5544c6f6453f90f598a04b9d4679d5779d4145f744 +$BLAKE2$c35d406c9ba302868360f581bfa6b79b6f2c47d5c56984032fb79f68fd98e66f +$BLAKE2$a5b001eab1c3048e6e49bc1970a1d53e89941c3e9ec408935af268ec7526fb4c +$BLAKE2$573601c04c8ab34cfdfc08772dbddc8d11e05b4d52888085bd5c17b21c37aca6 +$BLAKE2$8665bfe99865b2fb7617745a3ca4119ecbbeff4cb65c4283ff25509141f1d557 +$BLAKE2$b1b4ff5869806fa8c0141f0fdc8cd0e0023320d2030f3031e77aa7cfa23f0e7a +$BLAKE2$c69a18e69b1b68f257a3d181cb371d4109adc439fd383f5e9c6a66fc6c13b9e5 +$BLAKE2$c9a4b604a6a30eaeb5b4e9f875171956750d56e5e0404a87daa1219ba7e8a1f2 +$BLAKE2$b4f703a47203f5eb3acb74dc7540acc0c611fd6545d5b538fa33103c23750d78 +$BLAKE2$c28f0d52e7bada80174af76f397770351cb3d02fd0bdbfec80d8e0ad780ee72e +$BLAKE2$c722ef4c01191e477c438b5da9d866a976cb6f8587c71995b24102bf6c7bfb36 +$BLAKE2$0e7b8897d06525c17081faed7fca0f52f23eb764abe4e1c7dfd891cc89eb0bf8 +$BLAKE2$c63bc04590e7261e69964a5b0568cc0212fa46b9ac1d1e50a88598e34acfd73a +$BLAKE2$e8cb315cb90f1cc8c86ac7058930f9a4553bf9fd807eb6f0f36051e2d5258b33 +$BLAKE2$2a1ac2e100872bfbba6bce1f6bebd6d23c0df7848e1e393bc050cfff9dbf2107 +$BLAKE2$a986a1cb88deccfe4adc36f56f30133deeec85d87796bb832a9e598d03ad2535 +$BLAKE2$d183a2388541c5727b8e92116ad0986a7c84bf8b5b029a692e97d68e89f8b2ef +$BLAKE2$60418088b849094f7cc16200c2f6d14b23a4d926c644e1373d71958338e7b5ff +$BLAKE2$f9be9991ffdee155887fa687e30eecfc3e87a4d7e3801224a8f8f5bd69189a1e +$BLAKE2$391eedd54136fdd1a800e1392bad8d9cc16bad2b53de8a6d88fa42f80cc1ff29 +$BLAKE2$ded48dc52de178a06df993daa6cd3881de5385656fdc7824d24ba2ec7a790f0a +$BLAKE2$1db2e6b5ebcc1d6ea5b4a15b0821ef9473f960e8a4445ef12b101ba22a9b2e9e +$BLAKE2$d35f94a07e157145a27231a86e7431d5fc708860b62f1698919876a6ea0eb9b6 +$BLAKE2$4a20397a6eb7b6a6fd569f085b500de8f9411751c24568580a57ee6243dd2ebc +$BLAKE2$49c5c7ad894a7efb743f724bfce4ef6ae23be684c233b44388775caff0a71b11 +$BLAKE2$6a9db534f433f4e5c8d75b7bfcc40448511272d7bdad89c4cd7965eb34eaa358 +$BLAKE2$ef6fdf6d0029695c6bd7c848ba1e45c0df88a9eb253d9a0d122fa6040ce141ec +$BLAKE2$3feafdda55800c0d250c5441a78a212b052db460c6bd70891cb6459a3027ad46 +$BLAKE2$42ecb2d060da14241f32b86084a693985dc44f30e212d413e4a7e6a22e41e2f5 +$BLAKE2$602a1bcca151be890bc79f46856f94f0684327a14e2995d465de87e4f0739f4d +$BLAKE2$ebd97e6d162c25ad1adfc3cca01d85e0e0508954f94ffb1754fce258bd997c0b +$BLAKE2$5cefb7a13d0cc866e68e75ff981463a3310b07edb511519254108b1db274f23c +$BLAKE2$16f79e98292edd3a6cf4a745e511bfb0b9b6ee6e79c8f62179a94ef34d0d315f +$BLAKE2$e2f41d85e16a24211dc548dcaeead0772dfc22f93d61dfe873a55d088e2e40b7 +$BLAKE2$0d5835349596490c295e538d39cc3e8ef927aab3bfe9fe5f94d4a238c09a7f6b +$BLAKE2$d8703bc1031058d505431f37dd49c55f186c11d101a53261250654fc09248aad +$BLAKE2$83d263bcbb6a68dae12db425a5979830a78032fba035bee94a9c78a76e493f06 +$BLAKE2$768b6246009c2ba9b7a9322c5fb56f4d21560ddd32af1640eb210ebd70e383ff +$BLAKE2$101360c5377ceb25b8cbc4420e29ae07ae1d1342e84ffe874c84e100654b7c9b +$BLAKE2$214092a70a9fb90221e91c281838f4bc1eaa063108b9f3c3bda5920c17284e2d +$BLAKE2$406523b125dcf1b1eca1d473d8ecd50c53f5246455384c20a4901df446d7397c +$BLAKE2$c88c794d399d87dd36248650fd8e4d092bcdab5cb9d7ddccf74bb291850b6353 +$BLAKE2$0c27b8336784842ba1336cffc33d9d5685a3f86ac0fd97f0f7a7137e8e25425c +$BLAKE2$3dc316f83fbce8e080fa8c2c25de9a73fc26a2ad27706fcee375e8f6d94a8bdc +$BLAKE2$9fb772eade77fea47c5886f51d2bc79df54b159d3464c4cafda9b28505aad8a2 +$BLAKE2$d05a33a2af2b7d66dbea3a5294b56859a5ac0adc6e9e8bff8536290e0fad8e3b +$BLAKE2$8dd718fdbbc0caf36b9c16609e9337e01be70f66c51052f9aee529e05e99655c +$BLAKE2$61108e77d874c367c46fce5309a993b3e1fd40357d69b45594115840b7eb4dc0 +$BLAKE2$bb8f662837c309c5db522844b47b3914de857127d30f519a4770852a0b4b5875 +$BLAKE2$b23d4511bbfa03c6c50faae261f7757c85e8ea6d5c652200d162761c6e846184 +$BLAKE2$0864bbbcf035828529382c53e8f9d3ea7b650eceba2e5a47c0322818534c453e +$BLAKE2$31d29fac71375baf10beebbf42e6fce7f80da4346167b04dc2e2390d918e6569 +$BLAKE2$a46152708734ee6abf38c042f6a726164c44fa51882c24a736b312c53638f990 +$BLAKE2$f2493d008461b48cd0be323bd00ba50934c6d18a56bdffd23dfc17e972e151f6 +$BLAKE2$e5f9aa9f22c354dcc897913faa0b0a0f6e804e0af0a296f189ea766d33f6293c +$BLAKE2$1ed6ed3822601182ce5314aaaab97c0bc3fdbcf1409c09aed647dffcb895759c +$BLAKE2$612790eb53f1c97860fb44e010ab2005efce6b292774c32cd4664a5e4db9c4f0 +$BLAKE2$d32d83aa7d5f052d85e8d8069696d82770f46aa6b459f940d85aa59fbd4955db +$BLAKE2$f30423bf669c8dd0f28bdf2eede867bd0e76f258bb91ea493991dcd6857fdb0e +$BLAKE2$13b2fba5bf23e9e49cfeab5231d2fdf0265f8e8588387a43a0446ed82bd8d0cc +$BLAKE2$8a4ce1c2d40eda98d56c09fbfaae68be8f00d9209738a61714222eec0f1bf7de +$BLAKE2$6fe1eabc7c6e03fa72d3ec903d4c72854cb70bc1cc6f1f1f332da68e1db6d4e2 +$BLAKE2$fb46750f6baed9700378d22fc0acff24b8886d8a7777ea62a863d136e08b5cce +$BLAKE2$36e25538f9679220f4b885dbf5aac1ecdd9120edd185010ad4bf075840e4afd3 +$BLAKE2$e46d431d69599ed3f2c573b83d2f8c40d3f9d4148addfde35dc38b19df4aec0d +$BLAKE2$bb475719b4b5ca4174f96c1edacdb5f720b92fd144a03e0871553738554c96b5 +$BLAKE2$fbb866ee10070a107c08bb80c0627c4f6550b2e6de9279180d63b853b5d5f3cb +$BLAKE2$339e4e75bf63d71d65fa638c88fb3a9ba513d7d0450bc0b53cd9205950df7e45 +$BLAKE2$ba9e57181d9985826bab5d30b02b1bc8f6457af3cedcfc8acda077b663fe9f86 +$BLAKE2$57d212bf08aebee950c6ef4a1699403ac15e54b43a60b149ab92419e366306ce +$BLAKE2$b8b3e6608cc65fb34b69c4553a0708e10c27bbf1fc6c3a1aa89a06d93383be42 +$BLAKE2$ba62ece66c7cd96c976641428e61e977714ba93e019668247b602e7cc9bb0eca +$BLAKE2$b7c3c055ede102d7f34f905752b11c3d7f2196f110b2b16e77796b1890ffcac1 +$BLAKE2$c5757a17bcb5449ce8e9bff0269fdd07042f4b65b93b1c06f89b1eb3d7d63287 +$BLAKE2$fa47e1791cb6a8131fb9a7db51eddf17746b1e7734dfd156798063431283acaf +$BLAKE2$75913378b57c62ba725c1a3cc0d588558ff74f573bf947d35e44ac6208d59f18 +$BLAKE2$af9da17ffc029d28f2e174c667ed32ea889cebbf6e5596a1dc37c1e44914d6a2 +$BLAKE2$d890b7901e3f9c2b4bb15c2fae67791b4165ed9e69c7bfe69eba0f13b0627f48 +$BLAKE2$eb67c2a2adda3af822023a7e5db8ae4874c4edadf9d9a85d96aa5ac8618c2966 +$BLAKE2$99b5ccfe9e28f6ff72cfaf2df527ce64e9a6d3a6654a48b8ec136ac598b38cee +$BLAKE2$7ec2f91eb72987155017d02856dbf1d76b7bec584f1388e8781d621d4c4687ca +$BLAKE2$7c530481f0c7d96a1a5f157b0412542b5b3d1d20eeb537c357fd5f7eba0a2cf3 +$BLAKE2$f0bee73ace7c799e434d577901bb370e50ab0480a30b83a86b902afff29bae01 +$BLAKE2$f5644f420b4a4a1835efb26f67f10c825c3d4cd08b98f85f8de7a87f1dc0c804 +$BLAKE2$748044bd488b5f648bb1f8d25b03bbf7c5a57336fee653df7d3082a6d5655a68 +$BLAKE2$055bafbf00fefa296dc1e6f36a95d111461a509e6e5788db41d5b52bc9df4e1d +$BLAKE2$cef542ac7bcb1da21362786904b2a6914a02f30643e5f5312efbd166694cddf1 +$BLAKE2$af5f4fc5349d60f1c9347652173ba9d11f4b13f89413852f2f60ff7c3c7772fd +$BLAKE2$d07482dec4ec954c849dcfb687f8e4811992a44ee6a1128778e62ab351289f98 +$BLAKE2$a001ac262fc92e969adceb2af9bd4621b8172755bcfb5a40b728bc38eac37099 +$BLAKE2$c23006567fbe6780166162ca5f925129031968046ea5b6c151a8dce13b77b556 +$BLAKE2$8c0b5b5b6869b14acebe35cce612d89f2282cbfe678ac3837efdc738d56966f5 +$BLAKE2$437185b3d145607277988912817dc0f2db9a1b0646bd9f9dba07338d8950d9e5 +$BLAKE2$36ba235733377a2add0ab985dc1f4d18be8e555b7c0f3c709b5f65aad126b978 +$BLAKE2$5d2845e6b31fae76ad5d69da174b833722e15e7680f04109397906b0a11ba3c0 +$BLAKE2$1cb6d0c952218d1ff8285d03a4c7d07b8c946842a37bb32d751da56949e3ccc7 +$BLAKE2$6883afc50e703643527fc53700f5faa5597ff3400a6e90fc4c392264fba325bb +$BLAKE2$ba0d9b26d89f4c998e76d22721222cb51a9287e8cd09000ddcbeb22fa898eb7c +$BLAKE2$44088ac30583f76e8eedcdd618456ddcc956bb2458d9397abe31bca2335acb66 +$BLAKE2$3da3674d2f1c3fd9c160217aa6c27df5b14317fbc3fef68dbbbd7eb1605c66e3 +$BLAKE2$28b0279fa2ee918032e7b24c16134fb9c6bde8f88ded4984070dc47d7b5678d1 +$BLAKE2$274651ae7518e0eac895b1f4f8622f41a1ff1bd825a3f2f7f004921e0f84e24b +$BLAKE2$0d1db77be4c72832172e82332e3d1847bf8cf9c7640a7d9ca188a857521fcd5a +$BLAKE2$d36f976209ae54d111e46ee7067eea7dbdb14c9fac1820f178c95ed391dbd794 +$BLAKE2$3a4368adaa5296c71113d713b1eaf2796131cd0324ae7a8382d0c4d8f6722ab9 +$BLAKE2$c90b0dab86466ba62ea825f28ae8afd0e9ff98b6290d014efa13620375ae2098 +$BLAKE2$91e24f6f78846788323738cc2c0685e18339cd23a0925e759004302c5456a10c +$BLAKE2$ec85440c24aa95dc7d8e24cf9afcd334fc640bcc816b1413bc5fb3803a516fe7 +$BLAKE2$9d70933d52fdb14ed89d45bfb31643ea301264341a86bb4ceceb8ad341504390 +$BLAKE2$339a2278d289996e0422fcfb425d746433d75b1a8380e7870774f8249f0da805 +$BLAKE2$99bcfbe4c65cc2dfd7eb0d6ccbdc3716a896981ca1e34c1664bec829d5e3c44a +$BLAKE2$ce96c9662092e6ddee33a5c0bd6a7f846ab0a551d6c716ccdcfb56b8f6c3201e +$BLAKE2$979beeeffa65985877cbe1ab1d88f8e700b6226bff60fc622d231fee550dc067 +$BLAKE2$948bbcc770f9f333d8f397f67b883b1afbba119b587f07129bea29d864831ae0 +$BLAKE2$9deaf498aad57692387da8c88e82faff744d9f0b6c1df0b662aeacb4be0b4579 +$BLAKE2$905a3909a9b13e9e97cc4658aa8f6abaf74ade42951f3da9e5a48b00d492a7d5 +$BLAKE2$be91640b88232d6cf80e437f357acd61b0f83dec89b370368cd86b720d0e36e7 +$BLAKE2$3d20af6b8a9a255c1796980953d4f3fac8f8e62a691e84de8d2646780ee0ae72 +$BLAKE2$d0e3a9ab927b8aee4013e4a251b8caf1f3b80746a95119080cbb9e6d119cd754 +$BLAKE2$7b3ca8fe983a50adeb21cbc91979d1bf99fc2a8268a54dce3d0a9c1b0fde5f23 +$BLAKE2$a386dcbf8675fd633a0ce411c83682046187f6d56245646e25324236d0a48db4 +$BLAKE2$c96cb496d8053195c55aadb0d5600357d4f9d5222c855b2bd3d7cc51321342cb +$BLAKE2$d5a531a47a65942db7edb6afc730f9bd64664234a06ed6c59e0843a2cd29e723 +$BLAKE2$2473d84e698cc4ea7738f99c6f75211309a3b9ebab7d351abcbd452d1addaaef +$BLAKE2$0062391d000e8f1e53917c13d497c7f5dacefd42bab60f17a0e670dda85c0cad +$BLAKE2$c34e52e284cad0f2fda19e8b19a928f916648fba03f6f7fc1152925c9e205083 +$BLAKE2$54d50a4b6b974782f591c890cf1bffbde86354fdbce6ae92f6d0151279a3689e +$BLAKE2$de0c118389a413eb868a9c6b4222feb3f6844a6a11d353fef05db479aec2fded +$BLAKE2$e7fb515901d09adf873ca20cb9e133a6a8d3128a5fc7615829f6a9d84ed39771 +$BLAKE2$39c6e7f3feb3497d22304624235a20d0dd66f14d9218737be7983320308f495d +$BLAKE2$01146efcaa83754494cbfaa9aa159125b4201be09dbe35744308d54d9aaca68e +$BLAKE2$824a6df6d6ee915efe71b2eebd1a37d236092cd9773eafc348cf4048bc7eb5e4 +$BLAKE2$e312a2886bc4a5572c19f363a335aa2543ecb5f316fc0eb3240db8e4a41333e4 +$BLAKE2$241c67abe90deb418d118916eea4021f1f519de092885428eb1300aecf95a0ba +$BLAKE2$ae33e6ccd04816926913f5c9696ee3fa0ce8706580199b54c01f23d2f958009a +$BLAKE2$0ea564a5d0cbb8e30aa815a9f016bd90dd17fdf6a7ddb7b376d6bac1363aa77c +$BLAKE2$1ce17bf4b24b40539e90f5dbea15883e127a9bf8bf19b1d506c67611d5edf205 +$BLAKE2$125524471b662f5c2cdb8c605a3f0bdabebe925f77e80c8a4af38a0fd16ea595 +$BLAKE2$14d59ddf3b7f4bc2c66fb4f6aead3205032cc8ab80f32146eba08367592a23cd +$BLAKE2$42d3966e71ede17d18acae72d10b90c99174dd70c892135477112c0c4e41482d +$BLAKE2$156912efe68e034536a90af4b70fb643dc5a1f94e8da5f763b4056c51feb3613 +$BLAKE2$3d062d4e80ff38af2df2c14a7327ae8f3884d814694cc7949f2682e7be264bdd +$BLAKE2$69883324d9c7d97a9ed2c9929f541c8c961e412447afa7c0a623cb8cbe3b4bf6 +$BLAKE2$3020af4507aeeb03e2d05d66b8d2633c9c3dbd27198fdffdd56f6aa83247af8e +$BLAKE2$322c55fbdf081ac1b273e8de719e5e92b1151f962f2187669e2134020331c9d7 +$BLAKE2$2543d16415e0ccae507a9892ee98596eb5f79a7ebbcca0236a5c3177b009c85a +$BLAKE2$06a59a86644892d3052608ed8cd802083c376d9af7fd301aee55217e0485e708 +$BLAKE2$ea3f8acb4778ccbf6b42ea68f3b419fcbfe79bc29627a63dcdde389d4c1a2883 +$BLAKE2$6ff075dafbd1deb6186d2c015e713be71ec7da4ac903e685ffb1795df70e1ddf +$BLAKE2$a623ffc46b8bf2c31e5f0a52b399b7b0266c397e8eeb70fdd1d30a1ea4e5ea46 +$BLAKE2$4182fbd1e6e801e91bfe3565b9659c9ec831f8cdbe086e576b76499bfd42911c +$BLAKE2$6cd6f01efdf4710fd371d78ea8fd2e40934de070c30d6a112b015f0555ad6a32 +$BLAKE2$5b0991bb73794c6ee3175fd65979c17b35366d262d32a77dec492d220abd069e +$BLAKE2$d55a85851c76fe219588ce05410b8454ef19cb0d851fe5aa9bc427f50f7da011 +$BLAKE2$3a5c6832dbdefbfc1b2038acd95e17273a890619c40ad9f5786d2dddfdc261dc +$BLAKE2$2ce3f802b612520542f9ee18fd011d1aab167d20d6016dec48623736daa889e0 +$BLAKE2$d5b42aca9f82fb4ad67c20273dd97dc218344eb8212eb96156b430723a0ca4cb +$BLAKE2$1460f38d5e441d5ba5925182e18d516c08d9719fb8a0b3e8cbc1648efefaf163 +$BLAKE2$5818bdbb56f04d0c17f2d68d5f7e8019213c1eec65ae0c908c32d9929f2189f5 +$BLAKE2$66b58cbfaac3c31676c11d36384140115af6738795944e4dd7eef334e6420252 +$BLAKE2$79d0b8fe13a71a343d7779af79e514041fb368eec7b8c1bc1ef0b188aabc6957 +$BLAKE2$e8d250124a0eff846ebe610c0882eb59b105e7902a73e5b658a0e02258b91025 +$BLAKE2$af84dba8ef915e875ee92a102ed343a63a7eaf33c67e9e1326115366088d8293 +$BLAKE2$05445411926c13139c0ad4753185a5483d745c514f2767a282990dd94906d054 +$BLAKE2$a8235b5443ddd8b71996c5bd3e49c01df7d46c98e9c1cfbff511462468235799 +$BLAKE2$4aa6299ef67dc1677c07693f4c4123eeeed5b34ceadb6ea3d78190297301ee00 +$BLAKE2$1dc97943dd33ad823794810c9d0fbc8faf3fd7be1bc0b4a18c4051a44e7f0ed2 +$BLAKE2$d244ab93b6030bac2ed4e2b333a078ae9f6eea4266e354d97ef1ee1cd7fddbfa +$BLAKE2$b0a36772427a86ff8c0ed350a4fe4fee245db26454ddd6c38e6705ce1e556fc5 +$BLAKE2$6d16fbf95df3a2b475dd2d79d1e74fe41cb39ae36810884cac527bc66fe9f0e7 +$BLAKE2$14451d93d5887525e1133893a6d68913f3d0edb613e00158ecffd5daf0889ac2 +$BLAKE2$2e8c13472fb43f4d7c5ee45de591b9e16d64d3d8dbf38625fb7c0afef006183f +$BLAKE2$f2aec4723f0c2d56c8fc7cc66ee3abc91c7cae0ef71d2143c24d8537b80d9248 +$BLAKE2$8f055905ea125e720db725be5810c7c5786b747ecd76721e22b79ca02dc6da86 +$BLAKE2$95a52b39978988c6266c31d9e3feba7d78682d07b3cbc55bddb4bbeb23db7645 +$BLAKE2$d4ef4a12b00c512abe1fe54b2908fccaaceb501b45a94f6e3bda939f2312a217 +$BLAKE2$015c98aab219aca102b8560a488f5c17695c5cde4c4a723ecefc592b2886ced1 +$BLAKE2$42d3c04cc153a209ea9b11fad534f3c1dd1272248781e19ffcae3a78d1bd6e8d +$BLAKE2$2291b09783c4d9f3663dc8e9c3b6ac5462371b37456d8ebeb1bf0cce096fa963 +$BLAKE2$bc3d7cdb18561d457798eed3a214b794fc56af1259d024fa4eb70247bff6386f +$BLAKE2$5fada5e541c840edcba45fb1b558fc1243562bb470d2302f7a1df64ab06e1bc3 +$BLAKE2$5f59e0dd91888246eec00daa2c2495ef334561b01610fc2a9935d805d3a94a17 +$BLAKE2$d2a4aee516e1c5ed1632f82e0db243c65f20f5f86cc39b07ad354e2086abae5c +$BLAKE2$cfc0e1551cdb82a2c8fbc9f77604da5a29422cf6b443a15b10c023c4e89ca5b3 +$BLAKE2$58c1a39349618e2231402fa80c4c5f77d86a40ae8113fceb3adf643032c09e36 +$BLAKE2$ea5ee51a236b14f7bbd3ec15ea74378c17fe0909830ef6b097e8e78349b8ea37 +$BLAKE2$e66c043963134e7654227dcfa7498e4aa63a8ee2b3fb75227068aff7248824b3 +$BLAKE2$bca230ac55b111659117d804ba0f3cea0abb1d32fd888eabb1cfa5cea1499b3f +$BLAKE2$0ac659b7b73e9bc513aba001f7c39b4ce2d88dacd2f341153b06aee980077dd3 +$BLAKE2$b651fadb97c30f00482f4abcd41b5292d2d55338c3ebdffe8d25edc63b2dacb0 +$BLAKE2$1c9063ad080abb880947873533867e1e3da1ebf34ae42955183f0c46424c275d +$BLAKE2$c6f0c6c53a93fa89e72fbd23ddbc15afe46e114597c7354baac7ac3e1201469d +$BLAKE2$c558455e207a37747e43ea8ea50d29b97d5140116c7727665fdf2316f53a46e0 +$BLAKE2$8db893da9b2324eebd6ea004ee4447236b4ccd35b29037c90df01afbc615f43d +$BLAKE2$8a6d29bbe289a95b7c38ec9e4645eaa1bf9c6b860be48c7369120c8295a8cf79 +$BLAKE2$44a3e4604ef7d3bf66b2cd3becc369ba3ed5f56b21ca8441cfa44f071d4b7a78 +$BLAKE2$8dcc7fc4327bef55e4c4a9b1100d3788a390e6c1f31529e85e0d539144a43c35 +$BLAKE2$a4816d2d4af22cf756a0701da6d8b8c3636782a850e8f9868334bef8f79afe1c +$BLAKE2$5abd6c47bd88d8e4b4955dd68ad39da60b7aeed145a9f172c6b1716fb8c23c3c +$BLAKE2$41b7129fa4e21686e5439003793e38be6b53963100f1490b33a73f1a20f099da +$BLAKE2$a4d594f39298b2598a07d247367c103fb22038658f2ca40db42f00f800dfba57 +$BLAKE2$b3a6be9c0e912bf59730ea3a8f080f6253727caf4c7f17c4577cefb5c90b1a64 +$BLAKE2$85acebd3fba57add675bc1cf4c0f8bf9debccc6d3c804d360610f655f057d4e1 +$BLAKE2$286500b1d77967cfeab34f484816effe6e1e23813dd7af43636a498a8ea6510f +$BLAKE2$407ad2e50c2003080a5052fd2456a375ccc550f88fa36b808cdcf3bef0df6f8e +$BLAKE2$f3f5440e9ceb7465a55bc33161760bb00c4c30a2e0e50f287d6f35802b279d61 +$BLAKE2$f38cc68341d2e8f662db2caaeb00e1d0fb496350066bbc216278ea6e10f3de14 +$BLAKE2$9c70bcf4426eaf35dea9346de7a55492629ed0556b92063675de39f8713f35c2 +$BLAKE2$0ae23c22ba470319799357aa1662a2b67799a0a4bcfb6c73df378aa0cdf782b7 +$BLAKE2$3763af71b0bd1cd559265dac4d915d90e8fda56a83a6d6ae9f49ed2ca5913078 +$BLAKE2$7531e1d681fd04a59108123cae8c71a216edd4923838fd338ed975926ed29583 +$BLAKE2$629cd7f6c0872ba0ac2ff977829a91a2528ca5e8ca57935480827fc90c9b96fc +$BLAKE2$40a592b7a7195a782af846a345f2925bb6a324961f775aa3112a437d93f1872a +$BLAKE2$def78d0c15b40b186d333c3e20dc1451e5428e73e3e91df986285bdedb335aff +$BLAKE2$4f0ecafc1f290b52a77f714d48438a7db077bf2c952429a17080d7115ab33adc +$BLAKE2$a1942cbe24ab05362596fe5d0adbf041b6c3ffeeaf826f8d08ec66a1bab3da80 +$BLAKE2$c2ca3bd16e44036f3f5853c87f752fee90e60fa814281330d28a4ede8c1cbffb +$BLAKE2$64315a60b8f8e6f0605f1ec7e5ce8da53dbcdacb5dc0692e1327b0a6ce6996c4 +$BLAKE2$73b7158cc457abfc1fa7adcbe5f5938612acbd43830a6a4e994c4fd9872e9b63 +$BLAKE2$b028911fd3fe775c9994f5d8e0782aaa6f63cac8d25a33b4ed43d776cfe43f4f +$BLAKE2$c4aea8658a6b3ea89ae286f83a43c6a067747682340e0c5d60877913a09e0b82 +$BLAKE2$7ace07fe94cc015379fc05e9d3ecd1a05ccbe0f3b51140c8f07e7971ab9c42ac +$BLAKE2$bcedfc03c93441418bf3c15f2d37e263a26e4e835b9c6a09ceaaff28221d53d1 +$BLAKE2$4366187bce7a566d1ef699a2b8beac5268b7387c6fe093bc00fb9c20b2a3a6a4 +$BLAKE2$4399296f477dbadbe7d48f3c25904aad9c7e926fc1916f176530c8334de47614 +$BLAKE2$b0ec41e94b4da33a0a3d49cf43877727b294a97f0ad8ff1f600743c6aded560a +$BLAKE2$d139df1f3a5bbf8939a076c683aeb2bb6dc3cd91fc32fd347c265954618dcd2e +$BLAKE2$480f4ed9c163cae4586c456dfcd202c78ffc05ada81b9584e76fd45775c01c7c +$BLAKE2$19be02c811fe4e2a44921539512afb77fcf9295492467c7f1bd433fd327c7718 +$BLAKE2$d59f8dbf7a25dfa848dc35866b27ded7817b6055c04e3b8fc16ac8b10e16de7e +$BLAKE2$adcff41879b44146c0c80f74c04ec6f1c1e5b8a7d9660c5f8f1a96bb362e51c7 +$BLAKE2$8293aee27c2b671e01a4f718322e355a762adddfa241f1e5c908a83df6417b91 +$BLAKE2$5443db3fd6077b225c57cfd830fbf0c27587844d3db99a6bf4dd96214303e286 +$BLAKE2$e575a2f1a39a72cf1f7c244a5a82fb4007544ed7cc0c586c850371d35787cda2 +$BLAKE2$51f995793e4a277387b5487aa3fe733dcded0bce54aff1c5c6da9279c3e97907 +$BLAKE2$7175a9a59151ce0e811b8cfc29a1aefe1ca39b962c897538e72ab8c824ddc77e +$BLAKE2$0c8c8baad86abed22a0236093613b930517ac172becb241d03e6e72d664751b4 +$BLAKE2$4140070f93168ca158ebfef76ce06b3ca9ac96335174860539311e8ef7d2b873 +$BLAKE2$8061b77be23351eb2d241fce4e9c2da3df1ab92170d09906b84fc45f32ee330a +$BLAKE2$9f69cbe2c20ba4b04e04c68ed63bcf8052795b5843488aa1cb3176e9e903f19d +$BLAKE2$059fbe47058ed2b8041b11768be5622e14eae5ba492cd501e562a0e5c47d1787 +$BLAKE2$eaa5e4f291d204f4adb34adf88745b2f98abbdf0bcaec48dd0ea0588494c375e +$BLAKE2$4cf027ded56bccd7122736ff3f61752f687a1a5fe2efa509b8bccb7f2422d1e2 +$BLAKE2$e3e91fa41e5408dfd727e0245f338441451bd8bbfeeb9f50b51bc99a0040a812 +$BLAKE2$778e72c34c132e33394b4a28ad4649ceeeb53ad815e6c85b796172f298bed8e7 +$BLAKE2$96438edd7a9050f399fa4563d1777281b4cbcf1475e8a10896e4791407cc5dce +$BLAKE2$e962b5fd8a32d05930137a9f3d7420a1d7876ea7ded7701ec8bcb5c71ff51170 +$BLAKE2$d7b737f54d38211c1f2d27e689fc753c30fd2e04565c1780de6c207a4dc4e117 +$BLAKE2$ee648815593fdf1e0fe5bfa35ca6d19a66fe9a92a81bf226d6f6b61a4e89030b +$BLAKE2$fc65a5de2cb71083f174e33ae81c4e9b80e6fcabc5b97f943143ecbf16585825 +$BLAKE2$fcce373ebc018e6b736effc65a8b81d8ea4b4afc1a8a8244da75f709162ca853 +$BLAKE2$ab6f368eccb66e8858f628df56506f6fda6a5093e3e1a0ca6b886ebc9d4db5a4 +$BLAKE2$4f9c87748f539dde62a11d963d8dbf38659f3fb8e185c5d57e252851496994a5 +$BLAKE2$30bebb654e620e56e1680177f7f4099c1ebbff91fbb42659752659a1ed7b2528 +$BLAKE2$370d26aca302cad4a7ea426b72352edc0c3bdf85f5f349ca9eeca8e359c1c4ec +$BLAKE2$6a724490d5a7f155e294effa42e31d12168032bb5506dc46585ae379aa1a0ca8 +$BLAKE2$57d4f30e4981ae73f471ff6994714c9313b9898a8145c770761e828f6816be27 +$BLAKE2$7e570d01911fb2967026cb3cd86d1ea1a42b295dd1e715b62144c879bc51af7c +$BLAKE2$5429f46689f36b773a799a192f413870ba9d745e3537efc2de026b63e3d6c2af +$BLAKE2$6da7c19b6e6c08b59ba4ccfc259bb9ee74ab9f29c5cc25b93bf7a71da8b51b0f +$BLAKE2$64308b3b442606c7d2455b8ff9f6403e06df42d64be1ce504a01ace05f45ae0d +$BLAKE2$55b7a22e834f5007b5efcd33ac5b3019feffd49da9e6019c20fed7e72fd070bd +$BLAKE2$8c2fe82c49a7478fc1844ea64ced44eda0124e6ea4bb1b9ac32bb19355d091be +$BLAKE2$0b2bbdbc9c7cdd95c1f5f08a85b4f151ae7eba308fa89e85c067e6a7e43bb422 +$BLAKE2$c891d02e5c959e7ff78a3daaade9e370f42f84486c08587b75ef366320235e56 diff --git a/tests/dico.txt b/tests/dico.txt new file mode 100644 index 000000000..8baef1b4a --- /dev/null +++ b/tests/dico.txt @@ -0,0 +1 @@ +abc diff --git a/tests/password.txt b/tests/password.txt new file mode 100644 index 000000000..953502667 --- /dev/null +++ b/tests/password.txt @@ -0,0 +1 @@ +$BLAKE2$508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982 diff --git a/tests/password2.txt b/tests/password2.txt new file mode 100644 index 000000000..0735e7e4c --- /dev/null +++ b/tests/password2.txt @@ -0,0 +1 @@ +$BLAKE2$ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923 diff --git a/tests/sm3-test.py b/tests/sm3-test.py new file mode 100755 index 000000000..7a8be7503 --- /dev/null +++ b/tests/sm3-test.py @@ -0,0 +1,32 @@ +#!/usr/bin/python3 + +# need to install snownland-smx package : pip install snowland-smx +from pysmx.SM3 import SM3 + +# Python script to create dataset of passwords/hashes for testing - SM3 + +PASSWD_FILE = "500-worst-passwords.txt" +VALID_HASHES_FILE = "sm3-valid-hashes.txt" + +# Password source file : https://github.com/danielmiessler/SecLists/blob/master/Passwords/500-worst-passwords.txt + +def createSM3Dataset(inputFile, outputFile): + # open password and hashes file + passwd = open(inputFile, 'r') + hashes = open(outputFile, 'w') + # for each password in file + for line in passwd.readlines(): + # compute SM3 hash + d = SM3() + d.update(line) + # encode in hex + formattedHash = d.hexdigest() + hashes.write(formattedHash + '\n') + print("Done") + +def main(): + createSM3Dataset(PASSWD_FILE, VALID_HASHES_FILE) + +# entry +if __name__ == "__main__": + main() diff --git a/tests/sm3-valid-hashes.txt b/tests/sm3-valid-hashes.txt new file mode 100644 index 000000000..7fbf09fa9 --- /dev/null +++ b/tests/sm3-valid-hashes.txt @@ -0,0 +1,499 @@ +91a6eed57b1d72100cdb2a0c5bb83e8cf764d7c08eb257906d119083ccec51d2 +2dad53f9d5ac7170f049b8679309e64658a573e475bb9c12d50f0d5368e85abc +ba1acd8697d133eb096c5abd6becf078b825f0e0671b5bd9ab13e1ff4c879ad8 +2851fa25211a48023794ae9515909603da80e405a4998c351b0717093cbe86ab +be59ac5b4fdf08eec25b056dbe3d5826f2c802c75bcc7f323efc9f22e51ef32e +f3f23d4aed55260d2b35c105ca0d68b04eb4e4d983533f52081c5ffd6123db58 +73632c6994116149124991e1d561473a4f053269e01fbc57341ed4ed10ccce2e +c7bd1b69dd9c629b3a9c7e151f30a708e440a8ec047ef2860a4ca6b2c6843f06 +563a4b31670cf55a7ac82f504299976e0e0055e0845389cd8092efdfbb58d3c7 +abbd8dbfb379dc2674b0f470868fe7e187eb5fe1a425394a7d6eab65a7b183e5 +b640b11f51e9c049b260d24ff37eb2946ca96725768f267202c2a15ca8cde28a +66fcc1a3b5e43ab7adb86a9165ec08cbbd521aa759706ee9b4cc4b0c47dc8f1a +92e4ac6ad0fcc66f3a69d2e9f354c317e2a00b3b1b6469bf6556bc6adede7ea5 +8eaed38a7a6feb181f73756cbc3d55b739dbe64e5796cdb209dece09cff39bb2 +39b955d5b82a8d2edb4fa882acd2706854d9e3eadf4986f280a1e4b486d2dbef +0ab2f2a0916d77dc1a4c67a9ba8a3ab07c06996d5b4f4e1495978f29518f80b6 +3a4cb4d39364b8a75f2bb7d1470efc2a1273801e14587da3074ed8e94203b1e1 +b136036b0f17776dce03a0f6c3840fcfda5de75ef6d56c68c8d83ad52c294b5f +fd5cc9e527a43c0dbccc3fb278f4da144d187c307e8903f7388e26812fbc3c1e +eca7b52a3971fc67a227fe129dd5c2548233d19e8d46cc18ce8b42ba18eaaeb8 +5d816a7ca91b7a0a5ddf7cd2240cb0c2546d36a2c57b23ecea14302eed5adb78 +e912e6642a96c1858b2f5d888ca9530137a2b9dccc1ab60f024a78e68b690740 +844509afb66cae151127f59c8f03dd58f38cbb1fec9775ad141e80fdd49554b6 +b32bc30cce74c19d9181a96d60c0bb5506f5f06e0379cfaa1f2ac60ff68f8f5c +bc39c6f1606cccc1573a907007debb1fc42e18f61a30061f46a37fcca80cf8f9 +da7161c56946ff85f98eb79002a639c89fa379fd6bf7273a7e32ff28b911b2e1 +777b30baa39194fa626e7eee8282e1ee669e6d6c014699e45d5fcea4999940a7 +de4bde29725e0eed9d2e69e8c6521c5fed399ece57386eda7370779ef186c0da +dfd8ab0fd3302830493b87c2a6f9dc262ae813993842c0de7d09748b0314be32 +d583e38313ef3fcecbe58271326ab9e79c951a90d0577be4c2456fc5d1e8ddfc +e9fc1e96459a887c8b0e833216f248a987b7adf222f44171505f3ec91f2717b1 +36a686ca4915aae915d8bb8a786f43dfb98a1fe858b0b7ee7aebeb47b8f2fd7c +7ac10e5bbb693f5fe88a3912503d65ffc37db385bc53e69f20f82a57f63bf71b +70204277cedf0bd87946c77af286d5b389c65b0b0cef31482e66ad6acd6ac5eb +b2eba89c4b09cd97ddb448250a69e6024e05a0d15748456fc5ee8d1a719dc042 +be96fe8cacb16a9da906a3885c7e65a3a7e34eacb453ea154a88d187a53e1d73 +0046c7842cdb0ed2cb830c3219f010a1dceebe334ec6eea44c596f9cb5e2ec37 +9ac8a47b8e336bc51a5dadc89ba70bceacfb1f4d9742976c9227708f8584f8bf +79eb8233922522e35927a32ae3ca085d3db0168fbc373cdcb5fb781fd012742f +52d0a833d647d575745d6c0533dfd476f36cfbe85233d9f4dac2709bd982abda +9b361976c771019a692558354d1a3e4280b7fcec487c7312c6aae8e9101494a8 +9a2bd1b16bc90c4bd2c3256cb797ba9b1f42cba12ab2551e2b5d40dfdd2f687c +560a693fd10f993492033630743c26d223b83138f3c6c6f5336140a190a7f8cd +368464e0b2b6a44292b6c3b1e4a5e095901cd6f348004376ab654ce70842edf9 +e0d7e07eec3f10795e622b75b9d33681d09af2d0c4b660175b04b80d6f07d243 +103bb692af00a89c0b74d28f5cf5cbcbf334f6be37eb9deca654a9cca5bc06fd +7379675a8d7f2aa4282bd2bee3e6cfea2a761deab7e3ee7db950f0b266261194 +154e4cc42b68bb6b4d3d0f99852139a9bcf14ae3c270b39722e9d64a2aab9874 +248f049573f2aa1d3b9876a1e210c41facb3fa4ca6a71eb376c96d746ab6715c +df54e67e38cf39980187bf0405d2a4810bda65ef6f69bac87497d41e9d4c9aad +90b2619b05f8fd2d4f0f0815ab59c8092e54a45852a8ed768635638fd0b87a8a +527d0c5d653980ef781a5c6e1f640ba810ea24134f0763aef14fbdeaa85596e0 +a4cce21e5402a502e9e3c9efc5b567231900ae125e1ce1447d6893118f434d26 +ee41b5ecc50ca025ef400677285fae52d57a8fcf105a3fe48a09b0597f46216f +59ba7587242a902b51cd1009f03d999db8c1d5ed56355d2ac55d6f7072a60274 +cab5d435ec21810b6b644df644ebd0884e2aae7d7f620aba71fee083a94e0ab3 +8e73cef2dcd6525a1b3ea132aa1004e39c8325d0b52284ef04bdac75f1f845c1 +34e3d688250e8c299856f1b4648c4940663aea686c4e4141ca2df28394e3ea2a +be0c2182267a763ff521bdf9a76a904a36e30de1ef0148686099da42fc0d89a5 +16a8fc29d7c0a815688a42a0faece2c120265facfe95581f1ccad03eb0bf82c7 +923a24256713e740d42a431e61953e497883de5296fadfff7258cc684d0d09cb +e0152d4b2c2c1337c3ece743533536e0a46542760dcc890ba592fb70804546dd +bad4f2526ca443c1a75b0b555a345756622fae88dc92438c95ca0d519ccde701 +3fab911772bffa9c3b706a5d55d17609911b6ec7e361947f0a709bdd4897733b +387aba72e994d4ad4727278e51c626e673cb58c4289ac04a2b8f95dfacb6bac1 +2a9ee7df1da03bfda2e336f44dac6fa898dccd5c401c95212388daaf4b0fa12f +11b316bd422f0856f1222a29f16a689351386b72d05f73dd63a086bf37cc02ec +eb79afb56a8cd0a43ba98f9a3d7663ec253a97cd9837ac709525d73ca1be76f2 +70f48d7eb4467da45ed386b5eb029501b2cad93c2191e15bff749784c5789da5 +b67f607ee98c91f78cca76e575d2e5f1828b79aa3df1f1586be2c1a791d88d05 +1312dbb821931c777d286ccdac8bfd98ac5c212335f569aa69c076b7882e65db +50dae9a4ba9e98417d1c69b0982d4e6357bbb91a8276a349ce3eff05f376580c +4b0fd50755d4c599176424d6eb396372f368f9a386cc94e9ec4b5afdc9e692e3 +527ac6a05cbe2585edd865eeffe129d453d10a40dbe6ef299e0c89e22cd5208b +831709978181d98c1ceb3ac704e4b7015520f300103ed1ae51bbc600b33eee4f +2dc033fc05ad61bc02ff80460cd67ef120a44eaca75c69f59f721cd48b48a9c7 +c91a43079a6d8d481e8beb685064e7c7c4b62e7049cdc5ccf410fa282d414b09 +2d0b38747b3ef9853fd2f0f908d90ef55c846fb660a34a83cb179ae4a4b3eabe +9a4ac448dfb0ab539118436bf7c58a35840d703479bbdbe6315f2041b575a445 +a1eaf04e7d7011ff58dec44438e522c5ac2e5cbfb0545813bb819a59b928ecea +fe7698763c5f4d87d9a9e52a8ffd45168d7a5c5db2a934d192a05baaba52e382 +d3b96d0e9856cf46cbd12682f811805d65eee52b2e0ca5e813e3b53579b86542 +1faca700ba062102a9c2b6083b27c959efe2f46a40c17cec664c879a12519e46 +928c66bd63599b81f62e73aa4436577c557596de5abd040bf71c306313931121 +2f488d7f01ee72ee8cc4cc00175ffd8c01f2253957d60a6eaa58e31ed6b9de6b +de1a8fdbfb026340dc738fe03fe6d6199c5d4b23b174f93a1e6e266b21de0f3e +721d41c6a4f8315d1579ec5ff69676855b8b9e83d7692207b57295ad884e8931 +91fce09d6230ddc038ca233f456201bc1f53510bb6368706a961d588e7e98350 +c293e4e40c0626e43905a69232eb19b2271ca293c9afc9ab91100fa15b8e4b7c +65e512368df4c011d8b459abff79486df2bd28f218069a06d5f7e8e7f366def8 +002fcdcf12700eb6a2de504d3f585035887e72fc03b9c6e7ce9d1a7aef053eaa +598f1121a6eb0dd3be91f6309db212c5fa03c273b78777bd72af176a4dcdba51 +40323c03c362c6ce4e333fcdf291d233896804ba3f8e391872396e20c55335ef +1de16b8eb4be0f0eb37ecad5ae7680ed010927bb8743331ba594b84d5e33a2c6 +297302b3cecf9815e087e9e8a49bf203323300d48b3c1bd2ce8164ccf83314e0 +025fa5e4cd34cd59dc5690ce834522e2e08e53e2bbedcd0409521cddaa357f82 +965365e14a920d7d2c0a38dd158d4ddb0ea32e33cdaa62ce149ad1c468be69c0 +f7a87a195b0cc0052b9d598482212ceb07e4ea60e8d139a5dfeff36c24abf2b3 +710f4dc74907f8b61312adb89b20740d5efb1cbd69c3ee4ce8a1145e80f0a073 +cdbe2efbf726f16f41d995946998f9e0af38b1fdfa320e4199655eca236ee27f +abbbba8b7b49fce719887a4bb29d32ae014d4296ad40af7c46d639e34323cb84 +70bc42e66d357f2adc8f37cc8d7fa316e7f94d2cfd8ebd2f1fa1561f22fd815c +ffbcc2d98a8b720d9d1e866395b56b443ac4d027ab02f8e3f6df8c223d9a80a8 +efd689bc26a21f6698a1ecafda892547f35406cb936ec73c8d73334f0b5d441b +f467ff28b10d1a9adf6c1dc53e97eff2a17a8b398093767a8615a3b72a7e29f5 +22ac5488a6c627802f705e33e106aa22568a69e3c8db9069116404456d59dc2d +6a81929ba5e51b57177eddf42dcd273ef5a6bc526ec663db6f0e65aff4f5585b +0b739e0fd20518152dd21340e6fe163d3e80ff609427466220586186756bc6be +4b35ab3d68e09055fda93076f99cdf0851ec52685f3a0338fdba0a11b2256c6c +d5ad664831df64e90b24193d0984e9fadf073625e0f80cea7bf194f4004a26b1 +6032fad1b4a5a061aac602ee3f8817911f0423ea19293d00e693014b88ab294b +4b1f8fa31efe18c43d5ca727c7fbbdef3b330cbf779144f23dd6d2443e2fbe31 +08735ba25f29b6b1ce1f2b81c563d63c8d96a675cd9da0480c9857485082df2e +0452bdb72c828448b9022d67bbe235b5d11a9b7270bb7ac76c9cabf23a5a36b6 +9fe8fe25f68d6105204ba56ddf363a03524981f35a5ca3acc421c444299e5dd3 +9a9d3693c9a3a3874005725e73722f1f6e74b97af2c701979a2853a9a44c4ecb +e4bc2725e617cf2255e00f5ef186f8d18d7516b6e62743a656609e8a17f750a2 +525558247f86f20748185456096eb1200603579366cc27e7e13283fa1dd5306d +b0923bba1279af8539390e5a65317009ac8deac1c661e23f60dd0bbb3494d1aa +745dd9d5a2a8e883bfcca7a1962ce61baf6448a5d282d5535cb08e0605ab4c15 +0c6a3316d4b5eea818043482be67075a3e6e0745883782db658308dd1283ae6c +bbf081f01a72da14ed2fb6ff398d369bcf3de989f08e2fa52b4ec061c7bb4c2c +478641e1e570808b6cf593cd63f308c28cfb466658f28029a02beee6c9cdc870 +3cac0a24efbe467899d81f0d789fbdc668fe9eb34ce5f350fd539840f40d288f +ca3037146464c76bcdab8dbaf0ab630f83b499f46183fe12a655acfb1e6426ce +768d3262e894500aa693affc11c59c3df1cf4510a238d630c01c820927b8d9ce +d98de59dc1814d10fd89ef3d91d513ec9e6a5700b16564e2e5a2a66aa77a535c +f98a18397c45cb5d2744af9c70036a5521df3d8a319e29202003528b73941087 +c3050df45fc371c8e32e335efa6abdc2975b48578584b34802312023d1c0a216 +ef9ac2945c264f3df779b1a4b04015aebeebc0b019094516371ee2a14bdafa7d +12db0ebba02c57705fea7379bfb67f8e5d8b6c4618f3f5100173f42463e06591 +9d77570a1cf60ab3e8a0ae2f387d5f686dd6a0b4f0d239a9e3b1deec69e11e44 +463a97cceea4ec077bbd1d68426e857a4b1fe348600ebaf02c3aa010a5a6f235 +6539ed4f15d683ef22943a9a7588bc6f5951fda6a0dc482fde32c38609f95bf4 +3594c2a93524d46bd62e40344e0f0667ddc83ced39307dc44ea99c1b374cf212 +695b9a71ac5388cb3d02cd0ee84e542f7ef3b832558440bfc39e1dc9fe530997 +459999297dc71006faae981cf571e82de2681072ee3a1b52e8dfee8879a512b3 +c4941d52a175c66291421bd677819415712ccf86a8cc94b4a9e0c516714c35a8 +fb3277716ebceb1b60282950174dda842d2161e4ebb3dafaa08a2353231b6195 +f9645734a5af2ef7ed72c4114069cd48d76dee60a9ecdbb702d9e602f1743e9e +aa6a87879c5791ecfb3caddccdb7d9b4ef4ee72f0a93b42b93fdffdd71b2c979 +f68e60c5a826968d38593954d06b0970b6bda62ab79369866ec860d64ad6482f +15d2b2b88b84851c0662956aa809a8e1ddf3a302245088c37549ad8bd5a61f3f +2dca8b13a1ac51066a16447b678125b2e6c0290873fcbd9ad8915344e164f264 +387a44769600245668395164cb4ceef8a487d8bf7458eec3029852c17bf80cfe +202f01d90d81484ea788d4c56f6a2d455412781e2889e8bade1a90d94f6e714e +2fe3c4dd3870b76a540b6bb8e710122d5a4ba5655d88a59c0f8d5b86945afbab +01b82e3a1d6b7d3075a262b98bee4386a4ef6547599b80a68a8ea8713920a646 +a7ed0e8439b9efd51d89eb100215363410ac25fa0cc2a452541efc8e11dab6e9 +2593eb683ff99cdff1e4c95a394579acffcb60fbfc223ae3aceea3e64b49b299 +63262fe891b66c1d3603c39ce4324914fde70d415aab44b57d14212a26859158 +995b06977640c0e4fc07404d6e8711852ecadcf9c9d91225ddc1b9a22a537e55 +41a8f6fa94be40c630f1545e2dec27a836d3dc7bcdbbb23158c5b4040f5eafa2 +7f65c2db175ee3e34ce849ec3ecf257a1adcb263bfb716b14875b2bd5fc711c4 +41d30bd4d9e1b0004d4811fae24585d7ffdf9ad4bb5c8fb76250843bbe36048a +e694b91def2bd4c77c4d8faad59849a0f7274502bb8f8dcc4febcfe1317b0a95 +e636db509a333350bd946ee90f993b608564c7b5d1dea3c8dc285a53a48b0124 +750454e509d093ee54753cc53438f943611a4ed88227d48236b5a46a87604279 +233d0ef4cbf07e2b950693621d742e6e81f3bb68c9197c7e712357e3c10e5cf6 +ea5b8f859aeb22f1768bee05797d9eaa5197e6f7d7b76a3ae0d801a554fe84c6 +ffe655d53995f465c2e7a262ffbc34a01e1d25796836f2ddac0c95683799a10d +942da211ff64bb0109455d4030165bc110928df21ad450a920a08bbfd28e96f1 +0c96df93f0d933b8a088c7ad310f4dfd5961bba06f12459110c045e31c3f4534 +bc32cf52d65b4724dd7dce59afc2132905aeaba180600c14260dda636bbcd4f7 +eae150fd4a807336ae51e23dd3ba01d2c41d261943b57570efcdb8ad52ee3c6c +577f3f09a8fb7f37785058ba2297f6a190cf454d5ddf85904ebe8973d788f680 +3d031ced85fa8919ffb3d2b869515b4ea079a0529da6c32741719b6b29436a82 +aa6bed0d1b06ae1c4beb2db376f91940f837dbe02b2941e0c5fa90335087c995 +5eef1f5ee5f9aa0b55bf7898f98d2eaf983d2e000e238417cabb5c8edb4db394 +3cbf62addf0d5554b8cc2e1de82a7aff900374da6103db47ccb61ed0aaad2a81 +9cb21e0ad89149895ebad140555e1a648e8a06b2b57296533535597d2c575339 +e6633921bc504b40d83883d444e8cc5bbdfca11315992840fa087516b1bde0bd +f502a760d338c3a73ed490eec55f6fd7e142b7fa20c338882ee99a9e7024e397 +e2ce21419d2179afef85234122a8ce567edbe4e3f2b49fc5759a4253f0a69c8f +d0898c679b7c535a95456ad37d4840210dbc0f1bdfb77308e61cebc8aac348ea +3dbc564a35054db266bdcbf51ade746621cb49bd12d8e20da146dcefca7dea19 +02eab9b22a3ada01c74c9f938c69289c9c2072237139aa30b6e3e981e856b1fa +82ff87be9395d05147a1e7fdfaebf5c8548faeb256c8a4ee1cc0864f40070ce8 +1a57b79269051cc2aa136f76a5db7f8a9b078fd92fa4c6473d878c7f57ae932d +8212f436cf81de9ad4e4d5940f5616df7e139953345661cd7b4d0d5eb1bc5afe +aa2333a8e441e3f1d0af9913157b124a28f4e0d3e92764c1b6b393e6152b8c20 +ecf94b595d1f463949c4fa89a4e89b318820e6599128b4883fa8c0f57186af87 +155740dffea4866091197e15df919028feb17ccf786e8c267698ee35553afda8 +11c7071d97318e09377c9863e13132a53df632963044124e67504eebb19772ab +370d132535474b9c46d4406ea780c9902ef5f1c68acd40134f204f2baa8e7194 +2decf22287a9d7e3b80ede0350478b75cc6ff9424a99e535e227d1c7e14cd2ea +078286d1e0c17fd9e8a82d3cdbfb8345d80698d3d4c75ecd45026e724d5f4358 +9082d686a9f883218970eda0bab87dc9cdcf973719f022bed0c808daa4eb8006 +da59f9505327815eea70785d7d247e9afbd9c156f07b68a669f5845ed6bdcdaa +a40b2507ce09e1cd2189f083164d6d42666540c8a6e3c2a7255fdf4b081f5d3d +0832f4533400f8c085e9281e9a87e337e7f8524b0edea248e4cc7eea9ca96d53 +b3e431763d6149d28583f3e234e0a57024cb462c98069a10cded8f59ea46f4ec +9906b44020ac5ca00b381980be68b124a0b1d80ff607576e90370416f894d28c +43e426249cde45dfeb27419f9b594814bc2253d66b6b35f09ff9ce11505d599f +037f0461fe12818d13252718e3ce0d6e641441f7571daf55027020696a7f9ff5 +cf5713229b6a1265a4f72a832648f4246ada8d2f238b9bae95faff0d236ef3d8 +a6248afd1ab3a605f473251cee308b550b0577088f0a8d30d03d8cb4491fdc3e +d8bdc4e5a5fe0448ba6382a6ac2be604921f50a7c566ecf444bbff30ee53a84e +7bee959f305062d919664f67a2f9704d3c959c4fe191ced17370dbf8a5c8b94b +d7e956acc0a7b63978deec1dc030439b1e4b309028b8866f23869794bf8fa19b +1b0b5ce974e50e0201c4885c15444c118d845a578a1d82e3d466085426b840ac +a4a0623dc1c6e91d1033bdabfa3caa1e8dd15c6f6682b249e4c853ac65f55ada +a668516cc3dab5aec8c263c838e32ee0fda194178c963113a059297b09ff3635 +ecd59a2767ba17aa9363e908c193953c5f0d57021c7e3ad84077f62c96e5fa6a +059009e8a2a8797ac95f2bfdc5578501535f1a50c67d297399c51b68a53d9133 +1135a683a6be330f13a9e36a53dcff74c5b91ceccd04c5c7993e1c661472dbf8 +f813dbf71563477610f9ae33fce7d87bbb15c2978a7697d33d5e8fea208ca1c2 +c7cb6c361490c73a7cd74649fd73d75701319ea1b62e183a38de97d351036917 +51673424c45b95a3ddd81d03399c0a851c54705325f5fa00df6c70b15db379c9 +f2fdebc0ec841f69e424b9f62a2a18ed06e6d917fabf97c711dfca02c61537e0 +49326b937b9870bfaa79cd459b2d60001ba09c649dd41ed9dee371f1b933b550 +6fb24e9010b2da98ca57b439336b1c1718b1332c585abd8e23a153b9cf017260 +4b5da20eba796c9333f714e62f68b8495ea5db9ae96078316efd1c4a39687eb2 +12909fa006e0e149b4a24d0eca88b2cc18576098155bd2755019f2360d26f92b +14bcfd78ae4ba2246c1cb95ec37778781b99b886202486ffb150d2e6e7cc640b +0d974b281aa9c678bb091cd328d7442c9fcb96c9b8a04013a3796524446e33f5 +3ab4c6826e535fc59d8f5d889d4a371d85f2ebf79c9ade474010170037cb6d6b +2d048ba67a87d1c1468fd8104133d21bb592b00f2c1d11cd9d90c1f3aecdaac9 +7d4dbbb57c46561d7697851f5bf5bd5a9ca6e05b70933f317aab57540885fea9 +976a16ae818d10e4122bb7364645c44e680382b21112a83f25301d694fe904ab +e59b149905ee08f4cab9bb2a55c3394ffabedd61a33e8852e11b46ea499a8bb7 +fbf712dfa28898953ba7b34c57b6a7e166919e9918dd0b45b55e1c6e79f1a019 +7fe3212ebdf55920f7f663178da7d7460575fbe8b4b3a6656f937eb8cc0bea45 +8b171934bec0b334b40e5488ef6ef9905ada69f7f86da2ef60113e0dca93bf8b +9c4756170e23c3712ca9d8295a834131f40ec48ae08ce7267b37d070f38923f9 +927bb700970ddd5f9c03a7ffb954a907d1095af6fa400c578f7fb54bb3afb0b1 +d96ac5e061f86d40de1ce55e04cdfa3cfd79b22ef08fcc73c7f46a9f7ace3511 +b45f40f68dc252ec9528b2068ab96b9b6b77757bb6fdb4b27eba9f52f5c32fd7 +96270148971bef60c42556ad83631ef785fa575731145560aca62339e7036a2c +3d080117feb31d33d34ab7f87fb0f8b1d1f4f3454e73b75d49c5b68534ef70c4 +5fadcd605d610f81d04da4c4296e6ce2f3877addba82fe09403088238e043558 +01bd2e40b0ca4d8f2ba2d4bc0b29e92bf4c7863aedad4953cbaf52e3c2b3d10a +815123753068312db0acb5b0bbb6eec9ba3415052d4173dcee456fe397a7a8f0 +219e82e5fee0dbad4652345228d6c9911e08c3dd71f4f01e58511b6573b73f95 +e24e3a387ae75f6c4838c24fc78766249d9bedca0c26d7a1c2bd1875daf7392e +8f6f50ffc8c1d91d75051222e6cb3af29f2b204d328665a5ad6990e58559cc27 +7df500d373f145a189f24485bf43b8fd940f9858e5c467490ff1834917784984 +c7f92cfea07a3bed3cc03a2e96ce24111ae01a89d8e6992d098c1183e45009f1 +f80ad92a086cda5ed7bd675478cecfdb43604c16e2f57f71850d1e76dfabef71 +562e59d4fae346ee85d54de040723d628556bdd78beb3fe9f5a4dd17b68d241f +8f887d4dc61ec229888d05d5dc47b4aa0308e932d16b3b0d29871c78fc3ddcc5 +ce71d033666f219a0347fd1dc8f5d49d6d486baeaec4f2660b56280c634ebb04 +b8e89a99f0362a623b959dc0d0886343a77d061c73c4eceb7f42d5bc5b3be8dd +53cd9a27c57af815313f87d1593395265a986a84bc07998ed901a8ece6fc835b +8695b4ee73842aa52a15e6471b54a9160be4fb1adc0dc7adf0f9bb94df2d3baf +0fb304447071686597a56f5f4600340c26708e3833d40ac7464bb152afaca337 +53ce7371db847ced5b52372b069aed83d3c9a33751919b157570a4cf087a9f38 +6318c8f6f9dc82e36de732647e9f6ed94253462c237e1dd421120de878a60924 +f416309680c569b61b8f93f40f3f75981799a683a156268e763ec1711c992ab5 +409120279d466d8e5eb9de417f5e85e905d5de7a2f22a6ce9b831efe53fd8898 +8b4c63229f801d3f52b60702f813ab6630fe0c1c461e1bf288d537ef14435cdf +2352d7ff82e7ac8d48a6990542f23eae52d15ab56375d7664403b2711dbcdaec +98dde7ce017456b5897d935f49d5613acf9fdf7f237147a3c3f8efdcb089fe2f +23aa9c8cf1aab36c86f923208f6594edfb53d72b5c70a38be0853b13b9f0097e +c1248c430cf8e0096ffc4add63ca94d150d2a903636b78d06129e18ff0cf2b9e +3c9fb8a7d02785e3ac939a55a87a4acdcf7491f1a3310c44e885f903f8cffe36 +c836d3a85b3fb3a1c95032e8b22d783bbf179c0a089799a400b3ccda19ee7c95 +42a898fcf398b5b09f65beba5a3410822114f3a312413fa4a17eb6a864b47cbd +f9e6955bfc17d3daec3f96a9f53cdb13feccb475d55e6f17dba1f8176476572d +ea390bbb5f6bd1fdd63c36fb219a550b05a73410e50400f4ba0b337bc0ed0264 +7200a6f44155011503888a69ecb4497e6a2b75bb69f429ba6eacfe70e3d1f97c +fffc0e8315670238626519949a4d5ac2970208b72c8bc043e5eff4d56c3d484e +df17165852ef4e728ab24d84b15473f6347544469fab2533d5225132747ee8d0 +984a2d2d2b76cf5111cebc467796957cd0cd3f8964fcca3d35dfe754a9ee88fb +3172b0fcb1c1b72b8216c99c4fc0765f351fdbe2e875788c157bfa5c8574a31b +1424475106ce38add700b1759957b37b0ddb5a052cbadc77165f408c59049033 +7d5561ccdb9678f131704f4ce4703432e1f28151d639ce530fe1c8eff0c3e68e +416035685294418434528324b062c1b313af8e39c9fc72e8d415778ce354ad68 +066e5271414a3e8577c9965c12637bb2bf416d979cb433f9533c46fb9a14aaad +2861ae632f72ae3c19c33a6b335bce32802de9cc280405ac13362adca9f64258 +29bf9b1a2f96e118036f718787d9e55397e99cc296ad672a9ac09af64b5467f3 +fa2451c931b80226eb84ba5f75c859cf4c45de91b031a5dc1f5f3e2a8ff132e7 +fe0ce735a0a8e39ec74d903b058bac01edcaecc32233c78992615a9b2c66cfcc +8803fb505549ce12ebdb78235d8af8f85d033fae1f2c2678d75618cf7e985994 +607b34e55bdc6d82f9f4c4852164260a144540dc0130aa3715d50e0c46012fda +1b539a456c1d6e4a38f3acebb05652b36e3924f0ebc468a77238f16c11f1f39a +ec44953cbf43d2774b09b35203f395b449b6398acd2cbc9d6f28aab29b11fa7a +f7f80f76782dd24b6acf7c123e8d42f6e5f885003b66c12e035617778463bfc5 +74eebd55eb9e29c838a6c3dd404dd443af813efe28b64cbed9fa6e2a6b9faed6 +93b2cf9644dbd1c03588a920c59e95c0b392d7d19cae508f0f083281897e7b4f +88158be8140b3086eb927aaee15e5532d784d98bffc0401f00ddfe35002f3e6f +37e5047632fdc8c0e1346f81a64f4d5adaef7e80b108188c0ca66dbbb338036a +0ad8224abdbc0ada662796d759afb0c3f72bdb0ef2629693172c8cbdaa1214de +bcf20a14f9a346cc5cf57b713206c1794b41cd97733cd305d959e22122b56654 +d137041bd490d3702d45382f69931a1d15ea876a6e7d5d703e4b79f7587a8012 +f8e5d2dad56aece2846344dd61d0703c06749a97972ae1fcbdd3f66a83141747 +c0970ebc41fbc61c04cbb858476ae0680e171f9b117306c7414b8ece8a2ec3b9 +41376e6213c5b3ffa68c66280b1956d11a6bf7816ad732ad126dbf3c6b5c96a1 +a3c3a4052e853672f1409f553e07793abbf847ce388babb323d75461c488174f +453c167275be4e0262c0b2a7b8e91de14d37be00d78dba4aee4bd94ace8bacf0 +46e9e07a2f5134b66e81079500414f919cd40220db116bea8d8999bd6291ceec +1d49cd5f6b6c58d29ce28794aa5abee6eac4d8e2f5ab4c0d1d750418064af399 +5e7458dbffd6e2dfbd87b0a58d4354e143ac2ecdda84bb0bad3e6fc42a86be23 +b1707eb7d8a2c31f794d39aaa417bfee74354f1495a715101fe38a9378c8b669 +bbfcfbdb82e4ebdf453ab281da395c7499a484d9d2ad3f2ebaf91e86ffe5136e +41a071f441e3ff69b5488f61b04cb14dc41daa5f4fe322d82873fb2425f4e341 +9a44d15cd41958cf2aa3b01e4ead6e1b3863861f2f953fdb708be567347fec5e +61a76660f5b7e4ec28beeb7041bd4932ad0b9923a2434026134280da2e19f760 +abee8fd8a2457b790ad6b49f2240a2961bb6ee1a6a0550f41ff22fc6905f70c3 +1b9c12cdde47ea248a29827a2928db4532a3e52c83cd01cc4edc4a0c1884847f +c1709dc5eeaa055c6ad49e6d96017bab014823148daa42d068339dcccf9cab35 +7fd86211af2996abaa8230daa8baa8b664401a46764f7baac6b73ea7ad8a33ca +ae8ae25c282ec1e6f6bb469cc53e51a5a9f1856f707b346a518892172081f8e0 +d0d3582c2448d0e2e94ad6578c5acbe2f6271fb78b2ab091b9725537a7594a15 +47a79c964044121797db1743821b5a0e08d4733e289d91845ad6d5562b4220e8 +2e333b084cffe0d4fd9b91e223ec948fd66097647b3e9b4bcefa7c1b6a6c5a77 +e947d86b06130683e942323a4e8e5c211f9252f55922f83dec26f35c109d6fca +15191e7307cc1ac993a73887562037836d126445f3bc3fdc5a929c19ad8f57fa +cd1cf6e4edbcb92b44b767710925c5d75904da307c0a893fa09c0ea5831185fa +2077b88ad5ce5ad00b855a080310913cc35c0a4c1874fcf1dc32ecebcf7bd591 +988266891e4ad44fee764377fe8d1a98d7ba6da27cd0eb4d499011a477a1dff4 +5734fb551bb0151191fe38542953fdd85e619845d48f650480a11b472165c779 +ee0c18ed9a9de34392ef7421f64e2a7f98a105c57f1fe17d64f85ddb6a346482 +d1ded67aa90af0a1e0c14ad45be4b26e179764d584b703bd026df6519331b600 +edd482c15b97abeb5a5a959d5c48ec96e35e5ae8b089b296f8b8e3ca31adc888 +87d148f5ed5363d48117f6c8ce009edc5f19982d89ab4e2ba21e60a56ec3d863 +03c361d3498fd4f59e0c076932b452f7de4936dcd58f9b2faedc5fd80aca9d5a +0581c003620dad3546803eaa4fc02bcd4846b496a42f529a3f765f26021aa98c +afdc151969f6ab4062b1191339bc3bd18cb9d2f75a431118aab925e9b6aae48b +e93762c1345539600561df7c016d0119fc41f1006fcb0a1a6cac8bfc8d42cc19 +494c5c62c97151062feaf56f2eac065c50ab290941a677986f5630ab97949791 +0be9ee9db773bf44407227b17ec312da6ceab108cbcd537c44da2c7f71bcd077 +f7713fd729a8826546a004da701b698e0bf2cea82570706e37f9a0c620492439 +55da1575fd76cf5b7d78b59c6851b7e78994d2b7ee35d012f9d944f8996c5af7 +6bc49a930e7c51533234f5898f498219f8866315f719e6f21b4af810745ea5c0 +754ced3f6f2435654532054e25d279e2071722d855b2ab090e4ec0c7adc2258f +0db6ae9cdf20f7ce3549880a48eb576214947e0b5e63fa22ed2f78a5e9a27c8e +7907dafb9b8095f4a9847684f7fdcc7afab9cbdd473a36e6366169a349438d62 +966f34839933aaa1037796ecee65807da72d10b5d407018c665fc97f21409388 +6b02be5a99db1bd977c0e2471266690304baaa8e483deceeee1852b9a0d8aa71 +b16e7c3dabfbfbee085b9587b4b1748009cd99267a8e2bcee84506b284c2fb38 +bc2da5be4d34e57117177977b9f9eaad4dfbeade344322067a38ee92c07d41ab +90fc508d43980780a0c4528d8e6bc8e1b0ad4c60c92fba4c1643778f980de56d +527b346d964b5e7a711e3d9115ed3feca36c01cbb64069e5b707af0103524936 +4652370c756189f7a860aa0dca1dba43b2e5448c30e11c4ca781e06d927a8e3e +8f579e172aa6a6a446ec96445705df8ad675509d821796e63d1739410ecb0a61 +f60a223f4f955bb355fbfa7e5c47737952af673d3a23616f4cb44b26600039c2 +0559fa92019935ae60d9c1aaa80e979134bb14cf47a988152907a4b77868ad71 +a3cf176fbecfb7942934dd3c47668258e716365b38297c400438deca908c359f +61ca4b88503adadecb182cf22320a14ee2cd9c92b2cd87cce54e36cb868eac15 +02e2b6d82f69e67f9015e74bd412ae5cfc08ab43627dbd24a326a32bdded13ca +8e8d1321bfaf88e9b8c665fdf59269d2c524a13668e88211ea42f60d1735f74c +3bfe8dcba4523937e00e3ac820f2818c93e1f423599429150663471d10fb13ff +f766ec92c5c7404e11f2e33ee4a7ce95192ffbfd8cc2503b846fa20ff67e0745 +22795a728b32fdf749fdeac09e58a881752800e0edde695b92e14a00969bf400 +6ec13158397845f2f6313b2b79a6a08ddad01a6cdb7c3b4b0ad8391c1b382b4f +ae43ce086f242bce64092a9097becaa1fd4142fa2172feeabad0a5e92adda9ac +6661c53aac9e3da2bd2d748a1fd2868b37aa9881ed6d5460737ef2bb1a52daf1 +59e0808bebfcf36a2ad06630fffcbb6c8ffd9d4617775ff5fa1a89067e8ca637 +5ddc6bc1c220394bca911eb8c90ea5024af4fa2002866574fa788800486b18ff +d6b144ca682c446d596b42720dfab2cca91e3b544d5daa8ca149219f619b5e84 +fe5bf9c51f1d24d7a3b3986bc1803967c979828ca2535fdebb1d75c74ffb423b +da6bbbfdd8587dea1836c2cab216dca9784adae242a5f0c0a9b0d8a67eea3525 +b87d5c8976d2a9470d7f1b8634248e472bee8052761f72b16a04378dfa60afd7 +ef9866c5244c887e9ca5de4d310fbb69701d30d42cca44e4ffbe2f6dcc4a745d +0f9c761893f224306ab743c73eaf2fd8644597d4cad6f6d41d3be7565ac149ac +3f2ab18d02558eef5d49e4b8d0e304e7f4151f8e78ba05b388d4974713a18034 +3cdacaeeaa584f96a7790ad1a4ec41774cdf2928169079d7c86114f1be65c75e +c97a9c27e83480e7b4b02bdad59b92f1821675ccb1fe6337c470b57dea22b969 +cf60b55e318bee317c374e63fea4c7c722f6a5bc34fc848e1834c4ea6a277dca +96d3ed9c28fbd332d61da189ed5a615e3ee71d0714f5b18ffff0b1eaf6840e43 +7332536928b57007d941246d44e02a64cd4071840e306509675c7f3be79d6b5c +fd4a34fcc252f4a7885947b1737570ab972c6f0ea8de905c4cecd9bb77289d9b +cf6a6b89da7752e5fa8aacf24d3348854b33438e1bad1797189590ea479215f1 +9724d2b9df31eac5cb7e15a97bbc83a88069eea41811303913be27dbbcd74197 +269405852a11f3dea4dab4ce528ae7e96df9b85735e8f035bf74188b1fa23099 +075f3e657431e273a6af50cafe17c8ef3cd93dffb8188b024e85bf4a05c40452 +03b258c4111dd80a81a2b97bb3dd922c4b456ddf3100238a69d5307073fb589e +ffbad5792761923f527e48cda6c0d8785f39fb53a2a78b04e877930407c6e03b +1f85d7bb7e2b3dcca1c40b7ea7107d9e4ce56b866ab08524096d86df0cea68f5 +ca8417ff762bcb31121ff04fd4089da15b193403ddf0b2928a9ef182b0cb3c5b +ceff60b2258df91ec65a364ef6b90dcab793426d24d0d3a445e0523ef4b42df1 +fdf47f4dc2cf20a90702a5b17008f24973ec50e6a9229f61abb1e9ed05cc0cc7 +4ad64ca5069ec770678b4b2ed5f7d1f51a72a4ed9ab87b9bff5b8e08bd1ca7c0 +c9f4671d5098da0a4b2546f84ca29fd57d1625880432e4e21352b52c18f975f1 +6f083c8289a90e9ab8fe90cd8ea737879eb589f986032c5d153141ac4ff0374f +bf859c225b151c19c76369e0ca31610ad1b96f74e99e257460d63462297555e8 +f9d4be6a95cf725aacea0862955d94c0bddc116118995fd823fba7dabddb7b09 +cec5a706385c6e7044ccd15c73be4c2a9b10a49d7a490483608828457017923b +b4983e893077f0b1eacf1edbb95e438885ebe1455a7920ab666d12c72376d3c2 +4d859628f72d7c627f7edd4d947e5b50eb4d36f70fe0a07a403ac514fcc07866 +bfb8fc64bced8cce8b1db977a7da94882f2b5397c1787f2f2369a3fccfb2df80 +25d2a36cd343f342e1c33fd15fb51aee61315e36d47e268b340c2054d5cb0911 +57b267ae70bd70a030a9b4a95e853221bde1c2ec2116dd3fc21e95d9ab2830f6 +16ed7a62e0832aea2b265a53f7ae4cb2ea173062a8ee4573812d10503cfd147d +1b3c9aa5444d82fc0f7ad9f4348fab1e1db05687bc6b8e55b49a6e1893a57007 +7a6a92dbcbdc16a96bcfcd594580bed0c68554fd1d465547f0b23a8d4812ab6b +ca77f22ac0b9022c7105b9a18ac4d3cedff29a29c2476b71f25e8daee9b6bb9c +e0d97e4629f8aac9cb0ad2408e34242118b446e6933ea0e42e39c75136167f13 +d41c6b9252de67cbc401b366a3aa3f4d32c07c7a943058495633e9c586079913 +7a12a6cffa7c304180ba8c4bd19e929786ad3f8c85aff4734ebfc5eb9472956a +7d2645344ba34fb0e5849b42294ed7cc00bd5ece1081b37a01e4e00ff407fb8d +b1f3509f57d68c379e0bc81548ff2c12f840035fbd5ed30a1879db15009be45c +b5850d908ce0b3b3425b4e79ec298dfd542eb320415651972635727d9031acbd +f4f71b49ac82e44d099ea77dc43faba4143e96956eaed34cc459091f77f825ed +ba1c774e72583ebfc373b565389230ff18bd7f12cea761bf341b6aee1c6d6a19 +ee5ac125fa54fa86487ac62d12cef673acddf8b49b0aa2c4fc5a1910af5191d0 +499c55710766f4da43ecd2d9f9eaa620d9eb508814cbb149afe4174cdff7e017 +6290baee79146f98fc6c9e9aafb801cfebbf03a49b50820e9a0294beddd469ec +99f284da918055d60a719cebf94df593b1b7f36f8ba61f2a7d9d70961b3782cf +a38e27df794eed77342718762cbc659cf8179890c3b07788ebc88758cdbace66 +e8a4a1a9044cbf156090d6f3f9f4dbf5c139a45a00ed66bb5b849efe399a96e4 +0aff6b6eede83ca3c08fb41ce894b97563f945ae6f8d19ef1153002f012f0719 +ae49821f9ef8fcda418ad2d555bc8a92750af370466a15d109f72c0201557cd4 +9d9ed47bae7334b3a8c41497a1e9a16c493f2000f5dcaa615366dfcf49c03ddc +388c9a3556be2e4d42a7cc6b9cb93c129727576a2a71a1dbbe4b9216d4df45e4 +f818b2191ee925095e22f1c2fb568e4a91041315a0a46d2a48419b21e19eb2f1 +817449c9955d87ea59d215a9c72225089cab88d0ec1286cec111312be2f2fd2d +15ce3c6ed4f8a97b9c901e0c1b78c50413cc0ebf3be4cbf638d6f87a66abb5a1 +8816db062342e55536650d9cef84a0c2b732b2eaedb94f24d3f14dee938f5505 +9eb0ce1b6158204a3fc0ce773dc80f8cf04d4f490342f1e61e3e76131c9ebba3 +d37ae7a31c07f94fe704611c8acb82eff202e978dbbfafd4694bf8644f34efb7 +8dbd5bfb6bc31d8dd8dd75feeeec3538907e7c34afacf0ca38b73066dd03df90 +29fccf0cf2c11e3c32f931a73f3d2f878b7feb5949466f6b5b2dd8c4a5234dc7 +68da4de1eb9311ecbde751ca868c2eb1ec34407d446593ea89589fcb9fd7fd7b +41332d1662e1d23159171ca91b2ba32d4265d54c2f31db733dde8f7e35254e5b +16d61b0be99bf418d2c07ba289d935270c4b5e58b283d83bde386e0f3a363321 +8fc3e6444179d1e53570e29d8381d93d99e020544974fb2e29069b007466d80c +0fe18dd2fea487abb742cd6cd895322f4cbc870dbc4ac0dbc9b59c8ec172c764 +e9192406c15ca1728db37cfdb438ff7b2b4a46f26ecd54ce220a2d177688f797 +2315ea7b09932c1e3ce5c8a3aa31b67a4023b32ab5258b6191917fe84f7f138b +a88d893bbc85fea4c22d6fa59a0bec05c4f2bfc6d4abad38bd8a22b130f8f823 +2bb4682395d9db042e918ce3eb15bc649a5177a27345769ac8c7e37e1f018382 +75db6b96262280d82881cc078c177d6ebba6fd076b32545e47e777dbdc12b531 +5a656f3d3e0432a5725c503ac377f0976c4d4645ba8a62b85f2855723fcbf0bc +1bb16ff72236b2bbcabe1927b4fee83a7ccb4f8c576eeee4411e5c1836df2bf5 +fcda883b61c809a5a69c0174bbdc325216c05d100522faed7880e8be18c77c1f +469d64f39e5fb0b92770d55a6996f08871c4cf4fdc09f33646b06a5bcdd4229a +58bb3556e2a2bcc028768ca1b6ed15104c5b961eab6bf6c7153304f871445f2e +c27993619c52f4c05d3bec9e0ba6a29003538a792601a0c0aef1a2f799b42bef +07f1040a95f100c1d5f634cef2a7418606c229ee938383011ed5e9821a5b1ff1 +f4d168d933cb008b862a8161c1365d2e716d8b43eef14aa5e428a1114b69f42c +13c78d7387c1ed874362f6c9324cc18a9a1e021ae5572bf804126875580f2033 +b36b8bce6bda1afad5a8fe1bb70a5f0d1997f4d07474240bd86a9f78ef8b79ab +b00261cf19fea68a0e26044b48601761a22db022b22b68b5d1cc20846d188aea +167481bdce64bcbb6f83db97e88275cb69c4b0eea1e977fb372cb5dce6d0ed5f +b014870d25d5a4b0fbdfe1b0631cf06c05503e46504001b1ef38bc89b353d1b5 +d6df1d5fbd8caadad2a79f3251c362cb179b42bfb350a9656850fdafe00fa69f +af222f6e32e1edbb98ff629db8a7e712092c62abff1071d5b827ccb937aef491 +bc9af196382c4d646b6c0bafc87f3a21a96855c60592a2eb387e12961fb0edc8 +b8f2d25a159c8bfc6dedf61d9892b1e6311b4a25355f658dbe570ac2dcb6081b +5c53601a341398be9607c76e3f920bbdadb0ecafd168592f62009a8c7642c3c4 +0079107e049c7d5bdffe2c1111c48293d043a116601186e6145766691205adcf +9d9ff84952991b2b23eba2770885adfae3c33fae6b9cc1d50816ddca0735b68f +3374691bd27d31d02b74c45fb8e49337c60710fe831372da5415c15eef486645 +84e2211306e112ebe45c53316d9a3d5321b98d797ddca1d086f5c8e50ba5a112 +6e1943923a0f9385ea1dbe629da5f74b951a71413582ad57615c7a92aa2d7b3f +a9d5825596d4cd92f4596eef20d1bc5c15510d81fa7e1cdf6d2a34fc4023b492 +e5fdf751ae848e7b26e2dc72ed766ebfe1146ac1a2a11d463116520645d2e768 +d16d466fc6edad472a30cbd98c0e9e008bf6b49cca455575476b1658d8466b3e +cbc51ec8e3b52ae4361eb36852727f31acadd2020264a9f8f7e8eb6e95cae23a +83a16f953cf427ced1bb080642689198ebaad5b7cd45d4f6512613e97a37df23 +a59c77afde3912b08aeab2c03ac7923641d5e44f84993823e7e394b9c60550d7 +d2285defe44b842474db7c475282749610930bc6a9b89e187475dbcc72f36367 +4e40286b9d8fdcba50ced64c4b8a9b432b646eee842c48fc007f7901f3fc1160 +47ebef1f2bf1ae8217f59fb7afe388bfd40a73deab20c485ac50d0df450a2a15 +7c7e1847b538bd6712b4d7ba0492af115a4de59eda19349f85c1b2164392d120 +4a81dda27109c502c502941b2add6ed6ab415da9af37ca7d2761814eddca8875 +7aab159ee330af8429362fe44ea6a4adb495a813ab822237891826df1e622b81 +d2d7037594c12acee29e9c884286657f77f016310b2a6609bd3fc6adde3ab40d +8fd79361c53908594b363ad4376168ea4a25915010f8c5733079b5ae3a3755a6 +cab17d5bbb97223913c1d409a4603c715f8e709225f6af1f52f0c7027910840e +326216ed1dbb668651f0cf630579370802fdbe4ebac66aaf70324c34baf68392 +58261831369fa1083127db90491f3585ce706fce6cd6a407d66aaad4395163d1 +b7abd4db0dced900109e618b8bce5442f85571674980740ab0c85a243a3bf408 +decad7e7a973f09042c0ae718a773fede87142679ddfc47bc0c56c61162f0444 +70d9a2376219833883b7fdfb97334b5b032795a929428a9dd25c62568fca846d +499d461b4f00e366c04fce939d135e98587b3df9b2a2b2df05c14643d45dbd01 +791e88658ba3e020dee5ad84695956e302845145b92dda7957ab4ceed047ea3e +343687015c58893ecff2a14b2c4fd92eca727e1ecb26f9e85f059eaba8b90be8 +0b3e951661b6b3add13163437b6e404e6b816bd08b7bd776620d61542a6fe3dc +c3bd33272cc9bb0ddaec0f557e6477bf5a3306f416d6d2e965e2dd44ebdd1df1 +e9773769bb4e9a3ea52ad101dcabf10ba972978bd281db4deed4337d5cb9e38a +4dfc7c6251c997eb7e188ce325cbeec9b2c8eee0f600b6c5807ac789520a1891 +e7deb786644e296b449cb98211a89b56e5f577bff920d37dc849d43da1cded70 +d34479a1494f7f72f48fd56c809d8a8b6186298c2fc5688ed7b9825304909208 +996d91b74aedd334cd31a679ba2fad8fca9908eedb8a800e752048565e161cb2 +dc9f654be8c60f05a8dad139956a080673b6293fbaafa8ef52a9ca40c2792251 +fde97d5fd7b990d54fd3bf0a0eb960c6e9c96f977adc33f0542dda672b3d81b5 +7d64e97b680fa6ec5c84f52be3ab264d12aad0110b14788107e3b5e00d42c843 +5f65092cc5b9eadab9183cd69884f0079c48d0a606d55678beaafeda083b7b56 +efe6d56986564ea6b78c66004ff51d609309180c812e49ee92b785312af960fb +b751c7d867f93e40703fd88e60ea96d3a9af3837e433b0d6843741f01f0f1272 +0c56678d44194f4efd3d7071e11c4aea724f676789b55c8958e597580d4741c0 +10e2497c3dc0757b8b454b4b9bb89f1aa2e009b408d3e45d432887d42d225421 +e676e6deaffb5641769a2ffea8b06a40c42cff99a9c5b91a5d405169cd2ffdcf +7622a3b7af17178ce75ee248313ff426edabca3e8fa879d56bb621fde9ae43c3 +9b88216ca93a41f00abb5c376e6f94641f97df1d917b99dac76e62765fc47307 +8b985c8bdb81bfe53e37bc29798263f00daba58d7406504dab2d9c7555a5ec54 +0f83a6f483b20d4a0533a6a0fc68f086b91b15a9fa03b673d6d5e3bbb438fcfb +bf996ad62fac68c7f476cf2b8806d2f537daa331f66af7761c9dbed0b03e86b3 +8355747580918e37b3efc7d0ba05576a8153dbba711d77d6c57920ff195bcc26 +15fb1e901c72c2aa200b2d95b148bdc91cc45281703ea2a83902a409d3f059a4 +e3be3ff93baeb34c91f50f473056713dc643241b0d046245f6095be26abb9d79 +a846369479475db7756f55b00a2c3a803b1d72a4d4655e3b950b8b38133191ad +435bb0c45b0fd1ae0d20fed291899a8502c256c84cca2989bf419045d13e568f +5743a331fc7cbe1a68d348add976c506c1e3bb09bf2af3fcc63a02d83e389381 +53fcd5f9dc3e32f9b53b0729dd8603b390bb0f82b6759d9d8b4580a39ba7529a +f47498900c912826292964cdbdd6c63968f75c74bc59f8b8f439e0c40bc45d88 From d78cb92eb8b062ad73341bb7e57960847f91d62b Mon Sep 17 00:00:00 2001 From: Louka Date: Mon, 6 Feb 2023 17:11:37 +0100 Subject: [PATCH 09/28] tests --- OpenCL/inc_hash_blake2s.cl | 3 +++ OpenCL/m35000_a0-pure.cl | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/OpenCL/inc_hash_blake2s.cl b/OpenCL/inc_hash_blake2s.cl index 9b9ecaf91..a38dd87b6 100644 --- a/OpenCL/inc_hash_blake2s.cl +++ b/OpenCL/inc_hash_blake2s.cl @@ -136,6 +136,7 @@ DECLSPEC u32x blake2S_rot08 (const u32x a) DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, const int len, const u32 f0) { + // printf("------\nm : %x\n", m[0]); const u32 t0 = len; u32 v[16]; @@ -157,6 +158,7 @@ DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, con v[14] = BLAKE2S_IV_06 ^ f0; v[15] = BLAKE2S_IV_07; // ^ f1; + // printf("v : %x\n", v[0]); BLAKE2S_ROUND ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); BLAKE2S_ROUND (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); BLAKE2S_ROUND (11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4); @@ -176,6 +178,7 @@ DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, con h[5] = h[5] ^ v[5] ^ v[13]; h[6] = h[6] ^ v[6] ^ v[14]; h[7] = h[7] ^ v[7] ^ v[15]; + // printf("h : %x\n------\n", h[0]); } DECLSPEC void blake2s_init (PRIVATE_AS blake2s_ctx_t *ctx) diff --git a/OpenCL/m35000_a0-pure.cl b/OpenCL/m35000_a0-pure.cl index 9e2e4b5f1..bb45bf304 100644 --- a/OpenCL/m35000_a0-pure.cl +++ b/OpenCL/m35000_a0-pure.cl @@ -47,7 +47,7 @@ KERNEL_FQ void m35000_mxx (KERN_ATTR_RULES ()) blake2s_init (&ctx); blake2s_update (&ctx, tmp.i, tmp.pw_len); blake2s_final (&ctx); - + const u32 r0 = h32_from_64_S (ctx.h[0]); const u32 r1 = l32_from_64_S (ctx.h[0]); const u32 r2 = h32_from_64_S (ctx.h[1]); @@ -101,6 +101,11 @@ KERNEL_FQ void m35000_sxx (KERN_ATTR_RULES ()) blake2s_update (&ctx, tmp.i, tmp.pw_len); blake2s_final (&ctx); + if (il_pos == 0) + { + printf("ctx.h[0] : %x\n", ctx.h[0]); + } + const u32 r0 = h32_from_64_S (ctx.h[0]); const u32 r1 = l32_from_64_S (ctx.h[0]); const u32 r2 = h32_from_64_S (ctx.h[1]); From e3d47f0ea813affa4daa5e8698a4a60bbb0867b3 Mon Sep 17 00:00:00 2001 From: Benoit Date: Tue, 7 Feb 2023 13:22:07 +0100 Subject: [PATCH 10/28] Correction de nom d'une fonction --- OpenCL/inc_hash_blake2s.cl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenCL/inc_hash_blake2s.cl b/OpenCL/inc_hash_blake2s.cl index a38dd87b6..9a28ee59a 100644 --- a/OpenCL/inc_hash_blake2s.cl +++ b/OpenCL/inc_hash_blake2s.cl @@ -95,7 +95,7 @@ DECLSPEC u32 blake2s_rot08_S (const u32 a) #endif } -DECLSPEC u32x blake2S_rot08 (const u32x a) +DECLSPEC u32x blake2s_rot08 (const u32x a) { u32x r; From 1e79857ed039a21cf543e3111debdd4bbb853348 Mon Sep 17 00:00:00 2001 From: bacqube2 Date: Wed, 8 Feb 2023 11:50:31 +0100 Subject: [PATCH 11/28] Changement des valeurs de test pour debug + affichage des valeurs de rounds --- OpenCL/inc_hash_blake2s.cl | 19 +++++++++++++++++-- src/modules/module_35000.c | 6 ++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/OpenCL/inc_hash_blake2s.cl b/OpenCL/inc_hash_blake2s.cl index 9a28ee59a..d3a87272a 100644 --- a/OpenCL/inc_hash_blake2s.cl +++ b/OpenCL/inc_hash_blake2s.cl @@ -26,7 +26,7 @@ DECLSPEC u32 blake2s_rot16_S (const u32 a) DECLSPEC u32x blake2s_rot16 (const u32x a) { u32x r; - + #if VECT_SIZE == 1 r = blake2s_rot16_S (a); #endif @@ -159,16 +159,28 @@ DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, con v[15] = BLAKE2S_IV_07; // ^ f1; // printf("v : %x\n", v[0]); + printf("\n"); + printf("Round 0 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + printf("Round 1 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); + printf("Round 2 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4); + printf("Round 3 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8); + printf("Round 4 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13); + printf("Round 5 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9); + printf("Round 6 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11); + printf("Round 7 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10); + printf("Round 8 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5); + printf("Round 9 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0); + printf("Round A : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); h[0] = h[0] ^ v[0] ^ v[ 8]; h[1] = h[1] ^ v[1] ^ v[ 9]; @@ -178,6 +190,7 @@ DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, con h[5] = h[5] ^ v[5] ^ v[13]; h[6] = h[6] ^ v[6] ^ v[14]; h[7] = h[7] ^ v[7] ^ v[15]; + printf("Final : %x %x %x %x %x %x %x %x\n", h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7]); // printf("h : %x\n------\n", h[0]); } @@ -454,7 +467,7 @@ DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32 v[13] = BLAKE2S_IV_05; // ^ t1; v[14] = BLAKE2S_IV_06 ^ f0; v[15] = BLAKE2S_IV_07; // ^ f1; - + BLAKE2S_ROUND_VECTOR ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); BLAKE2S_ROUND_VECTOR (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); BLAKE2S_ROUND_VECTOR (11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4); @@ -474,6 +487,8 @@ DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32 h[5] = h[5] ^ v[5] ^ v[13]; h[6] = h[6] ^ v[6] ^ v[14]; h[7] = h[7] ^ v[7] ^ v[15]; + + printf("Final-V : %x %x %x %x %x %x %x %x\n", h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7]); } DECLSPEC void blake2s_init_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) diff --git a/src/modules/module_35000.c b/src/modules/module_35000.c index 3c36c99a9..2769fa84d 100644 --- a/src/modules/module_35000.c +++ b/src/modules/module_35000.c @@ -22,8 +22,10 @@ static const u64 KERN_TYPE = 35000; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_32 | OPTI_TYPE_RAW_HASH; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_NONE; -static const char *ST_PASS = "hashcat"; -static const char *ST_HASH = "$BLAKE2$2c719b484789ad5f6fc1739012182169b25484af156adc91d4f64f72400e574a"; +static const char *ST_PASS = "abc"; +static const char *ST_HASH = "$BLAKE2$508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982"; +//static const char *ST_PASS = "hashcat"; +//static const char *ST_HASH = "$BLAKE2$2c719b484789ad5f6fc1739012182169b25484af156adc91d4f64f72400e574a"; u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) { From 5475e882a76c060115c5900acea0e0f172a866c5 Mon Sep 17 00:00:00 2001 From: bacqube2 Date: Wed, 8 Feb 2023 12:57:17 +0100 Subject: [PATCH 12/28] Ajout de printf pour tracer l'execution des fonctions --- OpenCL/inc_hash_blake2s.cl | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/OpenCL/inc_hash_blake2s.cl b/OpenCL/inc_hash_blake2s.cl index d3a87272a..c47e123a1 100644 --- a/OpenCL/inc_hash_blake2s.cl +++ b/OpenCL/inc_hash_blake2s.cl @@ -136,6 +136,7 @@ DECLSPEC u32x blake2s_rot08 (const u32x a) DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, const int len, const u32 f0) { + printf("transform\n"); // printf("------\nm : %x\n", m[0]); const u32 t0 = len; @@ -196,6 +197,7 @@ DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, con DECLSPEC void blake2s_init (PRIVATE_AS blake2s_ctx_t *ctx) { + printf("Init\n"); ctx->h[0] = BLAKE2S_IV_00 ^ 0x01010020; // default output length: 0x20 = 32 bytes ctx->h[1] = BLAKE2S_IV_01; ctx->h[2] = BLAKE2S_IV_02; @@ -227,6 +229,7 @@ DECLSPEC void blake2s_init (PRIVATE_AS blake2s_ctx_t *ctx) DECLSPEC void blake2s_update_64 (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const int len) { + printf("update_64\n"); if (len == 0) return; const int pos = ctx->len & 63; @@ -334,6 +337,7 @@ DECLSPEC void blake2s_update_64 (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS u32 * DECLSPEC void blake2s_update (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len) { + printf("update\n"); u32 w0[4]; u32 w1[4]; u32 w2[4]; @@ -388,6 +392,7 @@ DECLSPEC void blake2s_update (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS const u3 DECLSPEC void blake2s_update_global (PRIVATE_AS blake2s_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len) { + printf("update_global\n"); u32 w0[4]; u32 w1[4]; u32 w2[4]; @@ -442,11 +447,13 @@ DECLSPEC void blake2s_update_global (PRIVATE_AS blake2s_ctx_t *ctx, GLOBAL_AS co DECLSPEC void blake2s_final (PRIVATE_AS blake2s_ctx_t *ctx) { + printf("final\n"); blake2s_transform (ctx->h, ctx->m, ctx->len, BLAKE2S_FINAL); } DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32x *m, const u32x len, const u32 f0) { + printf("transform_vector\n"); const u32x t0 = len; u32x v[16]; @@ -493,6 +500,8 @@ DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32 DECLSPEC void blake2s_init_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) { + printf("init_vector\n"); + ctx->h[0] = BLAKE2S_IV_00 ^ 0x01010020; // default output length: 0x20 = 32 bytes ctx->h[1] = BLAKE2S_IV_01; ctx->h[2] = BLAKE2S_IV_02; @@ -524,6 +533,9 @@ DECLSPEC void blake2s_init_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) DECLSPEC void blake2s_init_vector_from_scalar (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS blake2s_ctx_t *ctx0) { + + printf("init_vector_scalar\n"); + ctx->h[0] = ctx0->h[0]; ctx->h[1] = ctx0->h[1]; ctx->h[2] = ctx0->h[2]; @@ -555,6 +567,9 @@ DECLSPEC void blake2s_init_vector_from_scalar (PRIVATE_AS blake2s_ctx_vector_t * DECLSPEC void blake2s_update_vector_64 (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, const int len) { + + printf("update_vector_64\n"); + if (len == 0) return; const int pos = ctx->len & 63; @@ -662,6 +677,9 @@ DECLSPEC void blake2s_update_vector_64 (PRIVATE_AS blake2s_ctx_vector_t *ctx, PR DECLSPEC void blake2s_update_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS const u32x *w, const int len) { + + printf("update_vector\n"); + u32x w0[4]; u32x w1[4]; u32x w2[4]; @@ -716,5 +734,8 @@ DECLSPEC void blake2s_update_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVA DECLSPEC void blake2s_final_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) { + + printf("final_vector\n"); + blake2s_transform_vector (ctx->h, ctx->m, (u32x) ctx->len, BLAKE2S_FINAL); } From 6176ec3264b88ea802e8e37eb0f6d47cdd5f8192 Mon Sep 17 00:00:00 2001 From: bacqube2 Date: Wed, 8 Feb 2023 13:23:11 +0100 Subject: [PATCH 13/28] Ajout de printf pour tracer l'execution des fonctions --- OpenCL/inc_hash_blake2s.cl | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/OpenCL/inc_hash_blake2s.cl b/OpenCL/inc_hash_blake2s.cl index c47e123a1..81af8c236 100644 --- a/OpenCL/inc_hash_blake2s.cl +++ b/OpenCL/inc_hash_blake2s.cl @@ -198,6 +198,7 @@ DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, con DECLSPEC void blake2s_init (PRIVATE_AS blake2s_ctx_t *ctx) { printf("Init\n"); + ctx->h[0] = BLAKE2S_IV_00 ^ 0x01010020; // default output length: 0x20 = 32 bytes ctx->h[1] = BLAKE2S_IV_01; ctx->h[2] = BLAKE2S_IV_02; @@ -230,6 +231,7 @@ DECLSPEC void blake2s_init (PRIVATE_AS blake2s_ctx_t *ctx) DECLSPEC void blake2s_update_64 (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const int len) { printf("update_64\n"); + if (len == 0) return; const int pos = ctx->len & 63; @@ -337,7 +339,9 @@ DECLSPEC void blake2s_update_64 (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS u32 * DECLSPEC void blake2s_update (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len) { + printf("update\n"); + u32 w0[4]; u32 w1[4]; u32 w2[4]; @@ -392,7 +396,9 @@ DECLSPEC void blake2s_update (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS const u3 DECLSPEC void blake2s_update_global (PRIVATE_AS blake2s_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len) { + printf("update_global\n"); + u32 w0[4]; u32 w1[4]; u32 w2[4]; @@ -447,13 +453,17 @@ DECLSPEC void blake2s_update_global (PRIVATE_AS blake2s_ctx_t *ctx, GLOBAL_AS co DECLSPEC void blake2s_final (PRIVATE_AS blake2s_ctx_t *ctx) { + printf("final\n"); + blake2s_transform (ctx->h, ctx->m, ctx->len, BLAKE2S_FINAL); } DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32x *m, const u32x len, const u32 f0) { + printf("transform_vector\n"); + const u32x t0 = len; u32x v[16]; @@ -494,12 +504,11 @@ DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32 h[5] = h[5] ^ v[5] ^ v[13]; h[6] = h[6] ^ v[6] ^ v[14]; h[7] = h[7] ^ v[7] ^ v[15]; - - printf("Final-V : %x %x %x %x %x %x %x %x\n", h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7]); } DECLSPEC void blake2s_init_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) -{ +i{ + printf("init_vector\n"); ctx->h[0] = BLAKE2S_IV_00 ^ 0x01010020; // default output length: 0x20 = 32 bytes From bd0f05835754857b8988389a671c0070dea23ef5 Mon Sep 17 00:00:00 2001 From: bacqube2 Date: Wed, 8 Feb 2023 14:04:12 +0100 Subject: [PATCH 14/28] Premiere correction des fonctions de traitement --- OpenCL/inc_hash_blake2s.cl | 2 +- src/modules/module_35000.c | 42 +++++++++++++++++++------------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/OpenCL/inc_hash_blake2s.cl b/OpenCL/inc_hash_blake2s.cl index 81af8c236..5712ad1db 100644 --- a/OpenCL/inc_hash_blake2s.cl +++ b/OpenCL/inc_hash_blake2s.cl @@ -507,7 +507,7 @@ DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32 } DECLSPEC void blake2s_init_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) -i{ +{ printf("init_vector\n"); diff --git a/src/modules/module_35000.c b/src/modules/module_35000.c index 2769fa84d..6519628fc 100644 --- a/src/modules/module_35000.c +++ b/src/modules/module_35000.c @@ -22,10 +22,10 @@ static const u64 KERN_TYPE = 35000; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_32 | OPTI_TYPE_RAW_HASH; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_NONE; -static const char *ST_PASS = "abc"; -static const char *ST_HASH = "$BLAKE2$508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982"; -//static const char *ST_PASS = "hashcat"; -//static const char *ST_HASH = "$BLAKE2$2c719b484789ad5f6fc1739012182169b25484af156adc91d4f64f72400e574a"; +//static const char *ST_PASS = "abc"; +//static const char *ST_HASH = "$BLAKE2$508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982"; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$BLAKE2$2c719b484789ad5f6fc1739012182169b25484af156adc91d4f64f72400e574a"; u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUSED const user_options_t * user_options, MAYBE_UNUSED const user_options_extra_t * user_options_extra) { @@ -110,10 +110,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUS token.signatures_cnt = 1; token.signatures_buf[0] = SIGNATURE_BLAKE2S; - token.len[0] = 8; + token.len[0] = 4; token.attr[0] = TOKEN_ATTR_FIXED_LENGTH | TOKEN_ATTR_VERIFY_SIGNATURE; - token.len[1] = 64; + token.len[1] = 32; token.attr[1] = TOKEN_ATTR_FIXED_LENGTH | TOKEN_ATTR_VERIFY_HEX; const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); @@ -124,13 +124,13 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUS const u8 *hash_pos = token.buf[1]; digest[0] = hex_to_u32 (hash_pos + 0); - digest[1] = hex_to_u32 (hash_pos + 8); - digest[2] = hex_to_u32 (hash_pos + 16); - digest[3] = hex_to_u32 (hash_pos + 24); - digest[4] = hex_to_u32 (hash_pos + 32); - digest[5] = hex_to_u32 (hash_pos + 40); - digest[6] = hex_to_u32 (hash_pos + 48); - digest[7] = hex_to_u32 (hash_pos + 56); + digest[1] = hex_to_u32 (hash_pos + 4); + digest[2] = hex_to_u32 (hash_pos + 8); + digest[3] = hex_to_u32 (hash_pos + 12); + digest[4] = hex_to_u32 (hash_pos + 16); + digest[5] = hex_to_u32 (hash_pos + 20); + digest[6] = hex_to_u32 (hash_pos + 24); + digest[7] = hex_to_u32 (hash_pos + 28); return (PARSER_OK); } @@ -149,21 +149,21 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUS memcpy (out_buf, SIGNATURE_BLAKE2S, out_len); u32_to_hex (digest[0], out_buf + out_len); - out_len += 8; + out_len += 4; u32_to_hex (digest[1], out_buf + out_len); - out_len += 8; + out_len += 4; u32_to_hex (digest[2], out_buf + out_len); - out_len += 8; + out_len += 4; u32_to_hex (digest[3], out_buf + out_len); - out_len += 8; + out_len += 4; u32_to_hex (digest[4], out_buf + out_len); - out_len += 8; + out_len += 4; u32_to_hex (digest[5], out_buf + out_len); - out_len += 8; + out_len += 4; u32_to_hex (digest[6], out_buf + out_len); - out_len += 8; + out_len += 4; u32_to_hex (digest[7], out_buf + out_len); - out_len += 8; + out_len += 4; return out_len; } From 468ba9d92b959b810bcc2e652b9f49f3dfb50ed8 Mon Sep 17 00:00:00 2001 From: Louka Date: Thu, 9 Feb 2023 13:11:54 +0100 Subject: [PATCH 15/28] blake2s --- OpenCL/inc_hash_blake2s.cl | 56 ++-- OpenCL/m35000_a0-pure.cl | 21 +- src/modules/module_35000.c | 38 +-- tests/blake-test.py | 6 +- tests/blake2b-valid-hashes.txt | 499 +++++++++++++++++++++++++++++++++ 5 files changed, 558 insertions(+), 62 deletions(-) create mode 100644 tests/blake2b-valid-hashes.txt diff --git a/OpenCL/inc_hash_blake2s.cl b/OpenCL/inc_hash_blake2s.cl index 5712ad1db..9c15f18ce 100644 --- a/OpenCL/inc_hash_blake2s.cl +++ b/OpenCL/inc_hash_blake2s.cl @@ -136,8 +136,8 @@ DECLSPEC u32x blake2s_rot08 (const u32x a) DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, const int len, const u32 f0) { - printf("transform\n"); - // printf("------\nm : %x\n", m[0]); + // printf("transform\n"); + // // printf("------\nm : %x\n", m[0]); const u32 t0 = len; u32 v[16]; @@ -159,29 +159,29 @@ DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, con v[14] = BLAKE2S_IV_06 ^ f0; v[15] = BLAKE2S_IV_07; // ^ f1; - // printf("v : %x\n", v[0]); - printf("\n"); - printf("Round 0 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); + // // printf("v : %x\n", v[0]); + // printf("\n"); + // printf("Round 0 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); - printf("Round 1 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); + // printf("Round 1 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); - printf("Round 2 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); + // printf("Round 2 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4); - printf("Round 3 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); + // printf("Round 3 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8); - printf("Round 4 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); + // printf("Round 4 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13); - printf("Round 5 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); + // printf("Round 5 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9); - printf("Round 6 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); + // printf("Round 6 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11); - printf("Round 7 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); + // printf("Round 7 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10); - printf("Round 8 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); + // printf("Round 8 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5); - printf("Round 9 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); + // printf("Round 9 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0); - printf("Round A : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); + // printf("Round A : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); h[0] = h[0] ^ v[0] ^ v[ 8]; h[1] = h[1] ^ v[1] ^ v[ 9]; @@ -191,13 +191,13 @@ DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, con h[5] = h[5] ^ v[5] ^ v[13]; h[6] = h[6] ^ v[6] ^ v[14]; h[7] = h[7] ^ v[7] ^ v[15]; - printf("Final : %x %x %x %x %x %x %x %x\n", h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7]); - // printf("h : %x\n------\n", h[0]); + // printf("Final : %x %x %x %x %x %x %x %x\n", h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7]); + // // printf("h : %x\n------\n", h[0]); } DECLSPEC void blake2s_init (PRIVATE_AS blake2s_ctx_t *ctx) { - printf("Init\n"); + // printf("Init\n"); ctx->h[0] = BLAKE2S_IV_00 ^ 0x01010020; // default output length: 0x20 = 32 bytes ctx->h[1] = BLAKE2S_IV_01; @@ -230,7 +230,7 @@ DECLSPEC void blake2s_init (PRIVATE_AS blake2s_ctx_t *ctx) DECLSPEC void blake2s_update_64 (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const int len) { - printf("update_64\n"); + // printf("update_64\n"); if (len == 0) return; @@ -340,7 +340,7 @@ DECLSPEC void blake2s_update_64 (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS u32 * DECLSPEC void blake2s_update (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len) { - printf("update\n"); + // printf("update\n"); u32 w0[4]; u32 w1[4]; @@ -397,7 +397,7 @@ DECLSPEC void blake2s_update (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS const u3 DECLSPEC void blake2s_update_global (PRIVATE_AS blake2s_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len) { - printf("update_global\n"); + // printf("update_global\n"); u32 w0[4]; u32 w1[4]; @@ -454,7 +454,7 @@ DECLSPEC void blake2s_update_global (PRIVATE_AS blake2s_ctx_t *ctx, GLOBAL_AS co DECLSPEC void blake2s_final (PRIVATE_AS blake2s_ctx_t *ctx) { - printf("final\n"); + // printf("final\n"); blake2s_transform (ctx->h, ctx->m, ctx->len, BLAKE2S_FINAL); } @@ -462,7 +462,7 @@ DECLSPEC void blake2s_final (PRIVATE_AS blake2s_ctx_t *ctx) DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32x *m, const u32x len, const u32 f0) { - printf("transform_vector\n"); + // printf("transform_vector\n"); const u32x t0 = len; @@ -509,7 +509,7 @@ DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32 DECLSPEC void blake2s_init_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) { - printf("init_vector\n"); + // printf("init_vector\n"); ctx->h[0] = BLAKE2S_IV_00 ^ 0x01010020; // default output length: 0x20 = 32 bytes ctx->h[1] = BLAKE2S_IV_01; @@ -543,7 +543,7 @@ DECLSPEC void blake2s_init_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) DECLSPEC void blake2s_init_vector_from_scalar (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS blake2s_ctx_t *ctx0) { - printf("init_vector_scalar\n"); + // printf("init_vector_scalar\n"); ctx->h[0] = ctx0->h[0]; ctx->h[1] = ctx0->h[1]; @@ -577,7 +577,7 @@ DECLSPEC void blake2s_init_vector_from_scalar (PRIVATE_AS blake2s_ctx_vector_t * DECLSPEC void blake2s_update_vector_64 (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, const int len) { - printf("update_vector_64\n"); + // printf("update_vector_64\n"); if (len == 0) return; @@ -687,7 +687,7 @@ DECLSPEC void blake2s_update_vector_64 (PRIVATE_AS blake2s_ctx_vector_t *ctx, PR DECLSPEC void blake2s_update_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS const u32x *w, const int len) { - printf("update_vector\n"); + // printf("update_vector\n"); u32x w0[4]; u32x w1[4]; @@ -744,7 +744,7 @@ DECLSPEC void blake2s_update_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVA DECLSPEC void blake2s_final_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) { - printf("final_vector\n"); + // printf("final_vector\n"); blake2s_transform_vector (ctx->h, ctx->m, (u32x) ctx->len, BLAKE2S_FINAL); } diff --git a/OpenCL/m35000_a0-pure.cl b/OpenCL/m35000_a0-pure.cl index bb45bf304..07db0954a 100644 --- a/OpenCL/m35000_a0-pure.cl +++ b/OpenCL/m35000_a0-pure.cl @@ -48,10 +48,10 @@ KERNEL_FQ void m35000_mxx (KERN_ATTR_RULES ()) blake2s_update (&ctx, tmp.i, tmp.pw_len); blake2s_final (&ctx); - const u32 r0 = h32_from_64_S (ctx.h[0]); - const u32 r1 = l32_from_64_S (ctx.h[0]); - const u32 r2 = h32_from_64_S (ctx.h[1]); - const u32 r3 = l32_from_64_S (ctx.h[1]); + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; COMPARE_M_SCALAR (r0, r1, r2, r3); } @@ -101,15 +101,10 @@ KERNEL_FQ void m35000_sxx (KERN_ATTR_RULES ()) blake2s_update (&ctx, tmp.i, tmp.pw_len); blake2s_final (&ctx); - if (il_pos == 0) - { - printf("ctx.h[0] : %x\n", ctx.h[0]); - } - - const u32 r0 = h32_from_64_S (ctx.h[0]); - const u32 r1 = l32_from_64_S (ctx.h[0]); - const u32 r2 = h32_from_64_S (ctx.h[1]); - const u32 r3 = l32_from_64_S (ctx.h[1]); + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; COMPARE_S_SCALAR (r0, r1, r2, r3); } diff --git a/src/modules/module_35000.c b/src/modules/module_35000.c index 6519628fc..e272c22e5 100644 --- a/src/modules/module_35000.c +++ b/src/modules/module_35000.c @@ -22,8 +22,8 @@ static const u64 KERN_TYPE = 35000; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_32 | OPTI_TYPE_RAW_HASH; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_NONE; -//static const char *ST_PASS = "abc"; -//static const char *ST_HASH = "$BLAKE2$508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982"; +// static const char *ST_PASS = "abc"; +// static const char *ST_HASH = "$BLAKE2$508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982"; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$BLAKE2$2c719b484789ad5f6fc1739012182169b25484af156adc91d4f64f72400e574a"; @@ -110,10 +110,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUS token.signatures_cnt = 1; token.signatures_buf[0] = SIGNATURE_BLAKE2S; - token.len[0] = 4; + token.len[0] = 8; token.attr[0] = TOKEN_ATTR_FIXED_LENGTH | TOKEN_ATTR_VERIFY_SIGNATURE; - token.len[1] = 32; + token.len[1] = 64; token.attr[1] = TOKEN_ATTR_FIXED_LENGTH | TOKEN_ATTR_VERIFY_HEX; const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); @@ -124,13 +124,13 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUS const u8 *hash_pos = token.buf[1]; digest[0] = hex_to_u32 (hash_pos + 0); - digest[1] = hex_to_u32 (hash_pos + 4); - digest[2] = hex_to_u32 (hash_pos + 8); - digest[3] = hex_to_u32 (hash_pos + 12); - digest[4] = hex_to_u32 (hash_pos + 16); - digest[5] = hex_to_u32 (hash_pos + 20); - digest[6] = hex_to_u32 (hash_pos + 24); - digest[7] = hex_to_u32 (hash_pos + 28); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + digest[4] = hex_to_u32 (hash_pos + 32); + digest[5] = hex_to_u32 (hash_pos + 40); + digest[6] = hex_to_u32 (hash_pos + 48); + digest[7] = hex_to_u32 (hash_pos + 56); return (PARSER_OK); } @@ -149,21 +149,21 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t * hashconfig, MAYBE_UNUS memcpy (out_buf, SIGNATURE_BLAKE2S, out_len); u32_to_hex (digest[0], out_buf + out_len); - out_len += 4; + out_len += 8; u32_to_hex (digest[1], out_buf + out_len); - out_len += 4; + out_len += 8; u32_to_hex (digest[2], out_buf + out_len); - out_len += 4; + out_len += 8; u32_to_hex (digest[3], out_buf + out_len); - out_len += 4; + out_len += 8; u32_to_hex (digest[4], out_buf + out_len); - out_len += 4; + out_len += 8; u32_to_hex (digest[5], out_buf + out_len); - out_len += 4; + out_len += 8; u32_to_hex (digest[6], out_buf + out_len); - out_len += 4; + out_len += 8; u32_to_hex (digest[7], out_buf + out_len); - out_len += 4; + out_len += 8; return out_len; } diff --git a/tests/blake-test.py b/tests/blake-test.py index bb9b9d104..03e0af9bd 100755 --- a/tests/blake-test.py +++ b/tests/blake-test.py @@ -5,7 +5,8 @@ import hashlib # Python script to create dataset of passwords/hashes for testing PASSWD_FILE = "500-worst-passwords.txt" -VALID_HASHES_FILE = "blake2s-valid-hashes.txt" +# VALID_HASHES_FILE = "blake2s-valid-hashes.txt" +VALID_HASHES_FILE = "blake2b-valid-hashes.txt" BLAKE2S_HEADER = "$BLAKE2$" # Password source file : https://github.com/danielmiessler/SecLists/blob/master/Passwords/500-worst-passwords.txt @@ -17,7 +18,8 @@ def createBlake2sDataset(inputFile, outputFile): # for each password in file for line in passwd.readlines(): # compute Blake2s hash - d = hashlib.blake2s() + # d = hashlib.blake2s() + d = hashlib.blake2b() d.update(line.encode()) # encode in base64 and write it formattedHash = BLAKE2S_HEADER + d.hexdigest() diff --git a/tests/blake2b-valid-hashes.txt b/tests/blake2b-valid-hashes.txt new file mode 100644 index 000000000..3cfd5fbb0 --- /dev/null +++ b/tests/blake2b-valid-hashes.txt @@ -0,0 +1,499 @@ +$BLAKE2$bbc7ad961a66ae406e05859918dd6979a32240c1e9e0482c64ab76d900099758fdefe0f0ab1f2ff9f9d8d55b98ede3960758b9cff4af6826fb4506713dc068bc +$BLAKE2$523ff429276912e94c32886a217c4b312d950b7fd18418176cb7bc1599995319882c0966f5d68bb735407caad86b37f7105c8dcb5bc280de67cfa4d63d8420fc +$BLAKE2$de4ae0455ce7517933e64c47b8cdde2aa5a0bb5dffeb54b6e87ec0bb9ab6fd725841ae1c8232ac96e3117c70739f7bd306dfa367090c74eb822186eb4e00954a +$BLAKE2$045f7d14d7bdb5d0aba2ea27bf999ab344e4cb2e54f5982b7c81443db525cd9aece53e3dc73892afcb958b137b031c8cad0892f8fb6abece7c264d1824005e31 +$BLAKE2$38cd4c7c7f3f9227b87100856a3a393c73f7f2beb78da059e47312549bb6d01050b3d342b5f4fc81a0346ae39e267766c462a300f1d6526def6e21426a332c18 +$BLAKE2$bfc877bc2a258facff21279383039ca6c5e4f98ee78b5cafa209bd3598633443908f9e533676cb38952cd8132241f19735b4929bc249937ec79349132dceac5a +$BLAKE2$ae7fec75d3060d3e531b31722a7d81053becfab3b0025e8b15dfb831456817690046a2054b1e0eae1e733449bbbf3c00066cf848421f6ab944a9992d6c9970a0 +$BLAKE2$b617653a8b5694ab1358c345774d245b1a1df5837ab73d4842dbf186b2fc76d8f370c295eff7d9511570c9312a668b5699de8bc117bd58a163f119b2a6684660 +$BLAKE2$9e12c61707754d49e33fa8aa727e54ba6d4383c4cdb1ed55080904e564d9448cc133ac99f20f418f5990562a06ad7869fee12c4643e0f1ebd7574612077145ae +$BLAKE2$b19c19d89c177b5cfcd9369d3e3d19e781566dc9264c5b964ef7f926d3cb47ed50ce664a0341f6000da11b3b5f799aab981fa85b76cd45023fec0cbb3be6dbef +$BLAKE2$dc5ec328215b4c6fbe1703bdf32d6be6d6a61d61d5c88656c2e5927a3d104e2b9c4dedf6e89500c721f2dca512757858eee6de75d025ada6ce60a92203a43086 +$BLAKE2$f96215c71d1fe92a3b905df337a9884589aa2e8afa2aa9ce3672cdf68b602872010d0a5eda1108ac7b4e3bcbebbd7d4209d07486ff93d723f585bcf62df22620 +$BLAKE2$e5a710a0e5cffec69624623ea811397d74210804c6da1b06c2c66e203b4829b3e6e3555c3522b79697ae337d41b84565e7f7cfaecb8ccbf56bc5b64e66a9b812 +$BLAKE2$c80dbde57100578d0b7de04b54fdbcbeb82fcb806937a5d80c284ae4a956b3f98df1b25bc40245f5561f4f502e24ed4607044574347ea5e85a2d0ba026e17743 +$BLAKE2$f91cbf5ccd4ef658e72aefe41a99f252fe4f1812824f771434da8db6433719de728bb30997a548e8014f2dd4bb9527d6c58533850b3e0d7339fa752942036c53 +$BLAKE2$2d42aa225892384642ea69389553796f59b1d0f42fa33f89beaa206850d12b4fe34c6dd741cb49a0796778b835fc893f31197e78dc4d8cdebff35cfad3963769 +$BLAKE2$a61f757c16c3f70e98e1d662a79457b9e5a01cd62eb9ba1caa1854969c6317d6acae497f96821c3b20c4ff89eee11627bf189d6efe3016b3093c2fb3e88a522a +$BLAKE2$fd4519ee16e6f64b0f031e413d181eff83639721dcc214184f74d0961e7fbcba756eed1517113e754a939cf53b77b666aae30fcf95ab90db0dcdb9586af1b1cc +$BLAKE2$058ab3e0d2ed91074a3668c37e4bde111b0812c53c8c339b9566593bae3ef382b5e18d1d6d5f6710cbe831a1ae322e978ff9732b5ab4aa805193edb6055da8a3 +$BLAKE2$e88015a6c16d9ee83a888920fde35b92ca6e22071ac7d54821ae3c76bf03d297af85a6e9bc98f80269ce981a8fca34198f2dbb3682eeb096fe54eda7bdf5766c +$BLAKE2$8ab50927cafa3f350bad9beae292d13f8f909b85a32ecb4122301a33359a6d16afcc97e8642697385f1d72abd0d91f297d6d6ef9776820f70a631a02d7cbdc4e +$BLAKE2$dfada3017bae682228b354f25eb761a988744fe3030c07c2c501e543084c4af753136696f7263a94d15dd90d3925aadce8d0c770b4dc26de33a1a846ec6952e1 +$BLAKE2$8d77ed16cea34767c30cfa42d3b51c3ba1cadf198bc8d49e89aed8537c7b35bdf10861fceb18610e537c60c707e8b0795f25def75a73265fd9d5aab6cdedc064 +$BLAKE2$0ca9d5384197fa60ed5a79a9507c8ae23d4b336bdec622846680c372e59344364ff462ee1c00283da7b3cdc188744c8f0761fa5d6f1968738f7b4557836ee748 +$BLAKE2$84c2f532a6cc4eecffa13aeaf5984ddeb515421d4a5377028e237ec2f7a9adff6bfae82e9f25751c779d6da8244b3a556cd01a14ed3ddd56a41856e25f4b7bfd +$BLAKE2$bf642227ee4f9a9bc61b7bf986e16f6b0e6102586478f18a783d5b455a1591d2c951b3dc8a93fb33f3a96b4821085f1e91befab38b73c3c59280a0dfd5f0b2e4 +$BLAKE2$f4ffff8b36486ea85bee8cc6be91880a8f2e5f2f89c0c8c11b06850f86eadb2a720ba52ba9595baa5272effc1f0c67de03ec738d4780d9631ce5d2dcc3417bd3 +$BLAKE2$dcbd18cfb30b2ccc26453aab495e8b0316ce1b770bbec638ac40f9c6f14d2080fe1d8727f1374f17590de888e9e7119bd051590b83845d79094be5a647cc4880 +$BLAKE2$9e417d49a556300d2416d15aa3ca955a47e717c4ca8ea7d4eaf7178dc735bda90e7aa30dfc27b687455319528a8d71c5ee141a97e90859aad8ae2d0ff04bbab4 +$BLAKE2$34073762db7af5008c7213f93390e0e7b73051ecd42d49f3633c82c9af0caff3fff74f09c7a6ff72ef309a584c8dbeb0cbda750fb08bdaa88ceabfccda650c35 +$BLAKE2$3edc72c578caa0dd31116ab9af1d3b173a1b8ca51cbff4774b84cd873233b8c1845dd479c26b96bcc7e90e9b14c9f1313901bd8c5faad251416b1e518748e0ef +$BLAKE2$40977128880e41d2876f4ad3b13423691c88652a0de98f332c63f46caafdf482c85d64a94509f375406979d109abaa603cb6f0a67c90c7772ca3d14bb86a1406 +$BLAKE2$76e31dd75cbcb564ae337f9c33a7a61c65eb299dd4e9b4f396f3e5dec34cfb89d882daa7432bf4345265479c6e9b2b3a8d8fb86ee8d5db7286042dfb06b1a419 +$BLAKE2$b8433fefacae17439aa80855b9ae398c08080271652aeab82db8fd191ac0ea828d7d56cf7cba513f07f4203530120bae0e1e6b89e9886155220c26c234d4c265 +$BLAKE2$2d9e931f00022eff0a6f6f78df1e126d8566f1eaef9726f0cf848b52567299260629d2a5707a3220ce91feac9aca9ab7a9918f5a90915f9419f791cf94320253 +$BLAKE2$e4fcb6f3e0d915fc7e77c0d34ba75b8c2fe5bc3ccf84f0c005122a8e191d198ec7cf8b3c629b524903ba00a69bae267fb8b530a4940c6281ad0dda13bd81603e +$BLAKE2$299b1918c3040374dd05fac37eb4947dde6e50ab0c5617a2627ba38048e2410fa43e4c3513698ab9bf04c9009a1d20edbce8916cfc6f98d0ccb5e14dabf5940f +$BLAKE2$d7664bc50dbd5895e3c6d4d7485f7c0ebea3ee980eb740f236f0dbe968ff29c5efb08a84014a0a0a20b7acdff252fae50deb8bdfe191284bc2a97e07b72fbfa1 +$BLAKE2$3bd285bd1b83a0fda20f6de7c3e4cf62e171ccafef582d77a764fe5221da2c2f42a524aa8df29c49b29aa96015edc301e9b20e68eae3582dc0f2ef53f5717b40 +$BLAKE2$72e3611e894781726108abcae3898b4efe333e8a295365c36ea7931cb784bc53f952d1488f29fb01487c068530ac48a0ae44c85d0547de44d5c08f17f4baa557 +$BLAKE2$648836f005bb1067543e43a59890977c41f93e4075141ce27a27da0c567685a430fecf3f00ed6f8a110e0729735f1a7571638bc1ceb1368ca30934a3f2923da1 +$BLAKE2$81620e9ec9e77334e9def4752ebfe7b3492c77d5e1f2aa6fe542be41eb0eafa3c281413af36cd258ad9b0057703a2855d3ad58b30f9525feac7c90c1428c2782 +$BLAKE2$f3a5285e853285d54b2b98e217e9fa2fa70b7ab2f09507d7e59699d1598122afa7e86b63cf56e666dd096ee27484cc2344784e6f6c25b8942ea1553f2e804516 +$BLAKE2$73634679d80cafeb2c989c5abce53a3512fe758fe4deef909ea8b6faf468aa57f8f13b93bc2b2a1fd614a75f21f2f2ac6fe488b643e2cfcf0a6ff885cd9f44a8 +$BLAKE2$bcc4c12d92679f4eecc81f80e327514e5f18dd42aedabe755c05a80ae8ea2f1f1afacbaa9e5986e2cb31867ab3cf910de34cbf41dec03e21b3ef414d77f7838c +$BLAKE2$192a8420a4f1fb1c869886154e847a6548e46660c18690ae452293c708253575c2323b5c54e8335c6bebef2ba9896ad60bb33c2386ee4f0412b8877fedd41d86 +$BLAKE2$b29a7d50938fbe2c4b6d2fdc8464b60c17cbf28940ee8a153780a14bcdd23031e7ad08c5faf217658f4069250ead30eae760ca36d8843351a763cb4ad67b773e +$BLAKE2$ae966a5ee740276a9c8b801c81b0a8e4000c13cbc39b238e656fb02a7b4c1a679b13f5c76e19cd68a5e070b4714aabf40d90c98381f2f35cddb4b6737e608ea2 +$BLAKE2$4404c97c4726bf03a2fbb05196b4adf47f069f2e29a7f3aa5c977b96cff169c1c2c99027e379d5bc45de9090423a89a4f9500d79c765a43830974048b2a00a54 +$BLAKE2$0f6aa44ebe67ccb526a13806ad1f923852881fdd6a448f580097bec741b5bc18e2d5d587a8b8263f1893a50bb00355f3bc1734839cf140840724ea248f6cf867 +$BLAKE2$5bb08b0096d514792194ce3859fc148957fecb9fb6fca368c8e18ef6bd214e10a142fc6ab7001efa174d607aed41902e1401513e3c0a95b3c47797e2a50691bb +$BLAKE2$40cda9799eb2ed92c5d6d5880146d69dd49e4f74f90493447015e99fb87b488733d40b940eac90521b70890a94757acb739ce14c5034827e63d6d0e599059cfa +$BLAKE2$63f20d9e88830dbe9c75d91a653b0892c8a7501bd708c05b7d9f4c4a2eebbb86aa2e105f0b63222c12935845bf8990d54aa37c968668bb79eccaff71bcb36767 +$BLAKE2$9de6524332cb4c7cfd743d4c0fa833bb0e0005d8c2f06dd870af5155e69aa3ecf32bea0983fd1e4da08f1102097904ab5dc9061d15b302054fcbc1ecbf83e8b4 +$BLAKE2$aeb579e66ce8f0dec496842d2d2b2040330d3e7bb90f92199d4720f0642b5ffec3a0ee08d30aeab14323c6edc02800cc8cfb871d93c968a92158d0843b66c2b2 +$BLAKE2$1ef098acb8ad3a9762e36abbbb1c0d462451106e41af72d98404336238d858017e7413531ae229fa03d22452eeb9537873282ec823a1c593349fcba2789a4e6a +$BLAKE2$bf817e36417f317e8393a57db95b1dd47a1b7257114a34d6cd197a8ad993faa80034ab76fe722ee84494dad13997f61d0db363b37545526c9be0ccae866236f9 +$BLAKE2$b907357d3bbf90d45f02d45941148df268b2222f59aa95e37dc70decec968d307a6646777ed2e2791000fb4f58479fa69015ad45d7a6638bb2c12e785483a75c +$BLAKE2$33cd9288a367df4699f2aba590c0ae90bf477fccc6291862213909de2f3209cd00755114766128519b3a42f17a3ec600933fb3b416a4b22073bbbd631446912c +$BLAKE2$f69e4d9d019007814f9eb5ee668a195829edc16d1b632b5a8cfe3eeea234bef70306ac21b6fd2a7a3f4ae6bc01860bf95b0634885f2a33bd6aeea3eb2504e727 +$BLAKE2$b79e0e4c534a029a1fdfeeb9689f9fdff34dcc76e7f7dd0cf6a3578534913a37511c7b7a697e259648efffc2d66f65a14e6460714d7232fd11d1a87dccbd50f1 +$BLAKE2$2814ce5293a2b48d83d36930937ece00c6ce67b2ebeaf2f75fdd2e4b848fc7ec3dd42664b0425e67f14b5b407b33ab13d9a88e64bbdf1ce2417b734c38472005 +$BLAKE2$10384443213bb2f79b96b8fe5111a2c13792c434fe6ad1c4afeb55758bffa540ebf734a1fb2b55ebc603cdab6e7e330a78b46d24a44a413882f20cb005162101 +$BLAKE2$3a38cb7a51122f3a754438e89c07dbcf0a98e20dbcc60a68848b0bd10b277e464b1cfa0fb4e11057897fc562091549f3ed7bb366852e15264165b0183163c664 +$BLAKE2$c3d8602c8cd15bbfe9cb8d878ae88f14d35faa01bcc2e0377f5ec6e14106a7cb1ce8b70ed69eb5138796bb6ace49e404510bf54f4e6886e7751fa601bcb5753e +$BLAKE2$37c08100dbe0046db60a35789b4db4afe8ca498a81f1e49755260b0a1d13b4878017dc95c2ca01a740d5423b628986c3053151e85f601d3c92e130d1319cdedf +$BLAKE2$5e8792612d3f1edc812826950aa4b541645c5d1a8a91cb2fa092787f0215940412987de9a94396b2965b04b1156960e305dc11433162f59e4d195643d987b0fe +$BLAKE2$c387acdaabd7c7cee953db11231d23fb542af82424099e95d3f29db709e5ee7d81a8448c95f8f688efa40aff3b5b30c269ce9329cb14cd96e7c23731b50c5746 +$BLAKE2$3de310eb0438b527488f21b9aff8b9cad66c2654f80a7b60824585f5471aeab5cf041ccae616bf4a643387a05f96b09a361fee015eaa1896cc3b3d8c71c991df +$BLAKE2$7760882c0b89c981db5f3158ae9d11a140d818a2eaae9c9e015ba9a5ebd072e0135b41e57be632437d791de7b0b8c230c57f2cbb59173eb6d57528d3808aef43 +$BLAKE2$238783f92f30526e478554d3777ee393b81f4c778c821ebfd9b61903001dc9511f685c0a722cba2d57e78183a9d0ecc5682beb0bb304f5153357bb52db0ab5a8 +$BLAKE2$592f4da49d55d040c7e16cf24dcd94959a0fe3229de21372f276c557a67a356e09ac9bf965f610618ec95e8e758ca471e5c25276bba0357b448a4b1eb44f6896 +$BLAKE2$a1f59d519e90432efcbce502f6b33a73c3caf2ccbb74a7552a7ffbf72f8b99ea53c82101f3a3eda158db70deb31a84511283aca1d0bb1031ab96e650de06f730 +$BLAKE2$2b5ea3feaf19284dd0d0b5b08dd717664c97ec83d536e202be972f5166ab3f5df9dcb23eaeef1c56d1a724496d0dc622dabc43be3e98fa4cb1896aecac42797a +$BLAKE2$bca35b1b0304a166986ad716c125f847e65868ffa8ceef2ea30768b94298e6d15f8617430eb8f1c4738e0476d06493c87ec809cfbd68b66d3a36b09834625f7b +$BLAKE2$3440c563d627fb6f9da4b9be5520f01ceef3ae6d34dff71711d03f904630c9282b351e3775090ec13b2813218a21fdde5d6c0fd9e3160cb5a7bae040f68a4c73 +$BLAKE2$c4794b8a22821a496b31abc6946b596bd83713c9e187d5a38f39397940684ba45a8ab5d2ecc980cc5dbabc7ee70b5962e05ee4cbb574b2ab3cd5f9b89200c8cd +$BLAKE2$dad97608bec34a0efa2aac02ee3791748c08f996ac049af6413938aa5ae4f0d0377af31a32f906de6576dbc5eb6fd2545b72d2e6ffb6022100e897cdf8b8e215 +$BLAKE2$60b65325f50a6395ebc6d00c335385ce95bdc22e0ec7516b315eb5a62a7044e9ff49f120509a5a4efda3d68362a9de6851f56cedfcc12e179a596e8930f03f8d +$BLAKE2$6f194bb015b189e2ddb7e307d0ea0fefb7055e5a2d5c33c0e06fc56c0b127b0918c168f6695d5be46824a9e4d966f7c78ed725e02dbc88b43c31e221cacde60a +$BLAKE2$3d73e2087adaf2987b111a575ed421021e67f204b5982d6ecb6c6138bd224fff1673e5934551ff0992e76a19d1170b8e2477c9968075a9ad02bd34d99c2618b2 +$BLAKE2$96d696acba033749f729ae588ffb84c8c44ccb9b525f082c6986b876d730a32bc17ff899bdbc4fa34b0a793371026882a5b73c5d1cfd7e859c1db17e5475f06d +$BLAKE2$30e20d0c74b83a31ae5c2c27619473df556777f004dafc74cc018ed5a6b92ad74af62e3458377f111400086033464605122fc62cec8dcf9d01579c376dcce312 +$BLAKE2$00b9819e6a2722829f0c1386e3544d7481623d5298a0af5157ce5aa677b14be95523ca362da0532eb335028909096fd60011970fdd595555005b105ba320c81e +$BLAKE2$14c4918b437c520426913320c784c06801f7a4a20a8d5ec43e5540c8ea1091acf301c6c14ec0ae7bcaeb4b235c17ac7b2f0420158bf0851c500d5c3c6ddc217c +$BLAKE2$934da00ccdc584ce7c92e3fb8f2c6f165978fb7f82aee2abf70597eba775687a47657326645142fe227907b954aab76a4e8388c9be3a44d028f956d21c458ea6 +$BLAKE2$398b76d3e5104601b425320cbd3ec61a2ad299047d54b1e103b740708992c1f89d2ab56556820e2db26fbab9147d446da3fd8317a4d619f944f3ddb0ba62d101 +$BLAKE2$af76e192e8851904e565c872ae6aa9befbdb999a99ed148af7aa6a508f5fd35d39de4b208a486251995c1a1b7ec86107aee7ed03948874d811e57a940684a694 +$BLAKE2$ac8581cd39ec0ce0002a3012ecd6317c30a75366f62e033805b22e0d2ae32d026c5d15f3da34b14a2e89e308e93d7d775ee84c67e06f2297cfc02a8f34c3a4c8 +$BLAKE2$d02ff5c7a98558a1edede0b9c4729d3608e61919a2670afac2ca16700fe3053f37f74b0b210288828e60516a42fd3b53aaa782618bd839e112c7eba287751eb8 +$BLAKE2$cb85d54343717e3ee47280ee200f1c91dfe717e9f554d20638b8a6a49fcd1d24fd5f772e47e3b000e85b8a3183e8f0f33e3f9bec1745d25aa75554ab528a4e08 +$BLAKE2$92d33f2760d8d0c4e25ca298a5caefcde075241d32b902c32edf0ef2211ca2eb3a29e9882d989e50442beabedde53f921c7d473460eee05fe3098512d0089642 +$BLAKE2$f6a7445a630aef0003397f6702972599c0aa623517420aff7b7363039aac5bf4d4d0ba22828969f3208da45ee4a0d889118387c01ba6de1ec543fe4d15b2b143 +$BLAKE2$035347683dfe2c7ee7863b36bc4f750ca6482e4e165edff42bfb438383781123282701aef56aa05af548494e2233d02cf8e0a2b8917e2a0b98a7358573b7f6ba +$BLAKE2$c230df1006fac82f6ca00526810f6f88afce92b32e9b0920f406d045a3111ad8c2412ec0b37b2ec15c85363a0c85e6182e69dc9177c00ff180c8366b1b63ee5e +$BLAKE2$fc9cc8a4ce44e378251c4260a9aa4e81374bd718eff1113524ae963fbe097193c2ca237c8f5efb32e659ef83655b8ea4151a6d2341b0bc7248720e159d94225b +$BLAKE2$d1c7f5b916b55eb2dd1341cc99141bca588a81e500fab5c23e5c5f271d8169d120bf15b311978b5cd4267eae65d00815f15a3355ac2a7e4da1f26a72a318ef59 +$BLAKE2$f60ce482e5cc1229f39d71313171a8d9f4ca3a87d066bf4b205effb528192a75f14f3271e2c1a90e1de53f275b4d4793eef2f5e31ea90d2ce29d2e481c36435f +$BLAKE2$d08e7d762c7b9cb61a7ffc26c5777777212b45b199706d27b3b670635d8ed4678bd5163243df245e637d7943875595a9b75297ee06d69cdb5b787a6f2a94c810 +$BLAKE2$2e14c5cf9f64098be0ccf566f919a8662ad30ad7be2dcd22dd54fbdeab4e178e9584cb39eb73b5f89b622f325a137a920f995c8f2304c966214781e0a38c6c90 +$BLAKE2$4d1ef607bde261ee96fa73660f5ad3ce15d7864639e320b46969e412ed6163bc677a61f9575b3ecfba6971b5f66580b4a12eff1938c3834c66d9061aeb17f478 +$BLAKE2$992364dd60a82728fe46a2c14a8ae0853c02fee8dd73cc6b0051d7a194a1e8e2eb403722caf511e7643f96d76f266e6cea6058469e8996f2fc5f003de0eb9471 +$BLAKE2$5390d1dc7914448c578198336df013a00af2ad64a30eb756d19277dbf9c2eb94ca2f57c7b1dfb67e62605efcc90261f0abe98a3913ae5c598e04fd4f98ba1722 +$BLAKE2$bf9508ee65b8206ee8f6a7a2ca04d4ac99f66c019356c4c97b3b5156e53e3bf55fed66e9f8d6d5fb8c7bb417e96e076d283d77ac86d1cc314af6d86ba0fa7240 +$BLAKE2$1d5e3e39446ab0ef7d079b6dd31a388088bd015957a3aac060f2cb5971152983ee2fa87f5fc5cb360c46bcba767a9b6a8ff75ceccb96f93b298f91967c44311b +$BLAKE2$90f3cd4364ab2932c1b8e9835a5ecf7a976a7943c58b99b9de4df1cc43b6bb91be06e09b43de5bdd28b37bb511b848c2494ba0e768ce8028ebbdcc546880ddd3 +$BLAKE2$1e388ef7908b873aa0b3c0e39d093ae741002416891ea0eca72cef1916eddcead13af2ed492654ca6f050092d0a1c61586f0192c8cc0f6ac1e2cbc68ed6e249b +$BLAKE2$ff348ce9c09b05b7eb1aa9a71d0454af0ee4d1cc87b29465e97097a70cd852a0b8a7be78e6a7e6054c145dabd0640dbb81e03a01bd2d36386867e0c393c51ebc +$BLAKE2$f445afe3693d01141327259a5832b9d83b31d46b482b8559e02aa6203ed4d445b5a805e254387280c00d6daac2418de6405c1ac7c4f2d4017647ed3ef81f48fc +$BLAKE2$f1e5eba2986ca4d5defb8521658e9508c6e688f7b806a0a5af775ab67fabbf6da7da98a654c6a5f09f19bd20b6a7cc87173e40ccf60038a72b20634008e93643 +$BLAKE2$9bdb70be7cbcf9cda59c377c85e2705e3dba21b39b6fba325fc755846ba7a38122ed898c559645f8a3f9cec21fe05cf5eb6cbb078ee577ec4cb24f60c9c4d9d5 +$BLAKE2$848f870aaf4e4e33165f7075f4f62dce069a1b2fe96c7d6c85ae0e0c1a0674e1af31a5e7a6446ed9a186b77938f9447fe85741a39e7bbbd1ade0829577797f6f +$BLAKE2$094fe151b84ddce9a89e06c953f3c88fb1e98c26bb3c72019f5b0ce571f1cb7b116e4daaba47b55d16bcd91aff2d96789c05e75a703ec6b73e313808e8f66107 +$BLAKE2$762bc6217ac76e5b5af8621fa325e7c3237b1a3d82826da726f3bbbd59e7257da8973aa732dfd2eae35a89d29d41858449a535de511e46c648f8d056cba5b685 +$BLAKE2$d5a7d20bb933ee598e69a15bda9b127a119b420b0b6984e97b034edc6e03dd3482aa099dce6fb004ea4494496afc75a42046d75fbd61b494a5bd3f2d08e0d1eb +$BLAKE2$7a0942b7bf16c6e60140c6b0e40a1aa0d95c1508e2c726e67fff396dea92480d84f5775bf31c9dcf64930a97d87278266eb6e84c508c87692895f8be4c0a5dfe +$BLAKE2$b6f37fbda6006d98dfce5b38243101980df6a6a03fb72e6f926cc0ace2a39f4fafea60aa68b34027420163cddc7f2a6613b59af4d356974f384509daad46b8de +$BLAKE2$9a8e56eb827436b51afa1028b56091cff5a8acb3637d3ef23862ed3d1926a843d29d63ccc60ced2f33ecb809e51184b14d1fa6b199751ce4af939ee21c0d6d65 +$BLAKE2$09cbdebb14368c20c0877345df01551efbd31dbae5de498342484db50286746f9a82b70daf2489fb24f9bfce2ceb051abc86fc009800b4ce8505db5d04be55fc +$BLAKE2$7d5a10d7fa8088911344c954c2db35cf51ad7a1cd0f235f8bd6a1453b56f3976a1e434562524f261014aaf9d8ea01bff72673cfb284bc9f05da45c0568c3c874 +$BLAKE2$c75de0053d62e3bbd733424324da7ba4b9a387a630b0bfadd1ac70359fc1b34b7f60a0c899e4288ed9d924353b81e6f1691600b9704188b6c488fac57915dff8 +$BLAKE2$22abe62c991eca7f085a3ffb222d50aab0c3de9fb8507dc3bda9b68b5d62a61d43db1471dad4b7b32988dea6590c64c5ed0583b1f38cd469e99739b414f70a15 +$BLAKE2$c18afc137faa059e54e15ba169e983958b5fcd3b332adb08e3794145e6fc51e42acc5f4f5f4c706d790bcf1b641ee9db1797e3eda4b3ad8bfa7d61955382e1a8 +$BLAKE2$11e30423546e3fb0089c5f02f8926e1f9cb45f757134dc895ff299e3038c28b8ad3c91133857e902302be637193a87c6017fc73ba219cd41c8fef69b68670175 +$BLAKE2$9584007b0517cf13036e4372c5d7cf982c0ac166c945906fd81ecf86af722bb11799a11e46da291b2caaaa38b3b4c38aac6076812c2afbb3096892ccd12612b6 +$BLAKE2$db4eb5dce763a3e95097db5aca042f66780a12d2bf391d8d2c899f361fdd14fe4e83655f06dbff4bb8d2df8dd6233a78dee734f51c3b3530651fa5e0b6f8a489 +$BLAKE2$eecbc92bf3dd96923949de2970a30df0018d1d5257881d2dd5d7f863f065c94c4d65a105754f44ad8f620972c5a4c260bcc6ffb99369deb9a8b8e0c1303ac44e +$BLAKE2$cadd2650e0db1afaad87dcd64d13bca2b25bcbc2a7369f3e8f015c4ecb1dda4e05eda4cc7280ba58951e7d4bae7909bd5f5cd8b9cf68675b67e7fac301a70321 +$BLAKE2$ae77cabf0a5bd3c9013922f648b59b88e313248cfa49eb9fc1af59c4382fdb9144a0c69efcc4c1d6dd82d817036c4b4135a5c4484bf938e7234763dbbc39787e +$BLAKE2$b49dfd3c9eab0fb1c4e89b66e4a088158d71934245990a1af91d151c9aa8c94d9ff09280d568ffdeb08bfa4015278a2d0b1601a00738c06e10cc6e53c75179b5 +$BLAKE2$276aaf4b9da377ec1c30ec3d4a556628781de03fbcfdd21483d3c8ff68cfb245b24f3782a9650241ce056d9857f6b452c44fd00bed32b9f8bb3f7546fda7f9f7 +$BLAKE2$72a8a78430928114c9e20e3c5795347da0e5e3ee8f0060801eed0c5904cf5c3e716fd9829074b3a812a0c34e4272f718529cffc02c43007f6c3357aac52802bc +$BLAKE2$19777eac829e36d79acce82682626cf7138b82f2139b16b8fab97bb1d03ee5cc13a537dd3d7ecbe6d70083807bcc0a3e93dac96ee69aa09fdc5be01ee508d1e1 +$BLAKE2$46d2d749e4d6f087f9e0be07b411b8822eef407181abef8c2a4b508889147213977772e26f2754e9deb55876411aa3941b2e1c681ae3017cb2a2e26d763d54d7 +$BLAKE2$7cf9c415754d09b9ee6fa9f538eefdb3db8a1db3aa06999dfda3d6de623d9b3c63835e6b81f8c336252073c96cfddcc50ba4e68ce08e0fea32ddd443277cd0e7 +$BLAKE2$1727dd4711fb44c31bfa54a34520f35ce2127e54b1164f6a0c8ba06d6d859215bb2df44d8e031dd151bcee390e7ef05c3c10412a7b1e485fc308d85ef2f38f09 +$BLAKE2$a7f56c3861ef15be298ae6452a3a542f5b820aaa4b80fa00c752c94976cfdfd68c6f488146d3b14fa5f1a979e7211e0462bb628ca56a81569096a36477bdfc50 +$BLAKE2$466e37494cf6386604c4cabbbc7bc758595038b2b7ac238f066b6112b388065f684dc27806453c4c6533d723654c9b9af4b3692d83e78414a8f5ef31a39d701d +$BLAKE2$3a9d5a6ae1594efcbeeda808e763b284b65a062ff6f449f5406fd7039357e9c04041408c555e0819f7cb0e03a7c0a2638f3acf3bd2bb1dc9a0a9261f7f4240cb +$BLAKE2$76d69daa24a18df81bc22e082508688159759cc29695910f019a59faf7deb47a0eb6265fb43d1b71c5cea0432d350ddba9d3f20dd0ec3dc04b30f464ee8b0af1 +$BLAKE2$6a9832956b27c221f6474640033eef41b17e72ebece015943d0899eceae382f5d645bc5a4b1ce7f86b4e13344d0bc5b77164a59ad2862f72ec31e59e7b1d193b +$BLAKE2$8ad06b13f9fbbac6ce9ad8c3c8a6735678239aa394218b6d24843540a0eca4b1880a3cdd04dbff81c81d384cae0e0ab76b5f52a3ac7886a976bc42f76d9ec3b9 +$BLAKE2$25e19b79fd2db40dabc8aa56897bbdb7ea4d84cc65c580d84fdb5955b3fe45fe9e1cc390af2313082b44b19c419699b3fef543cc1e11468a06aa50f9522e9824 +$BLAKE2$53cfaf986a0ecfabfcfb89acc2d3e94b84d1797a9fca485c2ab0b093c47b3ca4b04ea2bdf1a64145300fad6d3c961d84b038bfb75c77af8d57345fef1663c14e +$BLAKE2$e6a59472eeee096b99a7a058c7d101d46acfb70509c5d23dd8c0044e05c62108a1730c5798d5777384ff78d30e42ed5b11b2983b19e27e796a8c0d8497e60305 +$BLAKE2$f291ab0fc85c1dc629d2a929835897a5adeecae1de29430685b043d2017dd715f4f03966db3adf2df9f1c284bf6c4e2f1be0d46b4741e2fac823461c48516ced +$BLAKE2$27d734c3d527a43007a2d3f409fe25cc92f57bf758dd71931ccb4d1ae68608eab292822186b260f2e9a6299561d113246d13bbf0f02b0523261f3e5b78abd802 +$BLAKE2$dfe10e04603036529a2baa9bd5e724e8efbba32ddf30d1209cc493506ec06fa206171e5836e4bcd90a4e0ca66035f4f3be414dc310b47857db8bee87c5ce9c5a +$BLAKE2$8bb9bfd355659d6027f8c8336e4e2fedbab83a1ccca080f79b2f8cfe2264071b623de38cf299e6a4ece0533298a746f2554e32dd2f595003eea8e3c71e3d4439 +$BLAKE2$60eecdbd1ba09c7b58dab3bdf1fd697e949a7931d5388de21a1740738ca90242c2f9b755926d1ad204b601ca4d6ff6dd850352f10d2c2be719cb72b65f1f771b +$BLAKE2$be04b6cc7a10f5758e963a4c21e824d64db3ef5421f13b6abf8a9fbe35828f503875fed4848409581e7c415e59f6b6b6dc213a9eb7957a6d72bf835b8006d9ad +$BLAKE2$d1dd62d0278617c658f5d30ea29f6accc3f440e00062262d53f2c3010e3a98758dc19d31635105d041e16a0ec66d0238f149214061fad97fa252b2028ddda530 +$BLAKE2$45f039766114677b936bfabe3ef7c6599d5466f174b8a088f3a4a46d7b174b1c7d937f324e0e1de96d34854837483864d6567d51847aecfaefbe5563cdb7921b +$BLAKE2$3a512b6ff306495732bb839d093d54d14c695a77399c9e01ed0aae00c7378a2eaac0bbda483cac0f7ff1cd03fe9186f45fbf3ff304889802335809c7f69303de +$BLAKE2$e49a33f13cb7f1eb03888de8c611c7802d25b338b1c1f94eef6eaa96918e256a53b14d573dc4c2068a76578c6eec43927378dde9262a3d10e3dc06287e659b40 +$BLAKE2$12e59ddb60cedead932540d0af3cbceb6c06d1a44a0725b76b587c1a882122a5f49efa171be52b7aaa0e2ca53154eeb3f1cde81c228f6309b00e24f15a9306d7 +$BLAKE2$cb2234115a19eb0f5637adf6f1fd19aceace969ec60a70bb834b304c7b0cc0d31528dbeab7381d41359f96f97743d20d51e279c22f7b07774fa31f0cdb21cf02 +$BLAKE2$e7a220a82d9fe83fb6889917c8009ca8de6ad6a32a9c875178578469b335c60b7bccd0b9c7d3a724d18a31bc11d0aefdb4ee0cf2656894b04cf1a7475cd2b7da +$BLAKE2$a1fe9f3a23adf810e348c43db6101df5990bbd648c31a11432ee8e5cec3ff2cf821e09b1ca17f06761d103e86d85ea092eacd1be1814964a61fbe6c30d33d485 +$BLAKE2$892cf9dc8c32ee8c2848d49cd2d206545a39ccdb197e92d5f412d99ca3d4c053badec2aefa683fe60f2e925b2bab94a852dc433840e70e38250faa919899e929 +$BLAKE2$030bdaeb053e6a0e88f4df5367f474b073ba0b0046addf1164428f5c7ea8e31fa76c43cc470af90be2d6640b2ed00464ca30a230713bab5ed360745377e19d0f +$BLAKE2$5806a642cbcf999c967b7327a749561f433ca1e2a20792db4c867eef2ee0d8b93cfc9aa023eeb812c72f2186521a2d1c9418bda55f2f9d352f229cb58c012a0b +$BLAKE2$224785362911970fe1cc3b1ad1e96497e74893df0270bcd7dde4c9d6cbdf3231d5a8fd3f44e1e1cc6715007f1f8ecbb8061d00344b26cef89cc62395b9bf429e +$BLAKE2$9341ccef732176fee99ec2f419ed813b93b70f4104c3795af281033fd67ec79e830c42c9ac4d908d96211c62bb4e0736b4d4100ceebda155e91c3f6d9bcbaa5e +$BLAKE2$c56bb153f2a6d0d967e6a5eaea1f202d98f6b879dbb4b6ec34d315a0ab5f01715ad73af63a3fec0e2ae89d0f72f25360cd488fab00eeba0bf994a37263d8323e +$BLAKE2$625a64601ac399f474c378c8186fca67166f21d72fba1ceb510d765fda0938ba74d90f1b51a4eebeb151e3d8fb63630db1cec7d10c25f9a52ba227974a7d38ad +$BLAKE2$ca1b0ab5e3e47cfd44ede718b1eb76bf4280165dd7f3af725dcb24780309a0186b55228976c35755f1b6282d64a4834a2f7abec7c7f7d14529ffe15ffb28c1ad +$BLAKE2$22dc580853fcf30528cd2b7594d5c6a18f5ea8c5281a9f1f748b69cf5a359d921b044e5c9570a9d850253d1538dd2b2a9456bec52e6b1fd51e741594065fb15b +$BLAKE2$dd204db56510f343a0f182f4bfd2891c618c01b1c5389fd2f1dac5f8d773890485e1e8149e8ddc21dd7cc39a4a72a0f6a4a380ee8b231a60767b7b976c6746fb +$BLAKE2$9e7992651081cbb7896b498bb0df91cf059664509142c3142e0daf07cd6ecbe4e0c343a0ba299b72872fc24197d5728c6fc90fc777e8905cbbe803152ee777cb +$BLAKE2$2062e63bcaee88543dc429b06bd1962dd0b7faabba2c29fe73dc6c9bcc26c809c7ff74aeb9e73d460fbf2897b76fae430daf3e52fdb568dbcd2af6cf9c0b2ef9 +$BLAKE2$97f11df09887b41f6dcc5e78bf40699798411a70f9749c22fb06203803ed43da5c72c30124c6caf6304c57dde14b1ed270e87d827768f7b33b20bd9e96880268 +$BLAKE2$202c9a7df89ecdad8bdabb0ae72148c31fe1fb72a7d79808bb961437d2e8072c67e8b907682c49b77bf8431e9027ef49f83828b601261d2a606c8d0e5a0ffd30 +$BLAKE2$d10e53f851150d335e1400bbe6fc03ac0393160055033b079a57b4cbd194d7f19a662228a9dc99e2d89601c144fdaa284a899b98474a32d421ae9b441d1d73a8 +$BLAKE2$19b7843aef4fb12853b2817f8563b6be85813005d5f13556df6effa6993c83ff686d6ff0549179bcdd80a116e2504ae88dc79b778a52225544b504e4ac7a1729 +$BLAKE2$5153410286f920304461aab35e73281ab9dc000709f16e3e1fd37aafd26fe08982313b2da12452d8dd17cc13f7c6aeb10d15d9bfef9e4cf4bb8f43e630803b1e +$BLAKE2$71c7006539b0d34c5f164c41f51ce7a46df35b8c2601071a433bc77e38c473b720f8a44e3b8c98dda2aa99e12fd270e8281ebddf7030378287ffe1c08410c262 +$BLAKE2$ba4bd25da47a37ff2d10d91fd60da8093bfaaacfc9d60acc118170fc4036f0f523850647554b8348276a3ad8dab015f0c3f7a5f868e09aa7b3af2c332b59debf +$BLAKE2$3a3858d3c276752b061ed3aefb59aea2a9d51b869eee0e30d3aa4dc404b0a550cc375769921d2c7c3ead33b3e228aeea8133e13364bd2f2054814abbf4108bb2 +$BLAKE2$ff584311083364e2e56498ac86fb9787b28e64db2bbab6684b4988a950b83d9e7ce91996465b123158ea7e2742bb5e66964f78999d5c40e7dbf3d02fb2b5a4a3 +$BLAKE2$2d98287cbb2f1ce9160fb8e278eb2bc9d7bdb04a8912b1ed209a7fea80ac65cba2bc97f0299af397479e1bb426fcd4307b2b852569d8ade1d727b56450d1c5e4 +$BLAKE2$e1abd601b49ce31f8574da2ff59367df66e5ecea97c04acdd041d7950b9b6c5ee38be8a45f4301a83ce25a5373c6b409c52b713302a540d197ea74fb9112fb8e +$BLAKE2$7daeec53dd0af28f658553bef0b9bacfa7195dbcbf90f03cc6d91a34493ac6a036eaf39fd44f3747589e7a0faade9b9e61ec56f60811d6cd1f087507b3da258b +$BLAKE2$ef918aa42fae251f920bbd37fecce9380d528a079dfbc0afc23dc3df48c2077bc24c5f2fde8594e290054c94becbb80e80849b4d40ff947a84d933dcc9124a80 +$BLAKE2$1d3cfdaa4bcb278e35d3d56fd85147885e1a86f71bc6bc82be4e1b7618e3e56f16cfc1f52f43b163f807ac0aecb498a162a11f614c3971c2c333e137d6f1d3fe +$BLAKE2$6f0659f9f80e1edd2ac83a29de519d7de4b94551211f7ccb8d6ad16b7af4e1d460e2e5a6459e4bbe864c2bb7b2dff042dbe084007de46de7b70ef10035231b41 +$BLAKE2$574b045842d1720bcba9dbc9496e40c08f851c7600e978f8208db8b2fb0e7c08f5dac2e6c9c91dd6b3ac93ba7eceb3eb5bafa2af2131b863ccf0e49e92d914f6 +$BLAKE2$5049def57b309032bccdc02ac6baa5053672477e80b8676eac9ab6afa03a81a2cd636f5c08d57c7513d9b6803ea08aebfecf6ad7200a532a5fb258755cb335c6 +$BLAKE2$6a97c64f5e8b4030058901e7f83d4fcd8c4313ca45b15423d897e2f3eb6f61d015ba8baef05e49d026cdb0033a83bc2b4f94320de70d6c7c1a11d155506fc733 +$BLAKE2$a199f90da770865c4cd792a3a833fbb5ffbeeb8b0e0cf27ad128a241a5c34efa2244de73f39df1e3578b43d18a7145a074cac5298997856d93205740b8e706e4 +$BLAKE2$e1cc3bf69a0aafb2c9575175f3fc3b0b00c9fb9879bcf1a0f3915434bdf113853a7a5087eb67b9ea65c749988bc67cc38e9cb152295b0aa997cfa6bbd05129fa +$BLAKE2$90dde2ac48156d09afd91d168dafcfdb3c77ed2bdb042cc8d08f46d72ac6ee8ce4360cc8cbbcdd578d84c1a54be37357b44c2d65a9acc7d1e251c4f153824b8f +$BLAKE2$4753bd090734731e869386d12f1f7c3bc588959506de7b211b315af4068f24e74b6eacad9da03dd0f22f22fbe8cbecbbe5f49f59899dc43a9f161462971013b1 +$BLAKE2$bfebf89aa4a232a5da1dc5d5f55064bf794f1173dea85fdcf48913b4924058b4f7a593d4bde48b1f29046dcbb07632e22367b461b6e999715ecb378df96c3abd +$BLAKE2$17978a5759f3f1a79ab17ff001a14120b1ebb8ad60fe87aa6a4d5762ff4a9f7089793a644b7aaee6109ba8744845a67de8f36cc90dff53ab200e90bd9f524532 +$BLAKE2$d121bd4015a4949121a4783f259a4b74a985e34bfb460390fecfa0cddf3b35df27282a13dd9b1c48731bcda8726c3c5021309b183ac6d9393bf4a65cc93f578e +$BLAKE2$547b935513f8cf3680e47ffb6919d41b6b5f9b3dc7ed44012f05dad753594d60d49457269e6d304bff603e20563ec2301b2e305aa3bebaa0c8ac964d035bad9d +$BLAKE2$cecefa09a3efdffc6f1ec548b66f1b7a0ecdb4e84f138fa7accfb7404b31cdbe40ea1ea9f5718995b767d888d381252e560ec6f6458308bc36ef7cef5de7520d +$BLAKE2$db5c8973d0d70dd25007cf3227ae49b23fefdd1b97ca8a0757747088e63d21b2b2545c8d8b17fd4adba0cd04c35817f0473f6dbc6034afdac46bce421973be2d +$BLAKE2$0cfccc2c11b9d9fea2a9ab4f6f6ddf51917db853705c21ab1a244b8ce4b5bbdcaf783f86b6a3deefa5da0f2ad789851386163e7541044d17518e05362e5d9edf +$BLAKE2$15956540d923b21de9873bce4fbb697b936d37f3000b062ec6c8751d90eac19ebe21115b0d56559eafc79f0eb9e6fcc1b8a4574381e2a12f5f58cbcf87bd0f96 +$BLAKE2$0bcb135026ee9a9030a05459a3222451c0a91c5986cdf5e61bbbcfea9ec43f9a5481c03efb0546a5b1174e66f99ab0a9a8a6522511b515ef5d1a6be7a7e036ad +$BLAKE2$6289596fa2990cd88402caa857d77b649d44998594ff2797feb7be29916b7ba426c8ae91b163ea58b6e19aa17306a88f2f9ca1825de4a84c1e97cbcc09d99aad +$BLAKE2$529f10244799dd60836588d077d68707eca53f469773437770d3db90bddd19f87d36c4564bea4b33ad275435a9a586645be0b8b1b5c7098629a5256ec166fa09 +$BLAKE2$fa94000bd14f609f23c2bf3fe5eae1fa0b7c40f1df94c0076fc6a9d994eb79fea9eb061de85ad34726d8fe811ba131a70748ad4ac51b60290e1fdc4287beb92b +$BLAKE2$eb811447f61f3c815c6eded4e43d4ac99f22539bb43d6f001120898f01ec268ac977fae1d0bcfc4648f0a25538a196722e1d28baa62487051fea3f668ecdef4a +$BLAKE2$daf77ada5e1c68b950cda65a96690330d575bfc547775f89eb7ef2a1a56fbb19238525572ad71dad26d944b2aa62c666073ddeabaf36ec37fe3faa76fb28044f +$BLAKE2$8c369c8507beac55b9e87d983702abe4ad95c831939efc7ac161c8387b7592378dfdebb68dd4cf6b5bfe66e614df72aa38614b827312dd0e6ddf9c730f799a0b +$BLAKE2$dc4a72ea598b3619c02bfd5f02fd548a672020edf7e93194cc961200e08783ced4be17e5df934f5899e2bcfba5f610a3a98142c226f95093d8dc62e36bc34892 +$BLAKE2$6d3002887ad7e3972887967a67e77317492a8a9fe2c3f13ca5626749d6f6b6c717c8798fff3dac485a59f93255096d6ee857e324a7c4432e99f6900941e0a5ca +$BLAKE2$1245775ca98e79f1da5ead6a7e16f539531ef27e2cf3fcddacb7fa3aa911f75046928c6359c73b896cd4ee03caea3b17a0c2ab3f779c7e11dbbde6245fc79afb +$BLAKE2$8176e41c7883d2ede161218f61a484e5a33fc18f19b70525186ca035a75ec89a01709c00203892b8d89ad8f19a621ffb049c9b8cf9d951436bb723bf8f457ecf +$BLAKE2$97ff0176d337d8d1b1983ce5cb8b4fc0fec647b62a3cd72a26bec5f43031699be4bbf5e61fd80f1c45366f5086dc7537a986b0d463663e4bfe7d270dde145941 +$BLAKE2$d25e9d1b93f3a8e614136515f70e1b4976695775dfdf16ab810c92ed61d5b11ad2ff59dce5c43eb8f31ec9ae777e44127641f7377228ac2bce9b4f720eba957e +$BLAKE2$bfebf7f2080d69832343aacf35fdbee4a02aae76f0a2385edce88848ccb22c83a82b7f52cb5fd5f1358e2dc21115644c2c5fded31b9b8362ac4695b897378bc9 +$BLAKE2$5307c1d6ad5af25a904956033977a6f31290a14e648ef3e54cc52a6f80d6b47d0936066293f0e0d1bda85f1abe7cc5cc475b96badd3180214e457532a4072f31 +$BLAKE2$eaeafa964c5baf08f89a2cf11e0875114831dbe178ed3ea542c7ec051034f8fd590a7f33c8ec8a7f6cd7eab437646c3f8976e22ef6cc9f5db24a2da82a337aa2 +$BLAKE2$edbdc2c9a488da8c406215c157f423e9d38efa806240ea27a0d529ed21ded2dac7f15f238aa52c56ed1049906ac90cda9e2b26be93ad3b34f1394f35a1426253 +$BLAKE2$14cfc5c7f518d0a45ff68ee0054a160f8eb087cd422d7a18b8db202028b2cc9b0e3e58869a726289143bfb9bfb9c9f604726fb4723cdca86c5d3328d36bc0eb2 +$BLAKE2$6c48877d87eca8c58568ee08d85b0bb9200f32351acb698fc549ceccdf6a7ab6a0d76a324adbc881fb21a322118ee8d8a9bc2cddd57b1817d214f5a9eb93d4fc +$BLAKE2$172b1c94a4fc84cf5eaf760a09bdd24ac2bca4b637b319e1ba31f44e9ad49f0f2e19892c2ddc392bf148a0626874c321d0f3a43a274da8daf203cc7bec66498f +$BLAKE2$ee1bae5c4860833c5d8472b4b8096b615c46cba42d5dd2167c0eafaea2d1906c76508b447f1dd8352822062e075c5b03fec07b57b8a33526c66238424bebff9a +$BLAKE2$38751cf75ee0fe260af5b44b08693dcc4ee46cdca8db26a20c1c3bc40ba6c466e33969d9024b5471b4486d52be7ffe6ce86ebe265afb960b43f4d4f29ea7bc97 +$BLAKE2$ab86d4d768a3ea3ed87079ee56fa4c87a10f6017b9499e0f09d76b8fe3e7b888a4c12751305aa13f2b63f076fc774f3658ec850066a1347b4ccbb234dff51444 +$BLAKE2$0cb190c66b572096f92bed3021e7c6ba2624c8d69b406fa4ffc647123ef197c1197f5b724eb2757a50ea437e256df0548aa796c0afb5e636c183e7ab08bea48b +$BLAKE2$d314d18618826ea1f6e03f850dbff9740f0fd580b2beeb336ed218c36934c44f713920f8562cfaafc43994c2ea20f7546c798042b22d0167ed3c28f779b96be7 +$BLAKE2$913a50c4b88335476b74c25743f0b1e013b9484ef4b5ff7de814786aeeec3ffb90b6143ded6f9c621f4823bfd335b13aa5d8877c687550b7c16217bc12778f33 +$BLAKE2$d613015a0526bf0143970a8a35fb1e2fa0b6607471bdfa0f1c9bc5681797dd9fafc5e4e67909df2acbedc73344d4dbf42e6b827805b6accbb9d891c889c08c01 +$BLAKE2$5e8359de5cb720082a02bdc19d3b76d7f3c06fd4ebf8873e22b0bf503d9fd993c009b01b7d61e93bba79291de9ca437aa598d665a88a7bc6d96f7e1b5bbbb5ec +$BLAKE2$8d3eea8224b4c160d049a7cc06491c1933620fccc99e72f252b4004253a276c12bee78c1c45804a34211f8300911205f9c04381b73f1b37126167c4cb1495bd2 +$BLAKE2$b67a60a8d7b2da4bf025b78524abbc40c33f298b68481164ab2bc9dfe20273e2bf7cd73c6f42e4e9582cb61dc8d1586836898ae8382dc8c9e2597a7b56575379 +$BLAKE2$fbf120be3fa5b44d731993fbcfa05b850796334d070b65f5221aae0db7cd0eb0fba62ec3289590da65dc7ae9c8d6cb0bb3eccfaa992ac5d93387ce0a9894aee5 +$BLAKE2$2c49d4fdc47a1de33fe7b943ba4dbccd61e3d26431b47459912567772023ac6914b41cafc8a83ccfc473f97ff6554e64dc5285b61107177f5fb018bfc34192e3 +$BLAKE2$0266e7cd7024b8c153269d171a4b2d5805c7e02608191983d3fd3a249418c30345ddd4ddc24837b35e82cdd0fd77eb0a1e5a89583b88bb5f10f0f6c0b14719c3 +$BLAKE2$a33d872e99fb13a2d62de5a2b244809686e589d7793cede6e4ffe16a947b24befb3735e619c362914aabfed243e532107533fcbd90e7df110415f8a47970a5bf +$BLAKE2$2e06e0d638c1bb18a6911b1131690fc75af3bd827f75ecd23bfdf9577ee979d52e02ff02f19be2892f9ad5076f40849e5c4ee66bcd6d2f2c5fad50d8021b0659 +$BLAKE2$e004149c808f89616b5f87b0508cbd8bb901bc3553813126d64d307d5056782d6ebc755aad96c8ca1b4f630c765aa0617ae791a43c1c47a1bc3e2b817aeabc3d +$BLAKE2$441298d6bbb9f9c4a16c3a3ae186de38a22bd0a001dfba194f7c746add25a75b67ffe4ecc3610df6cf9120a3433fd8ff68cf539a9fd6e02805686c1179d32fc8 +$BLAKE2$2a967cb234958b87df06955bee72c80b17abf88317648fd2adc6560473bdc9f8523d4d0fa767cc78cc76415e8cde5bd76d7806fb0b331e5e6810198bcd02a83f +$BLAKE2$2bc255530ce7f9ecfd99b6881e92972d352d49874204a4fe51fbf402744e628741943bad3aacfc80e99f82634c6be3d7f4f588d1fd4fbbea1b9d9ffc7dc647f5 +$BLAKE2$58e0b32f03fdc861e354b8755b77aba52b2f9b5153f7b523afac6606980cfe7e330f5cdfe1c816587fc50d8ce0586b7bcfd1dfaafa31a725e85f5915691d08db +$BLAKE2$a52166efa50f37e735d1aae3ea5a8493f6a3e9557318ec1235b06b4854d74c0b86bc4a6e654f2efe6335684ad5b0b0a5a43f976d0d2ab12ee8488763e0a660bd +$BLAKE2$65ec99984c33a671e8515e52ed344fb6608a7524c8fa82002bdd0566361980948e365163cf69b9ca6e312fa8f43b93ab3e6de185e2014094b86cb0f8faad4f6a +$BLAKE2$5cdf5b06f9a576ecd3727088506c9c3a2d184286b48b50d751c7e56afed178e2ca9b3da184419b10997a8a0a41a38111e4c6db27f2513903a7e895c389eae0ab +$BLAKE2$84a3e61ce9a1e25fe581ed5cfaf38289d1256859406eab6842d781632c457caf35c1890c0edf42d4ea36a70f82f56f2e29db2b524cf8dca8636fbd3c2da160a3 +$BLAKE2$3d09ca0191a282e7a8b3ff1e59fd28f9720560e4a51eef8ae420362b6d4b2ee6d226231ae036aed3ab156b885a4110fa4af46855ebb0ade147bc7f67867b7394 +$BLAKE2$c31297fc1f9642c1cb7613334433020a364b0ed69fcb38d0a99515bf5485e39ba1536bfde15d0c0ee43f472e06fac8b2404c7a994bcb986df4468d2b65b8be85 +$BLAKE2$78c9fa4c233052d7b83f31ad4f27f977b181044779730a05e87606c29af739c46fe14f2611c6ffe83db7b48465b9acc3f6d34b44d78c382de13589c93fafd741 +$BLAKE2$1a7ab9ec3179abd457b44f4846e69fda3dfe925e7308d66f32e0ff0f0ea26c1623ec160849183e09af4c90114ff87a004b12c1d3597f44a3f154e73a53348e80 +$BLAKE2$b1c93f67f335b83c63888d3abdbafd9556c5b4fec81f018091bda200fc1b5596e11348801643e8d60a76f8ed9f752cfa0ab68ff8c145fd64bbb10622891731ca +$BLAKE2$274be19a64e615b129075e4f2a24639cf48493ddf0cde30fc10fa94da389eb8779c6b97ac0bdc80212092013ff8fa4c09f6db885c72925e46a9735980ee325f3 +$BLAKE2$ec8e4b21eef1eb92b89fa59b0eb8b58b284a2211dc8fbc58a32fb1b45b352442c87345b099efd15e0c604c4a23dffe7224775d3bc49702d96fc2b5bdf0af0340 +$BLAKE2$f26b2c442346f70dddacd2cab76b300913304e93c1899494e53161a1078d6ac9be880f073a293a126e182451298e53b034b2a71f5cf2df1b12210b2bccedecbd +$BLAKE2$e513ef6eccd637d0d270a62256da94e959bf9d1fce056252763b177932d1e4920e5f58dba5a372e2c901142a563c47a6084523129a4637b2c616da98fdf7e4bd +$BLAKE2$f6f82a44839a7442ace1c2430e97f2934271015dfdad8ceca790e9403f1494c49e705ebb19d191b760896f58c342e58ddd2243e8beaa18bbd009e1720548172b +$BLAKE2$9d6f8f2d6e28fc26844cf3517e22b336c2d98956e04cd8a194a8bf933589dd880f80cc34c3e23eb1d1ddd1b2909bea04e15fa3671667a32527d5bba884c263e7 +$BLAKE2$3061bb380c7b4b2aa128756ba7eb053d049ebf42c229fa16e09349139e418b28ece5d7d70e392fa2a166358e3c4f3c95af2e3ab778826d64b65a6dd26896ed7c +$BLAKE2$813d252e68460b73106e263c3c7acf38c20ab03bd4a3f430c5f39a5c8f5102d00519943111f69b3cad490bc60298dded25dbfa22e1ac7e8a145430aa7e206111 +$BLAKE2$4000f7a304c50a5c8124840bff0fcbee640b853a7e4f4e2c28e165d71898775689b38d46d11c038ec72ebd15dd2f099fbe6e4954ec48dc55af7bf8d84f085b5a +$BLAKE2$095c0f87bd114cf32d22128f60bfe9e805e266151cd8d5a90b96b308402d991001c930f9711a037f9c9dae2c5405685f8fafc46f9180f0f26d723d46dd372418 +$BLAKE2$cabbbe87971b6aa09a0254aeddd9bdc00a3182db7b2b5def1f27f681db4baa50dc79ef8596c71bd12e237521d29dbfd87d644868c3edce4d923a035e6d409022 +$BLAKE2$ac1a05f7d0f726ccc4551577de1af4423da6729aa7b7085810122d63a5ce0dc63019bcc5eda7905d3a428ff0c88f9426040a15e1a5d8200cf83c92ace161dd13 +$BLAKE2$a47e24caa8f6cea048b6d292081a96289116bb7643c255ea6cd3b836afa91405fe5e3979aba578f551d6f62bd0dc11db9a366b6b7048ff76fc0836cba4737668 +$BLAKE2$e384544bf57238dc8c0b6d40da682cf0a57e16e38d2ad9d3609a742115036894c71ed14460348abb0e1e392ae3769a02738e0bd9c11b4e15addbded9730ca73f +$BLAKE2$a8b211e1cca5ccd00375382cd39ae4affbdb5f0d545d3481ee2c15eb8a57cd1a7f1827f41f2509356edc4002fcca0a58f69876a3e6d326d5307ab4a42fc86f84 +$BLAKE2$bd72c86087f1ae9b8c5ad9cdb8e0855a94310dbabbd0a3b9651def42f2100b0433a40ea5eee588345dee019ca41ea77c542d91139e4324369cf780d12c0ff219 +$BLAKE2$b29645f46b8930db065da8d961b67739342c289bb5a564c478ea26a4f983c6e28a823bf976bdd5abe8a98ac2a57a3389d74c232cb3958861bc7064fa4d9c3207 +$BLAKE2$9411c6ef701d83b6f2a95e5c7cbf77ec744d6dccbf98c42423b9df1574b9cbfac36ec55f4385a2969a114140543b1495e46e2a5546baff5eba0500cfe11249cb +$BLAKE2$92b71f7b0917ea971206ffec9b1c223c4cd39f9fb1ae66ba1b93ad667f30e77a6f91c31f3bb4262fe8e7781dd852bb040615be1e61e82eb4c6b868aa82919cfb +$BLAKE2$e1d4857475ee74205f25a922b437caedc673fe3a1eeda09b36135fe0ad85f46391b045cc3a01302a2bac726c0781bce0e18fe8ba69ab888b48175be7860a90a3 +$BLAKE2$e48b6c988672a821e0aba37840072ec88b99c64d75b33657fbc4932e0de62bc1a1bd564061a99dfe36d9f916e2a77f783b577178648bdaf52ab6382d689d37d0 +$BLAKE2$b4eec1e8630e8bc1ddd87afce074e648ed00fcdf109b24e2b58392916616cd6c8bda8a90feeb84053d642a1f8096aac377069f715146a47adb8d3d2bbde5aacc +$BLAKE2$00c04282dc7c935820f42f1db13e69e7d6f3feb0601fedde868c8972722b43dc7b3bc060aa2af36fc6692dd79aff68bf76818ff2e52fa2ac073719418b603c5f +$BLAKE2$ab6443324ebbfda3424ba6f0038a60e9cae3ab00810d558cb837b3202d6c7532bc634bc5d8de6705320ae11c38db8671ebf520d8aaa2a021f54b53dc0186849b +$BLAKE2$254128cdc6e2e6c71ed24fcb26ca6ad4cce3eb7de6f214bad22f6a6fa7c3d91f8723813d6a543d5f52015a5e65229befa8e9783d24c076f9107649b66416097b +$BLAKE2$9ac1fe335755734ac688e9bafd14de14115c758d00fdc57833bcbd8463a19377defbfdcfa77a28c8c5a3ec00f4641fcc29f3b4f8d808cd76c094c167c2406f32 +$BLAKE2$728d2b5c4da03c8ebbd0d45e0e54392fa2bbf4dea0b0d5582db7ee7abb1a399e54f9d1f24917526de572df7dd2412f937ccc3ba334e160e4088da18d9748b3da +$BLAKE2$36b807d56cea731cd7d1a9b42da1083e8bb6b2c99cc50e1b3816689a8940704c0f847dedd41042a1e3d9d600d067f370825b5eaa9ba22691b96c5a13cf30f5fa +$BLAKE2$8eb614b5c2f8c7d250339b3298bd60a5a738b4116098136833379098435c9944bec5ff8d5f8bd7bfe949622303d066ed5e6140ace7895926dd7678c7bdfa6a67 +$BLAKE2$fab6df628b0a6b09600b56fe866841c2dcb8a76fe670eb4f6f4bd75821da669e15bd207a141227b7d978c59bad8f9b6dfd13e38e49c53ef32432f41fb18389de +$BLAKE2$8f0fcbca863918aceea2aa14d217ead65ef4e976f7965a3d3ec6942f2bf144b430143f4a15ba9478e2746230151f9c40a1d42a97ac98083083423fb0af8f3c36 +$BLAKE2$8fa04bb0b00e5ac3746c57acc4aab3b75fd77f09df6e8fc815e5f7983fe2dde00139ec7fef1310e784be8639c003446d367844cddd718bf04cc4ce77349e1cdc +$BLAKE2$dd408948d376e681d808c5dbafecef031d0438c7ce2cbd8baf225ceb109cfe1597f1a7673a878099509012808d8214a35ccf625e8a56878bd0d8213a5569bb83 +$BLAKE2$e15903386e3b2ee1f440bb67127b04737bbcd603c7e48ab114ce5bc080902906de3bfe21081e91a6eb7bebab829dc3c3c35330a5dce5fcd35ec51e903c9c4935 +$BLAKE2$cd7503e595f9421c4e6033f27a4aa392c3f3c2a0666fe0fdb0fac51b4a2024680a44203739c9e34a0913030aed48758ef42b059f2371e36bf47a55de3e3f47ea +$BLAKE2$9784745714723cd7f2be48af4025fa54bd890177790bc614a6db96a4a3b641e53129dcb3db6dd2941ada25a25ab2827ed73fa4f0d9f64f0a5ca7d5076f28216b +$BLAKE2$df2274ab2d217236d841b1ac4395b4d00e4a7877d9098e325b089464bd4dbdb79b779c9458dc955b1b41f35532e10f59ec190b26619e80770d839c6e07caa2ce +$BLAKE2$d0c939c512dfb389ebcf3643e870288ab533220ec7f005ceff79505fccf3786e400140e23985abcc6f00be4641f59c3cc9826c110cbfb5db8f438a88528b0e65 +$BLAKE2$f5beb53ba581ad5969302928857a0f82e53623d77aec0a12a78f6da01b79083bc994285f068ce0f1a90ec133d209014d8e9846f5debc3d641c287c1b74423fdf +$BLAKE2$043ba531b850a37037a0dc758bd73f149d2de0615e6f0fd76cfed62e85a718cdf1e50e63be6bf00df2be4c514cfe1915c60a07b3bfb9230097264b1aa819ab03 +$BLAKE2$85f7dfe3a339e379c2651e29ebf6be2404469538887449f85c1301be2102a18b586ba517fcdc6691588e1ffa005dc7c80b586a5d6e1895a64fa3ee24fc884675 +$BLAKE2$115229af04ef9b5b79f5243dfe8b290e5ea5571d8d0e4b6e391cb2e5f3d36dacf6abc8582d667070d40e4ab56d73cb8e57e7183d6854baa5a50740342c4cb865 +$BLAKE2$310af7c5d611683855645d248d36a8fd725ab779810f6c4d711810c66acc5f8af18afdbbca8ccea8ff7049b9b2c664255c656ababd36916a78bb2f7fa3f569e1 +$BLAKE2$cd06254d828e4ef42aa1e1402b3dbdb0fa9b682f280523084e8e5592ad9fdfdc7a9511a4c6f5866ca1167aafe3ef445ec77db751a9b92d37436f5d53c8d4c882 +$BLAKE2$e682788b927e40caab4f775a0b91c39d11c01b13c1595c64f105d853cacc0a48f4f6a9e9b394040b87e044e48ebdefdc25fde89225e4d5192f0f09c0630c14a3 +$BLAKE2$3165017564a5d9b87af8613a403e2c7c7b1aeafa808142655d16b8537fbea6d43fb4b85af2ad2d3d4df02f52a726e0649eb88f4d99d65d9d6fad985fcab1aab3 +$BLAKE2$f2ac77da19f9db5690c93c1452857cd95575881afe4c57a9e170d4b57e94f90fa7133721c3ed9e4f0ee928af3312738a78ee57215c28f4c19ba05ce3a27d924a +$BLAKE2$b3f7223662d8ec46fee6d090817a1ee6bce3585eaaac90ee742d1d3b2f4a3b1b58349663b7f9a739a1b3f867ceffff500c8c3a0bd0022d536bc1fc219767b68c +$BLAKE2$8a0a908701a7af939dd81e8eb3b34688fcf4d74e420a7bc314a1d5a9054b5b47db35ad9437b0c9ac5b6a225be390e129226297e95dd7d1dfa4d460e83c046ab0 +$BLAKE2$924355746838b6cab5cbeb68d28d9cb5e3be5126c3e174de2d4ccf70d9d8c132436a09c8cde23ec3e9c62100b1ad03c6849dca44306ca102539e12b356c85d39 +$BLAKE2$cb71fbcc60051762f76a57919bc0933def990e9e920b79323f17f2425e73675cb930364b39a47ad712766093d47da5055175670b6e09c7d2a35db96e27f797b3 +$BLAKE2$bc26fc591ba160b9b57c074bcc7aa231043acb62f828ba4a732651bf14334068f6eaa92ef55c70c705825fafd949ab9809d964e25225a931616e06346a569bbe +$BLAKE2$32cf22f6f0e7745db087dd04610138738ac26119288aabe9cbca1573b70d0de0f4ce96e60396bf351579b39b3d2ecddcd9538e8471e0d232be6b09a2d809f39c +$BLAKE2$2551c52832b4a7bd618fc40a935651cccea3240a7654c5b5667e9a4864529ff994cf252039c208b353c9084fa11a99ee22d7dc191044d606cf63dcd5bd6d798a +$BLAKE2$1ac354d1cc93dc563a21060a59fa08fdd94691acb2724127a74660b5f37eed80cb6ec83bb09bfc46f85099c70cb26e2d4fb7b3c63ed1ac86dddb5d5b3087a2af +$BLAKE2$e7491bb3c390a56e22db3af175a66b5df136940eeeeea6cc7d6785a713bc50e95f3028ba0eaf5399d165079b975936284cac9263cc4202514f1c22110d8393ca +$BLAKE2$b739320c8de5b0dc3f10ab0d9f35286369ade07b4cc9467cb81d2e7aede120e0d19899112fd20ce07ef7ea695e53de29151962b61c8848a02f4651f3bd49efb7 +$BLAKE2$8616f30f2a552152dcc6aea8ebef797896b6f068d37aa5db4ebf9fa0c4f8e8414549e44956b7aff4b725a5f512d5a897da5dfe7a8de99c4af291d991c6771911 +$BLAKE2$8c23845b0912b45126ac59e0de9c71ac05b9fa63fb1b05f6a5d194d0352b91d9b34af2f5e8cbe553ee20a27405d3edf30de557d7131b2d9c214721ea83452b03 +$BLAKE2$2d025039f1569ff0291938ab317f885038063b1544cfdecce39935f6094137cdfba8e3bff615e5e45737a3cde9384ac722defd8dddce9310138b1b86a95e8e2e +$BLAKE2$342dc072288c006b02ace35cf861097f6f538c7cfcafc26694baac7b166ba50e0e73390e262f6928057134d8cf2c9f3625ec4cd63e90418d573f512f8a3c9a13 +$BLAKE2$8486978063ec884885eda4f2f2a60dc0e8030d82c7a21bb13f7f6e78c1f7143e742905f7db5d3b79dfe85b242ac9a82cc662f7a4c6f3a64e233201ac69393fc2 +$BLAKE2$bf1a8425a94ff4d99444adce530a70ad4a40e0cc8f9c9616fd96070a71eb8b180c21323765c176ba98cf8f1a830ab52a305a1e27c45c18a4e19e97dead7108fd +$BLAKE2$a425c40ead0bf1405ecadc8f5c2907f6c2912166dbca5602890d4f6c3a8fd126507cd52362fb45b13aa6285ca33a7487e8f201d69f7b7ccfb737debad45c253e +$BLAKE2$3a9443abaf284c000229f445c55e0b6d80911ae1082e1a9089b0b55b3693947e32498665de9f6602338d4da6f8f6fbdfb3c658fd7befec862bdc7b162830d988 +$BLAKE2$a8cdd064c7ad4c217232b2f1131b674ca4fe9663b4efbf5fcb3d6b1f70e6eb23a6295776f6b20950e4911d9e4947a9d6109668f93cf575608aa5c00e859cf62c +$BLAKE2$883255d457dd92da7e58c1930eca42d5ef9b75524c98c2519ce1aaf212f6b126a3dcfff0f0cc8f786e0fde9a017cb2f2b520fcb1796faac08e013191e538e7e8 +$BLAKE2$7fefb6db03d9a3e0a0a6156b6724354762b109b710d2ac4943447aebc359edb5e3d76b2b573dbc4a3cae30c1a6e7fd0b0d1c8c6ca230890d2f5b7175f1163602 +$BLAKE2$3da149c80ee1977da983674a71c44867d6ece9b9b0f4b462c2774e20880d3dcf0dbd792ea24d7091dcb2226b35e4be237b92e6b76d06fc7089cb6938d6697642 +$BLAKE2$a88237e96aef7ddd2e8f733005e3301f7f5456e95a80a28367c04b12f19dd0ee8a906a64aa910d97c0e5ea58c928f94b209d9f720bd9eb671582660394b8e7a9 +$BLAKE2$dce84fd1cb43566fe592720b8414af8c67f9bebf2940408baf7d9ba3071b4eddae30c7c49428603efa897d031be97931b257ffdc0c754e82ea2260c2cf4e644b +$BLAKE2$58563664ab23547f298ef854f67081c77f9662836870133d70e59f61f3224b24b7e3335ace9e0d7d4c53962728477594cafe0c8c55868806074cb785146d70ad +$BLAKE2$3aaa6e653c31f8512aec3535384cd86e103f03b29e3b91f773793c906413af2698ec1c4b472ca56b157eed7242897b106a9575681f7750baf084ba42afd129a4 +$BLAKE2$8902f5bf39eb7401b6f26ffbb0fbc3dd18b6319a9abb4e9223397735c4139e9648dcf11111b731620dbf6f291f2bb78984925d140f6da8ae9dac0cc6893c1a16 +$BLAKE2$be2a2f8d6d04b98d9f3c000241a7fad0fb3647a2a7ac413cdd6742935fc6e5029d5f75cf5d5389a731ba7f1ac9caf417289f13abe14fd256b79dc6f841ad33db +$BLAKE2$e589c0918b405101c4e509f64ba5640b594f898c6460ebe0cbafb8602ebf7a9d01dbf5b34c1c91a9353dfb5378764fb11833e418b03b993ae2809456a888bc07 +$BLAKE2$c3a3d43fcad821575cac2b358195ac1e7f4fd373343f5e49dcdb2dbef43d30489fec24ff9bf78656ac2c8ba3bb7da621269ff2a86b0fe98a6dc16e4d20fdb5e5 +$BLAKE2$1c09b0c9d6c09786e1e7c352e984febc812090b7d8e3a0f0b4a9f195550fb246ab2472f39ed9b7a9887ed489373d5d6ba97d1538c516b9ff2d4f0708ab246cb7 +$BLAKE2$e1407db035fff6b06a7938492fc0b2d9e96bc3c420125da2f26f03d85dd48be5d0d762d2f54a698f887036eb0fa6cd8eebdebc5de30056513473201f2bc20d6b +$BLAKE2$5b3ff8a714eca6ca2c9f354918abfd3e09c9218afa482be9b4e14a96abd4620da499d044350f766c462c3d53f26d2f0eb184fa4258c89105e09f0de49c8aff89 +$BLAKE2$493e15a872b3c6177eb4a1d781d1525cc44bd029695e2632a16cca7809873fd6f3e3ab101f1a66c9236bc54346374756ee46c79be778ed2b29df8d562ed41c06 +$BLAKE2$5ebc1ca068a6ca2eeaef9df28a22e53b1582331c1e4c887da2b4a6677be8edb1093834c3c2dfc8ef5fbfa53de69bc0dc2c71a52800009080b630714ffb6c77cc +$BLAKE2$4e6bd1be88874d61e95c89fed117170e3723aaa39eae0607e1edab1474a4befe2cab8c03287369a1cb036ba74150b2f705684beff67c31904d59e5651e413ff9 +$BLAKE2$c574c0c0a2a917dc470cc7907497d7bc389af0b3953cb9771720fe88973e5541c9461a581459f31b541940f97a497d70aa1ff7a7be83296f3ba89037eda6f37c +$BLAKE2$c9c8538a0c1eb41cbad8a68198be815c89cd52a908c363c23a5e6a05953b7c6417efb2051f20295b0cf465ccdc2c42cee9f321b5e23e65de7c7049ac8b552df1 +$BLAKE2$b69b0b1b53915f856f4380cdc851a684adbc17fdbb72c04f4160628e8d5efd3b023264593a7b1442174e559ac74e655f204e7f36c259bbb28dd0618f266974f4 +$BLAKE2$cb0007642d88c092f9046b50354c2f7e7a414637fb230f8ab826f7391fb32726c644b54da750dd2f6a7a2551ac0d982a77e3d6ef385df200cb0f5130c273b144 +$BLAKE2$3aa0a3fac0c41df997d8110ae74839adadb195046b1ac430e73d480f32ac721a78c11c7cc48b516e5dd17e99ae99b77cdded3ad2a6f53df29cd1f8dcd7796a36 +$BLAKE2$1ab8626178f453a3cc84001c4e92932cd30bee39d95b31050e252fcda68bf037b9e17adc6ae84ff24f961b946cbf81b8049dfa2da82e5ccfe50b8ee26aa38115 +$BLAKE2$19a6a43a49b3f40c2ab698f50b515dd90805bb79120bd9099f01d34b83528dc6071609ed958051f142fbd0c6116bdeb66e39682ca9a3827a5fc18db388fa47dd +$BLAKE2$e0361c764c4fe9867befb980dfd27746a0f649475146113a8635fa9b4c3cbe2f888d9304a68d12ca5e00ef43e314c418f64d7fd92fb31f09eedde1c86c27abfb +$BLAKE2$8fa545e2a5ce8ba666bf01291284685b9f993efd584355352872ba726c77357fdb18e0d734be164f1a4daec17d2da7ef6dd9e0ae5ea412dfd0818d27e7ee0232 +$BLAKE2$db59fe44ab46e92bd908d36aaf8b63139709af215c4ee8badc1a2616c45741617ca7b537dcfb9b533a1ea99f74d20ec72572051630d026060aa61779850b121a +$BLAKE2$74f980758800c519a79e6aaf12fbe7d79aee0108abb2d4ea79b997f1a383d7be6c96aafb704ff3db85192f551ce584d9572fc1a9dec4af5dc40d0b1b005b5c08 +$BLAKE2$7c214d5a9f8e7327e0453ab682e3d538e2679b000287efc03e8109b901ac14e4cd66c25d92e077a00011abb7915cc12ef8d2d5069cf082760946e0f3fe87bffe +$BLAKE2$3546ceecf39e33d11f84588eea6f9a6f6ac888cc78f0e224c83c172a6b6e2fbff8bed9d62b1485afaf607a07022410448028ceab7db108f95cd737904a2b926f +$BLAKE2$f5d9042eafa754ad235b2d13ecf1d32cef3882e3e050c5eff016e77c0ca66f0474fa1e25e55b6d833e37dc85c6801d33960886fa48d45fd9ad38824e5714ad2f +$BLAKE2$6e308191b71d8140626429355bd3c57f281e0fe6129f850e177837f75df4ae818c3dda284e6df186a1c9a53bcb705cc0e4fd88005bcabced11e56c48bfa70a72 +$BLAKE2$a200466ed33534fac112b56e2087d8804eb746cca888c92c93c5e0527de9597d8be04ed860b2e167b301a13ab197331a8edb9420e33cef4c06b8b1e68f27bbad +$BLAKE2$d226d0748b1960776714f78b71efb73f5c1f961c90c4a9ef47186a8097e2df924f68c99675dcca6f2c59967eb9afa3db52521f4c356924fc24520086b6625a89 +$BLAKE2$03b0118b338ceea7978af2e6188755a33d492e925b0b22fa17730f081d713bb705f4da9749c7e15e74e6ab08a814fcad6280dca113d5e999aa453df32f69c270 +$BLAKE2$a77694e76b9a4fc450690d54ce8c80e5f573edfd8ea8862ec700df4a8bf1ab273c161ca657111a7367f2eb3f945559c5fa04f38154495aedb8c6308490ea0af6 +$BLAKE2$e2b63b929214448f9b729b066991ea87e1e205a45b33818e830c2cf64ac1f642ba0122c35136f1ced876590a1982bc054375da059ebfdd93017186a052c4da3b +$BLAKE2$4f2c5d7f5373b4401a035e70b407d9df944829c77a52eb05093df70bcea81557aace170ecd4f2554a5100ee9b5d6babb7a80bb972b73fbb04b8cd5ebc3e22f66 +$BLAKE2$be4103a28d5a214ecfb317378d64c3d5d03a010115f874ab9790d27ea1db94bb481470a11e7674c394a2b7e9028084c473759fab70e832f4cd1745f30dddaf7a +$BLAKE2$6d82a0394cb3ca98ec1488ab50f4436099e1defb91f41015768bebe8a41864a67f5d0850dac9cb9992d3bd73bb2210bfe3dac70f147d72ca6b0a96cb05ada968 +$BLAKE2$e74ba0620e0364aeeba56d371bfe634a094676a9bd9c14c38a1f9cba0d6eb93e5d2bad905899b2b19ccc31d40ddcc1862749f58485f96877357ebc57e3bb975c +$BLAKE2$493f920a9e1b0ff9c4b42cea30e356c4f13aca53082dc64dc40a214dae0673e796680af7d418b96a233b970d45e1acc19d7892b217b573e34ff68ed5084b2f64 +$BLAKE2$37bc8d3bfab6135ccf451980da3b2b5c7a23cf9eccb22ab13c168f6f462f9dc78ea6dc9f9c1e7f665ae65d5ef81a215f9bb8636c4dcb39eb8a1e6cf96a914b8f +$BLAKE2$8a83250f8b1f9a075cf26d6599d805faef9ea4f8f02ed9d4a8c22b611f1f8621ba715f6c48b461cb6006ae79fdd8b09e7ac55789b2042e9872bc2682a044e599 +$BLAKE2$f9da8bbb9a4263b4604adbae5478fd9e864ff266dbf97c2353eb41c4f8730ce0b8d05b8ba5dcb6326bad09e73900570a8f11575fc16942108b4663c1b8aea423 +$BLAKE2$d2af84c19b8b690cb6df172c81c37d288a3431ef5790cabc123592b06682ce516f4727aacc3ecf86ab68d43daedabb87070f0837430e6a6cbfd06161acdcb76d +$BLAKE2$c9370983b0bfca907940f6df62e1b9943b1ae0b61d362d080f7472714e4cab38c2488d14302b4f5500e4b62e1b4169404042440ef7ff2ced68ab70b506a08333 +$BLAKE2$801cac93a3293b996223c83787a960ba96239117bd5d3623e51d3c960839dda8adaf4b56cb3fc69559034c6570d7914a1da089e5d952a969c72c7461a223d544 +$BLAKE2$62326a9d08f46c41f7b9cc70961d49b58d1a5d0bb1777cc9ae0fe1fb4be644d28004e8831c19877c715778de4aa20e3647b2f4812de5bf8399c115df6d54ee53 +$BLAKE2$0085f7b878df8fce8c7754b6090ac1c2bab4057869ac92206b95193705f91c80d8893cb04ceaf648c72311bb6145837f2af0a71582347b0d074cc59c4f24078c +$BLAKE2$8a1eebfed501933c1d23e099038af75ef4a619c76f8063b1b1e84687eb0cf43241d23ab33570255f7c69efc0020076a99f1f8c7f71784d0b538df94cdb934dab +$BLAKE2$0c2325ce4881542136d992416179813d292babe44a9f3165a6a31f37ce2a9ccdddcb98545610aba1eab9174aa0874ebfb7c4e0a4b4ace1ea0c0c22cc6bfc4b23 +$BLAKE2$40081bf9552e32082763da70b61f9e4062df7357156fccb05011312468628324bcb10df8e27a362a43d725a83f7da5b1d42b213f0702df79c9067846779a2f91 +$BLAKE2$0affa0a92a9a0b0f7a245727c462a5df6e881deffbe17c9dad0845debddc706bbab41cdeb8bca3f1d5b7e70d9292428925c724d2a8d6451997f28fe683b65f0e +$BLAKE2$82c11cb86056c2fafe345c6cc32454c3038ca7b24f45022feee933a43b37e781520312a5b7196e50c29a61789588f0c74ae980b98404561a8b83c334e4dccbf4 +$BLAKE2$65d3a95922e97197f0d686d0e087b7adb3e49c3af42648e026215aaceb83f8644ce6412539d97e0bec3e913a72f0ad0d8559a778f2dee2df7ec650cccb86aaa4 +$BLAKE2$f919a41db7927edf7b8732115cf9c3da552bbf9a5e24a7ea96dab2cbd7d5664343ca7f85165d3730485d1fa873e84d4597cea18575027c11654fc41c4cb1324a +$BLAKE2$4e51cbc3336739726af1ea1919d9b2f9b5828b4fa30a4a625919f66687f8d48e1020253f46fe7bf5dc700f25e1e0450e43bc4311aeaf99091e1cdc12c25c40dd +$BLAKE2$ba3847d5b9023ac17ec95175099a4196ed8833b02304cbb23291134bc26c1461454d45f92185346ed2edd567f79fab9f746cd71b4314277fe1fb218b0b4e1e6d +$BLAKE2$1de3581bb9deec069932af971c594abc98082d14104a35ba426c9d2922783189101119ea5bd53ee7810f887c49cf4a09a55502de227a86f704b9236247ed0e47 +$BLAKE2$aaf6703b772eee22ea4dc30c6276ea65d1c752329d83b720eeb15299eac1ef65997a59350264bfeb8596e6f7cedafbe56ecf5be49b578d84104b01f4135becd5 +$BLAKE2$002203c252b02bfeb8a11366442ef1b6329f48603e9ef19f5d3207da5216d7491956454b12f7b48dbdc49315da6fca0d0807f3d7c028d678e1d8746cc8b0775a +$BLAKE2$231bff52c897875d741e5d153c5c314f0c70d7de03108d764945e5340657c04c6963d45c0da391309b6b4576ca646f8f58cc809a887a407023934a6adce0b4f3 +$BLAKE2$bec628241aae52e16c483a540cc92deca37189301f4a5a2308133333ec1d9375787be15e3b6e6bdea8c3433917a557e8a6f07a7f96be88684e3e801c255131d5 +$BLAKE2$f091d8a0c3e21e140f755a278fcc5450cbdd613d7c9e9232c93cc07f54be6f54496e9a18cf23f6d639c59fd137913ac6d691872eaa913da5b7a3e2107a9ce08e +$BLAKE2$b1fe890a132d6ce894fc73a972262662a1e599e12b3001dddade660414e034e690aa065abc3b5d5fea3c1ee6081de87bb1259ebd26467de65277c4ff3654a68e +$BLAKE2$37c1afae59e1ce30a3d795aac3763cdea764992bf6bceb65b277d0eb183d786c1955e0a9d26f78429217595446b74bb230da7915f5d012272c194f238f51dd96 +$BLAKE2$3f27196151510d20160451c63992e607cdf0fbf588461788012e1cc9b0d5791a8bb75552e72a3b491696c019eb609cb2e3256292f087a4a88215fc0a6397d0c3 +$BLAKE2$c06e2e90084d2c908dddef57230ada575dbfdf703c9437b6f560f0eb797d4ecf2e40899d7995612a7ca29206de2eea19c5d1d9960074b0d79ce0e9805cf7bb85 +$BLAKE2$3523fa249ee28b20f051ae7321192716b8d9619748a863d12abdaae000e9b264be66e480897e158cc8036352430c7278161d61118f1b6918819685b7583ea483 +$BLAKE2$5ae563d8d61af6190ed2ed52126c0cc28520ecae42a463cbc1e5855a052acf821af4f67fb969ea2e635336cd943c583831c77901697f0fe63d98cdfdadd87ccd +$BLAKE2$cd780adc7678d5da51b821d81507fa468759c039d7c07fe702b63b94db8720555ee42bde3c9e6b5638aebd7c33185b175d71571bfb30085b0613bd5b6e4ad65f +$BLAKE2$78a51d8373ff58ecbd84b1cc8c0d05a2af11edf1bf64f36e9595bed80a95e67bbf6915ec702eada9a7149396e142335fbdbec8a8070ba0f45401395b8f47c495 +$BLAKE2$180f7567e945f516574ca61f9d2734193be46bf12be6862cb11d7e433becec7de7f540a294978e9604907c9598a0c6abce5920990fab2d5e1e8f0199d620a9a0 +$BLAKE2$98e33877907923b23a6d6a853ff57bb01d37be9799d86e9e7760a32feb0959eabd331823d0255f02db5702e7c0047371d364755e1cef91ddc869c7b703815804 +$BLAKE2$8a09e62b0ed66fccebde07555cb2190954b0cccfacafd2d54a760ac72af57453cebd275019409e2ac31e2fb88504a7a5416d9d0dfa9b6eaa6eb67f7fd06bc93f +$BLAKE2$bc4984ef5a4aa05a0e52cdf7f9c8aaa3d9359474cde295bcedb79d79569f0ae1d4bd270875ed1a5fc2bcc5afe99a6c3adc47d066fa596567dd6437eec9265cfb +$BLAKE2$dbf23f37c0bb04ad17ab5f448338b0f45aa6450b5c842c4c48f1694e52f4f7a0ea1207c93f04d6efd20e025435a73d6dec65a44177a7f854b4bff1f9c8375068 +$BLAKE2$eb882471c099618c16c33d46d9f4b0e62a4af309e9b8485d2eca323c13b6c5a4043acb6e71efb334aa23ba7065c6584e8d3a8c6504a6c77386bcc4837cfe0ba8 +$BLAKE2$3f91cec9365b1e1d3a1dd611306efc49f54c900c9a4925c377ceb4a71595765f05fa1016a5142255ea491e3e1b5ae9065684994de46c9d5a34f26aa323215ae8 +$BLAKE2$b73ac80837f21b81721d854b7efdcb3b3792b6e67bfb33b509060607665555fabb2dc0c4e0ded96eed5ad790b52d281503dfd33fc5f4cae36b7987e10e7b16fb +$BLAKE2$0a499b3ddcf123a90fec6770a512c97c77f03e81af18bda4263a4635ee6dd22a1cdb5c2c8872b5cb5c6e330a6db74002b1143ed729048a77c73e8cf7605875dd +$BLAKE2$9293524c0ba44bc38525b4bac6c91fed94514887154a1a01c4e2236b99b1566c851edda2a78e98196cde8645ef0a84e7a6c0a4c13090fa34f338a89afebb99ab +$BLAKE2$4c59239bde3a315290160ac632aaf1b44a2f7e6db80f4a60e7f92798c2383f70f48ebd707c9fa51bd0f0b70f710ff80293925c6c7019c95907ad246d77773158 +$BLAKE2$670fac352066f2b5d20a2acdceb2c6f16032749393b62a9b896cc283a9f352150e132d1cf1a52efee6d2685f711a69a8aa736b07af1e8efa5dcdb70f1b3f310b +$BLAKE2$e48437d890017faa1a80fee8900b059280629b129737fe3e919e069120a3e6c6a3b6104b73054aeb2aba49dfe4556a33af558bb99b3d6abe5dda93478dd83b54 +$BLAKE2$81833d8e9d4a684fd721a6b22ccfeb907c11c908be91b27369c0246404bb61b3fd96dfd9537f6974e2008f1a66845fabc0d04156d7428e6d61bb716a7ef2ea0d +$BLAKE2$7597ec39ac5f52f550b703043766888477bb29090f8ce27d9aaf0c68563c51b79bae63bb27de5603f4664eb80611a23a7c962b4780560a9512db821868ff378b +$BLAKE2$d1571a4db6c612651fe764fe1c407d294fe11252206b9cbeb90a8088b14dbeb5e184be30d50e24c188d3b61bb576ae188f04e27c9945bc8030dc97c735b7b5a7 +$BLAKE2$24a097efe872d84e2c5f8a9fd249492ca9ba6598cc34243dbb0c52a3052912107e7bad231f983b7df33813973fcdbee387dc9ca67fd7d702b527cfa555600bfb +$BLAKE2$dfccbe2a0f9f6b2db6757cd6a55a125f3e52774c19dfe1e9df950fe3a84e8e7c240db0127ffb4aade0c4140394f87128e2ec0ee022952141866ca3ba77002e5b +$BLAKE2$28d02ed24bdcf453d12ace1cb76b5e5e70dd10e46029f06b35ae899507801b8f0770dc38c71d2229eb0383586770adac21edf94c850967e0c688b447fa34b0ec +$BLAKE2$1f2a1eeda52d333f22a4f8e09ecee1507c21d5188fdf7b2d958c4b7a20758c6c0b4d4a103a39caa9146a720627b920603d2d6404abc97c55188bdc435d1a903e +$BLAKE2$bc41adaaabb0f5f936e8f345848b6c7d9c27b59bb45e4e117c9c22336facc9584a6dcb729cfe2a88f4074f1a6474359a288ecd1c999b3a5b6c4ec0f7b87bf526 +$BLAKE2$8af9915031e22f0aa84fdef5138b11ad79173c318e2506e8db5313fee03584078e09dec7ff42303ba2b454939d1dcf9f2e6bb1530e6b0cdd880d981e2d195739 +$BLAKE2$a6f35bd64b2456d61b1943db414fd7760e99e9bb7531b6aa67bcacdc0924410fad2802178ba34767a53ccd025557edd63853cd2935bc226aaad99b4cf5e8fcc5 +$BLAKE2$a0520535f6dcb32d7cb3ba79d6b5b6440585df15e9c60a924236cdd76e4ef477059f1fcefe3013c87ce8a224ce539fc7b362ccf0366adc7ac50565630e0d4cac +$BLAKE2$d803cf0670d041926db6432ee7d40023cdc3f933e7c7c83fe89103ea13fd40b815384865a82ace84ba25c99f508812ca0afd85b832cf32e444fc9f4152f15c13 +$BLAKE2$2607e54fc5391748181c799f925d2a07cfbb92c88eca911ff091e88749cd2a4d1520d5e470c5656343a49c8b6b29f76aa54491e7d6fddf143d9af3797dc1eb4d +$BLAKE2$90c2d1b533c9290ea0bb8162ee836a61127fc206a0c22ee3a0d7c9d25a8a94680c536ce7a102f485c00b009f479e450d2b829c149328d33a0c9ea9c38fdc0620 +$BLAKE2$6a94d0c26f92ade52ec37d3aa6962f0cb8a18b191480b06ee5739a5b7f1e99fba97b63135be4b049eb627f94534c71e4050aa3f9ff0b17561d5af74e81d8b1b8 +$BLAKE2$1d3c4d25e553ea62dba815b6a77b54b9c9fdb20325cfd903d363364984819345d959fc24dc1d54f0204386aecdccbdfad3d77b54df6db93c6f0292f49834847e +$BLAKE2$77a7996653b980b36577ce18f73361b9fab4d657ab0dc8c15c96778d26517406dd09de521ac6516fa35831ed87683796fbbe1cabdd1f1d297bac6e96255c051e +$BLAKE2$606c5c3526dbc01b0f8b9c9af3e8587acd5a874ce61a3ad6d726a82307b9b1867c96e97057cb6edf5ec772ebd04c60159fe2b6f06d26234d5a499ceb4d40bd03 +$BLAKE2$0876f1afe65ba36a435ef18ad12dddd7f05f5ff4fb3e6820ee98b5a480435f72db38b456d2e279accb0c826cd89885786aaa7ce87ecbaf19a0d7539ca7690095 +$BLAKE2$4f5d81a3ef9f9f888fbd8ffe6d177f241e5c90a234bbb910a3404b6d71518e52a615634f893fb8bcba2923722b0678238a0eead86f20a146072bdfc3622f6e05 +$BLAKE2$a3eba04036329c20b7ef4a92afad9c6903ad23b568f49d90ceb24b20e748fb06b5dcbf9bd51230097a790575c29463614b7d1706b2489685d89bb60f3c52e16c +$BLAKE2$a5f91a2f7fb0114232134dc0b4b58ab2df52f828c9b9d90d05bd9b6c706c4891e7d854a788bf21d39376c8afa3114c99adcb96003f0a81d044428268096c0164 +$BLAKE2$25b96a413cd7ece5a3c87a3b5820b971c5ee36d7dd8e380205f0bf9ea06f63cb9e6f980dd88809639a3ecb9cfdae39673a3e48dd49208225500223689cc5b442 +$BLAKE2$e3a568a78dfeaefc24e44480e18b65317b4f7ba0429ce29d4fbd293cd7cc9dee3cb269843b6161f24727849af0651f5ac317e839f7e1590849c565ffd224b171 +$BLAKE2$c0d01f6bd4f67c1caa67a6f6618390a09578064fceb019cc9ca1825ee74fb4e3232e215bd0349a042a72b5ed6d92b01e41b5e0468de39b3905979b491adcee50 +$BLAKE2$7915e16796d1876446220e7302a8d010e519af094073c12e60191151dd3bbc4d3a7bde583ad832966e891161718daafc749413453e221db82b053dbc2c496d60 +$BLAKE2$1f683bdf755306087d5d6b95149529e8f2c1c18d55247666135c2740daaff5e43c72e7a1619e1eb1eecb38f98c838361474486978040d9be10ef66645b085d57 +$BLAKE2$f2766de2d835ecde82274758a6be243881bcaff141a893739c2121213429088279115b206740afefce91cc19c32b949fca57fb1dc15c8d6163d02bbbeeb312c0 +$BLAKE2$ab646135de72b67164d42f15fd680e9f282695fc48b64a376c6dafeeccb7b9c9df0abaa5de9ad639ad66afadbf972058148ee5c9371488d54640cebf87d938cb +$BLAKE2$8af1cf71c35df8442d57fd2458b4a46f992d79e5dd8131ea74342984fa35037a1605b6ba454e91d3f3870aadac242bd7b055c93360f7117594827eb03433bb5d +$BLAKE2$32bce12b631d4e111eb9f5ff9c0840cc0ac89b424110a3e3c757d046f69ceb8d57111b7a80fbfbc6be9ecee4744dfc8f8ca576569346d7259226adccbc67e3e5 +$BLAKE2$9a4c00caa577fbcaa5ef2b475dce9c34448e1eb6e1623c96c50996364ba61dfd12a98d9f8017ad5020ff86fa4597b5d329a667746dd556cc2ebae0cb8d6d777d +$BLAKE2$4c8b8eeea32bc797322e0d469d12cafa0800ffb77fa5587257fcc5cffe9dc64c6362c2b6c5a7b49a10eb8bf20662eac30811e26009414b34741a92ee64a3293f +$BLAKE2$72328365a05eddf1a9d5eb1e03b2b1060d5f7a67130b26ab36cf62c26a0059b41beb46b2c91291b681501732e00d75d5563f32dd52924cd9d9f42c9ba460d8a8 +$BLAKE2$cfe6e4f844450e6c08d538096d0eb2a73675ecaedb282155b119bef54658aaaba11c79862edecbe298b1d1af91aa39200e451f2a8ed5e094b6a9523bfbc24fe4 +$BLAKE2$3675f6aca1fe8beb6a24d2c1a97646529bdb321a9db4a761e97bfe87ec2a08925910319965b900c8c0a15aea888a9fc5298be563d78cb6ad386cf69fa381a912 +$BLAKE2$2df105478cef0c02878ff56b6e5f5bbc1b546745b602a6aa9344e6a25b825797c99090ec996919b313c9157003983392ad0582e3ce934773badddf20ceb40c8c +$BLAKE2$9318caebf9d76d8e126f6e8bd610443b4cd863d8d13dd7d95136c902ad95a4ded96e682f9a41dba12c60cfbc884c85f88c64d5d82d2543c0dda9be49d8cacf78 +$BLAKE2$fffcf786a7a220e822b13995207c0d619d329cc7275810ba8b10e4853c56741d227c2e2fee7b3d681508c73da991d657da6f225a22f595f92d256ad981aa880d +$BLAKE2$19f164559cd1a3b66e440d9e33cc6cb1b6d5cef280c4b1f36b5decef9f82b761e4e2604d4a2df8fcd8183862d9bd32ade49fcfda8b65ab48efbff349356a489a +$BLAKE2$46b2cccf47255361cb98098d5d801c69f0045e4ab544cd11351e10614f6e13e4ffb453e800455c89ca19a47860ca3857d488394fdd4bae41d8f08925d202eb5f +$BLAKE2$3c428e7aa3238c72455b8e7243bd323f2ae1a561d22890701de2c34905252011c9438a2cb5a56ecaa1ac6b35427d3ff29f6047619d088de98d27c69eafd1d7c3 +$BLAKE2$3fdf5fd5437418d9a80ef65cde9748cbaaf05545b49ebbc4bc24dcd840d163c419525bbc6fdf62b05d728ffbff67a28101e07517735429fe81637c9cc483e634 +$BLAKE2$c08adf507b20ab8e687ab3a8883386ae9abe009bcb980873460db1e063cb4a58400d5dfba454bc76c345152a7273601806c78fe075bcd8d388327efdc0ede30e +$BLAKE2$a2adf65b6d4c7342fc840ce368f3401651d6b8616a9261e343b05cfb5af1227b8d2ba9beeaf675444cf3d35975f938f06c4fd001e2a51a7764aa5ab2af7bf236 +$BLAKE2$cf7fa77f3e03ac15c35392a3256678b1ba7e85b166e33ba632f4608a13dc1598f2e64e702edd618cc8bf855d3563c7712efc64a8700bfdb5713154c12ce353ae +$BLAKE2$c76f2ff1efad42026ea4f22f2b4cfe6d0e3c450b7a505d287f9a0c9370d50bddf75793347542fd4ed988042073cfe12937ebd0b4c442a16b916b7a4decdd1b86 +$BLAKE2$235184b3fee6759f485847d049c1e67f115a9daccc3949eab36cccfca6ed22dd3582f0d6c8bd8976c886e80facb0a888688744d013708e482897fb4044b88f9a +$BLAKE2$b30119d28eedc18930b855a8dc138aee59509a2f36a23ef5ff74adc5bfbda1b246c1c75d914d23541c71e968f00f3ea25528b2c229722913c74900f27070f327 +$BLAKE2$7f524d55ebe1e0b21b38936148223f40fbe0e2f88d87e4bf0b4d7fc37b0b6a8af4ca7c70466534efc85a0eb4eed8aa1f8241ea2db4888d58f54218b90e3cbe5e +$BLAKE2$238ee93568395424cb13e177584dc4b4be2c1132a864baa08304193452fc5616f431fe2c0e035f0b62e0559b205ea2bb0a6f31640534719a3d6c6c1bb5239efe +$BLAKE2$c9aa0e9feb18b4444cc3bf387e4d1c1313c8737778c6e2859b23cc229d453b2d6bc5c919cf0cba4e540d596d967f886dac495397f401765ed3c54049d4ead501 +$BLAKE2$29fed39b24d75809577a69e9abccc889f11ec7850069a08f2b8b12dc75de975cf683b56b2cbb8d8bc318f51b763c64a8bb56f52e8b78a16bb6f63ba7662aaf08 +$BLAKE2$d72401f5d987ff46fbe4321115d770d90bba725889650e70c765ff6f71a5fd9c127447df445fb448b50c0b7af1900db3922170799991f36391bca0332345b9d3 +$BLAKE2$d0f5b54347f1ef54df7bdb9f1250c259f20a3dd741d97abee856294279b3c405f9b3072b3f8506b7debb366ceb8fab9907fd787e223ad85161a51042441eb401 +$BLAKE2$8a3189f3e75037718823ce706644c4d173910911bcc7b67533d315e99bdedb84d0355519d974861d44a5c5fb80dc22047cc5d5f34996a66cd413bb41fc527fa8 +$BLAKE2$ed5c6da539fd44ad11bdc9774dff0168d40559d1a1c146af4f77cf471b7c92ee24bf46033568ddd6272b8d59d972c1600f8854fb79879f9a4fba6ae15430824e +$BLAKE2$45763280f19cd54507e86cdf4ab9bb4faf391c6b00bc412257a0f4f1c33b0598050bef4cb0944d14b1eab9dec1033928ec8275f3ee7bc221f02707a3a7f151b5 +$BLAKE2$76d06720951051143a7cbfb22c23d1dcd22358b37c93da3cd24439a3d5eba004b5deedc630680d09c549c44fe317a223cc54d01040039320283823aca07ed315 +$BLAKE2$511b05c8bb2e96cd231d62e548d5d8eec029feff897913a0360e565cb6d825fe8322c07a665b01dddf23e5aeaf80277f010adf8d654823ee1267f121e71b0dd3 +$BLAKE2$b1e269329199585d518b64b9426ce02c716a20945cfe02877f9adb33bcfa4fc85785f7ee0ce8a1aae888dfefe026d0da16dbdbfb4145e412bc2a8fa5dce88679 +$BLAKE2$b2453d9b2484791e60e098e835405d3a6e6cd8b8554a983fc0a17fd1d58dc8feab8c720255d347c0d60b72f95119a8f57d0c5b07d056fbae9ba8b80d0acfdb85 +$BLAKE2$99a65731af842c389b36a86843fb576ada3232b16ef2120d46c8aac85074a00a8743d7290dc64e1a52033994649d769836f3782e5580eb793177da5bc51843a6 +$BLAKE2$0f0245808bd80447bfd4b17b278ffbeab859c9cf8763cae292a1f5b2b11f35c0895556524bfa6f086b9cb39ac2dc1c70bb6b374694a54b6deca96fe4c1323f4e +$BLAKE2$627c29fa6b8dcfc888778771dd74020e4e0ad63b4111f1b2b893ac2c99566200d91d8bf56399caff63e464459656982e311f7d37c599752e2faca68b24fb9ab8 +$BLAKE2$ecd3e4494485d2c32af3f74f67e565fe3fb2d65baacc6274e2bed62c0d13432569b18fbdace98a213c7594c939b4561e7cfa3642362c10a05b35a7d48bdbe4c7 +$BLAKE2$acd66c1c5e4460d2637089e7bfaf60fdbb045193fc5dce1bb42450f6f6e377c74a1a7d4978b8010a565b67a3d833f38a6e7b53538656f5853ebda0d7fd262e1f +$BLAKE2$1fcb6a245100a20682eeb976e2b3dddb36c18edc8e78a21d4afd44f362ec9dcecf85be5b7193dd5711ff920ddda01d60ec51313ef99fdfecdc77b9bcfa99dc63 +$BLAKE2$9159a7bd60526fd503a4ba5fd7280885696a9156918457b351153da5f816408030564fb2ac6d25c810c9c63a3cfeb7bbe54e1c29ee64e715307efb01d4102299 +$BLAKE2$8836997db41526a5c8e0045f638648ca957dd9b555bd05ce4ea15070766000682d3889ee150aad892dd2c86bd5035dc19731d591be76989227ac97a7fda61abd +$BLAKE2$36fcf20a00b9c539dc3e8d27d5046309df08252481cad3b723ce2af0e8531bff8b1fd5d144f6c1b8fdf375e2657f827f65d985958abe0358b7b0979283bf42ef +$BLAKE2$588b0c629cf198f9539a87eb7a326aed75a37fc17b6cbf08c92f1b8ccfb93a28fa7a737052dcaf7f021b69e99c59018c09233342c6fad48fce68fea1d77e8dc2 +$BLAKE2$141e7c0f4eeb9c44c545b2ca9e7301e49740b67812ba9e693ceb1f23856c094a537eab95e801574da8f1f091caa6af3f700d8dfdad67d3adba8b6c7beb162b8d +$BLAKE2$4fffab302c7a9559293ebd0ee2f6dbbec55b5a1e9fbe92d75ee56fd913f6400f6a63e3b9461eb4aa186a6dd8bc4b7db18c6e38c1fe685d528761308c05e0b181 +$BLAKE2$65e4622a45e700d9396bd55446b7938b6adea5f54175ff0f4d1637365b12fcc868664940324b4363b80108d843efbfd634fa7de6de79337f2d0cfcde84483a34 +$BLAKE2$1a99e4e983bcafff36fa7b56c69a82add8d1140e5c38decd058eff370a7753f3b8f60ce94f1ea98e139c25fee6e33e93f2f03a100e75f1bb8ee9171bafe12e75 +$BLAKE2$d4bd48c98404d8469f6595b3dbd7e2e5610c714d546562fa7ff3edc7caa5f21c25e985d5037f37fd62d7ce996d5638cbd0ae52a3d58215f3683a8936ef126b7d +$BLAKE2$e732f639d94e7613132b127cf37a3bf0b38801c29a5f4c694766629b3d9b73d8ec1a428c43a7c96aae0b4e9b9435843dfff2e95761ac13008219168978c0d04e +$BLAKE2$029effdfed05253bd0c89c7f7dec5f83d8841645ea675fea98c5338eb46baf0c6c8ab4366db632467f66ce6991871ebd244d657c7c79391a9b8eaea2d1859408 +$BLAKE2$b58197a3583d73c60d30b1713716b938f676aa6b79fadf0ca59a754dcf635427c6bd90665c3a27c03997f790d3ea27bb96d8218127707a79c966aad1c076e8e1 +$BLAKE2$51fe01da0f2109ecb0ebea5f3fbe5963023943f28c1028c6513286a40c0748183b65b7f3fd1ce79018de4c4cf8da9b4c8af3fd75dfc1721a6c250443fb1cdeb0 +$BLAKE2$5e6f9d1fb8182c0c86c5730cdb876f069b085f90bd9d42700bd115d31cfcfaeec40ee6e2ebb745b0266f2fbdea99fe7ac4c9798f606fb35ac7cb351cabb1ac88 +$BLAKE2$ffb049275f440cabee8c7c0d8a8e9e67aa68594dd10dc88a0402eb62cee33255177d032011e984d3aa967e07f96d9da067a4d7b325f4298aece43ebcb7d6ba93 +$BLAKE2$ac81370122dd21d4b54e1d638789d0a81a8c0f980f7e4a416a857eed3b831c12eb04bb6dd78c5f1abd8e632649b9d72cc5a6591a0c372a743c3798739337a507 +$BLAKE2$2e67878a3c0e45f9814d50b034f8ad1eb8479c47991d3b44dbc10b098c7267334d285ba61f0d14268ce6587c96490d053785b52f9a8520fed749158f20372aac +$BLAKE2$6a66944cca1aea01ce47243e93dc94f42e0bd55a38aadec9c7f588cdf6ab6f647ec044cad832edb68b4bca2c1baa9f8fbfb5c49354c64ecb963d8c66ed0b1d7e +$BLAKE2$f93a3a848d3e55eecd3fa2625f4e4a2380604dddf8a2e592743a8b0dbd036161a1d516d2e51c0028614acb80717532c091509b856f1ecdaf13c12785240656c8 +$BLAKE2$88126af898d6400d26eff899eec6ee2c026d76b248a66fe8255ab1ff0a45916cec51e725b4636b08a66debf22e81371ed61c849565b1628dbda2dd2c142615d6 +$BLAKE2$a46c4f844c4efd3dde68aee7e6b12adc1afd952f86ca60d76bcb5b9f9630be675057a15607558c275559712876b74d25bdee4d8847b4edd7178425391b3762e7 +$BLAKE2$3eefdea9a2ede7762cbbe1f9378dbb4d3d6888d4fcbb68863911b04b28a4d4bba0082daf1b27469349669899118b36456b09e18b98a06171b4806c238a9a2e28 +$BLAKE2$a92f2f54c537bb6158f4fcc073329e02182540e9bda366bb8d49eb091119848a7c9d2243864f3af9feeb36baa55aae2b75717ca28854efb9f39e45ff659e9a04 +$BLAKE2$6154b70364d43086e648733c2e402e64ddc8ce08b13aec1e2e8e9dd05e41408b39f5f1bded226a45ec85ed5a37ca0439b7022e31ce9c6093bf4a3c948f774c3a +$BLAKE2$4ca4a38d3404947e4781f0445c5e4b9a07981715edfeb7e567fb82ce6432677f309aa7375dfdedee9ac4421e73940c8e0fd5c1aca445cb48120605ff52f1d10e +$BLAKE2$4a1177ed10926e449e3f1f0a8d79cea639bc7c467f36af6ae2c1c30abaa4ef42367b98d3bfc60faa89fff8893d23762de3c3261eb260886414ea887d9c375eda +$BLAKE2$e420ba19ae3e0d8f97e6590f72c3e6ca56fe233f296ad53c6ab3d6b08effbbf8e5958fc18949537f070dd2fc2b2b4230360f42497cc84272af6690f3a9bf04ce +$BLAKE2$bbca4ca9d49d4f53040d2a06da6a472003c8c4c628e7dcec87b4f6a279e612932830761a8282fa5bce8a051f4974c2c3376d863275f03fde8119132976e63e95 +$BLAKE2$357e440f0f8704848e108b4192af9a0ab75b53e4198dd1acf87bb9ad24eafd7cb8b1449a968817f40ecbe62a362d1731c972bdc729f5b79e4fb89d8f718bb706 From 68eedce3e6eef8d6639d91ba02626d346473da7e Mon Sep 17 00:00:00 2001 From: bacqube2 Date: Thu, 9 Feb 2023 13:40:35 +0100 Subject: [PATCH 16/28] Modif tests --- tests/password.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/password.txt b/tests/password.txt index 953502667..6d2df1028 100644 --- a/tests/password.txt +++ b/tests/password.txt @@ -1 +1,2 @@ $BLAKE2$508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982 +$BLAKE2$2c719b484789ad5f6fc1739012182169b25484af156adc91d4f64f72400e574a From a016e621a702aa94b5f8ac1ca6f1ad2cd66eddb9 Mon Sep 17 00:00:00 2001 From: Louka Date: Thu, 9 Feb 2023 15:22:51 +0100 Subject: [PATCH 17/28] update tests --- tests/blake-test.py | 11 +- tests/blake2s-valid-hashes.txt | 998 ++++++++++++++++----------------- tests/password.txt | 1 + 3 files changed, 506 insertions(+), 504 deletions(-) diff --git a/tests/blake-test.py b/tests/blake-test.py index 03e0af9bd..f80a9f47f 100755 --- a/tests/blake-test.py +++ b/tests/blake-test.py @@ -5,8 +5,8 @@ import hashlib # Python script to create dataset of passwords/hashes for testing PASSWD_FILE = "500-worst-passwords.txt" -# VALID_HASHES_FILE = "blake2s-valid-hashes.txt" -VALID_HASHES_FILE = "blake2b-valid-hashes.txt" +VALID_HASHES_FILE = "blake2s-valid-hashes.txt" +# VALID_HASHES_FILE = "blake2b-valid-hashes.txt" BLAKE2S_HEADER = "$BLAKE2$" # Password source file : https://github.com/danielmiessler/SecLists/blob/master/Passwords/500-worst-passwords.txt @@ -18,11 +18,12 @@ def createBlake2sDataset(inputFile, outputFile): # for each password in file for line in passwd.readlines(): # compute Blake2s hash - # d = hashlib.blake2s() - d = hashlib.blake2b() - d.update(line.encode()) + d = hashlib.blake2s() + # d = hashlib.blake2b() + d.update(line.replace('\n', '').encode()) # encode in base64 and write it formattedHash = BLAKE2S_HEADER + d.hexdigest() + # print(formattedHash + '\n', end='') hashes.write(formattedHash + '\n') print("Done") diff --git a/tests/blake2s-valid-hashes.txt b/tests/blake2s-valid-hashes.txt index 230f4a6f9..c3ac195f3 100644 --- a/tests/blake2s-valid-hashes.txt +++ b/tests/blake2s-valid-hashes.txt @@ -1,499 +1,499 @@ -$BLAKE2$ba08e9b0d31c5a4eec3f0bafd2b1c9e63a86f14a6ed1da891e575f165ef8f3bb -$BLAKE2$6cf584a9285679edca822524c4ce8b9b50c43642bd0001aadd5b38299bc0a57c -$BLAKE2$11fa7c1103374ff17e5d0e59e433b0743284177be0ee14fd2639add102c4f020 -$BLAKE2$87361fc2ee0a0155f1478e4025043c62e43354f11d694a318e0273bf2b95c0ba -$BLAKE2$1c3f004442d1e0c5fc2c509fa86c397052b1c3a934318137f61a4a628848642f -$BLAKE2$709dcba6d2db68cdc6d4d3674cf8382755b6f6d673c68ad2d8132d5eac0a54cc -$BLAKE2$d8b59df69749fdd9a7e9ad6a9154367f28ed84ce6df0e91bd3982c14e982786d -$BLAKE2$418a20edc50181568918d798e862e4bd6a26471e3622d81ba349b09812ab4006 -$BLAKE2$856a6d77f6a9f93bb6e7498e6731b1f04fb5118610aacdc9afb90ead3b042fac -$BLAKE2$6d94063cc0ae099bd0e12f946f3f2d577c7969e0ffe407d5ee7d9e6cefa60882 -$BLAKE2$88f736073e73b753dc62d73f1898c30611432dfe375daca0505d27f6412f4630 -$BLAKE2$6ce36dab0fc75a08c7dd680d8e79c6fea051219c19262c8bf28939403f2e4adc -$BLAKE2$da4b5435b0ce3bd67b347b686a7a6f946d8d39c3c66ae7f56e16a8297358da19 -$BLAKE2$77fc62d5adc48e0cade36419ab51a290caa728ee627d71ec633bfda2090fa83e -$BLAKE2$1be470485b09416bfa3378f4a24858787b809436e833057e61c26f0aebf6c4ec -$BLAKE2$150abe7ea429e5c13eeb672c6f604147d459b8629e695080ef095db624643d62 -$BLAKE2$26bd5075b589d90ebd857e0b84e965839764afa261eba41950296b440d7a1c14 -$BLAKE2$8b0cb8b9d0c2f4287d1e5b08283fea69a04e36b2467a3dcc73e4aadacaa12ea6 -$BLAKE2$f071ebf10d75305e8b70c59d2e8938515e71ac61039873099e803a007bf4c58f -$BLAKE2$cc87b12d8a1de96100e8c24bdaac9b57cd2dced9426b2a4468f7ddfc98d4064e -$BLAKE2$2a85bf4d1536e97f3146635022b27afc5ffecb1250c0ebec95bdd09f4405fd25 -$BLAKE2$823c5883a4a3f1ab343cda5746529ca26d04d6e898f191b21a5fc2a16c33a8ad -$BLAKE2$bbdd6131eb5248348e3b55f65821ef21877a5f9b80f859d369b9b0f7c01b6820 -$BLAKE2$8cf72094862b3414f0efe99c59692686f3718ebf39dd29ce854ecedf31646a20 -$BLAKE2$5168353bfef0b8b679d8729fcf9e54fefe05ee57aa82873bfd506470e17239d7 -$BLAKE2$77d0a1fb0b0738f3226841c64d5dd7e29c82aeb042f8ae1dc35a2701874b99df -$BLAKE2$76a005d158ec4bb1e27934f8cdbde1e5d0e2282fa65f6946dbabd8524f976419 -$BLAKE2$aed85a67a5834c4a2da8932bfde3d7681add52a099d53794d377a3d879112230 -$BLAKE2$6b00e3ca889da6e66fbb9325523d8a87e3310e5040c4e1f3a748a820d9fa2f8e -$BLAKE2$975c6313d3cb4fae3ff12feccc34a68b8719e2793728377b3f32fafbe39b8a7f -$BLAKE2$d40e3a9a75510ef8b07148b05964f43c57157b2f6d7fd4eddb5d5eeb2c1e9d60 -$BLAKE2$8ae05c79ccf242cc954fb36584b2181cc9236286a0382e69b516f2cef3ba5902 -$BLAKE2$ed265610715e5191c371ece4de68a0453a31898a17ca2b1f21c28577d31cce07 -$BLAKE2$1eb99e5ff1b1f9567df5792bfbed918807c32bb8d26b2c7c86c975b1c57d014a -$BLAKE2$6eb2844b17ade456b53ec224f6d4762a8b3cb0b8c349200b58b11ffe7d3b1867 -$BLAKE2$81fa3f4e4898e07d88252325de9a86a7c37b492ee11c4853610d1af724013087 -$BLAKE2$1353db829cb6bf4b8ad9f1653f6d385009306e19c19fa6fdd94383b91241e59a -$BLAKE2$2d0802e7ac636f16b23d77198aa9ba0f89fd60d74cd07be8c8ea448bf9e2ab1f -$BLAKE2$0b0f419866944ed4d7bcc38fb2b066d020f74f41fa27600e5d99e401ddc98085 -$BLAKE2$e9a8b49bf63d8a74b48d97c7300829927d14306aaf22bef70563d395b6cb0a6e -$BLAKE2$7d7c4ae414d0f8abb64f45c49b0c878ff881655691ed5124cac3fa97f260a26b -$BLAKE2$577e1d0b3d7470649c679c5282210f63c1b9168b2b21c79b72685763048cf5ab -$BLAKE2$cde3715eb49b32310e3c1a122d8b62418606670b1916193f4b512b02615fa57a -$BLAKE2$62baf1e31ea0aab68b49aac9214f52d8f07af6da29f3f3bea638103d5e5e067d -$BLAKE2$229e892f98bf37476a8afc76ee9a6fd16fa38f7d72bbf77b41e406deb4d463fe -$BLAKE2$94eb97c12568652b665310bee2d86026e3fda6fdd3e406b23ece55115b9ca81c -$BLAKE2$772293e5eeca4de5a04a926f97f0f25df96dd5e02f3bf097c061219374b220ca -$BLAKE2$ab3103cca8d1cd75d92728dc3e479336409f65940f760c9182a492b4c44e957e -$BLAKE2$bdb9532b6544171ede2ded9ce7847ef30135d69896566f5c188c27e0b8fc99b0 -$BLAKE2$56a0dd23625d82b63102b6915c56073ac20481d77af0edfb84bf5dd4a9a615d4 -$BLAKE2$6478cd84ec927e5ce0219d487957216c147ed2873a630895e8ffd6601365b5b8 -$BLAKE2$4cb9b963aaac5dcfcc283ef24e5c89f968c3dbe0f7e1640d9b1d246d29092f57 -$BLAKE2$bb5af99aea722cad52e7ed74413e5671db8d86a8f9d438eff37cf3aa5e963236 -$BLAKE2$f48b768e4fc9f853548b24d7ca8411d765bb91071d81142c8d3defdd97dc3726 -$BLAKE2$4309aa9d5e0c480d0440518e6d9d39319262acebbcf1e958c29a51ef8b9bb36d -$BLAKE2$a23d86088e7a7526acf02f0f5c6216da43aa1bdb7892721c710aedf95f8cf304 -$BLAKE2$173021f80295900b1674ea71f14d63352adc6f94f4b2a15586220aac25f2d170 -$BLAKE2$a281d1612d40c995b8b57df944f6c7e42c07ec20aea84b920d58c00b422b311e -$BLAKE2$98143913f273d896256fa862e9911192e2f15f66728fdbf5d8fb83bbf7d4e9e0 -$BLAKE2$3944d18a788dab51b10001e32c22a85590ae6ab092a12a5d3877d0c240fa0b75 -$BLAKE2$7e5281806efdb8935a9e1801847fcd641727cd83f8bb33594858b147f086f702 -$BLAKE2$3f1621c85777e18f0367b291e5eea1ace1071a2da424fb479b6018ddda422f99 -$BLAKE2$294ced3f3a14df098aabb37c6a53382aab0af821304595d46e179ce4211b20ce -$BLAKE2$62c518806a643b52e97c14e3925535dd64c8b37e15ea5d4224fae1c7d9c83c64 -$BLAKE2$3b6b5f750b1d50e27feaee361ca73c6078a31d70a2ee19a4175b7ca44d7e2959 -$BLAKE2$b3464e16b759821e5b3df2b866c092a1b044108c7150ebc577c2491e41d9e251 -$BLAKE2$0b0b18c0726e97121760d32aea490470159541a34a818e9d3d7403f92e6b7aac -$BLAKE2$9b59893a29cb61e969ee7abe26caef3861d6ae12cb4fc47f9062236fe613349d -$BLAKE2$a74e7b6b2a7de830877d3b424eb8272bb36259047bbe56c8f5e6188b40050c64 -$BLAKE2$93335ab1e466b8bd8714ce43dec08eeda4b12bfb2ff9726e2a0e8da1c7d98137 -$BLAKE2$76a56a21accb4b916a9f097029cba2fd6915e5f4b6787914c2bdeb25a89d7a15 -$BLAKE2$8a6b59458d81f8f72271d47ecd677e0afb558cc5eff2d24046781d57fcff329e -$BLAKE2$16b6059b1089b6b5a1bdf4bfae5fbb201a5af919e4bcb1c7e66e43ab40a149f1 -$BLAKE2$a164fb32ab56c9c29509224dc31284f6e30cad44ea45fff2e0dbc6e9c3775c52 -$BLAKE2$298e28f94822996ba2f01ef5bba282451f13a4f474bb287d6bc49ff9defee643 -$BLAKE2$0e73f055808c76834222071333d39fcbd1c7dd6f2dc7afbeabe76023b1609d75 -$BLAKE2$be442f168f216d5c1625785dee83f231e24815d17d32eb8c2eb31a0a1396e34b -$BLAKE2$f4421e461d43f1a720250cddf09827da9e8c41e7be19fabc4a8896717f0f0870 -$BLAKE2$cce76872e5d9a118c1a3c78f6ed8414a7452ac2f39a4117ef7249460a908f079 -$BLAKE2$a200db738561e6f939226770174338d92f004ae66d7abe0f15386025744a7851 -$BLAKE2$c889bf976489f2d5d9838aea436ffbdb9ffa2d2d5747d95e4ace00c980f350ca -$BLAKE2$8f4118f0cd494c737542411768200a09491c624b35c350eb61f296e085439cd0 -$BLAKE2$939835e3ba27094f1c2851961c0df06b3643e55837fd9a26a6f5b972acad05e0 -$BLAKE2$ebbabf826262b33565627ff9513a54a46afa79c99b537c03e119b304e7a11f5d -$BLAKE2$01921179d4bc76144d55697b4c75c790bc3dc4bd01810fabdb04a1deec6c1001 -$BLAKE2$8ecfe1339c24c82c62c8bd196b6c2079cd24fd9602d59ca0f50e6325f846e25c -$BLAKE2$965dc748ed6afe6031d39b6978da6ee5c12ca5fdab0773ff717e4bb71f194a80 -$BLAKE2$6881c0983e251969247f0d0e6351bb5b01d4eef9782acde5acaf18a960195bac -$BLAKE2$517a8c92234581728c7b80af1f5297934ce58aec4bf3617346dbcbd010045ca0 -$BLAKE2$867c15f054c6de1b6f17d2c63abe3da181c94ff2a2baab9d835d2e6988b9daa1 -$BLAKE2$20b2317b4e688e694d9ba96e0977325d1580ecf3ee8a385b26dc6221727b2207 -$BLAKE2$d70a00f3ad911ffe73a2c8065b3e4dade1fb302423b20dbe1b27c83c0334d67c -$BLAKE2$4fba4698c50dc73e82e5ea3954aa8cdae626382d0d086a8f9e4a72f42a07f625 -$BLAKE2$82ac71c9e2985fbb9361e4f4379a07b934e9bb4b9feeadedad6072952304d80b -$BLAKE2$61bfd377a17350a55bb06bef8fdefbbf2917fed52568eb02aada6b3f7bc9ddff -$BLAKE2$6848d7621f8295b34196de31afc47c636263a78a2f26e8abc2592d751151d1ca -$BLAKE2$74e31d48029f5598bfa151eb2cdfe1d7838a8ad0ebb1d889bb569e1a212e811c -$BLAKE2$3969b3926654065966b6f8d9a65789b0f76d56e1e2ab67dd94faa770959187ca -$BLAKE2$b0ff54a2d0dcccce7200f0a8001b024efd0a9e9550be236900a12d20d0921e86 -$BLAKE2$5145607abf940bf3bd9273559dc5414eab360f225980d79e163d157ab47e82fc -$BLAKE2$0c4ca0e6adeba449ef9e6a275d81d7186bd789f43c3b9ebc07f259754681d43a -$BLAKE2$cee6feb330a7a88c22b05bc7167e7252f084f5baf91955c8ab6b581788ef64d1 -$BLAKE2$2c9ee8c209e03ca75ea48c68e22723865d8163d72221b56531cc8b0e8b62c460 -$BLAKE2$dce35f9ad9e3173e6d246af5f359ce782f29cf1a2ee792e257d2b9a4cd130c31 -$BLAKE2$2c5dcfc68b3b4e4a1c75d4f202d4abaae8ff21a0abc91e0dc1b15ee25bd5097a -$BLAKE2$d5a63b73dda0efa545f38aedf480a3aabc060c6dcdb8c2a1e65406f89063e321 -$BLAKE2$2081b01362487f13a812a88681909d370a16eba6cdf5155c23fecb07650f0f17 -$BLAKE2$f6aa9109007219005e71ebf9aad7b5e88e56cc04bee50123ca6c0419484d0a00 -$BLAKE2$3380e8594b71aced82528e016554935c66426e9d17bc61f083d5c4949d119348 -$BLAKE2$1bd088743487f3826594c17f2260906bd0446882ddb2c6ad343de4a54d64727f -$BLAKE2$48b470551a13a3a1fcf464a1b3c423319444fd30cd6e2975bb5583bc895cb213 -$BLAKE2$dcae9d7611dc3299a10cfaf64c7f27e1aa60c6184b2700333cf2ccb86a5b7c9e -$BLAKE2$e9944efddda0c0989d5884225af44aa2999b61e3db1ddc4a13882e39a12f2daa -$BLAKE2$5b22c9842cd120c84253300416e19ff5bc8472247d44fd54f9431177a6189eb8 -$BLAKE2$a6ba970cd97a5db4e642386182946e84c2247e1b164b824403830365f4cd430d -$BLAKE2$089f302b18fc49697c5ad7254e6cdbdfab3d00056e22f746682133e5ea884e56 -$BLAKE2$db11e8c6b41565f01bb88a1348ccb51a7ebe5990f460c1d2bc05892a0401ab09 -$BLAKE2$aafd5f931022f6823c0e5c422d321771f887c472a22fbc451c080e1a355553bc -$BLAKE2$5fb680538a4d184824578489576df8614704d76a2a30cfdc8c22545bc8a0aa8d -$BLAKE2$4eda1f2f3e5ab9e76f49e36829d2d66adcf564216c61424ac1526f24cd62d8c2 -$BLAKE2$19673a15ae27918bfc460953503ae7efa72f33ebbda705ee0a3133a7a4b0e9ca -$BLAKE2$89dad277ce899cde08623f206f296d11b4218380fd656dfcc7329b2d548a2c4f -$BLAKE2$f26499cc2c58ce2ca405982903dc28e06bb83deac11ae5f82c03d16b04b876ca -$BLAKE2$83bcb423abe8e4ef5fc16d766ee5bd391cc8afbc93c99e6913278e5a1c304a66 -$BLAKE2$43372228212bf3eeced8853c023249ecdf58edf7529c6a505332724eb0d730b6 -$BLAKE2$92416c84483aa1f176b0fcb924828a8958b0348399481ea5aaeb111500bffa33 -$BLAKE2$e3786e038b1ecb2a449f08c337367a694290d3cc2c5b61607bf22325b0262953 -$BLAKE2$2316df49e2d2f535842c2196e778c669a9715c41bd9ffc51b607d5a492ba670a -$BLAKE2$c120109e98f535d4380dde69508fb1473ed8a977d3ee98d6d2b106fbc1df20fb -$BLAKE2$4e7a7028aa46f011af20fefbbd56d42c336322c9b2030b82710618cd7eb19db2 -$BLAKE2$959632e421411d6b943061dc93b57c8669b5daee3ea36ea5a1cc0c85e8caf8cd -$BLAKE2$d8a189acef58b9625ba9467f30f344fa78650100a32af255762abfc455979103 -$BLAKE2$941e7905de976379209b60eb4e1809d40866279430eb85bdd5d51d6f12a95bac -$BLAKE2$bbb835ad458959ac095c7fcd8e4cf65f34fd3dd006a6cfab2e85451d8dacafb9 -$BLAKE2$aad7218a489be1ba4cbfb901780e4b0688029d0203719e5c6b2574999c6e0bdb -$BLAKE2$ea681f5974258fd94b53043dbac5275f562627972526fa5d8e24ccb4d9897009 -$BLAKE2$290d66f08b2f24cec0c0ccfba786a2ae842de85997241736bce64ca82198306a -$BLAKE2$bdf863436bf8f2c9c4183b92ee9fe16f121ee1e0e026b8d596cd6424fd2483e1 -$BLAKE2$edefb6913000690fcefb688538e3a64b40ce3929a4b0b01f26bdd14ff315ed52 -$BLAKE2$d096bb78f5259748bdaf47ac1e6a310afcb0538fb9147f8350f41b924c43397d -$BLAKE2$2df40ca6d18f48601e704dda2bafa9c56250d96c3d5cda67639ded86417b530e -$BLAKE2$0acb7b4f60f2e042338fc1ebbb37d5638386ef9d760ea4483b8eec4864a8bbfe -$BLAKE2$f9465ccac8fd7400efc744bf920f633b4996bb3de913ba0e6e4ecb7ccb3b5446 -$BLAKE2$00e6e58b0c6b69c1a5b37ec574fce8703897a38da57f483ea7833eb6306a7a1f -$BLAKE2$d6be1bf2bf535bd74c3bca5b4c15ed84862076148838c00b7d30900fd18e4f71 -$BLAKE2$64b8d66ad5d6000b65e8b14ebd6fd62647052c712eba8a2581c3926021d080ec -$BLAKE2$2a7dff8433c996e303d06797a80df0788199cca6f92e256d5b525c064d16dcba -$BLAKE2$fc87a86f8decd0f9055299660368f4634b18e3032ac8049c42c1815bd5c833a8 -$BLAKE2$efffdd5dcc2fdefe642eae328dee4d34eb762045204d2d78d1eb625d9ebf93dc -$BLAKE2$a45fb884ac65cdb4559b2bb0b17016bbfea01691eaaa5328d6ef431785913f71 -$BLAKE2$58225c6fb01449c844e53373ed7abfa760999cd9ca2b0e4fd9c296a59ba1ea62 -$BLAKE2$389a2985d618bb4fcd336e3ffbb6d82a88e8fb7f7c0df668eee5e66e4656edb7 -$BLAKE2$8d166965a9fb21a3bd89810d774bee7f4cdfe1c373f226b98aceaed5cd9a91e4 -$BLAKE2$04bf9fd9420400e65b680e1372d755ab4cca7753d64e2f209d873502bb29894f -$BLAKE2$dadcc5f702eff91bc9a44f526281cfc07860f42c4a12f7c4b7e92ecdf9ba490c -$BLAKE2$a836f96b09b1a69e47505770142945252ee30e03c859689f158a7b54e29a545f -$BLAKE2$cd5b9048837ed18f41d69fe2a385f42e0646ba0b80df5039bb58df95f1111796 -$BLAKE2$2ce73e640f578b2f457aecd672ab635100ea9a777dce39474d87d5091211527d -$BLAKE2$bfa867801a9f61fe89ddcff40815630930bc19381dbe418911f4a7a2b1ce221b -$BLAKE2$11934a81928c25f36a316b7e82bd806532579420a2c9802add4ddb61eef0ebcc -$BLAKE2$8eaaadd55707ba7414131c9e41366e101a6c59012eb5b809dac8b7f8eee199a4 -$BLAKE2$95429e018bd9f4616da2ce2b46ff1e98752b65013309672cecb0191d050e6ddf -$BLAKE2$4a48215ea891db08d693ba826169f8e59c3c3a859b2c92a68f42cbb23e14cbf7 -$BLAKE2$8bc47b8d431dfe0509170fc26373049a4ce128e3ebfb59022d8f5bb2200002d1 -$BLAKE2$030f938298fb227d2054f086489f53cd3e557fe1045625d3e8998b44a7aeb6de -$BLAKE2$df72f7d1620a3f1300e38136d026b886379389cee840f2af635641de466bc0ad -$BLAKE2$6e5d59dd97e4d25b04aba3736acde84ed388ac7bf58e96ae15f57f44520ad9c0 -$BLAKE2$b03f1a568add2b2ae4aa7713ac68e0b55c526c22c2a87b5e81a33c271cef1e7c -$BLAKE2$ac3b1d878014436f392a5c08384a0a81ed64c759da945dd808efcfa3130ecfdc -$BLAKE2$d957519352fda1c992e6bca1f641d8201ca38b379ccdfab4331eb717afb80904 -$BLAKE2$75d7617b7646972928ab8afa5a3fe023ed594fa14f08350d8b5aa106490ea41e -$BLAKE2$623755b21bf267803a33c0a1010c66f58f5d4bca0014c3655eec404257d9076e -$BLAKE2$4d39347afc866c555641ff3f01cdf67c55bf2941c2d308bd8555eaf9a3612ae4 -$BLAKE2$1bb60acccddce22d6f1ae7259e45fc6a83a244392d016bd87b6b6bf1aacae60c -$BLAKE2$7d30daf235e0b6e6d67d93068b7216e76b9f2c70236430f86ae1527e90cded0c -$BLAKE2$eb1a854be06d75c935f4451eb2df5840b67df328c08e2a91bd7e9939454b3235 -$BLAKE2$6b5318e396fcd0f93ff8b822c00d69e0902e95107134701b6e3d7f2b5f7201b5 -$BLAKE2$cb8e04e2e6705ca0b1fb241268e3d31aa28e4e59547ab61595777de2e7124eaa -$BLAKE2$abef7df45b16356c16cfb458745bc0645da3bea5832633671165387f1597d9c6 -$BLAKE2$7fbf658a33aeb64c3ec7b1a075439f01115beb60eeed9a4e5aeeb4b56e94418e -$BLAKE2$1028714485c1663aeec86021b4f5124530ccbfc1fa0e19be0d97e2f363b46a71 -$BLAKE2$d460f6ce3f49081442dab71ae954ecb1775f573712ba4ebca83f44751d5bc958 -$BLAKE2$b4ef8aac59f29f6dd8773127544fdb30228e0d1c38ca931aea965106b2847f00 -$BLAKE2$d9c10b63e14775672d73c69ade6a1b7cf9002be9c572a0d47904c0d57044ca5e -$BLAKE2$b38ef98bcb69b6df41f1461817cea9aea3e1e6febb053a80a4e22771300db7f8 -$BLAKE2$3869d0ddd5fd2116478eec0481a491d69e267f9f6d5bbf636e222880db1ae9ae -$BLAKE2$0114c513f7e226420cc7518690018c988560de33e2c12e275de18c664dc542f9 -$BLAKE2$cf5711e35620c167f78710585e977fb53800b1e5b4f72c3ff84b37eafb5c3413 -$BLAKE2$ab668b54cd967761b94928113973807d6c02c9955c82260f189f34636817793f -$BLAKE2$e829692d1fc4854dae50c298fb3b16d5dff02f926aad8a1d35c8203b2bcb3adf -$BLAKE2$c78bbf4c606fa773161c668e0536ea6748603e656fd143f58790051648f30310 -$BLAKE2$eac39c6ae63765d2c6a91d054ec63c4a6fd305aab35113eb766319dc4f1577ba -$BLAKE2$f7baff6fc84dc7fe14d6c773ee6ed40c87ec262859a73d0cbe2f34e7a531dd36 -$BLAKE2$80f80803a6da922068ecaf9bc99a5691e08c774030894c26f42fdc672946277c -$BLAKE2$530a142bf942f499bcfd2d3292b2993a2a6c79ff7dd8a841ed1104925c64c363 -$BLAKE2$db3f54391d2d564b8f23f8dcacb9f8ac1356106323cab8f06caf53535610e65b -$BLAKE2$5e5e46fee74885fd83b37791ff6b58c865b3ab44177d517d4566354218d74a52 -$BLAKE2$038a47721f3f0cdd91009ab1eea377ff1d3dea7cfe67d804447759777e92b6a3 -$BLAKE2$c52e0b3bcbbe088c6d66c354c3bc478b995e3f1975cd355c7c254f3e2878ab01 -$BLAKE2$7ed093a685b26c4f9c4f9117c9a2248abb5c84fb7f53dc3ff35db488da05730d -$BLAKE2$f0a2e550775467b6828f71011822b9e4e03152cef90776a5c3cd1eca87e26134 -$BLAKE2$a6edb96ce9aab52875a67976c1bf7c0d9b3d3b68cfbab0ca26461f16b38b626b -$BLAKE2$602a21b49f3e12c0fa56e335f9b4c57838daad461c2a8ac7d77df5a4ff11fd4d -$BLAKE2$61525a45cdacc50d80781dfce35bdec4249c5935a5b0cfb78501e2f0c574bdb2 -$BLAKE2$f9971bf9fed3eb7bda3412c7516027457d0791445b8ef2e36c7592a05daea9c1 -$BLAKE2$d0644956c374c4f677562ef9860a3b98b6d1ec0ca6662d6dc85920d3bda345ba -$BLAKE2$2b312c647fe9179b9549e0ce4feb7ca099db72042e192cae804eb0f79b94b1cb -$BLAKE2$d800c5c54c950fb75b201574ef253d7d365fcae5a587c4c3d44185ff90a9130d -$BLAKE2$56d97209b60a5d93ee2838656fb0ecdecb5d90477b0334c4a73411caeaaaa10b -$BLAKE2$da390f740e755dc67121a228dedd7474bcb3bc2973b2307aabff1f6eb746e59d -$BLAKE2$57ca678a2b6e9f83116a56f0e402349ea4a8b97a2bff5a119558780caecfe502 -$BLAKE2$8d2d2e1eff4c229107dd60882a24ad0c1e20c3d27b7c1d21940c8c9890742b36 -$BLAKE2$5e0cf5fa8c5fb2e24efd05bc382541555082f75b056d3550d0022b4d4ba62de7 -$BLAKE2$b8239e816c1b6e8308096ff3cc67338e39809d62cfe8df597c985c2427efbccd -$BLAKE2$c91fd4e597d8094d4734248a9d818dd0816ab608c47c70552a016ab043a00030 -$BLAKE2$e2cddd43276603561ea47ad0afa3c8189eda0f61ed9b00f4f78cf57520cda659 -$BLAKE2$ece11b7a4ebcb9a6d0e13269006ceab70f3433a37a750757756d6d36e0c843a8 -$BLAKE2$224d40054ea585e74d68a14b27d42aa3ae7d11bbc878362aa6f9e588d3c26509 -$BLAKE2$428f2ac79f20997c1c5e419ec9c26cb0459f915a1608a05345ea29102106d4ad -$BLAKE2$d54ef2139d608f402b92e3e31daf9b3827813aae4c9992ac1004be10fa04bf92 -$BLAKE2$21c6dac02c63ddbb59e38479ecc6a787832545aeabb88fe35a69678517e1d8a7 -$BLAKE2$1a6892498b58f26f15ec7b76e3f357574133986ccaf274d6caad1eca01deb907 -$BLAKE2$e95376d2b4950182f2f34bc9befbb098156d3a0964755c6cf68df00f58f64a5d -$BLAKE2$6788a2eebd94ef56e70be78af41241eee38401b32964a33297ade824a4253e9c -$BLAKE2$cb1185bb2beb189a17e61a1ff7c09c96da36d72640b5eb6bddc71f243bcf66b2 -$BLAKE2$62b6b07d1c2c9d0a455a2f918d95d8138422c68b09b9896677ffc6a49635165c -$BLAKE2$877e67e629e318ff9e4907521db32e60f3f0160a216709bef0c4c4680635dff2 -$BLAKE2$b3eda290d91d75cb423ebc746f0afb7e6569c003c2298c068504eed7d0343c09 -$BLAKE2$7d05204ceee1c227b18142e4710764c9cdc9b3e4a4416c64994f2a2c9c27d718 -$BLAKE2$f71be1e2ceac8f10db9ae6e09828291275dca443ae96175569622802ecf0a068 -$BLAKE2$3496c7ae861ba1967c3a37c178557e517121af6d084d329eabbee884e8cdb36c -$BLAKE2$ecbdcd48548db380809159a2caee0d640530d5b9406395ef184240f8a5a10419 -$BLAKE2$d597bb17c3e8aa70d030cb44f119e40cfc7c317736fa1196aad1186cff9b2841 -$BLAKE2$efb43c8ac86cd552607b92ca367dae6cc26c5519926982eb5576eb600000f9f6 -$BLAKE2$e4fcd6d5e64a5c8c3ddb2d5544c6f6453f90f598a04b9d4679d5779d4145f744 -$BLAKE2$c35d406c9ba302868360f581bfa6b79b6f2c47d5c56984032fb79f68fd98e66f -$BLAKE2$a5b001eab1c3048e6e49bc1970a1d53e89941c3e9ec408935af268ec7526fb4c -$BLAKE2$573601c04c8ab34cfdfc08772dbddc8d11e05b4d52888085bd5c17b21c37aca6 -$BLAKE2$8665bfe99865b2fb7617745a3ca4119ecbbeff4cb65c4283ff25509141f1d557 -$BLAKE2$b1b4ff5869806fa8c0141f0fdc8cd0e0023320d2030f3031e77aa7cfa23f0e7a -$BLAKE2$c69a18e69b1b68f257a3d181cb371d4109adc439fd383f5e9c6a66fc6c13b9e5 -$BLAKE2$c9a4b604a6a30eaeb5b4e9f875171956750d56e5e0404a87daa1219ba7e8a1f2 -$BLAKE2$b4f703a47203f5eb3acb74dc7540acc0c611fd6545d5b538fa33103c23750d78 -$BLAKE2$c28f0d52e7bada80174af76f397770351cb3d02fd0bdbfec80d8e0ad780ee72e -$BLAKE2$c722ef4c01191e477c438b5da9d866a976cb6f8587c71995b24102bf6c7bfb36 -$BLAKE2$0e7b8897d06525c17081faed7fca0f52f23eb764abe4e1c7dfd891cc89eb0bf8 -$BLAKE2$c63bc04590e7261e69964a5b0568cc0212fa46b9ac1d1e50a88598e34acfd73a -$BLAKE2$e8cb315cb90f1cc8c86ac7058930f9a4553bf9fd807eb6f0f36051e2d5258b33 -$BLAKE2$2a1ac2e100872bfbba6bce1f6bebd6d23c0df7848e1e393bc050cfff9dbf2107 -$BLAKE2$a986a1cb88deccfe4adc36f56f30133deeec85d87796bb832a9e598d03ad2535 -$BLAKE2$d183a2388541c5727b8e92116ad0986a7c84bf8b5b029a692e97d68e89f8b2ef -$BLAKE2$60418088b849094f7cc16200c2f6d14b23a4d926c644e1373d71958338e7b5ff -$BLAKE2$f9be9991ffdee155887fa687e30eecfc3e87a4d7e3801224a8f8f5bd69189a1e -$BLAKE2$391eedd54136fdd1a800e1392bad8d9cc16bad2b53de8a6d88fa42f80cc1ff29 -$BLAKE2$ded48dc52de178a06df993daa6cd3881de5385656fdc7824d24ba2ec7a790f0a -$BLAKE2$1db2e6b5ebcc1d6ea5b4a15b0821ef9473f960e8a4445ef12b101ba22a9b2e9e -$BLAKE2$d35f94a07e157145a27231a86e7431d5fc708860b62f1698919876a6ea0eb9b6 -$BLAKE2$4a20397a6eb7b6a6fd569f085b500de8f9411751c24568580a57ee6243dd2ebc -$BLAKE2$49c5c7ad894a7efb743f724bfce4ef6ae23be684c233b44388775caff0a71b11 -$BLAKE2$6a9db534f433f4e5c8d75b7bfcc40448511272d7bdad89c4cd7965eb34eaa358 -$BLAKE2$ef6fdf6d0029695c6bd7c848ba1e45c0df88a9eb253d9a0d122fa6040ce141ec -$BLAKE2$3feafdda55800c0d250c5441a78a212b052db460c6bd70891cb6459a3027ad46 -$BLAKE2$42ecb2d060da14241f32b86084a693985dc44f30e212d413e4a7e6a22e41e2f5 -$BLAKE2$602a1bcca151be890bc79f46856f94f0684327a14e2995d465de87e4f0739f4d -$BLAKE2$ebd97e6d162c25ad1adfc3cca01d85e0e0508954f94ffb1754fce258bd997c0b -$BLAKE2$5cefb7a13d0cc866e68e75ff981463a3310b07edb511519254108b1db274f23c -$BLAKE2$16f79e98292edd3a6cf4a745e511bfb0b9b6ee6e79c8f62179a94ef34d0d315f -$BLAKE2$e2f41d85e16a24211dc548dcaeead0772dfc22f93d61dfe873a55d088e2e40b7 -$BLAKE2$0d5835349596490c295e538d39cc3e8ef927aab3bfe9fe5f94d4a238c09a7f6b -$BLAKE2$d8703bc1031058d505431f37dd49c55f186c11d101a53261250654fc09248aad -$BLAKE2$83d263bcbb6a68dae12db425a5979830a78032fba035bee94a9c78a76e493f06 -$BLAKE2$768b6246009c2ba9b7a9322c5fb56f4d21560ddd32af1640eb210ebd70e383ff -$BLAKE2$101360c5377ceb25b8cbc4420e29ae07ae1d1342e84ffe874c84e100654b7c9b -$BLAKE2$214092a70a9fb90221e91c281838f4bc1eaa063108b9f3c3bda5920c17284e2d -$BLAKE2$406523b125dcf1b1eca1d473d8ecd50c53f5246455384c20a4901df446d7397c -$BLAKE2$c88c794d399d87dd36248650fd8e4d092bcdab5cb9d7ddccf74bb291850b6353 -$BLAKE2$0c27b8336784842ba1336cffc33d9d5685a3f86ac0fd97f0f7a7137e8e25425c -$BLAKE2$3dc316f83fbce8e080fa8c2c25de9a73fc26a2ad27706fcee375e8f6d94a8bdc -$BLAKE2$9fb772eade77fea47c5886f51d2bc79df54b159d3464c4cafda9b28505aad8a2 -$BLAKE2$d05a33a2af2b7d66dbea3a5294b56859a5ac0adc6e9e8bff8536290e0fad8e3b -$BLAKE2$8dd718fdbbc0caf36b9c16609e9337e01be70f66c51052f9aee529e05e99655c -$BLAKE2$61108e77d874c367c46fce5309a993b3e1fd40357d69b45594115840b7eb4dc0 -$BLAKE2$bb8f662837c309c5db522844b47b3914de857127d30f519a4770852a0b4b5875 -$BLAKE2$b23d4511bbfa03c6c50faae261f7757c85e8ea6d5c652200d162761c6e846184 -$BLAKE2$0864bbbcf035828529382c53e8f9d3ea7b650eceba2e5a47c0322818534c453e -$BLAKE2$31d29fac71375baf10beebbf42e6fce7f80da4346167b04dc2e2390d918e6569 -$BLAKE2$a46152708734ee6abf38c042f6a726164c44fa51882c24a736b312c53638f990 -$BLAKE2$f2493d008461b48cd0be323bd00ba50934c6d18a56bdffd23dfc17e972e151f6 -$BLAKE2$e5f9aa9f22c354dcc897913faa0b0a0f6e804e0af0a296f189ea766d33f6293c -$BLAKE2$1ed6ed3822601182ce5314aaaab97c0bc3fdbcf1409c09aed647dffcb895759c -$BLAKE2$612790eb53f1c97860fb44e010ab2005efce6b292774c32cd4664a5e4db9c4f0 -$BLAKE2$d32d83aa7d5f052d85e8d8069696d82770f46aa6b459f940d85aa59fbd4955db -$BLAKE2$f30423bf669c8dd0f28bdf2eede867bd0e76f258bb91ea493991dcd6857fdb0e -$BLAKE2$13b2fba5bf23e9e49cfeab5231d2fdf0265f8e8588387a43a0446ed82bd8d0cc -$BLAKE2$8a4ce1c2d40eda98d56c09fbfaae68be8f00d9209738a61714222eec0f1bf7de -$BLAKE2$6fe1eabc7c6e03fa72d3ec903d4c72854cb70bc1cc6f1f1f332da68e1db6d4e2 -$BLAKE2$fb46750f6baed9700378d22fc0acff24b8886d8a7777ea62a863d136e08b5cce -$BLAKE2$36e25538f9679220f4b885dbf5aac1ecdd9120edd185010ad4bf075840e4afd3 -$BLAKE2$e46d431d69599ed3f2c573b83d2f8c40d3f9d4148addfde35dc38b19df4aec0d -$BLAKE2$bb475719b4b5ca4174f96c1edacdb5f720b92fd144a03e0871553738554c96b5 -$BLAKE2$fbb866ee10070a107c08bb80c0627c4f6550b2e6de9279180d63b853b5d5f3cb -$BLAKE2$339e4e75bf63d71d65fa638c88fb3a9ba513d7d0450bc0b53cd9205950df7e45 -$BLAKE2$ba9e57181d9985826bab5d30b02b1bc8f6457af3cedcfc8acda077b663fe9f86 -$BLAKE2$57d212bf08aebee950c6ef4a1699403ac15e54b43a60b149ab92419e366306ce -$BLAKE2$b8b3e6608cc65fb34b69c4553a0708e10c27bbf1fc6c3a1aa89a06d93383be42 -$BLAKE2$ba62ece66c7cd96c976641428e61e977714ba93e019668247b602e7cc9bb0eca -$BLAKE2$b7c3c055ede102d7f34f905752b11c3d7f2196f110b2b16e77796b1890ffcac1 -$BLAKE2$c5757a17bcb5449ce8e9bff0269fdd07042f4b65b93b1c06f89b1eb3d7d63287 -$BLAKE2$fa47e1791cb6a8131fb9a7db51eddf17746b1e7734dfd156798063431283acaf -$BLAKE2$75913378b57c62ba725c1a3cc0d588558ff74f573bf947d35e44ac6208d59f18 -$BLAKE2$af9da17ffc029d28f2e174c667ed32ea889cebbf6e5596a1dc37c1e44914d6a2 -$BLAKE2$d890b7901e3f9c2b4bb15c2fae67791b4165ed9e69c7bfe69eba0f13b0627f48 -$BLAKE2$eb67c2a2adda3af822023a7e5db8ae4874c4edadf9d9a85d96aa5ac8618c2966 -$BLAKE2$99b5ccfe9e28f6ff72cfaf2df527ce64e9a6d3a6654a48b8ec136ac598b38cee -$BLAKE2$7ec2f91eb72987155017d02856dbf1d76b7bec584f1388e8781d621d4c4687ca -$BLAKE2$7c530481f0c7d96a1a5f157b0412542b5b3d1d20eeb537c357fd5f7eba0a2cf3 -$BLAKE2$f0bee73ace7c799e434d577901bb370e50ab0480a30b83a86b902afff29bae01 -$BLAKE2$f5644f420b4a4a1835efb26f67f10c825c3d4cd08b98f85f8de7a87f1dc0c804 -$BLAKE2$748044bd488b5f648bb1f8d25b03bbf7c5a57336fee653df7d3082a6d5655a68 -$BLAKE2$055bafbf00fefa296dc1e6f36a95d111461a509e6e5788db41d5b52bc9df4e1d -$BLAKE2$cef542ac7bcb1da21362786904b2a6914a02f30643e5f5312efbd166694cddf1 -$BLAKE2$af5f4fc5349d60f1c9347652173ba9d11f4b13f89413852f2f60ff7c3c7772fd -$BLAKE2$d07482dec4ec954c849dcfb687f8e4811992a44ee6a1128778e62ab351289f98 -$BLAKE2$a001ac262fc92e969adceb2af9bd4621b8172755bcfb5a40b728bc38eac37099 -$BLAKE2$c23006567fbe6780166162ca5f925129031968046ea5b6c151a8dce13b77b556 -$BLAKE2$8c0b5b5b6869b14acebe35cce612d89f2282cbfe678ac3837efdc738d56966f5 -$BLAKE2$437185b3d145607277988912817dc0f2db9a1b0646bd9f9dba07338d8950d9e5 -$BLAKE2$36ba235733377a2add0ab985dc1f4d18be8e555b7c0f3c709b5f65aad126b978 -$BLAKE2$5d2845e6b31fae76ad5d69da174b833722e15e7680f04109397906b0a11ba3c0 -$BLAKE2$1cb6d0c952218d1ff8285d03a4c7d07b8c946842a37bb32d751da56949e3ccc7 -$BLAKE2$6883afc50e703643527fc53700f5faa5597ff3400a6e90fc4c392264fba325bb -$BLAKE2$ba0d9b26d89f4c998e76d22721222cb51a9287e8cd09000ddcbeb22fa898eb7c -$BLAKE2$44088ac30583f76e8eedcdd618456ddcc956bb2458d9397abe31bca2335acb66 -$BLAKE2$3da3674d2f1c3fd9c160217aa6c27df5b14317fbc3fef68dbbbd7eb1605c66e3 -$BLAKE2$28b0279fa2ee918032e7b24c16134fb9c6bde8f88ded4984070dc47d7b5678d1 -$BLAKE2$274651ae7518e0eac895b1f4f8622f41a1ff1bd825a3f2f7f004921e0f84e24b -$BLAKE2$0d1db77be4c72832172e82332e3d1847bf8cf9c7640a7d9ca188a857521fcd5a -$BLAKE2$d36f976209ae54d111e46ee7067eea7dbdb14c9fac1820f178c95ed391dbd794 -$BLAKE2$3a4368adaa5296c71113d713b1eaf2796131cd0324ae7a8382d0c4d8f6722ab9 -$BLAKE2$c90b0dab86466ba62ea825f28ae8afd0e9ff98b6290d014efa13620375ae2098 -$BLAKE2$91e24f6f78846788323738cc2c0685e18339cd23a0925e759004302c5456a10c -$BLAKE2$ec85440c24aa95dc7d8e24cf9afcd334fc640bcc816b1413bc5fb3803a516fe7 -$BLAKE2$9d70933d52fdb14ed89d45bfb31643ea301264341a86bb4ceceb8ad341504390 -$BLAKE2$339a2278d289996e0422fcfb425d746433d75b1a8380e7870774f8249f0da805 -$BLAKE2$99bcfbe4c65cc2dfd7eb0d6ccbdc3716a896981ca1e34c1664bec829d5e3c44a -$BLAKE2$ce96c9662092e6ddee33a5c0bd6a7f846ab0a551d6c716ccdcfb56b8f6c3201e -$BLAKE2$979beeeffa65985877cbe1ab1d88f8e700b6226bff60fc622d231fee550dc067 -$BLAKE2$948bbcc770f9f333d8f397f67b883b1afbba119b587f07129bea29d864831ae0 -$BLAKE2$9deaf498aad57692387da8c88e82faff744d9f0b6c1df0b662aeacb4be0b4579 -$BLAKE2$905a3909a9b13e9e97cc4658aa8f6abaf74ade42951f3da9e5a48b00d492a7d5 -$BLAKE2$be91640b88232d6cf80e437f357acd61b0f83dec89b370368cd86b720d0e36e7 -$BLAKE2$3d20af6b8a9a255c1796980953d4f3fac8f8e62a691e84de8d2646780ee0ae72 -$BLAKE2$d0e3a9ab927b8aee4013e4a251b8caf1f3b80746a95119080cbb9e6d119cd754 -$BLAKE2$7b3ca8fe983a50adeb21cbc91979d1bf99fc2a8268a54dce3d0a9c1b0fde5f23 -$BLAKE2$a386dcbf8675fd633a0ce411c83682046187f6d56245646e25324236d0a48db4 -$BLAKE2$c96cb496d8053195c55aadb0d5600357d4f9d5222c855b2bd3d7cc51321342cb -$BLAKE2$d5a531a47a65942db7edb6afc730f9bd64664234a06ed6c59e0843a2cd29e723 -$BLAKE2$2473d84e698cc4ea7738f99c6f75211309a3b9ebab7d351abcbd452d1addaaef -$BLAKE2$0062391d000e8f1e53917c13d497c7f5dacefd42bab60f17a0e670dda85c0cad -$BLAKE2$c34e52e284cad0f2fda19e8b19a928f916648fba03f6f7fc1152925c9e205083 -$BLAKE2$54d50a4b6b974782f591c890cf1bffbde86354fdbce6ae92f6d0151279a3689e -$BLAKE2$de0c118389a413eb868a9c6b4222feb3f6844a6a11d353fef05db479aec2fded -$BLAKE2$e7fb515901d09adf873ca20cb9e133a6a8d3128a5fc7615829f6a9d84ed39771 -$BLAKE2$39c6e7f3feb3497d22304624235a20d0dd66f14d9218737be7983320308f495d -$BLAKE2$01146efcaa83754494cbfaa9aa159125b4201be09dbe35744308d54d9aaca68e -$BLAKE2$824a6df6d6ee915efe71b2eebd1a37d236092cd9773eafc348cf4048bc7eb5e4 -$BLAKE2$e312a2886bc4a5572c19f363a335aa2543ecb5f316fc0eb3240db8e4a41333e4 -$BLAKE2$241c67abe90deb418d118916eea4021f1f519de092885428eb1300aecf95a0ba -$BLAKE2$ae33e6ccd04816926913f5c9696ee3fa0ce8706580199b54c01f23d2f958009a -$BLAKE2$0ea564a5d0cbb8e30aa815a9f016bd90dd17fdf6a7ddb7b376d6bac1363aa77c -$BLAKE2$1ce17bf4b24b40539e90f5dbea15883e127a9bf8bf19b1d506c67611d5edf205 -$BLAKE2$125524471b662f5c2cdb8c605a3f0bdabebe925f77e80c8a4af38a0fd16ea595 -$BLAKE2$14d59ddf3b7f4bc2c66fb4f6aead3205032cc8ab80f32146eba08367592a23cd -$BLAKE2$42d3966e71ede17d18acae72d10b90c99174dd70c892135477112c0c4e41482d -$BLAKE2$156912efe68e034536a90af4b70fb643dc5a1f94e8da5f763b4056c51feb3613 -$BLAKE2$3d062d4e80ff38af2df2c14a7327ae8f3884d814694cc7949f2682e7be264bdd -$BLAKE2$69883324d9c7d97a9ed2c9929f541c8c961e412447afa7c0a623cb8cbe3b4bf6 -$BLAKE2$3020af4507aeeb03e2d05d66b8d2633c9c3dbd27198fdffdd56f6aa83247af8e -$BLAKE2$322c55fbdf081ac1b273e8de719e5e92b1151f962f2187669e2134020331c9d7 -$BLAKE2$2543d16415e0ccae507a9892ee98596eb5f79a7ebbcca0236a5c3177b009c85a -$BLAKE2$06a59a86644892d3052608ed8cd802083c376d9af7fd301aee55217e0485e708 -$BLAKE2$ea3f8acb4778ccbf6b42ea68f3b419fcbfe79bc29627a63dcdde389d4c1a2883 -$BLAKE2$6ff075dafbd1deb6186d2c015e713be71ec7da4ac903e685ffb1795df70e1ddf -$BLAKE2$a623ffc46b8bf2c31e5f0a52b399b7b0266c397e8eeb70fdd1d30a1ea4e5ea46 -$BLAKE2$4182fbd1e6e801e91bfe3565b9659c9ec831f8cdbe086e576b76499bfd42911c -$BLAKE2$6cd6f01efdf4710fd371d78ea8fd2e40934de070c30d6a112b015f0555ad6a32 -$BLAKE2$5b0991bb73794c6ee3175fd65979c17b35366d262d32a77dec492d220abd069e -$BLAKE2$d55a85851c76fe219588ce05410b8454ef19cb0d851fe5aa9bc427f50f7da011 -$BLAKE2$3a5c6832dbdefbfc1b2038acd95e17273a890619c40ad9f5786d2dddfdc261dc -$BLAKE2$2ce3f802b612520542f9ee18fd011d1aab167d20d6016dec48623736daa889e0 -$BLAKE2$d5b42aca9f82fb4ad67c20273dd97dc218344eb8212eb96156b430723a0ca4cb -$BLAKE2$1460f38d5e441d5ba5925182e18d516c08d9719fb8a0b3e8cbc1648efefaf163 -$BLAKE2$5818bdbb56f04d0c17f2d68d5f7e8019213c1eec65ae0c908c32d9929f2189f5 -$BLAKE2$66b58cbfaac3c31676c11d36384140115af6738795944e4dd7eef334e6420252 -$BLAKE2$79d0b8fe13a71a343d7779af79e514041fb368eec7b8c1bc1ef0b188aabc6957 -$BLAKE2$e8d250124a0eff846ebe610c0882eb59b105e7902a73e5b658a0e02258b91025 -$BLAKE2$af84dba8ef915e875ee92a102ed343a63a7eaf33c67e9e1326115366088d8293 -$BLAKE2$05445411926c13139c0ad4753185a5483d745c514f2767a282990dd94906d054 -$BLAKE2$a8235b5443ddd8b71996c5bd3e49c01df7d46c98e9c1cfbff511462468235799 -$BLAKE2$4aa6299ef67dc1677c07693f4c4123eeeed5b34ceadb6ea3d78190297301ee00 -$BLAKE2$1dc97943dd33ad823794810c9d0fbc8faf3fd7be1bc0b4a18c4051a44e7f0ed2 -$BLAKE2$d244ab93b6030bac2ed4e2b333a078ae9f6eea4266e354d97ef1ee1cd7fddbfa -$BLAKE2$b0a36772427a86ff8c0ed350a4fe4fee245db26454ddd6c38e6705ce1e556fc5 -$BLAKE2$6d16fbf95df3a2b475dd2d79d1e74fe41cb39ae36810884cac527bc66fe9f0e7 -$BLAKE2$14451d93d5887525e1133893a6d68913f3d0edb613e00158ecffd5daf0889ac2 -$BLAKE2$2e8c13472fb43f4d7c5ee45de591b9e16d64d3d8dbf38625fb7c0afef006183f -$BLAKE2$f2aec4723f0c2d56c8fc7cc66ee3abc91c7cae0ef71d2143c24d8537b80d9248 -$BLAKE2$8f055905ea125e720db725be5810c7c5786b747ecd76721e22b79ca02dc6da86 -$BLAKE2$95a52b39978988c6266c31d9e3feba7d78682d07b3cbc55bddb4bbeb23db7645 -$BLAKE2$d4ef4a12b00c512abe1fe54b2908fccaaceb501b45a94f6e3bda939f2312a217 -$BLAKE2$015c98aab219aca102b8560a488f5c17695c5cde4c4a723ecefc592b2886ced1 -$BLAKE2$42d3c04cc153a209ea9b11fad534f3c1dd1272248781e19ffcae3a78d1bd6e8d -$BLAKE2$2291b09783c4d9f3663dc8e9c3b6ac5462371b37456d8ebeb1bf0cce096fa963 -$BLAKE2$bc3d7cdb18561d457798eed3a214b794fc56af1259d024fa4eb70247bff6386f -$BLAKE2$5fada5e541c840edcba45fb1b558fc1243562bb470d2302f7a1df64ab06e1bc3 -$BLAKE2$5f59e0dd91888246eec00daa2c2495ef334561b01610fc2a9935d805d3a94a17 -$BLAKE2$d2a4aee516e1c5ed1632f82e0db243c65f20f5f86cc39b07ad354e2086abae5c -$BLAKE2$cfc0e1551cdb82a2c8fbc9f77604da5a29422cf6b443a15b10c023c4e89ca5b3 -$BLAKE2$58c1a39349618e2231402fa80c4c5f77d86a40ae8113fceb3adf643032c09e36 -$BLAKE2$ea5ee51a236b14f7bbd3ec15ea74378c17fe0909830ef6b097e8e78349b8ea37 -$BLAKE2$e66c043963134e7654227dcfa7498e4aa63a8ee2b3fb75227068aff7248824b3 -$BLAKE2$bca230ac55b111659117d804ba0f3cea0abb1d32fd888eabb1cfa5cea1499b3f -$BLAKE2$0ac659b7b73e9bc513aba001f7c39b4ce2d88dacd2f341153b06aee980077dd3 -$BLAKE2$b651fadb97c30f00482f4abcd41b5292d2d55338c3ebdffe8d25edc63b2dacb0 -$BLAKE2$1c9063ad080abb880947873533867e1e3da1ebf34ae42955183f0c46424c275d -$BLAKE2$c6f0c6c53a93fa89e72fbd23ddbc15afe46e114597c7354baac7ac3e1201469d -$BLAKE2$c558455e207a37747e43ea8ea50d29b97d5140116c7727665fdf2316f53a46e0 -$BLAKE2$8db893da9b2324eebd6ea004ee4447236b4ccd35b29037c90df01afbc615f43d -$BLAKE2$8a6d29bbe289a95b7c38ec9e4645eaa1bf9c6b860be48c7369120c8295a8cf79 -$BLAKE2$44a3e4604ef7d3bf66b2cd3becc369ba3ed5f56b21ca8441cfa44f071d4b7a78 -$BLAKE2$8dcc7fc4327bef55e4c4a9b1100d3788a390e6c1f31529e85e0d539144a43c35 -$BLAKE2$a4816d2d4af22cf756a0701da6d8b8c3636782a850e8f9868334bef8f79afe1c -$BLAKE2$5abd6c47bd88d8e4b4955dd68ad39da60b7aeed145a9f172c6b1716fb8c23c3c -$BLAKE2$41b7129fa4e21686e5439003793e38be6b53963100f1490b33a73f1a20f099da -$BLAKE2$a4d594f39298b2598a07d247367c103fb22038658f2ca40db42f00f800dfba57 -$BLAKE2$b3a6be9c0e912bf59730ea3a8f080f6253727caf4c7f17c4577cefb5c90b1a64 -$BLAKE2$85acebd3fba57add675bc1cf4c0f8bf9debccc6d3c804d360610f655f057d4e1 -$BLAKE2$286500b1d77967cfeab34f484816effe6e1e23813dd7af43636a498a8ea6510f -$BLAKE2$407ad2e50c2003080a5052fd2456a375ccc550f88fa36b808cdcf3bef0df6f8e -$BLAKE2$f3f5440e9ceb7465a55bc33161760bb00c4c30a2e0e50f287d6f35802b279d61 -$BLAKE2$f38cc68341d2e8f662db2caaeb00e1d0fb496350066bbc216278ea6e10f3de14 -$BLAKE2$9c70bcf4426eaf35dea9346de7a55492629ed0556b92063675de39f8713f35c2 -$BLAKE2$0ae23c22ba470319799357aa1662a2b67799a0a4bcfb6c73df378aa0cdf782b7 -$BLAKE2$3763af71b0bd1cd559265dac4d915d90e8fda56a83a6d6ae9f49ed2ca5913078 -$BLAKE2$7531e1d681fd04a59108123cae8c71a216edd4923838fd338ed975926ed29583 -$BLAKE2$629cd7f6c0872ba0ac2ff977829a91a2528ca5e8ca57935480827fc90c9b96fc -$BLAKE2$40a592b7a7195a782af846a345f2925bb6a324961f775aa3112a437d93f1872a -$BLAKE2$def78d0c15b40b186d333c3e20dc1451e5428e73e3e91df986285bdedb335aff -$BLAKE2$4f0ecafc1f290b52a77f714d48438a7db077bf2c952429a17080d7115ab33adc -$BLAKE2$a1942cbe24ab05362596fe5d0adbf041b6c3ffeeaf826f8d08ec66a1bab3da80 -$BLAKE2$c2ca3bd16e44036f3f5853c87f752fee90e60fa814281330d28a4ede8c1cbffb -$BLAKE2$64315a60b8f8e6f0605f1ec7e5ce8da53dbcdacb5dc0692e1327b0a6ce6996c4 -$BLAKE2$73b7158cc457abfc1fa7adcbe5f5938612acbd43830a6a4e994c4fd9872e9b63 -$BLAKE2$b028911fd3fe775c9994f5d8e0782aaa6f63cac8d25a33b4ed43d776cfe43f4f -$BLAKE2$c4aea8658a6b3ea89ae286f83a43c6a067747682340e0c5d60877913a09e0b82 -$BLAKE2$7ace07fe94cc015379fc05e9d3ecd1a05ccbe0f3b51140c8f07e7971ab9c42ac -$BLAKE2$bcedfc03c93441418bf3c15f2d37e263a26e4e835b9c6a09ceaaff28221d53d1 -$BLAKE2$4366187bce7a566d1ef699a2b8beac5268b7387c6fe093bc00fb9c20b2a3a6a4 -$BLAKE2$4399296f477dbadbe7d48f3c25904aad9c7e926fc1916f176530c8334de47614 -$BLAKE2$b0ec41e94b4da33a0a3d49cf43877727b294a97f0ad8ff1f600743c6aded560a -$BLAKE2$d139df1f3a5bbf8939a076c683aeb2bb6dc3cd91fc32fd347c265954618dcd2e -$BLAKE2$480f4ed9c163cae4586c456dfcd202c78ffc05ada81b9584e76fd45775c01c7c -$BLAKE2$19be02c811fe4e2a44921539512afb77fcf9295492467c7f1bd433fd327c7718 -$BLAKE2$d59f8dbf7a25dfa848dc35866b27ded7817b6055c04e3b8fc16ac8b10e16de7e -$BLAKE2$adcff41879b44146c0c80f74c04ec6f1c1e5b8a7d9660c5f8f1a96bb362e51c7 -$BLAKE2$8293aee27c2b671e01a4f718322e355a762adddfa241f1e5c908a83df6417b91 -$BLAKE2$5443db3fd6077b225c57cfd830fbf0c27587844d3db99a6bf4dd96214303e286 -$BLAKE2$e575a2f1a39a72cf1f7c244a5a82fb4007544ed7cc0c586c850371d35787cda2 -$BLAKE2$51f995793e4a277387b5487aa3fe733dcded0bce54aff1c5c6da9279c3e97907 -$BLAKE2$7175a9a59151ce0e811b8cfc29a1aefe1ca39b962c897538e72ab8c824ddc77e -$BLAKE2$0c8c8baad86abed22a0236093613b930517ac172becb241d03e6e72d664751b4 -$BLAKE2$4140070f93168ca158ebfef76ce06b3ca9ac96335174860539311e8ef7d2b873 -$BLAKE2$8061b77be23351eb2d241fce4e9c2da3df1ab92170d09906b84fc45f32ee330a -$BLAKE2$9f69cbe2c20ba4b04e04c68ed63bcf8052795b5843488aa1cb3176e9e903f19d -$BLAKE2$059fbe47058ed2b8041b11768be5622e14eae5ba492cd501e562a0e5c47d1787 -$BLAKE2$eaa5e4f291d204f4adb34adf88745b2f98abbdf0bcaec48dd0ea0588494c375e -$BLAKE2$4cf027ded56bccd7122736ff3f61752f687a1a5fe2efa509b8bccb7f2422d1e2 -$BLAKE2$e3e91fa41e5408dfd727e0245f338441451bd8bbfeeb9f50b51bc99a0040a812 -$BLAKE2$778e72c34c132e33394b4a28ad4649ceeeb53ad815e6c85b796172f298bed8e7 -$BLAKE2$96438edd7a9050f399fa4563d1777281b4cbcf1475e8a10896e4791407cc5dce -$BLAKE2$e962b5fd8a32d05930137a9f3d7420a1d7876ea7ded7701ec8bcb5c71ff51170 -$BLAKE2$d7b737f54d38211c1f2d27e689fc753c30fd2e04565c1780de6c207a4dc4e117 -$BLAKE2$ee648815593fdf1e0fe5bfa35ca6d19a66fe9a92a81bf226d6f6b61a4e89030b -$BLAKE2$fc65a5de2cb71083f174e33ae81c4e9b80e6fcabc5b97f943143ecbf16585825 -$BLAKE2$fcce373ebc018e6b736effc65a8b81d8ea4b4afc1a8a8244da75f709162ca853 -$BLAKE2$ab6f368eccb66e8858f628df56506f6fda6a5093e3e1a0ca6b886ebc9d4db5a4 -$BLAKE2$4f9c87748f539dde62a11d963d8dbf38659f3fb8e185c5d57e252851496994a5 -$BLAKE2$30bebb654e620e56e1680177f7f4099c1ebbff91fbb42659752659a1ed7b2528 -$BLAKE2$370d26aca302cad4a7ea426b72352edc0c3bdf85f5f349ca9eeca8e359c1c4ec -$BLAKE2$6a724490d5a7f155e294effa42e31d12168032bb5506dc46585ae379aa1a0ca8 -$BLAKE2$57d4f30e4981ae73f471ff6994714c9313b9898a8145c770761e828f6816be27 -$BLAKE2$7e570d01911fb2967026cb3cd86d1ea1a42b295dd1e715b62144c879bc51af7c -$BLAKE2$5429f46689f36b773a799a192f413870ba9d745e3537efc2de026b63e3d6c2af -$BLAKE2$6da7c19b6e6c08b59ba4ccfc259bb9ee74ab9f29c5cc25b93bf7a71da8b51b0f -$BLAKE2$64308b3b442606c7d2455b8ff9f6403e06df42d64be1ce504a01ace05f45ae0d -$BLAKE2$55b7a22e834f5007b5efcd33ac5b3019feffd49da9e6019c20fed7e72fd070bd -$BLAKE2$8c2fe82c49a7478fc1844ea64ced44eda0124e6ea4bb1b9ac32bb19355d091be -$BLAKE2$0b2bbdbc9c7cdd95c1f5f08a85b4f151ae7eba308fa89e85c067e6a7e43bb422 -$BLAKE2$c891d02e5c959e7ff78a3daaade9e370f42f84486c08587b75ef366320235e56 +$BLAKE2$ba2649757ec72ed0b9bd8b3063687767946145f13abcb38e2718fdaad6c771e0 +$BLAKE2$4c81099df884bd6e14a639d648bccd808512e48af211ae4f44d545ea6d5e5f2b +$BLAKE2$93f9b0b205276f1c3b03464d5e890d6c99e7e22eb4d7530e53ba2e3a8066d103 +$BLAKE2$90931556d9513e8c26040a9ec2a2f1300bdc79a890907da9cc2b3a2c690574c1 +$BLAKE2$032a6339c8bc09e668daf8365b72f3d34ee7876f18a58f8ff7c35b5b02081d6a +$BLAKE2$a076a699190673026fe44f7b523d321fcae79e70945007bdb1c86295a11c4135 +$BLAKE2$4bcdd2aca1a694cbea5e3751b293c8107e0af50399766ae05cbf9fefceedbeb3 +$BLAKE2$4bb6d05aebc19ab25a7abfc3d283fc66b738f9295065fc684c23b16db775b662 +$BLAKE2$990e6d6fcdae520432dc402546775ab4fe2b6144928ca14bcf6c2cb634a021da +$BLAKE2$69f5eb7158a965665ac14505bdc7570beb3e5330c41cc70887c2b875a0d634a2 +$BLAKE2$e2ed9a2893f7c1e2a4a62a47ae29ef26af4914905797e1ff6c868ab6e0b94282 +$BLAKE2$329f06c7b90bf9605db11aaa10db43bf739bd08ea4a55ef4d4b1c6d3b4ea9d16 +$BLAKE2$2f185fbcef16ddfab9451925d69b0af28181a7a5efcfa9c6b47f76a2aa430e9f +$BLAKE2$486d9ad7d50e802bd36bd446bb25177913fbab5c93ef50099bdacfcc417dba3b +$BLAKE2$0022cb6f32dc58bc06cdcfce7aa9435d8fc2652b65ee269d1ab0ba1992f44145 +$BLAKE2$cdd32c872b68e6f9c080183077c7a540523047877469738f2d8a8a9e505e370f +$BLAKE2$4b97c169b3c7431df3fdc07f600271f837f837f2c766f8e93b92695d1dcf867c +$BLAKE2$bb48bdae67206a493787b69821008fcd6249d013125972db3660e75ab6f3c884 +$BLAKE2$4f5a01bbbf0ce658abcacc64c7efdb3f108a18705ca66196340090bedc11f431 +$BLAKE2$3642fed93aaba6bb4dd577a34bce709fc0c8b25c1e221feffb64c582b9d97d11 +$BLAKE2$bd749ded0335a0c42781be6315ebfd508620770f44380677594629367eab65b1 +$BLAKE2$145684b91040baa65dcc5434dfb3067900c07e90a47aed1f41d89c629a96bf2e +$BLAKE2$832024bf2a91cf3449c115314eef133af04f92314a4e05c8b02b615ee000396d +$BLAKE2$3ba62bae321b71dfd07a5972c204207952fb4a32df5a3676c61d92545ec2ad37 +$BLAKE2$7f893557a2ab7dc30d144715408f108e2b8a4b05402ca2163fcad8d6cbe502a5 +$BLAKE2$1d46d0098de9f1aa93d1427277bbf93c6b1ab85c33b4fdea11c9509c2fc05acd +$BLAKE2$080b2e76be2a828b09d3606bce6d7808a4374ea890b7a9ec48e1fb586e630a79 +$BLAKE2$e0f8b904ae65fe6a9338ba01296cd630862777e9d1334c4d7f51826f2632a252 +$BLAKE2$83950fbcf5c8140c7548cb746c7c58f09065822485428c229b3d8106b3a6e7a0 +$BLAKE2$f308fc02ce9172ad02a7d75800ecfc027109bc67987ea32aba9b8dcc7b10150e +$BLAKE2$34653cffb9d72a352426a7ec7e5cbed85295cf6c69439d0167825bfc3ede0c28 +$BLAKE2$ae3df7a88d739bbdf1e4ed824c7fc72366a5abbb7c79e41082b6aa0c0422a8a8 +$BLAKE2$fac0c123165a4f1faa161574bae73f6e4c68cede46dcee6c9b3573cad93de0c5 +$BLAKE2$0d31af450ddbd263036b1d9d1d48a8563c3973b435c06e0b01fed25bc4e44930 +$BLAKE2$00402f0fd560780ec23a0c3df2489eb9524f793330ff9c4460d7765302361cbe +$BLAKE2$13ed751afcecd936bcbe496a38545e63d2fb97f2ad8fc5b72f17d29784c34db5 +$BLAKE2$68bc019c5c54bdd50a1de6966ba1abafacc3c0e4ca80b42737380e1522e565d8 +$BLAKE2$ae739292848421b911d76657fce6a7b9ce0b013bb59ce4200be53c0321b59e78 +$BLAKE2$0b685d35374aa46e3816bcd141eb5d3a236b9ca8e6b0f8c64cc8e7ff1fcfd18d +$BLAKE2$2ad25fa5eaae90d02ce5d2285683ad39ff84d5c70ee5d74b8c874cc2896de653 +$BLAKE2$1532ebecef55533003540dd76735389f4ac58353b9b855819db71a75ccf7520b +$BLAKE2$aa8cf7e82062d965ae6f31fdbf16e055e8c5a44cc19c7980a08d598ebd4dd70f +$BLAKE2$67804f7b50f59148324f23ffbf44c59ff73bb938f4059c8d9b69cd3c83e0b85c +$BLAKE2$6319f3a2b2a080577e60fb01d623f0faf78fb47b4328970338a55f426b6f7f8a +$BLAKE2$b9ddba80fb4652a8f25f9347bd55442c1792c41f4a178714cc518c241e94c0da +$BLAKE2$2d7b78bb9f4750e8bbb1753ba2373be0db5cea3d5a8316715b164535460dc55e +$BLAKE2$9495af2bfd7926e8a8cdb642728a3b728f9500dd99343995c7262d37b023884c +$BLAKE2$4e2ca5712df5f9b1a776f76e513caf00294607e4a5818247a1c48fd7c4494b11 +$BLAKE2$d13ed8bda27d7a4be55ade4a533b7359812e19d8eed5c839cd7b09ff0eff651c +$BLAKE2$2abe661f649fd51b22450ba31b34035006fb1ed3faa73d59a1de1d12da652477 +$BLAKE2$8eab43845d6b7de88327826325bfb8ed6406dc54104ed91a7d0b292d64321e2e +$BLAKE2$e161489e0104903446c77865b85f097e1ce7a86cfeb548ee39b0fc32c894e8ec +$BLAKE2$1230face1de3dbfbc082256da4e9d0f3190e6284d7b20ad19f78434325216fad +$BLAKE2$b29d405f772295c6b2be416d3cf56c95b67bf07ec5b42d0d597dc90b98806930 +$BLAKE2$ee953fc5ab1a48548364aa752eeb3e68dc403eb3e9046062fedf815ab3cfd570 +$BLAKE2$424295c55946c5bc68a7ae2b60642b2aa03b891cfb6879b41239788fb2332b18 +$BLAKE2$511a408dcce9c359fdf9f546905429aef12de4c249d2899f7b3b84a364486cee +$BLAKE2$898af616fe84691502695ad3227ade34c7890a9461e977833ddf376f107ef9ac +$BLAKE2$1ef5707324b3b7a191102458d7c4b9d9f5cca5554c526608a2d523d198a6281b +$BLAKE2$b1bd6aaee62fb45dfc1269a117478b122c6c7ee873b729b29bf4891852741b6a +$BLAKE2$2d90b2b6a2c74a7dbea6571c7f8ced992702ace9712792765fa1553e8a68e543 +$BLAKE2$f982fd819b1a54c9d8a0c7fb47661bb154efc198a2f005d96699ad30495d90d5 +$BLAKE2$8f351ee660559c72a0a216e527107c208114b8ff25a4b21c0835f0935cbc66fe +$BLAKE2$728feae6d4e00341bf9898b60e686b4d3c77c9a2023c2a00b368a9b18220276b +$BLAKE2$2a9d636630b2335767df7deef95581a136100b8f4b76bd44c9216b736d77adbd +$BLAKE2$8e8dc50a1706531ef090ff98321b982b437a684cc443b48d44af66383cf8714e +$BLAKE2$44d17b6cc4dba17f3f67b1e7634206ce18d40e47e960b9f94b0922026626f8b2 +$BLAKE2$688ee6d3052bc38c7a7b3bd8eb48aadf98ccbd6c41def4bc852bb2f4db527d99 +$BLAKE2$9912dd90784b9b867f66852a4939905cbd2dc6513dc18ed84d6bed9e33fc4659 +$BLAKE2$7acf5e75fb0898fbc9c59109d59c868b3716caa5b58ade990c21b57e561de870 +$BLAKE2$221bbb02c00e7648ac4ecdffb9eb425556e256b72da846b3681515b98bb4a6a7 +$BLAKE2$55cf6bef9b6db824fd6a01b2a7dae7fd2a94f6c1b58bdfbd3c389fc941e20605 +$BLAKE2$9ea4ee3e61219bf1a416e72db8caf1f68e7704fbbdf3859178867c327042e615 +$BLAKE2$2ec7f1618229865129c27dfc428c4a26a4901fdf704199d9b013279e16adf01e +$BLAKE2$8de6542b39fd96aa62052a8675d0d10d0e1a6f2b544d92feda1e8cbb4eff8db3 +$BLAKE2$a21cbe2430e98abecf247f6d29abdfa15b7f3713fd7ac0a53e0c026e401f2950 +$BLAKE2$240520632594ef39f078020450f095a1bd4d6286381eb185cd0e200caab5f820 +$BLAKE2$87ac32a09864233afbd83da0190131de4cd398ba7307a977e6aaf10e93ed6ed3 +$BLAKE2$0e7eca2504a53b6d571a733581fc09ba7cbb9c7e1b3455d991d531953d0d0bb1 +$BLAKE2$568560feb38eef0f9c824d581639d374aa460faf8aa28cd8518d159ce2173b88 +$BLAKE2$7eb9f4c75f1fa7fe5c47181b8cd401bdde5f491052a4afc942f972e5d537f3e4 +$BLAKE2$bb0ff2a62622fd6683ecf617260d11e435d1f29b03de9171d7964ec0538517a0 +$BLAKE2$56b2750405c44e0f11e8105a69413a616b4c1a969389321b7fa027129d0f826c +$BLAKE2$44fe15604782e4a9d6b8d751c7cb36d2b13a3fe489bdb55f8f53dcb8b7fe54d7 +$BLAKE2$5fbc237e891a2a9a33f81a5071f27c78eb9234f889c6578b240607cd9c95f649 +$BLAKE2$743183ee56d8a004e447c0c1626bb63e75a529e333c2ab9350d36fe4281df40f +$BLAKE2$8bce53222ad873c9f0ed4acf195c77669d8d28ed5a45e3e20f103255e1397b80 +$BLAKE2$24b2ddfcd7acb20683bc59b29e09ae0b658a7c2359ef7dbd87d6c55377ee2823 +$BLAKE2$a5e7097a1ff743736dcc0bae36815b68207b086a17271076452901650c2f532a +$BLAKE2$66e754709229a1a76f12b770d612d4dba1d51e28894e2dce1b53ca15104f84c0 +$BLAKE2$a6608b013f3ece2993bd8b23ed90b5143bc563a456d103557478f0f3158a2698 +$BLAKE2$dc439f6904f3e669e765ed3bdcc6e457331e3344273944aa1c83b410bfb7b05a +$BLAKE2$bb0ca907d4573967d1f6e5dd64a83b1f983a6e228483aed0cb8dc5c01ef5ca60 +$BLAKE2$7a5d748f09ca6985da962fa6259d674a3e9a6b7f36a82d7630b7488e36bbafd7 +$BLAKE2$3d8e73ed957ac24b116f1886071facd87e9b95be76140010868849e20deff890 +$BLAKE2$82a1424e827c594ec1a9392c4d0a2e455131a0897f5bbb44e5563260ab8f9151 +$BLAKE2$b41737e947353e12e463488e4c2ec43cd858a146d518400ea64f128654b2446d +$BLAKE2$19213bacc58dee6dbde3ceb9a47cbb330b3d86f8cca8997eb00be456f140ca25 +$BLAKE2$298df4a8b8570f3c4411cf3d2abe8b0d65c4f93991687efa7ed97aca2b4793e8 +$BLAKE2$628a29b8e86535b02602574a6899276db369f940df7b69709c2e620f95bc0ff9 +$BLAKE2$bb8f658367c1ee69939bafba52f8d7c12227d61d2c1992989b1dbc1ece3e50d3 +$BLAKE2$7e5d2a54c52b4309b0b84ab024266896042cb7723b503a1b4f81f6d756064d9e +$BLAKE2$1c81a85e90d29bb6c057399749a1987c62530edeca97fd7e7eb938379953849a +$BLAKE2$f6bd2ac65de8eef1a0cb5429f8555710c2ebd8d8c9b37a4e0153b39c510c4f0e +$BLAKE2$7ca7c090076d7cd7d7922a99f50285b4f664d63fb2162af62c89c67ff1d7d23f +$BLAKE2$71909c2416ca99d1421313c9511b072e97a9f494c9906d82d3083b6f6f74597e +$BLAKE2$987ebfadf7d1e1cd1451f7312c81ccb3a640a36294b7a5b8220e06a4eb125bce +$BLAKE2$0b0213cc7ecbbbcfe5059ebc60c27d2c80edd705eb3b592cbb957e692fb496c7 +$BLAKE2$89e3b0095abd465cc170529b8a6967ef1a0549e49934f538d963d4104dcb3f1e +$BLAKE2$89db98a21af3715f3707917d07cb76d66e39c908e4e34d3a88dfa0dd60739e7c +$BLAKE2$c222b999235a8d659bc2c36afc51cf80e50a56d67372b4ccb6858f4e9f196d6e +$BLAKE2$880715b219548c28664347edc95bfb3f7482ed4cbfbf7439081c70771e825285 +$BLAKE2$3f70dcfd80c078b4fb65ff7b0be5646e93fc7b12a295f54cc2f2196a955b14c0 +$BLAKE2$93778e00d9b5322f763341e3c2e40037d049993b79cf95e928967105c367dd3f +$BLAKE2$32e10a70af6b1cb91f195b6759c6023fcb043e4c162013cf34ac2e0a827dbaca +$BLAKE2$dcc8eee61be37e2a83400687bb3a10c6beb2c7d7aa8a74d21a3175a800414445 +$BLAKE2$60d7226b5bf788ee4850a358fedbcfd6afd7c005ef6139336d656430314603be +$BLAKE2$ab160fcf0f0db1652cb12946de99cf98894292c53f335c625d2024558454b812 +$BLAKE2$8655797fac3ac685c37827fc1f5728687f729aee14020b4369dadc405b20cfa4 +$BLAKE2$4df2f2e0f765c6dad3f37e4d4ff49e4f5f26b23b4d00c12c413d67174676fe8b +$BLAKE2$1d00e734310c40bb1dc667fa70d7e5e125ade99daba57bc47bf039f4ef496856 +$BLAKE2$dc53832e260d1622516d7e612599fab282c64421a0a97d563bb0cd2f4695b5dd +$BLAKE2$f26efc093ce5dfbd20b0d34628683f7111187b391ad5a920e7a77f77b0b3dd67 +$BLAKE2$a2bce50004e2cc4a74ee1e72f82d181f75880e1ea5c61b2fa501efb2c7ab880b +$BLAKE2$a9657982ff5ac27dfa97fa1c7e19b4751ceaa14a9195f40b9fee52525100d1aa +$BLAKE2$fe1f5e72e2b18e2eddacdd1667794144de0f4545d79f49d0e52209fa88884846 +$BLAKE2$1e618596f5d03bf2b4cdcdb785a94b063bd16bd13d57149f9bcbdbef86c072c4 +$BLAKE2$6d7c68a2cfbaae287bcae0f23bba96275795763d9388fae9f68e6326e03213aa +$BLAKE2$0348437df36281aa42ed2b1342dc0d73cc11abf5e20d3f8fb14b16c8b51d2357 +$BLAKE2$138050e830b1670e27eb670686e4c94032ea4da8704046903d42fb4ce6700ea2 +$BLAKE2$56f56a46930c611dfcba0ff17e9ee4eda96f36b36115dd1c28cd601278865394 +$BLAKE2$833b85dd48f4fb8f8ebfeeb42b1a7a0411b77b8716a8cd7b160aeac5b40fa164 +$BLAKE2$8d90a523a4ee222c882fe4ec45ed59d27f169a85e7d36e32d1cb55228de13faf +$BLAKE2$a176176c2c19fd0619c3ad59a3ea20a5968d898c953e98487cba09510ca060da +$BLAKE2$3f6a93d572d9e990f0d681c67a6d1c5f2e98e5d4d27c9e5752b4d389bbc39c38 +$BLAKE2$50cff6e7b8f5e15a6b0f82188aa9d3530cf7d7e3aaf69be889571df611858c25 +$BLAKE2$0804906da951485325563540e1492f0905738f6b083cc6580d711ce6849dd4be +$BLAKE2$ce75455765beb1656eb303a0be75e882e68907e20f6986d19db4345851f51ebe +$BLAKE2$1bd6d86c18ba72fbd2af44e01d7ac686fd552bd4a73dd1932d007ce44161e1ce +$BLAKE2$9982ec2341a071264d506d125844d6ee2db86e26dd73c42ff8f52e4a5142ffa2 +$BLAKE2$fe345f283b661232168f2779c75616d10c7e2281b3e3f6d643c2b8e803b53251 +$BLAKE2$06ed8343267c8251f04d5d528ff3fe9cffbafec0052bff3f615b3eaea24df4d4 +$BLAKE2$959e4a641cec59a8e54b790b050e4bfed06ab1d61f40d0446fd5112993f20023 +$BLAKE2$61df4ef60395fb66adbc10109d60f871fe560b882d79af8b5583af75a14ee8ce +$BLAKE2$d1c096068e4da25f293410c5c67d95a99565b148f5ed32bf72c7e75a542b79c5 +$BLAKE2$8e440548b92331e306bc9a272127e63703afa8842e69200a9208a14ecddb6448 +$BLAKE2$27b134de8bc9df18658f8ebeb10545f272e860524c4d7023ccf465ee04e95cd6 +$BLAKE2$de434569f0fae5fa3e4cfff037249f0d9381b32578ea877c5053c910ae144841 +$BLAKE2$9815a1161e532fb71377abe2849fcc56620f87bd63fbf86e97ff07723256195c +$BLAKE2$db735243278a3cb481e740c233e3213907e637de746717507be609217577109f +$BLAKE2$5c3e17158535a9b5b4b4dbb0c4ffbd9085ec3513ff7d1cf8454ddad70d3a72e5 +$BLAKE2$4ad331b3abd2e8ccff1302c187443c1b4e0e4bd9db6cba420a541ac2f2a3131e +$BLAKE2$690def41dba850992221f866d4376ed88fce306f3fb288084fcdeb1dccdea8f1 +$BLAKE2$d228af78b69531845a66102d7bb098756d0b329728f66ba73aacef506af9a91a +$BLAKE2$30f6b4b27cf99db530e12e37abc0dafd84d99a089d7003cbc7d84b77e1cf2c22 +$BLAKE2$10d435494b8d2b6ff727c14da1af5412dfc429b8e2638cc252583a91485ac0e1 +$BLAKE2$67dd92c381bcfe42ae85adfb1e6cdc76c46813971d8ac709a89e1c4604b33ebc +$BLAKE2$7da550375c51a41eeb21d62654891cebecf234bf64c78980b8bd0d57aa648703 +$BLAKE2$555d134ce333e334937731c9af1e935639efd0545f68613e5466fdcbe04bda18 +$BLAKE2$20a89c387bcb809ad0ec92e0e8e6db2a52dc6df9983580c887d87e00f1bb5cc9 +$BLAKE2$e62ec493833c80bb3d846beb3186ff4d7deabd212fed9d877935cd50950a53e2 +$BLAKE2$2392450ea313eda847be14c522dd349b9fd30291ed0cb3c7a546588660880b39 +$BLAKE2$23a0d7fe8847d33a92dd7dbac3844a723d73a091ba505bdef32012ae25deb65c +$BLAKE2$b5ba1059763a4d68026b069a7c04447d146ba10176e1332fc66cd7f09eae7e13 +$BLAKE2$367d59fcf26e5ae012dd76190fd04400e2ed4843abf2aa95e4d2b8950374e0d4 +$BLAKE2$0d0a5294b4baa9ee0374ad0b5bd9fc86ca436866f4f6b4e5d92d4e1dae1ec503 +$BLAKE2$f54dbc383338bfa8b349e78a7300d65d9117f961dcb810ff57d1796536024c59 +$BLAKE2$09aff5884adcbe647189dbffd70ab42405694ed7a58344a578b85740f3d5a386 +$BLAKE2$d44e6c500444602c3ae2964a4cdd5e343eb9d564cf95dac0345756228a12bb5f +$BLAKE2$e3fa2e331dc0ac6c7c1657bceac5b42b04b101bd788e4bccf99cb9f2940f9aa4 +$BLAKE2$aacb2dfeb831f44d74cc5e299d6177c5c2070fd8315e2b33f005472cdb160e9c +$BLAKE2$aa7b587de5f8144e58c3951c473324b3b00af4c8ec2fdd3cd0d872a05f5b8afb +$BLAKE2$228c3a8526197e63044a1654a9407707d7e250a7ccac489d3cad024ce6cd9ad7 +$BLAKE2$293870d366d1b9c003eca7035cde9d5101500cfb06acb7c8d33b2f66b73d0270 +$BLAKE2$43490af39081d4e751108109066152b28dd59d9f9b3ac50a0b0cf00d13b4aca8 +$BLAKE2$719c84b76de2dc17d3eb08f6a44768191ac55be0fb5d2ce8acbbb3078b600363 +$BLAKE2$796e81141db1e41c52e4e3984627793f7176e73cc842e372255cf6b908d0b470 +$BLAKE2$475824c5f786c65570d052cc77298f777077623c27278456b471141d3fa47f35 +$BLAKE2$8c52fa190286c474375c2845495f3a05e9ba043947425cb7b8728341565795c2 +$BLAKE2$21cc1b7c470fac8c790628c07cf0578e5118007b010ba3d7b47d30e0765cd94f +$BLAKE2$cafe7b7e290c983b47826b4982ee33abba456374e6b140212bbf1d37c91f6333 +$BLAKE2$71c76fd14da3289decf906c595c3440861eb1b085a43c181d027a3c827783e94 +$BLAKE2$fa1757466d853ee92b45fbfdc250caffe005e77448dce9c7601e0ee2efb010e2 +$BLAKE2$3636af26e7f46a9ecd9b3c5a0503e94cb6d2f377b75025589615b37f4d607f9f +$BLAKE2$b1074d4a2f2c5c8e6a732be9bf2456d207351197981d6f33c1c03b57fb8187e3 +$BLAKE2$1fdcf7142190b146846acb0d0fa92450dcc683bc14ea030617678a2be39c5516 +$BLAKE2$f2c7c7b19a02deabc1cbbef727cbd0a345aee7529981e9f97d8ed2995fd9afb1 +$BLAKE2$dfef52f8249dee94595eb98bdb7fd148e05e7c17d9114bce3509b6e8b12dc2eb +$BLAKE2$1254bb4d1ca2e98a8b08fdfd6cfcb39a906c61f6db8005b77794706b47ba966b +$BLAKE2$0d144496ad4838dcb51562576788ee5329fb118ee5e3805e3b6bd9d50633ad1b +$BLAKE2$ce3fac07937b7afcd45ff96c03d8dd8e0a925e7b9f109a3b6ca0cfc323e07107 +$BLAKE2$96aa78bedc35d77ac412e933c01c4af4f43ea80d758c43eb4da92c2e6451d8d5 +$BLAKE2$c655ca9d43cd8b5fa04ca8b9203f71669c2df7586ae208b2380f055d3ef1d1ad +$BLAKE2$74863b5ce73d25d943de21111394018f7d3cb73fba41282db621db3d36621be0 +$BLAKE2$31f0637dc8a4d1f2b1013097da6bd77584e34694bf62388ea01de4204d724366 +$BLAKE2$5ef956927d502b95f5465203241589e472706ef4d2e214602bf4ae0954e15975 +$BLAKE2$1cbf7398a7a40f7467fd544de2eb862ac00039685cded72b33aac7c20ccaa145 +$BLAKE2$29839df3d35c57baa48800184a143e87f2ea9f00932915ef33f49a95eae0ef24 +$BLAKE2$c6513d2f7f02b3512870d58bdd3c4d5e81714090788a5ed5b13bc9d2b184134e +$BLAKE2$0277c87e9a9266b0c93f92927bed2b3595e68d8aeedb75188630c5781f0c59e7 +$BLAKE2$faa98659687b0e732090ad638a9b484380d00668d33d477a195c4c43b7a4f6f0 +$BLAKE2$f6873f981e87bbc0bfd80309e04b2a096d4c0623a4c8b3365910fa5057b22216 +$BLAKE2$113bba0c5038beb2e1265a3d6fbbc3da219e51053b8124a3f87a398bc57d5f47 +$BLAKE2$2d0ac2bbb16801e88b47b7a42eb5669aad31cb3a3492e71e13a49d7cdf675ce4 +$BLAKE2$1b55819e5b0f7d197e21a83e49f664f3c3d9b35b4e1f397cbbfcf1bc775f5522 +$BLAKE2$58dcd045bea82982caa3937cfd36ef5bd55a8c1b35e451baab7e5f3e643ee040 +$BLAKE2$eb9c75c55c5df3f6ea8064da957a6040c63dca8c1175bef377f86835b2056d62 +$BLAKE2$6842e2f9d41bd74a4bca6730a202f3720a636871346da27a9d66a67f0b2c21d6 +$BLAKE2$ab8ff5cc3142e952e875da6a8b5e79e2297efe4d29562c681ddf9b5283757e3f +$BLAKE2$c73925d0d6e4fbbea461512dd4c38c524f96d61affe78534b373e88f484c06db +$BLAKE2$805e7904be0d3e179ff510fe441e3c581461caa68ee65f9f04b941752fe459e1 +$BLAKE2$f7262995c54e4c2dad3fb559926ae798ef3f5df56b4ecd769bd577491ad89a59 +$BLAKE2$18476e912bbb81ac3811a254b483518abcbd76406be6b939385c2c46bddde6ff +$BLAKE2$de0c0bce76b60fb97991ff8b63fa84d8cad2f4e5ac26bdd239f31c9d6d307d23 +$BLAKE2$21dd11c925ffca3ee6944b86bbf2fba058a2f9a7155bfd6798fbbe9da4947b53 +$BLAKE2$2d6e8cb56d5b0cce26d9d63103fe8d0882bf633703178d08ac6a42dc9dd9514f +$BLAKE2$63829235701b1f12bebe777f8e7761f3b34a410bc274c8b1cea6021a74a16adf +$BLAKE2$98e24d0456f640c0d9bb70cedd79c1c9e23fa0adda2f65e8130c3bbc6e98e6f1 +$BLAKE2$381baacfc328c56293933a6d2ac19617007057ec6800c2a514f7cb34ad18587c +$BLAKE2$55a8f99b49611df268daf7aa03feec9c3bf9fb5f46c46f952eaa39dc2e17bcb0 +$BLAKE2$e4a8ec8a3a914fcbc25b3ebfda17aa16fc49ac356d040740d36054a9a3e2d900 +$BLAKE2$f8531219997559ae134725dbfb9fa77517054daaed882d8b7577aba9b294f902 +$BLAKE2$68866764c27974f7665a3de24106ce3a3d35c2f61e543b6509e663d3f801d9e6 +$BLAKE2$bcc5764ef11994d1da371b86a90d4efdb87bb0199e88fd8af1858282e2928557 +$BLAKE2$3b6b66f05723ec4fb352252ca0a49ede480eb36d2d686a75c157da6b1c1cba82 +$BLAKE2$f33f199799c69cfafc3a2317237989fc365aa99bcd6cd9bd5e344c2efc98daf0 +$BLAKE2$6e848ebcb316015a57201de09cc2694adc8c03b28c8172a29c1cb0d6f34b68c2 +$BLAKE2$b973c910c4c3564125b3b85544cacd21f21d06458ad01e8f91a5eb5eb9b4a8a3 +$BLAKE2$888855206e83e4f8e325e27dff142eaa1bdfbe68098fc6a9ca51fd92af61279d +$BLAKE2$94bd2b2c92c0d893991b42b73f85e3408a296c3c58dae953b15acb6f179c69da +$BLAKE2$41e6adda8982e8f61a73006243ee0730740a340a093458d844416f554690414e +$BLAKE2$09aea42fbecbd83cad903695fe4bad46c092096d86113e28ef3124baea99151c +$BLAKE2$aaace208a2077392668297fb009e158fa67ed0a866ec52016780a8c217c12274 +$BLAKE2$663a85530cb84d6f76e9a6b918632157d74bd0fd9d65a419aea38b53aeeb6eaa +$BLAKE2$cdf08b582805406fde43465fa4336aa11fa7079883f9b9a617e7e8d74250c7d7 +$BLAKE2$4849bdc5500c26e99b215784b644bb29121f75412110d756f6c88e74bb46691a +$BLAKE2$c1e4db74d99f5deaf0a5d7c21c37f4e518df1d570c480dbe6301c387a6bdc52f +$BLAKE2$5da43d4fad0657941a6b75991e394c9febebdb0421442d07eadf222bd4027008 +$BLAKE2$4115d139c82a5701d825a7f0f1d8e57b9a1c2d5600cb4df9a61fe0bc2ef69a51 +$BLAKE2$258d200b5ca62216b316d90f48485c7c1801e02e966274b9ab25d17fa7f05a16 +$BLAKE2$2adc7e785f1621b866acab6491de080cabbc2b36e5e97b93f1d32602f8b38391 +$BLAKE2$39d9577413b84030a7ba37a2ee7d780a60bf7bf591efb852783677fd9ad8f819 +$BLAKE2$00ce8c47edb66b8b890e11743bc0614b3dfb65fb047554710fd65a5cf7003231 +$BLAKE2$177b8507bb2fab9d1f6bf448632ac653ff05e11cf4a3eaf8e071f90c6c14a899 +$BLAKE2$9264d317f1f3d906379e4037f6fbcf7609c7cbee3b22566cd3dcc1d4865f4e19 +$BLAKE2$05ab55ec7919c8fa215bb54a3d6eaba371448025d16d38c6765e2a8424637ce6 +$BLAKE2$b0864a1546f15dbe3ece13d4f542bd20a169dbccf93d9b9728dc40483b0d452c +$BLAKE2$acde82278c3f832c63156caa5dcead2c96578f97fcca45a8638bddaae6c9e5b1 +$BLAKE2$ec37190796ee8c0b3cfc49355ae8e313410a77458e0836713e1feaa85e228701 +$BLAKE2$e9341c40111060cdb0b4f1f632c0641d0974ccf90dab42d5e9f6551ffc39dab4 +$BLAKE2$6552aced3ee8c909b537bf61057745d85f17b0ad52457091c1e508105ef912ea +$BLAKE2$04339265cbd585598dff41824389171eb4cb8bb7c70e6a45975486c2d641fecf +$BLAKE2$cd6cb1e0a60293b877ec0d5a4c036bd597abba686d682a694fc39f95e5818ea2 +$BLAKE2$d2e07adddfb6793e4f7f253e571f86c4e968012f31f2abe7ec5b9f6f2e73b898 +$BLAKE2$5584430e228c822ed50f0e2d5ff4f717c1051ce290bad5ec8ef5e81ea6525ac7 +$BLAKE2$b2f27a6a9d33958b20a111341d647ac51cf33f038e7085ccbcd2406509e18f51 +$BLAKE2$f3d77cd60a1dc2938b6f8f892ce9e6486d52509589641b17367207b8c953fca9 +$BLAKE2$3c21c6a0e701496c35c0b19db25ba759e3663f423099a2f73fe8043be5d1cf0b +$BLAKE2$aab7c09268c430943ecfb771c7af8515510083771d46260cf3c502c96eca54c6 +$BLAKE2$2a44c5e435a51ff2588a4b56fe5b30430fc49ef89989dc431919210b599c41e0 +$BLAKE2$283687e7e72c88cfeb137a126d28c6c6da0513ad0622aaadbc5de6286621098e +$BLAKE2$14799e0f64d4a15f3ab7f71a9950f789d279d4d6e4122f0da851c50750e67bca +$BLAKE2$f8b2476c7b1bb64ccd6940e0cd2bf43487304d7f66298acbb5c55ba5954e2833 +$BLAKE2$0152a86080d5d81993950f65ad24816c96c9aa3dc5c8fb1ac2ef2896ce7f25fa +$BLAKE2$76f68688f6994b86b700cdde3b91dc200b0bfa66885c2a07f89788f7ce17b115 +$BLAKE2$03e72b7059c591ba0496b9df64cdf275fe4f5d57be7f43b645f9ed1df8fdb0f4 +$BLAKE2$2c08445f590283992f7f674eabf98073ba63b98ffa84cd9b99a3dc4a9eea4104 +$BLAKE2$8b4d516f6a292f13e3724e63ea16db9075bc3a5f2f9e89c4578a6252c8487d48 +$BLAKE2$d379006d336835438160622121e2bcbf179af9068d040062c505a69de2ca231b +$BLAKE2$7b866d188933ccc5dfc6f79bd6366c759f7661ff500626bc1b013b6947eb5831 +$BLAKE2$bbedcf6a6e76c2c5a1280385a2b128b968d995d4f39720d2cc9281fdae095a5b +$BLAKE2$4b9d03d17e8b1d3b1396c587ead71a287b1500089efdcc9187308a277b2155c6 +$BLAKE2$03cbe79aba81e2bd12e5f5dc9ad0639a9378413b15190b8a05cdb3a16b410771 +$BLAKE2$24670b3dfcaa95bc27d1428e62d771de5509e0328787555b9e9aa87585db1b10 +$BLAKE2$8a0a605a1d34d2519bad5f376da059b2c02c06362ecac4aef548e9a98df3e07c +$BLAKE2$9b85d11b75ded647c0ac83fe56e444cabd447906ba71b15373b07b14dee39182 +$BLAKE2$df5b62c942121f6226e89bc08949226027803958d6e8f39496d1cfb971493483 +$BLAKE2$298b0e82711cdb7359cb8268de07f956cab08222e0030d9f8a5590692eac47d5 +$BLAKE2$961df075b5e1e6267dab94ebe237a349d3e32081019ddc7d9b0667bbadab1718 +$BLAKE2$64925664838af40e90f514e7a118be11de9d44023a516705955fc408581e97df +$BLAKE2$db72d44e69236b37042ffe1a0044c6f3e10cd106c63a06980f271fa59470b3f4 +$BLAKE2$6479e21642f5163b4cb35caaa639e55df18b9b040545b780a5e28571e5c3cf65 +$BLAKE2$ba551366ab1d92ba483692222646e79a9716d4280f52b2918638be0ae228c941 +$BLAKE2$b8842fe5ff138642e12b3d17ef388d8415a1a491aa5b041500e86de127d96a60 +$BLAKE2$e7ed62eab1512a35d23cf11c8611c9414edb0400932f36d0302a914307f5be5b +$BLAKE2$b49ee38ffac14819104036a016ee5f2833ed3f743909cee679fb563178565737 +$BLAKE2$0be9e34669ed2907ab7f9358a28439ebe069aec95e859c5018f16204b778c0ba +$BLAKE2$888097b78d3bf5214ddf448ddc78fa3afca8eff6f4bc23ea84ae8523de6f27c3 +$BLAKE2$120bcb536d799df1476bcef64eacf67d33eb53f57140a56a7de4861ef8afd636 +$BLAKE2$454c64974d780de7e6890461c8dd9e34824bb44e8cd1c3de0d8f727d53123d4c +$BLAKE2$0d33302c103d199d093e3818a4ad2eda680e6b48bfe0d0224d721d5a409eeb66 +$BLAKE2$579601731732fdca1002d64a9a037837c44e8d3aae75bd3657c3cec981310aeb +$BLAKE2$1aab0f37423a78e1345f30411476e9fa0a3e152523a43a07e6d74ea3cc8f9abf +$BLAKE2$409235fadd2872061457b34c35ce892bf48e555942d72f7251380951de4efaea +$BLAKE2$9ca1c373f9deb41fe39ec7fdf4866ee06b83570e3ef3fd388238d48663426959 +$BLAKE2$7cc48ba40ce7b42373306280efeee2f9ac70ab30a958b5e5697b0b7df0842ffd +$BLAKE2$a2ba4967029c718389f10c6bf20b13984480c5a38e6d42bd20c263084a52fdc9 +$BLAKE2$41a3e0510f79cb03dd7cc25f9e8992d13ef436beb64ea8f6b977df8af6556e96 +$BLAKE2$f6bddb051aec6d01742704121def4365dcff3684356da6781edc4468cfed7e90 +$BLAKE2$119ab7042b676e038ea72d1ae99e1805474f0e09b33dc4f57c7adef3951fdcea +$BLAKE2$8010bc4cc463597d7ad6739011d7d854179172d206a9b7e716ea98ed0859f470 +$BLAKE2$e85f5fd6a65390cfd48432e12ee6c099ca547a2c5f1c54e08f44102f1611cc60 +$BLAKE2$a9cde7fd6a516abff30bfcd0b758c76e05c32683d7f52433c4979c8501f5ea93 +$BLAKE2$a593dda642e80415e495b66e16d5bdeee8be7dd3cb076b8184df1be1f8e808a6 +$BLAKE2$44574f15485d5da7ae2faa002914cbef28996da3a0e65393b412f4d5b13d42e6 +$BLAKE2$33a4c493833df3fff51a1259fcf8cb20d8d4c74d2999bb37355f567c4d15872b +$BLAKE2$59e4448fa3f89955d7be5628664e82c298e83858f08ed092627ac9a0c250633e +$BLAKE2$e2c65a953f92e8843c99e7db0cddd03e0b27d701f033c349ce3ae525de190955 +$BLAKE2$b38213b7f71b6c34d2a75c0b79ba58251223f826d98bed62d8902b7aae286c1e +$BLAKE2$33893c0070e20d2852da0705431ef548c50a4f158308b0ebc09335c9c1deee65 +$BLAKE2$287b450c1e64fde47d40d99160a6814f2856a3246c038f8739eb89e29713f0cd +$BLAKE2$7b0de268c392b3bb82a8d2c01fc58c5cb8437886b6ef5d30ec338e456d5de122 +$BLAKE2$fee08e3483a69a25d61d59adeeccdf29248b4151e8d3e186fd8aa3d3bceba44d +$BLAKE2$d7ed3e24f1672858c4dfcb9db766009bf2bbc742768b68ffdfd2853eadc253eb +$BLAKE2$b9b53865e6e605fe3244198542594c759db8a2c7f77f8ec6ef1400664dfc6c84 +$BLAKE2$33c3792f382447be39e0ee2152bd836c1d939bb560081bfee97f500523841553 +$BLAKE2$8cf71cc32390b5650edb5300fc6a09b9638104c70434d5da1f13471d594125ed +$BLAKE2$8acf293fdd4fcb175431807b8f4560dcc593f8a56040e4185ed665044a7022ca +$BLAKE2$480d0a491818e4c90c9d214d046a80b459645018dcdd4239a5d8d03357981d8a +$BLAKE2$23823aa75ef195ce5f1bac0acda8878c16652c11d0e858f4ef00107ea0336800 +$BLAKE2$323a5ddc289790bcd634c2eac7673926d123af90bfbc4fb4f827144540f791f1 +$BLAKE2$e8c413e19f34a867cc0a8375e9d78f3ad897c2319299c0f54587dbc6dde5159f +$BLAKE2$f3bef0b6a94d61b9cf53621b9a51571ce7858bb2005c9a40f476d2d2d5e5d7f7 +$BLAKE2$33cbee81cadf9e8499e674f0e0dcb8f3d901155f1acbe1622f18394b021c88ad +$BLAKE2$b0581ff689ac8197972e0087540f2f4ee986d27482f3747746d16903d02a0e83 +$BLAKE2$e025091a0e57f93446a7cdf38c46cc22a5751020ecdb66c3e6a78fbd572797b5 +$BLAKE2$f06e05e85c5843e562e779a5e820c9d43aa2b47361e70a4c9fb8354917b6dae4 +$BLAKE2$fc9089fe18504e0d199b74d6616f9ce30139b2d07ff3a3c4c422b13e045ea76f +$BLAKE2$79818563830881644a327148cb7f7ed47aaded782afbd28aa4f24e478a401acf +$BLAKE2$7172bfa6701402cd4aae80f4b749a5a38a84eb1e25b3266bc760d534cbb44f1c +$BLAKE2$b0d90f2fc6e559be6640e1566a080ff40840e62250c01ac0fd2dc263ef4290ff +$BLAKE2$1b1c22577bf5d13e9c9666e603b39025b809a56106d57519bb6a6fd4d993d88f +$BLAKE2$f60436db0565ae85baca46c10c385310b9375fc0ac8d32e0361d3bdf0e30569f +$BLAKE2$8e9e5a2d0242516d47cfbaad2033ac61fbde571aa3b5443455241f767cf3a395 +$BLAKE2$b836d63e7dcf69603843780a5be37a19d985948b4e7f41187fd248afb897c3d1 +$BLAKE2$6bbb6d560949c88c6f8b092a9719bab5e136dacedf65e3efba777b4a5d60ebac +$BLAKE2$ac94238676484e2d80b04ab0f2079dd06d20af206bf6e36f2b9f1670b1133b1b +$BLAKE2$af9a78ff80600e9f8c61aecc3fbc63c02ea858a87aa04c62b4d38f346f21c94d +$BLAKE2$486419662f5693d90cd9577e734bf9fa6b81f207eeafcf97a6ca3fbe7f84f929 +$BLAKE2$3d7b8722caebc629ac4af139b0f5b46cc1a0a13979c7348506d2832583c213f2 +$BLAKE2$3b8cff904f2987d1124f5dc7e52517db3dab3e47cabcb5ac927f351492dbe63f +$BLAKE2$c5b7969f0118521feb28360b9b70b3579b83f93acfef25be12da7c0b60e6fd96 +$BLAKE2$98011816d9c03a6c87cdf6f9e1b80db6986f6a09ee6bb41b85fbfff599ddf702 +$BLAKE2$ace2bf2083cd3372fab3ce26fbccad8983d0da40aed58caf5252c8df3d4f483f +$BLAKE2$64ec6957494dc7f23f9e043758a7034cff646cd27d3e89e5eba735507830ac86 +$BLAKE2$79c69cdd9b2e7f74fb317bc72688f1b4fccb200141bfe35503e906131dbbf60a +$BLAKE2$893bfd833ac55678022b35c32178c6e8f74d91ee5edc60de38e74b59faf500d7 +$BLAKE2$3aca5c20db4743aa9c74c7c308452313a20339b8d4592dd35bcccf20d4994a6f +$BLAKE2$ce50232e292f5aff0f9c4b1abed992547c1c6ed2f943441dcfad51381546a1b5 +$BLAKE2$9fcffdce732346b5bb4407cf98370890fb1e024df3c2c30cb027e83de7dfcf07 +$BLAKE2$0fec76fbcb42d309ec5848405711b03d3f4009b096bcf9676b0844977ba23aa5 +$BLAKE2$d5493231061d970b57675b3b09e35c177637fcfafc14fe7d6e837cecfc0d73b9 +$BLAKE2$61b8d8cc6b8b4e61eac39fe7ca0bef91f0c208c8cb3175837623d75bc625e32b +$BLAKE2$fec7528d885d2ddd2dfeb0a2eb5386c542f97755ce0ec0b194802d09823512e7 +$BLAKE2$75490d03af118bf4993de9e15c861a1765b1fd927ea23d0497973014ee02a84a +$BLAKE2$73b0241ee5ad394b6de3f2c13111d250ba2dfd22f85fb37f781955efc74b55fb +$BLAKE2$ed6063bc1cfa4271e834750f6018d0005a5f3668924dfbfa757b2f892211579d +$BLAKE2$652e530edee5893b576f72b875ea1c918e85e29d859e7e3fa78b623d8abca3de +$BLAKE2$01986c1d10eacf4136a0f65e0681e9a54e86b6e8ec9c5518034cb7f4b6caffdf +$BLAKE2$08e046c66bc1b9002629de7e8cc832ff2aa881ab763bcc87d0c5fc0c8e307248 +$BLAKE2$4689f057807254c08974172c6daadff3e00661612f84e142e04073630876f13e +$BLAKE2$bf54ea2168382e5bfdaef7a6974fa3de72d964e986fede6ce34250d7e444040c +$BLAKE2$3be4a9027b3a3d4d9d1e11697bd302c04c1b53204ab648b8259b5a278beb4f85 +$BLAKE2$45340590ce89c4c1dba706ad95a1e0659c1e169fd5cd09dc028d3c7b816625c4 +$BLAKE2$8b2632d59279efc3a7a2986b3c391fa5149f1e9e3438081de98b798699bbae74 +$BLAKE2$9287a4b82d570eec913302d857de50aa41175df70adcf1fb13aeeca166d1a0a4 +$BLAKE2$b5e914d742755fb69a38eb891c5ed96cc22121267de38b6be3f3ea2f12feed39 +$BLAKE2$fa80eea6eee00712d0844da005fdb83d35c1b569395733f8316939b6969c41e7 +$BLAKE2$eaab955d86dbf396482a32d33782f1fff6cef0fb37ee0ca6fffb1beae40de8f6 +$BLAKE2$7f1f4291f68e29eb6c97fc2f1c0ca40051331a78034cf885cbdb486972502ae8 +$BLAKE2$d93c5eaabcc590e1c1645ade73031522e1de49c37499c4b338b06feea3095f8c +$BLAKE2$d906e125fb36a9fc1cd54f2ac5d38404c9f63957886aabc130d74b5e187f2158 +$BLAKE2$38f02cfad604c899a6a4769016f455cabb7908b7d2c2f6100325b3e7b9ed1958 +$BLAKE2$6c6264d8e101913608896986b51e7023abd4402ff08a5300f9a300c0cbeff5a0 +$BLAKE2$930e3d41f391e89059fec25def2fada1cd9c7281554275badd9a3f6e8634abb5 +$BLAKE2$81d7dd368b3fe9a1d3c18fcea48b783e2d7b1a1c06745e89f0adfe3c05e13da6 +$BLAKE2$ed968b602562ba3bcf2c1cf6d704482327c62b13934612f892de4cf92d0fe664 +$BLAKE2$a2d5182f1b2b5f128376bf63c569f075a862cc3dfbc9603dd93d3c410687c6e5 +$BLAKE2$2daf0d45039e1caf73ae06a8ed02f0ca297af5304adb997daa0126f6be5bc7a4 +$BLAKE2$949b013b8b648407e9ab0124d7890763dd0b740ac1bdab0e9f24f1d9f6a7741f +$BLAKE2$538a67c71d41d61efb6c205dd52597c050f30e4d2a258988c1cf2e5a1bf513ed +$BLAKE2$587719ed1be6846b76c55b1fedf0f62424517a6e91d19fb4ccc316f8da0e55f7 +$BLAKE2$f8d595be8c82df44c56cd83203ea6bc6ffd559b0827c4b3144789c118a7c5b44 +$BLAKE2$e6690315e1e4ee8b324d2d03a8c9fd2830198177011ee49029c765e9d8bb86f5 +$BLAKE2$68f0d04ebd6893ccd92a01d4bdea5a3bc9ba314444bc5d1234d62629b7df07e9 +$BLAKE2$7c393177aeb7617999c47989daec84ff20368db8a2a2e2ef06a31fb15ee67b47 +$BLAKE2$7180761f558c7f83b2b75286322179a20900df1c67e864cdc541f4ed97c3e0a8 +$BLAKE2$b53b795542ea28f63bfb5424ffb637bcfe966f70659be018c43396a5e5fddc9e +$BLAKE2$a5955467c532837e86c2c1127d602c853c3fd4dac5eab9610aa76346fd9ae868 +$BLAKE2$e691facd69c598bfa85f383be3531b4578776b74ee00032b9031e3b6a6265b17 +$BLAKE2$3efa6319f354bd951db0aa0c365ef05a576b00975acc8829c47524dc5eae2e34 +$BLAKE2$36391a904c044aa58b5fe9cea180bb30b3e2362fa0c92064d6f24a5ddadf7162 +$BLAKE2$53e7b67110ff5acb614e45f3418f3e1d8eac1b5c904cf23d59333ba9f1b86472 +$BLAKE2$3d456f321016555157074e13a1c392ac6382b6b0b9dfd7d864069c4c03c98cec +$BLAKE2$b0929e1bf76d5ab18a0001c8ab374762196cb7e0dc47e4b19fe2cd5c41c46bb6 +$BLAKE2$d0608aab38f76a84c24a7b71ad5e25ab27825cbd75ef7fdcd79404f7252f924a +$BLAKE2$4e2a49cdc35c80214af9f5ecafe10213a00170869dc9941d7a926bf195cad51b +$BLAKE2$0a155826bde3b2f65efb87cda1bcfe879f74e893fb930a540e59d0ac7a9233d4 +$BLAKE2$59d507983ed8bfdeae7efa93e5623fd561734adffc0a35425d5049b660f3b17b +$BLAKE2$1e0fa2e466698a5525de7e3d4b4b1bee5b320b6e7c6dcd54bac4060120509e92 +$BLAKE2$5e0823cdd9d1efd400a3efa94566fee45ee4b6e824261683d8654d237a8ab251 +$BLAKE2$dc4b22b3148c33e07c4210950a31d69245375b2562f5d74631e4371ee87ec666 +$BLAKE2$64b3970cf1d09103d2f25f94cd95e3fb1fee8fc105ee6773f48febba66c1de44 +$BLAKE2$4e5c718fa65c35825df637ca8eb16000185cb34d806420c435af7cd7e88f9088 +$BLAKE2$2333d366154ad3648e3b41993ee968a9c2069019b7ceaaca4ffcbda660a5384f +$BLAKE2$2968e7b402ac0b5cdd449cd3e0bcf8a5a64765cf8cdb078cb1f19ae82b06aab3 +$BLAKE2$8ffeec150d7f95a3fa974ef5fd42dc507907a4606fd66b28a2380831b81a7041 +$BLAKE2$80338e292c9e939e2f31330611a11b64d8588287e7dc5c1b9fa2833b5b7c7357 +$BLAKE2$91178dfbadb5baa743f24b333f4a413471261dacec663878b1b91baf2b230b76 +$BLAKE2$65e78ab72344ef09c018e2af036d5705ae8eb6ce5a26fd20774cd2220f1a04b3 +$BLAKE2$0578a014319eb0ad0d2a87c9e8ce19b0b0da49932137257fd84140219f53f080 +$BLAKE2$5688d3c8f3505ade75ca89ff4777b76fe007c93a610266bfc13d4fc2f43918cd +$BLAKE2$3f76ae440efd61f0af0da06e6082112d87640a4042ceb722c0e3f2d54f177149 +$BLAKE2$18a6b5111846d58440fe644ba96ae72acc30824687bd40a18ce40f3e758039a2 +$BLAKE2$5e62e397455a50d3d218590f4fedeb6a8dee708c3b310fe11f7920782d98b956 +$BLAKE2$87c2f94098a9e22e4c61827bc2c8ea02a9c466fbe0aeacb4ab171ae11d820554 +$BLAKE2$7c7bde6b7187cd9af5622843e2d140397e86f08e1b325fdbcbeb861d113c3110 +$BLAKE2$dd50e9f4e074015b62ca38a54bb2488d24ffbc928e40acaa71ed5c38bf6a5a04 +$BLAKE2$5a6f425bb0c849a781ab51f3eef1062e624dbe04fab4cee15f22aa926ed2510d +$BLAKE2$282965ad7d263c3a4ab813a1290901a982e22b842c8ff8a2d0088fd542aaa524 +$BLAKE2$6fbd3f8db4d30309cc4a7b2d9e6970871845e5dc5f5f7e46d5893fd5a1fc05fb +$BLAKE2$c4751cd77815b0e20f47f9741d2f3e47194629e975531bd4d826bc5907b82f8b +$BLAKE2$3c594c22afc4621bb398bce521b8a5d5890c9298d1ca75e74be3865e9b3e490d +$BLAKE2$2002db7a173ba4634de7f3a8f5d5c71c411cbad2e2b83c9c7e07c3b0b50e66ce +$BLAKE2$febe60b44de192e848846b9db1da1623532ca7fcdb36018e5ba14f1407a49c2a +$BLAKE2$3f9048bd29845ee46e4a49e9735d2e75559d3c134e8ddf9373a573cf7639d77d +$BLAKE2$9a83c8959db31f57bd3d7b44c85b7533019cd92d9160d4a4089a12d0d7c68026 +$BLAKE2$efdd65853b064a109c2def6053afd0cf07d677224e9e48b1d3756bc0b3b93b53 +$BLAKE2$3574c6c7d378898e4cafe2c4c1e2a0827725ab1e1a52888b9771d672ab0655f3 +$BLAKE2$cde6654f33ae4298ebf4d53abb0187bc063320ef4e1a12fbfe7de4a389f04a2d +$BLAKE2$e540abe5f1acdc5ad5319f199288d2be68c89fcd8a10f4358686841cb3124be0 +$BLAKE2$9e53b5275acb8564d6274cc484967b740652d858337180cdae37054847aaa2d8 +$BLAKE2$5574fe62a1c99686b2565c408a54428135cb556e16f24f2eea59c57a7cbacea8 +$BLAKE2$207f895181d964f72068aeb45a23d2d6ccfdf9343acd26105cc5335155f19896 +$BLAKE2$46e2fe963948f8d31141190e0cb7ca894513b479387576530d7ed1320dfc6178 +$BLAKE2$bd8d172213113626bfd2a9ebbbc859fc1690657ba4dc26732ff5a93775561071 +$BLAKE2$37e9e0f5d86735c51ab1a87e1bf45d32ad1434dce8aa5c21dda2016e288ce12f +$BLAKE2$049ac209613c5f09776970cfefbd86fe6f4510927eb5eb6077a4813d79186f79 +$BLAKE2$b949b6ad37926a0fdf6fea4c7ca516f4ea7ad27e547afc138209bf8749237d10 +$BLAKE2$2706001e1dc5803f991be424468a7b84af12bb166093da61f293cabf3bc2fb78 +$BLAKE2$f863f79187f035e1d078a3cdeb714e051a349a82f2454c7231e807a9a2efbeba +$BLAKE2$3a5ec04a46ec2d905bbaec9653cbaabb79ac43e37f7081cdb6e89e1b69cf99e7 +$BLAKE2$78c92111d21f3d8f6a0f4b9b3c25f4c8db22414f2848e5e20795aadbee5a4f23 +$BLAKE2$9b4a4b4d414fc9afc67c5d82978d2c27e620f24b359953c9982f576f4cfa23fc +$BLAKE2$f52e248fafc6b9701c371f362ea79f2056c9d2da7c26fd40d23b86012b65f924 +$BLAKE2$ca038df2d3c805609a2174bde2ac274ff8ef74f33999a2e6fc862ffc6407a8ee +$BLAKE2$875c4c5a5d466e78752d59d475c89e9702449e65adfa529eadcbec0e06452bc3 +$BLAKE2$a3bc7e65a8f379069b587c8542436a9e520a3e0c0a1d392d65f07753540fbbfa +$BLAKE2$626aeabf317c32b3f3997ff76ff73818515ca85e5630941f6e311a327023c9fa +$BLAKE2$345083deb54e99d43195872fa21882f4f0fa3453d3d031198f1b324a9449aa58 +$BLAKE2$b5135282f6fafc4bba09726951896e784d692e2d3d940d21c160e416b9783272 +$BLAKE2$085adac994ca9a6a31bac3bb1fa3df81ea39f8ea042fa17eac37e97473003dc1 +$BLAKE2$f098c8d259af820926bbca1496c3c359444fcc36f86e020f3bfd2f8dd3ad9c59 +$BLAKE2$2953cc95dc62af0a5cf11f6ddf31b63c21ba5d320baf141ed2d818506bb821da +$BLAKE2$1da5f77d42f375a4645efa990df2fbdce40e8f11b5808a0eac54ce911730671d +$BLAKE2$2236ca12e6e31bea4a44fa4f67ff05fb444098f986093fe549cf4733659f82fe +$BLAKE2$52ee0be10fe17ce449cd2d228e19a6c4def4864e23acd527808505ce0e789e4c +$BLAKE2$974d0d5b7549390f27a7a0b11d181c4aa3c429bd83799e756d85f635ac329764 +$BLAKE2$7373280ae8695037ceb9fc1aaa75c7b5c10d6fb523ea3301bd65d81788f82a8a +$BLAKE2$6f8839ae82b7e03ad2588043c694b6c7edcc39b7ea68916c2371d3ae3494ec75 +$BLAKE2$e31f09be7a566168d760a776ff1269292d5f42e6d38af06a203365e133530e50 +$BLAKE2$b0d8848742d2d41f859b5828bdf5d6df84f3678b37d1c1cbb716dec13868bedf +$BLAKE2$9e38c84fbef7d15e7e7f2016076e4f1b4c65440599aef83afe0a71bb8aa77153 +$BLAKE2$47e839b482156bb1c82f274df937ef5dd90916efea02e108de65e1f8ed22e415 +$BLAKE2$0e2887ab09c54dc4a82ee76abd50db9a109a1290729179aa09bcc4582907cad5 +$BLAKE2$e90a5eded5e9f7ae5c65d0ffbbc1ec695455e6c91ed0897418aab6c13cc06374 +$BLAKE2$95ed24e3b2ee9e9ce5457bc40a0934466d187d9b35c33991a221262cb1598f7f +$BLAKE2$104ea23e86e5287aed53f9a431fa0ba2443541b24c9b2e8ec5e98309a8dd4d26 +$BLAKE2$8e7bd21b016032b906c0ad7352113e57fea0ea37e9f637dec4434de472f43e55 +$BLAKE2$934804255c453972da99bcdec2e4d99aad2c277bc7469bb335d4a835cd32e529 +$BLAKE2$031cbf165ad350a6e2c7d5fa04f3c03d31eb91368b39b1506adaa6cef9c3086c +$BLAKE2$4b35f5862ef53c672dbf8b313c8f0225fdf46e7f404b06f61669000756be7751 +$BLAKE2$e7f88b81b336b04395256eee73b7a60f6713db665351c8078aed25f5ed8fdd99 +$BLAKE2$0a18ba9040c94bd6d72471a221ff016ceb82de69752c38ddd7952a4efd6025f5 +$BLAKE2$06db81a4be2822fc52858450e9e9100fa2b89fa5e09598da325e17d4dc1127a8 +$BLAKE2$be8200a007952a68dd7407040028b94c0080544e68ef6239aba7e40009efe2f8 +$BLAKE2$b9b8040b08920fe3d8379b282ff65aa3dab42b91397d228b250c7bcf56734228 +$BLAKE2$a8b395a6f825ac658a69bcd6ae80a2e91770852e70ad688085167f407c798063 +$BLAKE2$7912e75f9d076247398b58b48d5c008807fa4668b5f9a7f267239ba31b641e0b +$BLAKE2$666a3bf29564b3daf0f668870c1f8d218196da950077e766762b0653a847a77e +$BLAKE2$c952b8bd73692e5c7ef6c66f00a3b1fbe46d7362d785d2063b48ac3787b72b52 +$BLAKE2$7b6b97bd37214d7f85de662a59b63807a11c1337502d2fe6378d3a1b7c6b2f34 +$BLAKE2$6efd1a5b1982eebdb1f0878e158fca1bf7606417920f728185e94cd09a0c10bb +$BLAKE2$be2c187d29093a4887202a7ecaa09be6d6eb32cd5bab23e533f7d903663e4db8 +$BLAKE2$121abdc19e79ab77db06babf454fe8cf309215fe70a1ecb2e71c2bc04c590357 +$BLAKE2$3e482e5657458545fc823a9bd3fbb2640602be668df7617d49d046e4ac090116 +$BLAKE2$d9e0cc2020aeaaab71ac6247b31ab3506ac8709d7b62a7d01edbe97050ee2db5 +$BLAKE2$5b811e5086a5a60b894c87074b90d80ed4138e8bdcbfefad3bcfd71a49733d9e +$BLAKE2$ae91562e06aabefec841193e9cd87207380068014d5e4f8a9e9c7bb7d8fc8547 +$BLAKE2$4915b02d60b890812261f5f5ec8cdfb819b6b0275625d12d5a01e269bd41a4b0 +$BLAKE2$d7c3f784cdd2d2ab1948e9df4daefb2697958630d66f541c1a704a4f479a11f0 +$BLAKE2$ff12b0795450cb0e4b23513031d7f409a5473517e1a700bcc30d7062ec62783b +$BLAKE2$580e72783b73dcc4b9fcba255af89571b94ae4a7c662da40c87a4bfd68b99b92 +$BLAKE2$72111e378267af6248f2e11e7bbad998686967026a0c8960582d343d8ed1e8ab +$BLAKE2$414f47ac1a8f16816fb8af23af8c17145a619ad99d2d0346a827b1a18997c88a +$BLAKE2$a50840909dbe7acb0d8fe0be85514cfa8d764c64f123b856fe55e6f84deba436 +$BLAKE2$133f5fbd7f7256148e34afde7ab858dc01ed14b18ab7b9da84f31c653c3b960c +$BLAKE2$e2ecca65d1905a278b976ad9b1f4775b6c3d04150ff7e92ffe02f49b9e37baf7 +$BLAKE2$7737f32c3a90859809b8dcb7ecc6aaa9ae71404bb0084aa0d908512d80de025f diff --git a/tests/password.txt b/tests/password.txt index 6d2df1028..068d492ad 100644 --- a/tests/password.txt +++ b/tests/password.txt @@ -1,2 +1,3 @@ $BLAKE2$508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982 $BLAKE2$2c719b484789ad5f6fc1739012182169b25484af156adc91d4f64f72400e574a +$BLAKE2$ba2649757ec72ed0b9bd8b3063687767946145f13abcb38e2718fdaad6c771e0 From 82f799950aa872bcf600ecd845228ac53cc0b81b Mon Sep 17 00:00:00 2001 From: bacqube2 Date: Thu, 9 Feb 2023 15:49:06 +0100 Subject: [PATCH 18/28] m35000_a3-pure commit initial --- OpenCL/m35000_a3-pure.cl | 131 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 OpenCL/m35000_a3-pure.cl diff --git a/OpenCL/m35000_a3-pure.cl b/OpenCL/m35000_a3-pure.cl new file mode 100644 index 000000000..edf01db97 --- /dev/null +++ b/OpenCL/m35000_a3-pure.cl @@ -0,0 +1,131 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) +#endif + +KERNEL_FQ void m35000_mxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + blake2s_ctx_vector_t ctx; + + blake2s_init_vector (&ctx); + blake2s_update_vector (&ctx, w, pw_len); + blake2s_final_vector (&ctx); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_M_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m35000_sxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + blake2s_ctx_vector_t ctx; + + blake2s_init_vector (&ctx); + blake2s_update_vector (&ctx, w, pw_len); + blake2s_final_vector (&ctx); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_S_SIMD (r0, r1, r2, r3); + } +} From bd8ebc365b672b6ce76241139cd8d79a1150723a Mon Sep 17 00:00:00 2001 From: bacqube2 Date: Thu, 9 Feb 2023 16:26:07 +0100 Subject: [PATCH 19/28] Suppression prtinf et ajout m35000_a3-optimized --- OpenCL/inc_hash_blake2s.cl | 48 ---- OpenCL/m35000_a3-optimized.cl | 427 ++++++++++++++++++++++++++++++++++ 2 files changed, 427 insertions(+), 48 deletions(-) create mode 100644 OpenCL/m35000_a3-optimized.cl diff --git a/OpenCL/inc_hash_blake2s.cl b/OpenCL/inc_hash_blake2s.cl index 9c15f18ce..06d6f857b 100644 --- a/OpenCL/inc_hash_blake2s.cl +++ b/OpenCL/inc_hash_blake2s.cl @@ -136,8 +136,6 @@ DECLSPEC u32x blake2s_rot08 (const u32x a) DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, const int len, const u32 f0) { - // printf("transform\n"); - // // printf("------\nm : %x\n", m[0]); const u32 t0 = len; u32 v[16]; @@ -159,29 +157,16 @@ DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, con v[14] = BLAKE2S_IV_06 ^ f0; v[15] = BLAKE2S_IV_07; // ^ f1; - // // printf("v : %x\n", v[0]); - // printf("\n"); - // printf("Round 0 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); - // printf("Round 1 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); - // printf("Round 2 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4); - // printf("Round 3 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8); - // printf("Round 4 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13); - // printf("Round 5 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9); - // printf("Round 6 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11); - // printf("Round 7 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10); - // printf("Round 8 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND ( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5); - // printf("Round 9 : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); BLAKE2S_ROUND (10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0); - // printf("Round A : %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n", v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], v[11], v[12], v[13], v[14], v[15]); h[0] = h[0] ^ v[0] ^ v[ 8]; h[1] = h[1] ^ v[1] ^ v[ 9]; @@ -191,14 +176,10 @@ DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, con h[5] = h[5] ^ v[5] ^ v[13]; h[6] = h[6] ^ v[6] ^ v[14]; h[7] = h[7] ^ v[7] ^ v[15]; - // printf("Final : %x %x %x %x %x %x %x %x\n", h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7]); - // // printf("h : %x\n------\n", h[0]); } DECLSPEC void blake2s_init (PRIVATE_AS blake2s_ctx_t *ctx) { - // printf("Init\n"); - ctx->h[0] = BLAKE2S_IV_00 ^ 0x01010020; // default output length: 0x20 = 32 bytes ctx->h[1] = BLAKE2S_IV_01; ctx->h[2] = BLAKE2S_IV_02; @@ -230,8 +211,6 @@ DECLSPEC void blake2s_init (PRIVATE_AS blake2s_ctx_t *ctx) DECLSPEC void blake2s_update_64 (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const int len) { - // printf("update_64\n"); - if (len == 0) return; const int pos = ctx->len & 63; @@ -339,9 +318,6 @@ DECLSPEC void blake2s_update_64 (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS u32 * DECLSPEC void blake2s_update (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len) { - - // printf("update\n"); - u32 w0[4]; u32 w1[4]; u32 w2[4]; @@ -396,9 +372,6 @@ DECLSPEC void blake2s_update (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS const u3 DECLSPEC void blake2s_update_global (PRIVATE_AS blake2s_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len) { - - // printf("update_global\n"); - u32 w0[4]; u32 w1[4]; u32 w2[4]; @@ -453,17 +426,11 @@ DECLSPEC void blake2s_update_global (PRIVATE_AS blake2s_ctx_t *ctx, GLOBAL_AS co DECLSPEC void blake2s_final (PRIVATE_AS blake2s_ctx_t *ctx) { - - // printf("final\n"); - blake2s_transform (ctx->h, ctx->m, ctx->len, BLAKE2S_FINAL); } DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32x *m, const u32x len, const u32 f0) { - - // printf("transform_vector\n"); - const u32x t0 = len; u32x v[16]; @@ -508,9 +475,6 @@ DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32 DECLSPEC void blake2s_init_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) { - - // printf("init_vector\n"); - ctx->h[0] = BLAKE2S_IV_00 ^ 0x01010020; // default output length: 0x20 = 32 bytes ctx->h[1] = BLAKE2S_IV_01; ctx->h[2] = BLAKE2S_IV_02; @@ -542,9 +506,6 @@ DECLSPEC void blake2s_init_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) DECLSPEC void blake2s_init_vector_from_scalar (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS blake2s_ctx_t *ctx0) { - - // printf("init_vector_scalar\n"); - ctx->h[0] = ctx0->h[0]; ctx->h[1] = ctx0->h[1]; ctx->h[2] = ctx0->h[2]; @@ -576,9 +537,6 @@ DECLSPEC void blake2s_init_vector_from_scalar (PRIVATE_AS blake2s_ctx_vector_t * DECLSPEC void blake2s_update_vector_64 (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, const int len) { - - // printf("update_vector_64\n"); - if (len == 0) return; const int pos = ctx->len & 63; @@ -686,9 +644,6 @@ DECLSPEC void blake2s_update_vector_64 (PRIVATE_AS blake2s_ctx_vector_t *ctx, PR DECLSPEC void blake2s_update_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS const u32x *w, const int len) { - - // printf("update_vector\n"); - u32x w0[4]; u32x w1[4]; u32x w2[4]; @@ -743,8 +698,5 @@ DECLSPEC void blake2s_update_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVA DECLSPEC void blake2s_final_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) { - - // printf("final_vector\n"); - blake2s_transform_vector (ctx->h, ctx->m, (u32x) ctx->len, BLAKE2S_FINAL); } diff --git a/OpenCL/m35000_a3-optimized.cl b/OpenCL/m35000_a3-optimized.cl new file mode 100644 index 000000000..e466f6ea0 --- /dev/null +++ b/OpenCL/m35000_a3-optimized.cl @@ -0,0 +1,427 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) +#endif + +DECLSPEC void m35000m (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTOR ()) +{ + /** + * modifiers are taken from args + */ + + /** + * loop + */ + + u32 w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + const u32x w0x = w0l | w0r; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = w0x; + w0[1] = w[ 1]; + w0[2] = w[ 2]; + w0[3] = w[ 3]; + w1[0] = w[ 4]; + w1[1] = w[ 5]; + w1[2] = w[ 6]; + w1[3] = w[ 7]; + w2[0] = w[ 8]; + w2[1] = w[ 9]; + w2[2] = w[10]; + w2[3] = w[11]; + w3[0] = w[12]; + w3[1] = w[13]; + w3[2] = w[14]; + w3[3] = w[15]; + + u32x m[16]; + + m[ 0] = hl32_to_64 (w0[1], w0[0]); + m[ 1] = hl32_to_64 (w0[3], w0[2]); + m[ 2] = hl32_to_64 (w1[1], w1[0]); + m[ 3] = hl32_to_64 (w1[3], w1[2]); + m[ 4] = hl32_to_64 (w2[1], w2[0]); + m[ 5] = hl32_to_64 (w2[3], w2[2]); + m[ 6] = hl32_to_64 (w3[1], w3[0]); + m[ 7] = hl32_to_64 (w3[3], w3[2]); + m[ 8] = 0; + m[ 9] = 0; + m[10] = 0; + m[11] = 0; + m[12] = 0; + m[13] = 0; + m[14] = 0; + m[15] = 0; + + u32x h[8]; + + h[0] = BLAKE2S_IV_00 ^ 0x01010020; + h[1] = BLAKE2S_IV_01; + h[2] = BLAKE2S_IV_02; + h[3] = BLAKE2S_IV_03; + h[4] = BLAKE2S_IV_04; + h[5] = BLAKE2S_IV_05; + h[6] = BLAKE2S_IV_06; + h[7] = BLAKE2S_IV_07; + + blake2s_transform_vector (h, m, pw_len, BLAKE2S_FINAL); + + const u32x r0 = h[DGST_R0]; + const u32x r1 = h[DGST_R1]; + const u32x r2 = h[DGST_R2]; + const u32x r3 = h[DGST_R3]; + + COMPARE_M_SIMD (r0, r1, r2, r3); + } +} + +DECLSPEC void m35000s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTOR ()) +{ + /** + * modifiers are taken from args + */ + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32 w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + const u32x w0x = w0l | w0r; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = w0x; + w0[1] = w[ 1]; + w0[2] = w[ 2]; + w0[3] = w[ 3]; + w1[0] = w[ 4]; + w1[1] = w[ 5]; + w1[2] = w[ 6]; + w1[3] = w[ 7]; + w2[0] = w[ 8]; + w2[1] = w[ 9]; + w2[2] = w[10]; + w2[3] = w[11]; + w3[0] = w[12]; + w3[1] = w[13]; + w3[2] = w[14]; + w3[3] = w[15]; + + u32x m[16]; + + m[ 0] = hl32_to_64 (w0[1], w0[0]); + m[ 1] = hl32_to_64 (w0[3], w0[2]); + m[ 2] = hl32_to_64 (w1[1], w1[0]); + m[ 3] = hl32_to_64 (w1[3], w1[2]); + m[ 4] = hl32_to_64 (w2[1], w2[0]); + m[ 5] = hl32_to_64 (w2[3], w2[2]); + m[ 6] = hl32_to_64 (w3[1], w3[0]); + m[ 7] = hl32_to_64 (w3[3], w3[2]); + m[ 8] = 0; + m[ 9] = 0; + m[10] = 0; + m[11] = 0; + m[12] = 0; + m[13] = 0; + m[14] = 0; + m[15] = 0; + + u32x h[8]; + + h[0] = BLAKE2S_IV_00 ^ 0x01010020; + h[1] = BLAKE2S_IV_01; + h[2] = BLAKE2S_IV_02; + h[3] = BLAKE2S_IV_03; + h[4] = BLAKE2S_IV_04; + h[5] = BLAKE2S_IV_05; + h[6] = BLAKE2S_IV_06; + h[7] = BLAKE2S_IV_07; + + blake2s_transform_vector (h, m, pw_len, BLAKE2S_FINAL); + + const u32x r0 = h[DGST_R0]; + const u32x r1 = h[DGST_R1]; + const u32x r2 = h[DGST_R2]; + const u32x r3 = h[DGST_R3]; + + COMPARE_S_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m35000_m04 (KERN_ATTR_VECTOR ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + if (gid >= GID_CNT) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m35000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); +} + +KERNEL_FQ void m35000_m08 (KERN_ATTR_VECTOR ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + if (gid >= GID_CNT) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m35000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); +} + +KERNEL_FQ void m35000_m16 (KERN_ATTR_VECTOR ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + if (gid >= GID_CNT) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m35000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); +} + +KERNEL_FQ void m35000_s04 (KERN_ATTR_VECTOR ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + if (gid >= GID_CNT) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m35000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); +} + +KERNEL_FQ void m35000_s08 (KERN_ATTR_VECTOR ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + if (gid >= GID_CNT) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m35000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); +} + +KERNEL_FQ void m35000_s16 (KERN_ATTR_VECTOR ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + if (gid >= GID_CNT) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m35000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); +} From e6a33893265ad2d2b874d80a3d4676e5430af1db Mon Sep 17 00:00:00 2001 From: bacqube2 Date: Thu, 9 Feb 2023 16:45:53 +0100 Subject: [PATCH 20/28] m35000_a3-optimized --- OpenCL/m35000_a3-optimized.cl | 52 +++++++++++------------------------ 1 file changed, 16 insertions(+), 36 deletions(-) diff --git a/OpenCL/m35000_a3-optimized.cl b/OpenCL/m35000_a3-optimized.cl index e466f6ea0..ec5f903db 100644 --- a/OpenCL/m35000_a3-optimized.cl +++ b/OpenCL/m35000_a3-optimized.cl @@ -33,8 +33,6 @@ DECLSPEC void m35000m (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO u32x w0[4]; u32x w1[4]; - u32x w2[4]; - u32x w3[4]; w0[0] = w0x; w0[1] = w[ 1]; @@ -44,25 +42,17 @@ DECLSPEC void m35000m (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; - w2[0] = w[ 8]; - w2[1] = w[ 9]; - w2[2] = w[10]; - w2[3] = w[11]; - w3[0] = w[12]; - w3[1] = w[13]; - w3[2] = w[14]; - w3[3] = w[15]; u32x m[16]; - m[ 0] = hl32_to_64 (w0[1], w0[0]); - m[ 1] = hl32_to_64 (w0[3], w0[2]); - m[ 2] = hl32_to_64 (w1[1], w1[0]); - m[ 3] = hl32_to_64 (w1[3], w1[2]); - m[ 4] = hl32_to_64 (w2[1], w2[0]); - m[ 5] = hl32_to_64 (w2[3], w2[2]); - m[ 6] = hl32_to_64 (w3[1], w3[0]); - m[ 7] = hl32_to_64 (w3[3], w3[2]); + m[ 0] = w0[0]; + m[ 1] = w0[1]; + m[ 2] = w0[2]; + m[ 3] = w0[3]; + m[ 4] = w1[0]; + m[ 5] = w1[1]; + m[ 6] = w1[2]; + m[ 7] = w1[3]; m[ 8] = 0; m[ 9] = 0; m[10] = 0; @@ -125,8 +115,6 @@ DECLSPEC void m35000s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO u32x w0[4]; u32x w1[4]; - u32x w2[4]; - u32x w3[4]; w0[0] = w0x; w0[1] = w[ 1]; @@ -136,25 +124,17 @@ DECLSPEC void m35000s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO w1[1] = w[ 5]; w1[2] = w[ 6]; w1[3] = w[ 7]; - w2[0] = w[ 8]; - w2[1] = w[ 9]; - w2[2] = w[10]; - w2[3] = w[11]; - w3[0] = w[12]; - w3[1] = w[13]; - w3[2] = w[14]; - w3[3] = w[15]; u32x m[16]; - m[ 0] = hl32_to_64 (w0[1], w0[0]); - m[ 1] = hl32_to_64 (w0[3], w0[2]); - m[ 2] = hl32_to_64 (w1[1], w1[0]); - m[ 3] = hl32_to_64 (w1[3], w1[2]); - m[ 4] = hl32_to_64 (w2[1], w2[0]); - m[ 5] = hl32_to_64 (w2[3], w2[2]); - m[ 6] = hl32_to_64 (w3[1], w3[0]); - m[ 7] = hl32_to_64 (w3[3], w3[2]); + m[ 0] = w0[0]; + m[ 1] = w0[1]; + m[ 2] = w0[2]; + m[ 3] = w0[3]; + m[ 4] = w1[0]; + m[ 5] = w1[1]; + m[ 6] = w1[2]; + m[ 7] = w1[3]; m[ 8] = 0; m[ 9] = 0; m[10] = 0; From 4770498960daf13f92877242f91dd40e1d726d41 Mon Sep 17 00:00:00 2001 From: Louka Date: Thu, 9 Feb 2023 16:46:34 +0100 Subject: [PATCH 21/28] add blake2s a0-optimized and a1-pure --- OpenCL/m35000_a0-optimized.cl | 199 ++++++++++++++++++++++++++++++++++ OpenCL/m35000_a1-pure.cl | 109 +++++++++++++++++++ 2 files changed, 308 insertions(+) create mode 100644 OpenCL/m35000_a0-optimized.cl create mode 100644 OpenCL/m35000_a1-pure.cl diff --git a/OpenCL/m35000_a0-optimized.cl b/OpenCL/m35000_a0-optimized.cl new file mode 100644 index 000000000..bf1694445 --- /dev/null +++ b/OpenCL/m35000_a0-optimized.cl @@ -0,0 +1,199 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp_optimized.h) +#include M2S(INCLUDE_PATH/inc_rp_optimized.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) +#endif + +KERNEL_FQ void m35000_m04 (KERN_ATTR_RULES ()) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + u32x w0[4] = { 0 }; + u32x w1[4] = { 0 }; + u32x w2[4] = { 0 }; + u32x w3[4] = { 0 }; + + const u32x out_len = apply_rules_vect_optimized (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); + + u32x m[16]; + + m[ 0] = w0[0]; + m[ 1] = w0[1]; + m[ 2] = w0[2]; + m[ 3] = w0[3]; + m[ 4] = w1[0]; + m[ 5] = w1[1]; + m[ 6] = w1[2]; + m[ 7] = w1[3]; + m[ 8] = 0; + m[ 9] = 0; + m[10] = 0; + m[11] = 0; + m[12] = 0; + m[13] = 0; + m[14] = 0; + m[15] = 0; + + u32x h[8]; + + h[0] = BLAKE2S_IV_00 ^ 0x01010020; + h[1] = BLAKE2S_IV_01; + h[2] = BLAKE2S_IV_02; + h[3] = BLAKE2S_IV_03; + h[4] = BLAKE2S_IV_04; + h[5] = BLAKE2S_IV_05; + h[6] = BLAKE2S_IV_06; + h[7] = BLAKE2S_IV_07; + + blake2s_transform_vector (h, m, out_len, BLAKE2S_FINAL); + + const u32x r0 = h[DGST_R0]; + const u32x r1 = h[DGST_R1]; + const u32x r2 = h[DGST_R2]; + const u32x r3 = h[DGST_R3]; + + COMPARE_M_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m35000_m08 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m35000_m16 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m35000_s04 (KERN_ATTR_RULES ()) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + u32x w0[4] = { 0 }; + u32x w1[4] = { 0 }; + + const u32x out_len = apply_rules_vect_optimized (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); + + u32x m[16]; + + m[ 0] = w0[0]; + m[ 1] = w0[1]; + m[ 2] = w0[2]; + m[ 3] = w0[3]; + m[ 4] = w1[0]; + m[ 5] = w1[1]; + m[ 6] = w1[2]; + m[ 7] = w1[3]; + m[ 8] = 0; + m[ 9] = 0; + m[10] = 0; + m[11] = 0; + m[12] = 0; + m[13] = 0; + m[14] = 0; + m[15] = 0; + + u32x h[8]; + + h[0] = BLAKE2S_IV_00 ^ 0x01010020; + h[1] = BLAKE2S_IV_01; + h[2] = BLAKE2S_IV_02; + h[3] = BLAKE2S_IV_03; + h[4] = BLAKE2S_IV_04; + h[5] = BLAKE2S_IV_05; + h[6] = BLAKE2S_IV_06; + h[7] = BLAKE2S_IV_07; + + blake2s_transform_vector (h, m, out_len, BLAKE2S_FINAL); + + const u32x r0 = h[DGST_R0]; + const u32x r1 = h[DGST_R1]; + const u32x r2 = h[DGST_R2]; + const u32x r3 = h[DGST_R3]; + + COMPARE_S_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m35000_s08 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m35000_s16 (KERN_ATTR_RULES ()) +{ +} diff --git a/OpenCL/m35000_a1-pure.cl b/OpenCL/m35000_a1-pure.cl new file mode 100644 index 000000000..9c1d45547 --- /dev/null +++ b/OpenCL/m35000_a1-pure.cl @@ -0,0 +1,109 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) +#endif + +KERNEL_FQ void m35000_mxx (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + blake2s_ctx_t ctx0; + + blake2s_init (&ctx0); + + blake2s_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + blake2s_ctx_t ctx = ctx0; + + blake2s_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + blake2s_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m35000_sxx (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + blake2s_ctx_t ctx0; + + blake2s_init (&ctx0); + + blake2s_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + blake2s_ctx_t ctx = ctx0; + + blake2s_update_global (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + blake2s_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} From 5381fced6221dcb8b15153099613fb6500a8a600 Mon Sep 17 00:00:00 2001 From: bacqube2 Date: Thu, 9 Feb 2023 17:15:26 +0100 Subject: [PATCH 22/28] Old self-test values deleted --- src/modules/module_35000.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/modules/module_35000.c b/src/modules/module_35000.c index e272c22e5..3c36c99a9 100644 --- a/src/modules/module_35000.c +++ b/src/modules/module_35000.c @@ -22,8 +22,6 @@ static const u64 KERN_TYPE = 35000; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_32 | OPTI_TYPE_RAW_HASH; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_NONE; -// static const char *ST_PASS = "abc"; -// static const char *ST_HASH = "$BLAKE2$508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982"; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$BLAKE2$2c719b484789ad5f6fc1739012182169b25484af156adc91d4f64f72400e574a"; From 816a246c763bd61280c0f2814dd52dc6bef52525 Mon Sep 17 00:00:00 2001 From: Louka Date: Thu, 9 Feb 2023 17:23:00 +0100 Subject: [PATCH 23/28] add blake2s a1-optimized --- OpenCL/m35000_a1-optimized.cl | 299 ++++++++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 OpenCL/m35000_a1-optimized.cl diff --git a/OpenCL/m35000_a1-optimized.cl b/OpenCL/m35000_a1-optimized.cl new file mode 100644 index 000000000..8196980e1 --- /dev/null +++ b/OpenCL/m35000_a1-optimized.cl @@ -0,0 +1,299 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) +#endif + +KERNEL_FQ void m35000_m04 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_l_len = pws[gid].pw_len & 63; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos) & 63; + + const u32x out_len = pw_l_len + pw_r_len; + + /** + * concat password candidate + */ + + u32x wordl0[4] = { 0 }; + u32x wordl1[4] = { 0 }; + u32x wordl2[4] = { 0 }; + u32x wordl3[4] = { 0 }; + + wordl0[0] = pw_buf0[0]; + wordl0[1] = pw_buf0[1]; + wordl0[2] = pw_buf0[2]; + wordl0[3] = pw_buf0[3]; + wordl1[0] = pw_buf1[0]; + wordl1[1] = pw_buf1[1]; + wordl1[2] = pw_buf1[2]; + wordl1[3] = pw_buf1[3]; + + u32x wordr0[4] = { 0 }; + u32x wordr1[4] = { 0 }; + u32x wordr2[4] = { 0 }; + u32x wordr3[4] = { 0 }; + + wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); + wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); + wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); + wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); + wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); + wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); + wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); + wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); + + if (COMBS_MODE == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + else + { + switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + u32x w1[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x m[16]; + + m[ 0] = w0[0]; + m[ 1] = w0[1]; + m[ 2] = w0[2]; + m[ 3] = w0[3]; + m[ 4] = w1[0]; + m[ 5] = w1[1]; + m[ 6] = w1[2]; + m[ 7] = w1[3]; + m[ 8] = 0; + m[ 9] = 0; + m[10] = 0; + m[11] = 0; + m[12] = 0; + m[13] = 0; + m[14] = 0; + m[15] = 0; + + u32x h[8]; + + h[0] = BLAKE2S_IV_00 ^ 0x01010020; + h[1] = BLAKE2S_IV_01; + h[2] = BLAKE2S_IV_02; + h[3] = BLAKE2S_IV_03; + h[4] = BLAKE2S_IV_04; + h[5] = BLAKE2S_IV_05; + h[6] = BLAKE2S_IV_06; + h[7] = BLAKE2S_IV_07; + + blake2s_transform_vector (h, m, out_len, BLAKE2S_FINAL); + + const u32x r0 = h[DGST_R0]; + const u32x r1 = h[DGST_R1]; + const u32x r2 = h[DGST_R2]; + const u32x r3 = h[DGST_R3]; + + COMPARE_M_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m35000_m08 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m35000_m16 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m35000_s04 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_l_len = pws[gid].pw_len & 63; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos) & 63; + + const u32x out_len = pw_l_len + pw_r_len; + + /** + * concat password candidate + */ + + u32x wordl0[4] = { 0 }; + u32x wordl1[4] = { 0 }; + u32x wordl2[4] = { 0 }; + u32x wordl3[4] = { 0 }; + + wordl0[0] = pw_buf0[0]; + wordl0[1] = pw_buf0[1]; + wordl0[2] = pw_buf0[2]; + wordl0[3] = pw_buf0[3]; + wordl1[0] = pw_buf1[0]; + wordl1[1] = pw_buf1[1]; + wordl1[2] = pw_buf1[2]; + wordl1[3] = pw_buf1[3]; + + u32x wordr0[4] = { 0 }; + u32x wordr1[4] = { 0 }; + u32x wordr2[4] = { 0 }; + u32x wordr3[4] = { 0 }; + + wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); + wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); + wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); + wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); + wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); + wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); + wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); + wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); + + if (COMBS_MODE == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + else + { + switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + u32x w1[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x m[16]; + + m[ 0] = w0[0]; + m[ 1] = w0[1]; + m[ 2] = w0[2]; + m[ 3] = w0[3]; + m[ 4] = w1[0]; + m[ 5] = w1[1]; + m[ 6] = w1[2]; + m[ 7] = w1[3]; + m[ 8] = 0; + m[ 9] = 0; + m[10] = 0; + m[11] = 0; + m[12] = 0; + m[13] = 0; + m[14] = 0; + m[15] = 0; + + u32x h[8]; + + h[0] = BLAKE2S_IV_00 ^ 0x01010020; + h[1] = BLAKE2S_IV_01; + h[2] = BLAKE2S_IV_02; + h[3] = BLAKE2S_IV_03; + h[4] = BLAKE2S_IV_04; + h[5] = BLAKE2S_IV_05; + h[6] = BLAKE2S_IV_06; + h[7] = BLAKE2S_IV_07; + + blake2s_transform_vector (h, m, out_len, BLAKE2S_FINAL); + + const u32x r0 = h[DGST_R0]; + const u32x r1 = h[DGST_R1]; + const u32x r2 = h[DGST_R2]; + const u32x r3 = h[DGST_R3]; + + COMPARE_S_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m35000_s08 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m35000_s16 (KERN_ATTR_BASIC ()) +{ +} From 01dbb4173424b513f970f6e57a6a13a506652167 Mon Sep 17 00:00:00 2001 From: Benoit BACQUEY Date: Fri, 10 Feb 2023 11:26:52 +0100 Subject: [PATCH 24/28] Added Blake2s-256 to readme.txt --- docs/readme.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/readme.txt b/docs/readme.txt index 289d3e935..d2b57eb6e 100644 --- a/docs/readme.txt +++ b/docs/readme.txt @@ -58,6 +58,7 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or - SHA3-512 - RIPEMD-160 - BLAKE2b-512 +- BLAKE2s-256 - GOST R 34.11-2012 (Streebog) 256-bit, big-endian - GOST R 34.11-2012 (Streebog) 512-bit, big-endian - GOST R 34.11-94 From d592e5dbcc95443c5b80e24ccd43f0828057bef5 Mon Sep 17 00:00:00 2001 From: Louka Date: Fri, 10 Feb 2023 12:55:51 +0100 Subject: [PATCH 25/28] remove home made tests and add test_modules/m35000.pm --- tests/500-worst-passwords.txt | 499 --------------------------------- tests/blake-test.py | 35 --- tests/blake2b-valid-hashes.txt | 499 --------------------------------- tests/blake2s-valid-hashes.txt | 499 --------------------------------- tests/dico.txt | 1 - tests/password.txt | 3 - tests/password2.txt | 1 - tests/sm3-test.py | 32 --- tests/sm3-valid-hashes.txt | 499 --------------------------------- tools/test_modules/m35000.pm | 42 +++ 10 files changed, 42 insertions(+), 2068 deletions(-) delete mode 100644 tests/500-worst-passwords.txt delete mode 100755 tests/blake-test.py delete mode 100644 tests/blake2b-valid-hashes.txt delete mode 100644 tests/blake2s-valid-hashes.txt delete mode 100644 tests/dico.txt delete mode 100644 tests/password.txt delete mode 100644 tests/password2.txt delete mode 100755 tests/sm3-test.py delete mode 100644 tests/sm3-valid-hashes.txt create mode 100644 tools/test_modules/m35000.pm diff --git a/tests/500-worst-passwords.txt b/tests/500-worst-passwords.txt deleted file mode 100644 index a33ca4719..000000000 --- a/tests/500-worst-passwords.txt +++ /dev/null @@ -1,499 +0,0 @@ -123456 -password -12345678 -1234 -pussy -12345 -dragon -qwerty -696969 -mustang -letmein -baseball -master -michael -football -shadow -monkey -abc123 -pass -fuckme -6969 -jordan -harley -ranger -iwantu -jennifer -hunter -fuck -2000 -test -batman -trustno1 -thomas -tigger -robert -access -love -buster -1234567 -soccer -hockey -killer -george -sexy -andrew -charlie -superman -asshole -fuckyou -dallas -jessica -panties -pepper -1111 -austin -william -daniel -golfer -summer -heather -hammer -yankees -joshua -maggie -biteme -enter -ashley -thunder -cowboy -silver -richard -fucker -orange -merlin -michelle -corvette -bigdog -cheese -matthew -121212 -patrick -martin -freedom -ginger -blowjob -nicole -sparky -yellow -camaro -secret -dick -falcon -taylor -111111 -131313 -123123 -bitch -hello -scooter -please -porsche -guitar -chelsea -black -diamond -nascar -jackson -cameron -654321 -computer -amanda -wizard -xxxxxxxx -money -phoenix -mickey -bailey -knight -iceman -tigers -purple -andrea -horny -dakota -aaaaaa -player -sunshine -morgan -starwars -boomer -cowboys -edward -charles -girls -booboo -coffee -xxxxxx -bulldog -ncc1701 -rabbit -peanut -john -johnny -gandalf -spanky -winter -brandy -compaq -carlos -tennis -james -mike -brandon -fender -anthony -blowme -ferrari -cookie -chicken -maverick -chicago -joseph -diablo -sexsex -hardcore -666666 -willie -welcome -chris -panther -yamaha -justin -banana -driver -marine -angels -fishing -david -maddog -hooters -wilson -butthead -dennis -fucking -captain -bigdick -chester -smokey -xavier -steven -viking -snoopy -blue -eagles -winner -samantha -house -miller -flower -jack -firebird -butter -united -turtle -steelers -tiffany -zxcvbn -tomcat -golf -bond007 -bear -tiger -doctor -gateway -gators -angel -junior -thx1138 -porno -badboy -debbie -spider -melissa -booger -1212 -flyers -fish -porn -matrix -teens -scooby -jason -walter -cumshot -boston -braves -yankee -lover -barney -victor -tucker -princess -mercedes -5150 -doggie -zzzzzz -gunner -horney -bubba -2112 -fred -johnson -xxxxx -tits -member -boobs -donald -bigdaddy -bronco -penis -voyager -rangers -birdie -trouble -white -topgun -bigtits -bitches -green -super -qazwsx -magic -lakers -rachel -slayer -scott -2222 -asdf -video -london -7777 -marlboro -srinivas -internet -action -carter -jasper -monster -teresa -jeremy -11111111 -bill -crystal -peter -pussies -cock -beer -rocket -theman -oliver -prince -beach -amateur -7777777 -muffin -redsox -star -testing -shannon -murphy -frank -hannah -dave -eagle1 -11111 -mother -nathan -raiders -steve -forever -angela -viper -ou812 -jake -lovers -suckit -gregory -buddy -whatever -young -nicholas -lucky -helpme -jackie -monica -midnight -college -baby -cunt -brian -mark -startrek -sierra -leather -232323 -4444 -beavis -bigcock -happy -sophie -ladies -naughty -giants -booty -blonde -fucked -golden -0 -fire -sandra -pookie -packers -einstein -dolphins -chevy -winston -warrior -sammy -slut -8675309 -zxcvbnm -nipples -power -victoria -asdfgh -vagina -toyota -travis -hotdog -paris -rock -xxxx -extreme -redskins -erotic -dirty -ford -freddy -arsenal -access14 -wolf -nipple -iloveyou -alex -florida -eric -legend -movie -success -rosebud -jaguar -great -cool -cooper -1313 -scorpio -mountain -madison -987654 -brazil -lauren -japan -naked -squirt -stars -apple -alexis -aaaa -bonnie -peaches -jasmine -kevin -matt -qwertyui -danielle -beaver -4321 -4128 -runner -swimming -dolphin -gordon -casper -stupid -shit -saturn -gemini -apples -august -3333 -canada -blazer -cumming -hunting -kitty -rainbow -112233 -arthur -cream -calvin -shaved -surfer -samson -kelly -paul -mine -king -racing -5555 -eagle -hentai -newyork -little -redwings -smith -sticky -cocacola -animal -broncos -private -skippy -marvin -blondes -enjoy -girl -apollo -parker -qwert -time -sydney -women -voodoo -magnum -juice -abgrtyu -777777 -dreams -maxwell -music -rush2112 -russia -scorpion -rebecca -tester -mistress -phantom -billy -6666 -albert diff --git a/tests/blake-test.py b/tests/blake-test.py deleted file mode 100755 index f80a9f47f..000000000 --- a/tests/blake-test.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/python3 - -import hashlib - -# Python script to create dataset of passwords/hashes for testing - -PASSWD_FILE = "500-worst-passwords.txt" -VALID_HASHES_FILE = "blake2s-valid-hashes.txt" -# VALID_HASHES_FILE = "blake2b-valid-hashes.txt" -BLAKE2S_HEADER = "$BLAKE2$" - -# Password source file : https://github.com/danielmiessler/SecLists/blob/master/Passwords/500-worst-passwords.txt - -def createBlake2sDataset(inputFile, outputFile): - # open password and hashes file - passwd = open(inputFile, 'r') - hashes = open(outputFile, 'w') - # for each password in file - for line in passwd.readlines(): - # compute Blake2s hash - d = hashlib.blake2s() - # d = hashlib.blake2b() - d.update(line.replace('\n', '').encode()) - # encode in base64 and write it - formattedHash = BLAKE2S_HEADER + d.hexdigest() - # print(formattedHash + '\n', end='') - hashes.write(formattedHash + '\n') - print("Done") - -def main(): - createBlake2sDataset(PASSWD_FILE, VALID_HASHES_FILE) - -# entry -if __name__ == "__main__": - main() diff --git a/tests/blake2b-valid-hashes.txt b/tests/blake2b-valid-hashes.txt deleted file mode 100644 index 3cfd5fbb0..000000000 --- a/tests/blake2b-valid-hashes.txt +++ /dev/null @@ -1,499 +0,0 @@ -$BLAKE2$bbc7ad961a66ae406e05859918dd6979a32240c1e9e0482c64ab76d900099758fdefe0f0ab1f2ff9f9d8d55b98ede3960758b9cff4af6826fb4506713dc068bc -$BLAKE2$523ff429276912e94c32886a217c4b312d950b7fd18418176cb7bc1599995319882c0966f5d68bb735407caad86b37f7105c8dcb5bc280de67cfa4d63d8420fc -$BLAKE2$de4ae0455ce7517933e64c47b8cdde2aa5a0bb5dffeb54b6e87ec0bb9ab6fd725841ae1c8232ac96e3117c70739f7bd306dfa367090c74eb822186eb4e00954a -$BLAKE2$045f7d14d7bdb5d0aba2ea27bf999ab344e4cb2e54f5982b7c81443db525cd9aece53e3dc73892afcb958b137b031c8cad0892f8fb6abece7c264d1824005e31 -$BLAKE2$38cd4c7c7f3f9227b87100856a3a393c73f7f2beb78da059e47312549bb6d01050b3d342b5f4fc81a0346ae39e267766c462a300f1d6526def6e21426a332c18 -$BLAKE2$bfc877bc2a258facff21279383039ca6c5e4f98ee78b5cafa209bd3598633443908f9e533676cb38952cd8132241f19735b4929bc249937ec79349132dceac5a -$BLAKE2$ae7fec75d3060d3e531b31722a7d81053becfab3b0025e8b15dfb831456817690046a2054b1e0eae1e733449bbbf3c00066cf848421f6ab944a9992d6c9970a0 -$BLAKE2$b617653a8b5694ab1358c345774d245b1a1df5837ab73d4842dbf186b2fc76d8f370c295eff7d9511570c9312a668b5699de8bc117bd58a163f119b2a6684660 -$BLAKE2$9e12c61707754d49e33fa8aa727e54ba6d4383c4cdb1ed55080904e564d9448cc133ac99f20f418f5990562a06ad7869fee12c4643e0f1ebd7574612077145ae -$BLAKE2$b19c19d89c177b5cfcd9369d3e3d19e781566dc9264c5b964ef7f926d3cb47ed50ce664a0341f6000da11b3b5f799aab981fa85b76cd45023fec0cbb3be6dbef -$BLAKE2$dc5ec328215b4c6fbe1703bdf32d6be6d6a61d61d5c88656c2e5927a3d104e2b9c4dedf6e89500c721f2dca512757858eee6de75d025ada6ce60a92203a43086 -$BLAKE2$f96215c71d1fe92a3b905df337a9884589aa2e8afa2aa9ce3672cdf68b602872010d0a5eda1108ac7b4e3bcbebbd7d4209d07486ff93d723f585bcf62df22620 -$BLAKE2$e5a710a0e5cffec69624623ea811397d74210804c6da1b06c2c66e203b4829b3e6e3555c3522b79697ae337d41b84565e7f7cfaecb8ccbf56bc5b64e66a9b812 -$BLAKE2$c80dbde57100578d0b7de04b54fdbcbeb82fcb806937a5d80c284ae4a956b3f98df1b25bc40245f5561f4f502e24ed4607044574347ea5e85a2d0ba026e17743 -$BLAKE2$f91cbf5ccd4ef658e72aefe41a99f252fe4f1812824f771434da8db6433719de728bb30997a548e8014f2dd4bb9527d6c58533850b3e0d7339fa752942036c53 -$BLAKE2$2d42aa225892384642ea69389553796f59b1d0f42fa33f89beaa206850d12b4fe34c6dd741cb49a0796778b835fc893f31197e78dc4d8cdebff35cfad3963769 -$BLAKE2$a61f757c16c3f70e98e1d662a79457b9e5a01cd62eb9ba1caa1854969c6317d6acae497f96821c3b20c4ff89eee11627bf189d6efe3016b3093c2fb3e88a522a -$BLAKE2$fd4519ee16e6f64b0f031e413d181eff83639721dcc214184f74d0961e7fbcba756eed1517113e754a939cf53b77b666aae30fcf95ab90db0dcdb9586af1b1cc -$BLAKE2$058ab3e0d2ed91074a3668c37e4bde111b0812c53c8c339b9566593bae3ef382b5e18d1d6d5f6710cbe831a1ae322e978ff9732b5ab4aa805193edb6055da8a3 -$BLAKE2$e88015a6c16d9ee83a888920fde35b92ca6e22071ac7d54821ae3c76bf03d297af85a6e9bc98f80269ce981a8fca34198f2dbb3682eeb096fe54eda7bdf5766c -$BLAKE2$8ab50927cafa3f350bad9beae292d13f8f909b85a32ecb4122301a33359a6d16afcc97e8642697385f1d72abd0d91f297d6d6ef9776820f70a631a02d7cbdc4e -$BLAKE2$dfada3017bae682228b354f25eb761a988744fe3030c07c2c501e543084c4af753136696f7263a94d15dd90d3925aadce8d0c770b4dc26de33a1a846ec6952e1 -$BLAKE2$8d77ed16cea34767c30cfa42d3b51c3ba1cadf198bc8d49e89aed8537c7b35bdf10861fceb18610e537c60c707e8b0795f25def75a73265fd9d5aab6cdedc064 -$BLAKE2$0ca9d5384197fa60ed5a79a9507c8ae23d4b336bdec622846680c372e59344364ff462ee1c00283da7b3cdc188744c8f0761fa5d6f1968738f7b4557836ee748 -$BLAKE2$84c2f532a6cc4eecffa13aeaf5984ddeb515421d4a5377028e237ec2f7a9adff6bfae82e9f25751c779d6da8244b3a556cd01a14ed3ddd56a41856e25f4b7bfd -$BLAKE2$bf642227ee4f9a9bc61b7bf986e16f6b0e6102586478f18a783d5b455a1591d2c951b3dc8a93fb33f3a96b4821085f1e91befab38b73c3c59280a0dfd5f0b2e4 -$BLAKE2$f4ffff8b36486ea85bee8cc6be91880a8f2e5f2f89c0c8c11b06850f86eadb2a720ba52ba9595baa5272effc1f0c67de03ec738d4780d9631ce5d2dcc3417bd3 -$BLAKE2$dcbd18cfb30b2ccc26453aab495e8b0316ce1b770bbec638ac40f9c6f14d2080fe1d8727f1374f17590de888e9e7119bd051590b83845d79094be5a647cc4880 -$BLAKE2$9e417d49a556300d2416d15aa3ca955a47e717c4ca8ea7d4eaf7178dc735bda90e7aa30dfc27b687455319528a8d71c5ee141a97e90859aad8ae2d0ff04bbab4 -$BLAKE2$34073762db7af5008c7213f93390e0e7b73051ecd42d49f3633c82c9af0caff3fff74f09c7a6ff72ef309a584c8dbeb0cbda750fb08bdaa88ceabfccda650c35 -$BLAKE2$3edc72c578caa0dd31116ab9af1d3b173a1b8ca51cbff4774b84cd873233b8c1845dd479c26b96bcc7e90e9b14c9f1313901bd8c5faad251416b1e518748e0ef -$BLAKE2$40977128880e41d2876f4ad3b13423691c88652a0de98f332c63f46caafdf482c85d64a94509f375406979d109abaa603cb6f0a67c90c7772ca3d14bb86a1406 -$BLAKE2$76e31dd75cbcb564ae337f9c33a7a61c65eb299dd4e9b4f396f3e5dec34cfb89d882daa7432bf4345265479c6e9b2b3a8d8fb86ee8d5db7286042dfb06b1a419 -$BLAKE2$b8433fefacae17439aa80855b9ae398c08080271652aeab82db8fd191ac0ea828d7d56cf7cba513f07f4203530120bae0e1e6b89e9886155220c26c234d4c265 -$BLAKE2$2d9e931f00022eff0a6f6f78df1e126d8566f1eaef9726f0cf848b52567299260629d2a5707a3220ce91feac9aca9ab7a9918f5a90915f9419f791cf94320253 -$BLAKE2$e4fcb6f3e0d915fc7e77c0d34ba75b8c2fe5bc3ccf84f0c005122a8e191d198ec7cf8b3c629b524903ba00a69bae267fb8b530a4940c6281ad0dda13bd81603e -$BLAKE2$299b1918c3040374dd05fac37eb4947dde6e50ab0c5617a2627ba38048e2410fa43e4c3513698ab9bf04c9009a1d20edbce8916cfc6f98d0ccb5e14dabf5940f -$BLAKE2$d7664bc50dbd5895e3c6d4d7485f7c0ebea3ee980eb740f236f0dbe968ff29c5efb08a84014a0a0a20b7acdff252fae50deb8bdfe191284bc2a97e07b72fbfa1 -$BLAKE2$3bd285bd1b83a0fda20f6de7c3e4cf62e171ccafef582d77a764fe5221da2c2f42a524aa8df29c49b29aa96015edc301e9b20e68eae3582dc0f2ef53f5717b40 -$BLAKE2$72e3611e894781726108abcae3898b4efe333e8a295365c36ea7931cb784bc53f952d1488f29fb01487c068530ac48a0ae44c85d0547de44d5c08f17f4baa557 -$BLAKE2$648836f005bb1067543e43a59890977c41f93e4075141ce27a27da0c567685a430fecf3f00ed6f8a110e0729735f1a7571638bc1ceb1368ca30934a3f2923da1 -$BLAKE2$81620e9ec9e77334e9def4752ebfe7b3492c77d5e1f2aa6fe542be41eb0eafa3c281413af36cd258ad9b0057703a2855d3ad58b30f9525feac7c90c1428c2782 -$BLAKE2$f3a5285e853285d54b2b98e217e9fa2fa70b7ab2f09507d7e59699d1598122afa7e86b63cf56e666dd096ee27484cc2344784e6f6c25b8942ea1553f2e804516 -$BLAKE2$73634679d80cafeb2c989c5abce53a3512fe758fe4deef909ea8b6faf468aa57f8f13b93bc2b2a1fd614a75f21f2f2ac6fe488b643e2cfcf0a6ff885cd9f44a8 -$BLAKE2$bcc4c12d92679f4eecc81f80e327514e5f18dd42aedabe755c05a80ae8ea2f1f1afacbaa9e5986e2cb31867ab3cf910de34cbf41dec03e21b3ef414d77f7838c -$BLAKE2$192a8420a4f1fb1c869886154e847a6548e46660c18690ae452293c708253575c2323b5c54e8335c6bebef2ba9896ad60bb33c2386ee4f0412b8877fedd41d86 -$BLAKE2$b29a7d50938fbe2c4b6d2fdc8464b60c17cbf28940ee8a153780a14bcdd23031e7ad08c5faf217658f4069250ead30eae760ca36d8843351a763cb4ad67b773e -$BLAKE2$ae966a5ee740276a9c8b801c81b0a8e4000c13cbc39b238e656fb02a7b4c1a679b13f5c76e19cd68a5e070b4714aabf40d90c98381f2f35cddb4b6737e608ea2 -$BLAKE2$4404c97c4726bf03a2fbb05196b4adf47f069f2e29a7f3aa5c977b96cff169c1c2c99027e379d5bc45de9090423a89a4f9500d79c765a43830974048b2a00a54 -$BLAKE2$0f6aa44ebe67ccb526a13806ad1f923852881fdd6a448f580097bec741b5bc18e2d5d587a8b8263f1893a50bb00355f3bc1734839cf140840724ea248f6cf867 -$BLAKE2$5bb08b0096d514792194ce3859fc148957fecb9fb6fca368c8e18ef6bd214e10a142fc6ab7001efa174d607aed41902e1401513e3c0a95b3c47797e2a50691bb -$BLAKE2$40cda9799eb2ed92c5d6d5880146d69dd49e4f74f90493447015e99fb87b488733d40b940eac90521b70890a94757acb739ce14c5034827e63d6d0e599059cfa -$BLAKE2$63f20d9e88830dbe9c75d91a653b0892c8a7501bd708c05b7d9f4c4a2eebbb86aa2e105f0b63222c12935845bf8990d54aa37c968668bb79eccaff71bcb36767 -$BLAKE2$9de6524332cb4c7cfd743d4c0fa833bb0e0005d8c2f06dd870af5155e69aa3ecf32bea0983fd1e4da08f1102097904ab5dc9061d15b302054fcbc1ecbf83e8b4 -$BLAKE2$aeb579e66ce8f0dec496842d2d2b2040330d3e7bb90f92199d4720f0642b5ffec3a0ee08d30aeab14323c6edc02800cc8cfb871d93c968a92158d0843b66c2b2 -$BLAKE2$1ef098acb8ad3a9762e36abbbb1c0d462451106e41af72d98404336238d858017e7413531ae229fa03d22452eeb9537873282ec823a1c593349fcba2789a4e6a -$BLAKE2$bf817e36417f317e8393a57db95b1dd47a1b7257114a34d6cd197a8ad993faa80034ab76fe722ee84494dad13997f61d0db363b37545526c9be0ccae866236f9 -$BLAKE2$b907357d3bbf90d45f02d45941148df268b2222f59aa95e37dc70decec968d307a6646777ed2e2791000fb4f58479fa69015ad45d7a6638bb2c12e785483a75c -$BLAKE2$33cd9288a367df4699f2aba590c0ae90bf477fccc6291862213909de2f3209cd00755114766128519b3a42f17a3ec600933fb3b416a4b22073bbbd631446912c -$BLAKE2$f69e4d9d019007814f9eb5ee668a195829edc16d1b632b5a8cfe3eeea234bef70306ac21b6fd2a7a3f4ae6bc01860bf95b0634885f2a33bd6aeea3eb2504e727 -$BLAKE2$b79e0e4c534a029a1fdfeeb9689f9fdff34dcc76e7f7dd0cf6a3578534913a37511c7b7a697e259648efffc2d66f65a14e6460714d7232fd11d1a87dccbd50f1 -$BLAKE2$2814ce5293a2b48d83d36930937ece00c6ce67b2ebeaf2f75fdd2e4b848fc7ec3dd42664b0425e67f14b5b407b33ab13d9a88e64bbdf1ce2417b734c38472005 -$BLAKE2$10384443213bb2f79b96b8fe5111a2c13792c434fe6ad1c4afeb55758bffa540ebf734a1fb2b55ebc603cdab6e7e330a78b46d24a44a413882f20cb005162101 -$BLAKE2$3a38cb7a51122f3a754438e89c07dbcf0a98e20dbcc60a68848b0bd10b277e464b1cfa0fb4e11057897fc562091549f3ed7bb366852e15264165b0183163c664 -$BLAKE2$c3d8602c8cd15bbfe9cb8d878ae88f14d35faa01bcc2e0377f5ec6e14106a7cb1ce8b70ed69eb5138796bb6ace49e404510bf54f4e6886e7751fa601bcb5753e -$BLAKE2$37c08100dbe0046db60a35789b4db4afe8ca498a81f1e49755260b0a1d13b4878017dc95c2ca01a740d5423b628986c3053151e85f601d3c92e130d1319cdedf -$BLAKE2$5e8792612d3f1edc812826950aa4b541645c5d1a8a91cb2fa092787f0215940412987de9a94396b2965b04b1156960e305dc11433162f59e4d195643d987b0fe -$BLAKE2$c387acdaabd7c7cee953db11231d23fb542af82424099e95d3f29db709e5ee7d81a8448c95f8f688efa40aff3b5b30c269ce9329cb14cd96e7c23731b50c5746 -$BLAKE2$3de310eb0438b527488f21b9aff8b9cad66c2654f80a7b60824585f5471aeab5cf041ccae616bf4a643387a05f96b09a361fee015eaa1896cc3b3d8c71c991df -$BLAKE2$7760882c0b89c981db5f3158ae9d11a140d818a2eaae9c9e015ba9a5ebd072e0135b41e57be632437d791de7b0b8c230c57f2cbb59173eb6d57528d3808aef43 -$BLAKE2$238783f92f30526e478554d3777ee393b81f4c778c821ebfd9b61903001dc9511f685c0a722cba2d57e78183a9d0ecc5682beb0bb304f5153357bb52db0ab5a8 -$BLAKE2$592f4da49d55d040c7e16cf24dcd94959a0fe3229de21372f276c557a67a356e09ac9bf965f610618ec95e8e758ca471e5c25276bba0357b448a4b1eb44f6896 -$BLAKE2$a1f59d519e90432efcbce502f6b33a73c3caf2ccbb74a7552a7ffbf72f8b99ea53c82101f3a3eda158db70deb31a84511283aca1d0bb1031ab96e650de06f730 -$BLAKE2$2b5ea3feaf19284dd0d0b5b08dd717664c97ec83d536e202be972f5166ab3f5df9dcb23eaeef1c56d1a724496d0dc622dabc43be3e98fa4cb1896aecac42797a -$BLAKE2$bca35b1b0304a166986ad716c125f847e65868ffa8ceef2ea30768b94298e6d15f8617430eb8f1c4738e0476d06493c87ec809cfbd68b66d3a36b09834625f7b -$BLAKE2$3440c563d627fb6f9da4b9be5520f01ceef3ae6d34dff71711d03f904630c9282b351e3775090ec13b2813218a21fdde5d6c0fd9e3160cb5a7bae040f68a4c73 -$BLAKE2$c4794b8a22821a496b31abc6946b596bd83713c9e187d5a38f39397940684ba45a8ab5d2ecc980cc5dbabc7ee70b5962e05ee4cbb574b2ab3cd5f9b89200c8cd -$BLAKE2$dad97608bec34a0efa2aac02ee3791748c08f996ac049af6413938aa5ae4f0d0377af31a32f906de6576dbc5eb6fd2545b72d2e6ffb6022100e897cdf8b8e215 -$BLAKE2$60b65325f50a6395ebc6d00c335385ce95bdc22e0ec7516b315eb5a62a7044e9ff49f120509a5a4efda3d68362a9de6851f56cedfcc12e179a596e8930f03f8d -$BLAKE2$6f194bb015b189e2ddb7e307d0ea0fefb7055e5a2d5c33c0e06fc56c0b127b0918c168f6695d5be46824a9e4d966f7c78ed725e02dbc88b43c31e221cacde60a -$BLAKE2$3d73e2087adaf2987b111a575ed421021e67f204b5982d6ecb6c6138bd224fff1673e5934551ff0992e76a19d1170b8e2477c9968075a9ad02bd34d99c2618b2 -$BLAKE2$96d696acba033749f729ae588ffb84c8c44ccb9b525f082c6986b876d730a32bc17ff899bdbc4fa34b0a793371026882a5b73c5d1cfd7e859c1db17e5475f06d -$BLAKE2$30e20d0c74b83a31ae5c2c27619473df556777f004dafc74cc018ed5a6b92ad74af62e3458377f111400086033464605122fc62cec8dcf9d01579c376dcce312 -$BLAKE2$00b9819e6a2722829f0c1386e3544d7481623d5298a0af5157ce5aa677b14be95523ca362da0532eb335028909096fd60011970fdd595555005b105ba320c81e -$BLAKE2$14c4918b437c520426913320c784c06801f7a4a20a8d5ec43e5540c8ea1091acf301c6c14ec0ae7bcaeb4b235c17ac7b2f0420158bf0851c500d5c3c6ddc217c -$BLAKE2$934da00ccdc584ce7c92e3fb8f2c6f165978fb7f82aee2abf70597eba775687a47657326645142fe227907b954aab76a4e8388c9be3a44d028f956d21c458ea6 -$BLAKE2$398b76d3e5104601b425320cbd3ec61a2ad299047d54b1e103b740708992c1f89d2ab56556820e2db26fbab9147d446da3fd8317a4d619f944f3ddb0ba62d101 -$BLAKE2$af76e192e8851904e565c872ae6aa9befbdb999a99ed148af7aa6a508f5fd35d39de4b208a486251995c1a1b7ec86107aee7ed03948874d811e57a940684a694 -$BLAKE2$ac8581cd39ec0ce0002a3012ecd6317c30a75366f62e033805b22e0d2ae32d026c5d15f3da34b14a2e89e308e93d7d775ee84c67e06f2297cfc02a8f34c3a4c8 -$BLAKE2$d02ff5c7a98558a1edede0b9c4729d3608e61919a2670afac2ca16700fe3053f37f74b0b210288828e60516a42fd3b53aaa782618bd839e112c7eba287751eb8 -$BLAKE2$cb85d54343717e3ee47280ee200f1c91dfe717e9f554d20638b8a6a49fcd1d24fd5f772e47e3b000e85b8a3183e8f0f33e3f9bec1745d25aa75554ab528a4e08 -$BLAKE2$92d33f2760d8d0c4e25ca298a5caefcde075241d32b902c32edf0ef2211ca2eb3a29e9882d989e50442beabedde53f921c7d473460eee05fe3098512d0089642 -$BLAKE2$f6a7445a630aef0003397f6702972599c0aa623517420aff7b7363039aac5bf4d4d0ba22828969f3208da45ee4a0d889118387c01ba6de1ec543fe4d15b2b143 -$BLAKE2$035347683dfe2c7ee7863b36bc4f750ca6482e4e165edff42bfb438383781123282701aef56aa05af548494e2233d02cf8e0a2b8917e2a0b98a7358573b7f6ba -$BLAKE2$c230df1006fac82f6ca00526810f6f88afce92b32e9b0920f406d045a3111ad8c2412ec0b37b2ec15c85363a0c85e6182e69dc9177c00ff180c8366b1b63ee5e -$BLAKE2$fc9cc8a4ce44e378251c4260a9aa4e81374bd718eff1113524ae963fbe097193c2ca237c8f5efb32e659ef83655b8ea4151a6d2341b0bc7248720e159d94225b -$BLAKE2$d1c7f5b916b55eb2dd1341cc99141bca588a81e500fab5c23e5c5f271d8169d120bf15b311978b5cd4267eae65d00815f15a3355ac2a7e4da1f26a72a318ef59 -$BLAKE2$f60ce482e5cc1229f39d71313171a8d9f4ca3a87d066bf4b205effb528192a75f14f3271e2c1a90e1de53f275b4d4793eef2f5e31ea90d2ce29d2e481c36435f -$BLAKE2$d08e7d762c7b9cb61a7ffc26c5777777212b45b199706d27b3b670635d8ed4678bd5163243df245e637d7943875595a9b75297ee06d69cdb5b787a6f2a94c810 -$BLAKE2$2e14c5cf9f64098be0ccf566f919a8662ad30ad7be2dcd22dd54fbdeab4e178e9584cb39eb73b5f89b622f325a137a920f995c8f2304c966214781e0a38c6c90 -$BLAKE2$4d1ef607bde261ee96fa73660f5ad3ce15d7864639e320b46969e412ed6163bc677a61f9575b3ecfba6971b5f66580b4a12eff1938c3834c66d9061aeb17f478 -$BLAKE2$992364dd60a82728fe46a2c14a8ae0853c02fee8dd73cc6b0051d7a194a1e8e2eb403722caf511e7643f96d76f266e6cea6058469e8996f2fc5f003de0eb9471 -$BLAKE2$5390d1dc7914448c578198336df013a00af2ad64a30eb756d19277dbf9c2eb94ca2f57c7b1dfb67e62605efcc90261f0abe98a3913ae5c598e04fd4f98ba1722 -$BLAKE2$bf9508ee65b8206ee8f6a7a2ca04d4ac99f66c019356c4c97b3b5156e53e3bf55fed66e9f8d6d5fb8c7bb417e96e076d283d77ac86d1cc314af6d86ba0fa7240 -$BLAKE2$1d5e3e39446ab0ef7d079b6dd31a388088bd015957a3aac060f2cb5971152983ee2fa87f5fc5cb360c46bcba767a9b6a8ff75ceccb96f93b298f91967c44311b -$BLAKE2$90f3cd4364ab2932c1b8e9835a5ecf7a976a7943c58b99b9de4df1cc43b6bb91be06e09b43de5bdd28b37bb511b848c2494ba0e768ce8028ebbdcc546880ddd3 -$BLAKE2$1e388ef7908b873aa0b3c0e39d093ae741002416891ea0eca72cef1916eddcead13af2ed492654ca6f050092d0a1c61586f0192c8cc0f6ac1e2cbc68ed6e249b -$BLAKE2$ff348ce9c09b05b7eb1aa9a71d0454af0ee4d1cc87b29465e97097a70cd852a0b8a7be78e6a7e6054c145dabd0640dbb81e03a01bd2d36386867e0c393c51ebc -$BLAKE2$f445afe3693d01141327259a5832b9d83b31d46b482b8559e02aa6203ed4d445b5a805e254387280c00d6daac2418de6405c1ac7c4f2d4017647ed3ef81f48fc -$BLAKE2$f1e5eba2986ca4d5defb8521658e9508c6e688f7b806a0a5af775ab67fabbf6da7da98a654c6a5f09f19bd20b6a7cc87173e40ccf60038a72b20634008e93643 -$BLAKE2$9bdb70be7cbcf9cda59c377c85e2705e3dba21b39b6fba325fc755846ba7a38122ed898c559645f8a3f9cec21fe05cf5eb6cbb078ee577ec4cb24f60c9c4d9d5 -$BLAKE2$848f870aaf4e4e33165f7075f4f62dce069a1b2fe96c7d6c85ae0e0c1a0674e1af31a5e7a6446ed9a186b77938f9447fe85741a39e7bbbd1ade0829577797f6f -$BLAKE2$094fe151b84ddce9a89e06c953f3c88fb1e98c26bb3c72019f5b0ce571f1cb7b116e4daaba47b55d16bcd91aff2d96789c05e75a703ec6b73e313808e8f66107 -$BLAKE2$762bc6217ac76e5b5af8621fa325e7c3237b1a3d82826da726f3bbbd59e7257da8973aa732dfd2eae35a89d29d41858449a535de511e46c648f8d056cba5b685 -$BLAKE2$d5a7d20bb933ee598e69a15bda9b127a119b420b0b6984e97b034edc6e03dd3482aa099dce6fb004ea4494496afc75a42046d75fbd61b494a5bd3f2d08e0d1eb -$BLAKE2$7a0942b7bf16c6e60140c6b0e40a1aa0d95c1508e2c726e67fff396dea92480d84f5775bf31c9dcf64930a97d87278266eb6e84c508c87692895f8be4c0a5dfe -$BLAKE2$b6f37fbda6006d98dfce5b38243101980df6a6a03fb72e6f926cc0ace2a39f4fafea60aa68b34027420163cddc7f2a6613b59af4d356974f384509daad46b8de -$BLAKE2$9a8e56eb827436b51afa1028b56091cff5a8acb3637d3ef23862ed3d1926a843d29d63ccc60ced2f33ecb809e51184b14d1fa6b199751ce4af939ee21c0d6d65 -$BLAKE2$09cbdebb14368c20c0877345df01551efbd31dbae5de498342484db50286746f9a82b70daf2489fb24f9bfce2ceb051abc86fc009800b4ce8505db5d04be55fc -$BLAKE2$7d5a10d7fa8088911344c954c2db35cf51ad7a1cd0f235f8bd6a1453b56f3976a1e434562524f261014aaf9d8ea01bff72673cfb284bc9f05da45c0568c3c874 -$BLAKE2$c75de0053d62e3bbd733424324da7ba4b9a387a630b0bfadd1ac70359fc1b34b7f60a0c899e4288ed9d924353b81e6f1691600b9704188b6c488fac57915dff8 -$BLAKE2$22abe62c991eca7f085a3ffb222d50aab0c3de9fb8507dc3bda9b68b5d62a61d43db1471dad4b7b32988dea6590c64c5ed0583b1f38cd469e99739b414f70a15 -$BLAKE2$c18afc137faa059e54e15ba169e983958b5fcd3b332adb08e3794145e6fc51e42acc5f4f5f4c706d790bcf1b641ee9db1797e3eda4b3ad8bfa7d61955382e1a8 -$BLAKE2$11e30423546e3fb0089c5f02f8926e1f9cb45f757134dc895ff299e3038c28b8ad3c91133857e902302be637193a87c6017fc73ba219cd41c8fef69b68670175 -$BLAKE2$9584007b0517cf13036e4372c5d7cf982c0ac166c945906fd81ecf86af722bb11799a11e46da291b2caaaa38b3b4c38aac6076812c2afbb3096892ccd12612b6 -$BLAKE2$db4eb5dce763a3e95097db5aca042f66780a12d2bf391d8d2c899f361fdd14fe4e83655f06dbff4bb8d2df8dd6233a78dee734f51c3b3530651fa5e0b6f8a489 -$BLAKE2$eecbc92bf3dd96923949de2970a30df0018d1d5257881d2dd5d7f863f065c94c4d65a105754f44ad8f620972c5a4c260bcc6ffb99369deb9a8b8e0c1303ac44e -$BLAKE2$cadd2650e0db1afaad87dcd64d13bca2b25bcbc2a7369f3e8f015c4ecb1dda4e05eda4cc7280ba58951e7d4bae7909bd5f5cd8b9cf68675b67e7fac301a70321 -$BLAKE2$ae77cabf0a5bd3c9013922f648b59b88e313248cfa49eb9fc1af59c4382fdb9144a0c69efcc4c1d6dd82d817036c4b4135a5c4484bf938e7234763dbbc39787e -$BLAKE2$b49dfd3c9eab0fb1c4e89b66e4a088158d71934245990a1af91d151c9aa8c94d9ff09280d568ffdeb08bfa4015278a2d0b1601a00738c06e10cc6e53c75179b5 -$BLAKE2$276aaf4b9da377ec1c30ec3d4a556628781de03fbcfdd21483d3c8ff68cfb245b24f3782a9650241ce056d9857f6b452c44fd00bed32b9f8bb3f7546fda7f9f7 -$BLAKE2$72a8a78430928114c9e20e3c5795347da0e5e3ee8f0060801eed0c5904cf5c3e716fd9829074b3a812a0c34e4272f718529cffc02c43007f6c3357aac52802bc -$BLAKE2$19777eac829e36d79acce82682626cf7138b82f2139b16b8fab97bb1d03ee5cc13a537dd3d7ecbe6d70083807bcc0a3e93dac96ee69aa09fdc5be01ee508d1e1 -$BLAKE2$46d2d749e4d6f087f9e0be07b411b8822eef407181abef8c2a4b508889147213977772e26f2754e9deb55876411aa3941b2e1c681ae3017cb2a2e26d763d54d7 -$BLAKE2$7cf9c415754d09b9ee6fa9f538eefdb3db8a1db3aa06999dfda3d6de623d9b3c63835e6b81f8c336252073c96cfddcc50ba4e68ce08e0fea32ddd443277cd0e7 -$BLAKE2$1727dd4711fb44c31bfa54a34520f35ce2127e54b1164f6a0c8ba06d6d859215bb2df44d8e031dd151bcee390e7ef05c3c10412a7b1e485fc308d85ef2f38f09 -$BLAKE2$a7f56c3861ef15be298ae6452a3a542f5b820aaa4b80fa00c752c94976cfdfd68c6f488146d3b14fa5f1a979e7211e0462bb628ca56a81569096a36477bdfc50 -$BLAKE2$466e37494cf6386604c4cabbbc7bc758595038b2b7ac238f066b6112b388065f684dc27806453c4c6533d723654c9b9af4b3692d83e78414a8f5ef31a39d701d -$BLAKE2$3a9d5a6ae1594efcbeeda808e763b284b65a062ff6f449f5406fd7039357e9c04041408c555e0819f7cb0e03a7c0a2638f3acf3bd2bb1dc9a0a9261f7f4240cb -$BLAKE2$76d69daa24a18df81bc22e082508688159759cc29695910f019a59faf7deb47a0eb6265fb43d1b71c5cea0432d350ddba9d3f20dd0ec3dc04b30f464ee8b0af1 -$BLAKE2$6a9832956b27c221f6474640033eef41b17e72ebece015943d0899eceae382f5d645bc5a4b1ce7f86b4e13344d0bc5b77164a59ad2862f72ec31e59e7b1d193b -$BLAKE2$8ad06b13f9fbbac6ce9ad8c3c8a6735678239aa394218b6d24843540a0eca4b1880a3cdd04dbff81c81d384cae0e0ab76b5f52a3ac7886a976bc42f76d9ec3b9 -$BLAKE2$25e19b79fd2db40dabc8aa56897bbdb7ea4d84cc65c580d84fdb5955b3fe45fe9e1cc390af2313082b44b19c419699b3fef543cc1e11468a06aa50f9522e9824 -$BLAKE2$53cfaf986a0ecfabfcfb89acc2d3e94b84d1797a9fca485c2ab0b093c47b3ca4b04ea2bdf1a64145300fad6d3c961d84b038bfb75c77af8d57345fef1663c14e -$BLAKE2$e6a59472eeee096b99a7a058c7d101d46acfb70509c5d23dd8c0044e05c62108a1730c5798d5777384ff78d30e42ed5b11b2983b19e27e796a8c0d8497e60305 -$BLAKE2$f291ab0fc85c1dc629d2a929835897a5adeecae1de29430685b043d2017dd715f4f03966db3adf2df9f1c284bf6c4e2f1be0d46b4741e2fac823461c48516ced -$BLAKE2$27d734c3d527a43007a2d3f409fe25cc92f57bf758dd71931ccb4d1ae68608eab292822186b260f2e9a6299561d113246d13bbf0f02b0523261f3e5b78abd802 -$BLAKE2$dfe10e04603036529a2baa9bd5e724e8efbba32ddf30d1209cc493506ec06fa206171e5836e4bcd90a4e0ca66035f4f3be414dc310b47857db8bee87c5ce9c5a -$BLAKE2$8bb9bfd355659d6027f8c8336e4e2fedbab83a1ccca080f79b2f8cfe2264071b623de38cf299e6a4ece0533298a746f2554e32dd2f595003eea8e3c71e3d4439 -$BLAKE2$60eecdbd1ba09c7b58dab3bdf1fd697e949a7931d5388de21a1740738ca90242c2f9b755926d1ad204b601ca4d6ff6dd850352f10d2c2be719cb72b65f1f771b -$BLAKE2$be04b6cc7a10f5758e963a4c21e824d64db3ef5421f13b6abf8a9fbe35828f503875fed4848409581e7c415e59f6b6b6dc213a9eb7957a6d72bf835b8006d9ad -$BLAKE2$d1dd62d0278617c658f5d30ea29f6accc3f440e00062262d53f2c3010e3a98758dc19d31635105d041e16a0ec66d0238f149214061fad97fa252b2028ddda530 -$BLAKE2$45f039766114677b936bfabe3ef7c6599d5466f174b8a088f3a4a46d7b174b1c7d937f324e0e1de96d34854837483864d6567d51847aecfaefbe5563cdb7921b -$BLAKE2$3a512b6ff306495732bb839d093d54d14c695a77399c9e01ed0aae00c7378a2eaac0bbda483cac0f7ff1cd03fe9186f45fbf3ff304889802335809c7f69303de -$BLAKE2$e49a33f13cb7f1eb03888de8c611c7802d25b338b1c1f94eef6eaa96918e256a53b14d573dc4c2068a76578c6eec43927378dde9262a3d10e3dc06287e659b40 -$BLAKE2$12e59ddb60cedead932540d0af3cbceb6c06d1a44a0725b76b587c1a882122a5f49efa171be52b7aaa0e2ca53154eeb3f1cde81c228f6309b00e24f15a9306d7 -$BLAKE2$cb2234115a19eb0f5637adf6f1fd19aceace969ec60a70bb834b304c7b0cc0d31528dbeab7381d41359f96f97743d20d51e279c22f7b07774fa31f0cdb21cf02 -$BLAKE2$e7a220a82d9fe83fb6889917c8009ca8de6ad6a32a9c875178578469b335c60b7bccd0b9c7d3a724d18a31bc11d0aefdb4ee0cf2656894b04cf1a7475cd2b7da -$BLAKE2$a1fe9f3a23adf810e348c43db6101df5990bbd648c31a11432ee8e5cec3ff2cf821e09b1ca17f06761d103e86d85ea092eacd1be1814964a61fbe6c30d33d485 -$BLAKE2$892cf9dc8c32ee8c2848d49cd2d206545a39ccdb197e92d5f412d99ca3d4c053badec2aefa683fe60f2e925b2bab94a852dc433840e70e38250faa919899e929 -$BLAKE2$030bdaeb053e6a0e88f4df5367f474b073ba0b0046addf1164428f5c7ea8e31fa76c43cc470af90be2d6640b2ed00464ca30a230713bab5ed360745377e19d0f -$BLAKE2$5806a642cbcf999c967b7327a749561f433ca1e2a20792db4c867eef2ee0d8b93cfc9aa023eeb812c72f2186521a2d1c9418bda55f2f9d352f229cb58c012a0b -$BLAKE2$224785362911970fe1cc3b1ad1e96497e74893df0270bcd7dde4c9d6cbdf3231d5a8fd3f44e1e1cc6715007f1f8ecbb8061d00344b26cef89cc62395b9bf429e -$BLAKE2$9341ccef732176fee99ec2f419ed813b93b70f4104c3795af281033fd67ec79e830c42c9ac4d908d96211c62bb4e0736b4d4100ceebda155e91c3f6d9bcbaa5e -$BLAKE2$c56bb153f2a6d0d967e6a5eaea1f202d98f6b879dbb4b6ec34d315a0ab5f01715ad73af63a3fec0e2ae89d0f72f25360cd488fab00eeba0bf994a37263d8323e -$BLAKE2$625a64601ac399f474c378c8186fca67166f21d72fba1ceb510d765fda0938ba74d90f1b51a4eebeb151e3d8fb63630db1cec7d10c25f9a52ba227974a7d38ad -$BLAKE2$ca1b0ab5e3e47cfd44ede718b1eb76bf4280165dd7f3af725dcb24780309a0186b55228976c35755f1b6282d64a4834a2f7abec7c7f7d14529ffe15ffb28c1ad -$BLAKE2$22dc580853fcf30528cd2b7594d5c6a18f5ea8c5281a9f1f748b69cf5a359d921b044e5c9570a9d850253d1538dd2b2a9456bec52e6b1fd51e741594065fb15b -$BLAKE2$dd204db56510f343a0f182f4bfd2891c618c01b1c5389fd2f1dac5f8d773890485e1e8149e8ddc21dd7cc39a4a72a0f6a4a380ee8b231a60767b7b976c6746fb -$BLAKE2$9e7992651081cbb7896b498bb0df91cf059664509142c3142e0daf07cd6ecbe4e0c343a0ba299b72872fc24197d5728c6fc90fc777e8905cbbe803152ee777cb -$BLAKE2$2062e63bcaee88543dc429b06bd1962dd0b7faabba2c29fe73dc6c9bcc26c809c7ff74aeb9e73d460fbf2897b76fae430daf3e52fdb568dbcd2af6cf9c0b2ef9 -$BLAKE2$97f11df09887b41f6dcc5e78bf40699798411a70f9749c22fb06203803ed43da5c72c30124c6caf6304c57dde14b1ed270e87d827768f7b33b20bd9e96880268 -$BLAKE2$202c9a7df89ecdad8bdabb0ae72148c31fe1fb72a7d79808bb961437d2e8072c67e8b907682c49b77bf8431e9027ef49f83828b601261d2a606c8d0e5a0ffd30 -$BLAKE2$d10e53f851150d335e1400bbe6fc03ac0393160055033b079a57b4cbd194d7f19a662228a9dc99e2d89601c144fdaa284a899b98474a32d421ae9b441d1d73a8 -$BLAKE2$19b7843aef4fb12853b2817f8563b6be85813005d5f13556df6effa6993c83ff686d6ff0549179bcdd80a116e2504ae88dc79b778a52225544b504e4ac7a1729 -$BLAKE2$5153410286f920304461aab35e73281ab9dc000709f16e3e1fd37aafd26fe08982313b2da12452d8dd17cc13f7c6aeb10d15d9bfef9e4cf4bb8f43e630803b1e -$BLAKE2$71c7006539b0d34c5f164c41f51ce7a46df35b8c2601071a433bc77e38c473b720f8a44e3b8c98dda2aa99e12fd270e8281ebddf7030378287ffe1c08410c262 -$BLAKE2$ba4bd25da47a37ff2d10d91fd60da8093bfaaacfc9d60acc118170fc4036f0f523850647554b8348276a3ad8dab015f0c3f7a5f868e09aa7b3af2c332b59debf -$BLAKE2$3a3858d3c276752b061ed3aefb59aea2a9d51b869eee0e30d3aa4dc404b0a550cc375769921d2c7c3ead33b3e228aeea8133e13364bd2f2054814abbf4108bb2 -$BLAKE2$ff584311083364e2e56498ac86fb9787b28e64db2bbab6684b4988a950b83d9e7ce91996465b123158ea7e2742bb5e66964f78999d5c40e7dbf3d02fb2b5a4a3 -$BLAKE2$2d98287cbb2f1ce9160fb8e278eb2bc9d7bdb04a8912b1ed209a7fea80ac65cba2bc97f0299af397479e1bb426fcd4307b2b852569d8ade1d727b56450d1c5e4 -$BLAKE2$e1abd601b49ce31f8574da2ff59367df66e5ecea97c04acdd041d7950b9b6c5ee38be8a45f4301a83ce25a5373c6b409c52b713302a540d197ea74fb9112fb8e -$BLAKE2$7daeec53dd0af28f658553bef0b9bacfa7195dbcbf90f03cc6d91a34493ac6a036eaf39fd44f3747589e7a0faade9b9e61ec56f60811d6cd1f087507b3da258b -$BLAKE2$ef918aa42fae251f920bbd37fecce9380d528a079dfbc0afc23dc3df48c2077bc24c5f2fde8594e290054c94becbb80e80849b4d40ff947a84d933dcc9124a80 -$BLAKE2$1d3cfdaa4bcb278e35d3d56fd85147885e1a86f71bc6bc82be4e1b7618e3e56f16cfc1f52f43b163f807ac0aecb498a162a11f614c3971c2c333e137d6f1d3fe -$BLAKE2$6f0659f9f80e1edd2ac83a29de519d7de4b94551211f7ccb8d6ad16b7af4e1d460e2e5a6459e4bbe864c2bb7b2dff042dbe084007de46de7b70ef10035231b41 -$BLAKE2$574b045842d1720bcba9dbc9496e40c08f851c7600e978f8208db8b2fb0e7c08f5dac2e6c9c91dd6b3ac93ba7eceb3eb5bafa2af2131b863ccf0e49e92d914f6 -$BLAKE2$5049def57b309032bccdc02ac6baa5053672477e80b8676eac9ab6afa03a81a2cd636f5c08d57c7513d9b6803ea08aebfecf6ad7200a532a5fb258755cb335c6 -$BLAKE2$6a97c64f5e8b4030058901e7f83d4fcd8c4313ca45b15423d897e2f3eb6f61d015ba8baef05e49d026cdb0033a83bc2b4f94320de70d6c7c1a11d155506fc733 -$BLAKE2$a199f90da770865c4cd792a3a833fbb5ffbeeb8b0e0cf27ad128a241a5c34efa2244de73f39df1e3578b43d18a7145a074cac5298997856d93205740b8e706e4 -$BLAKE2$e1cc3bf69a0aafb2c9575175f3fc3b0b00c9fb9879bcf1a0f3915434bdf113853a7a5087eb67b9ea65c749988bc67cc38e9cb152295b0aa997cfa6bbd05129fa -$BLAKE2$90dde2ac48156d09afd91d168dafcfdb3c77ed2bdb042cc8d08f46d72ac6ee8ce4360cc8cbbcdd578d84c1a54be37357b44c2d65a9acc7d1e251c4f153824b8f -$BLAKE2$4753bd090734731e869386d12f1f7c3bc588959506de7b211b315af4068f24e74b6eacad9da03dd0f22f22fbe8cbecbbe5f49f59899dc43a9f161462971013b1 -$BLAKE2$bfebf89aa4a232a5da1dc5d5f55064bf794f1173dea85fdcf48913b4924058b4f7a593d4bde48b1f29046dcbb07632e22367b461b6e999715ecb378df96c3abd -$BLAKE2$17978a5759f3f1a79ab17ff001a14120b1ebb8ad60fe87aa6a4d5762ff4a9f7089793a644b7aaee6109ba8744845a67de8f36cc90dff53ab200e90bd9f524532 -$BLAKE2$d121bd4015a4949121a4783f259a4b74a985e34bfb460390fecfa0cddf3b35df27282a13dd9b1c48731bcda8726c3c5021309b183ac6d9393bf4a65cc93f578e -$BLAKE2$547b935513f8cf3680e47ffb6919d41b6b5f9b3dc7ed44012f05dad753594d60d49457269e6d304bff603e20563ec2301b2e305aa3bebaa0c8ac964d035bad9d -$BLAKE2$cecefa09a3efdffc6f1ec548b66f1b7a0ecdb4e84f138fa7accfb7404b31cdbe40ea1ea9f5718995b767d888d381252e560ec6f6458308bc36ef7cef5de7520d -$BLAKE2$db5c8973d0d70dd25007cf3227ae49b23fefdd1b97ca8a0757747088e63d21b2b2545c8d8b17fd4adba0cd04c35817f0473f6dbc6034afdac46bce421973be2d -$BLAKE2$0cfccc2c11b9d9fea2a9ab4f6f6ddf51917db853705c21ab1a244b8ce4b5bbdcaf783f86b6a3deefa5da0f2ad789851386163e7541044d17518e05362e5d9edf -$BLAKE2$15956540d923b21de9873bce4fbb697b936d37f3000b062ec6c8751d90eac19ebe21115b0d56559eafc79f0eb9e6fcc1b8a4574381e2a12f5f58cbcf87bd0f96 -$BLAKE2$0bcb135026ee9a9030a05459a3222451c0a91c5986cdf5e61bbbcfea9ec43f9a5481c03efb0546a5b1174e66f99ab0a9a8a6522511b515ef5d1a6be7a7e036ad -$BLAKE2$6289596fa2990cd88402caa857d77b649d44998594ff2797feb7be29916b7ba426c8ae91b163ea58b6e19aa17306a88f2f9ca1825de4a84c1e97cbcc09d99aad -$BLAKE2$529f10244799dd60836588d077d68707eca53f469773437770d3db90bddd19f87d36c4564bea4b33ad275435a9a586645be0b8b1b5c7098629a5256ec166fa09 -$BLAKE2$fa94000bd14f609f23c2bf3fe5eae1fa0b7c40f1df94c0076fc6a9d994eb79fea9eb061de85ad34726d8fe811ba131a70748ad4ac51b60290e1fdc4287beb92b -$BLAKE2$eb811447f61f3c815c6eded4e43d4ac99f22539bb43d6f001120898f01ec268ac977fae1d0bcfc4648f0a25538a196722e1d28baa62487051fea3f668ecdef4a -$BLAKE2$daf77ada5e1c68b950cda65a96690330d575bfc547775f89eb7ef2a1a56fbb19238525572ad71dad26d944b2aa62c666073ddeabaf36ec37fe3faa76fb28044f -$BLAKE2$8c369c8507beac55b9e87d983702abe4ad95c831939efc7ac161c8387b7592378dfdebb68dd4cf6b5bfe66e614df72aa38614b827312dd0e6ddf9c730f799a0b -$BLAKE2$dc4a72ea598b3619c02bfd5f02fd548a672020edf7e93194cc961200e08783ced4be17e5df934f5899e2bcfba5f610a3a98142c226f95093d8dc62e36bc34892 -$BLAKE2$6d3002887ad7e3972887967a67e77317492a8a9fe2c3f13ca5626749d6f6b6c717c8798fff3dac485a59f93255096d6ee857e324a7c4432e99f6900941e0a5ca -$BLAKE2$1245775ca98e79f1da5ead6a7e16f539531ef27e2cf3fcddacb7fa3aa911f75046928c6359c73b896cd4ee03caea3b17a0c2ab3f779c7e11dbbde6245fc79afb -$BLAKE2$8176e41c7883d2ede161218f61a484e5a33fc18f19b70525186ca035a75ec89a01709c00203892b8d89ad8f19a621ffb049c9b8cf9d951436bb723bf8f457ecf -$BLAKE2$97ff0176d337d8d1b1983ce5cb8b4fc0fec647b62a3cd72a26bec5f43031699be4bbf5e61fd80f1c45366f5086dc7537a986b0d463663e4bfe7d270dde145941 -$BLAKE2$d25e9d1b93f3a8e614136515f70e1b4976695775dfdf16ab810c92ed61d5b11ad2ff59dce5c43eb8f31ec9ae777e44127641f7377228ac2bce9b4f720eba957e -$BLAKE2$bfebf7f2080d69832343aacf35fdbee4a02aae76f0a2385edce88848ccb22c83a82b7f52cb5fd5f1358e2dc21115644c2c5fded31b9b8362ac4695b897378bc9 -$BLAKE2$5307c1d6ad5af25a904956033977a6f31290a14e648ef3e54cc52a6f80d6b47d0936066293f0e0d1bda85f1abe7cc5cc475b96badd3180214e457532a4072f31 -$BLAKE2$eaeafa964c5baf08f89a2cf11e0875114831dbe178ed3ea542c7ec051034f8fd590a7f33c8ec8a7f6cd7eab437646c3f8976e22ef6cc9f5db24a2da82a337aa2 -$BLAKE2$edbdc2c9a488da8c406215c157f423e9d38efa806240ea27a0d529ed21ded2dac7f15f238aa52c56ed1049906ac90cda9e2b26be93ad3b34f1394f35a1426253 -$BLAKE2$14cfc5c7f518d0a45ff68ee0054a160f8eb087cd422d7a18b8db202028b2cc9b0e3e58869a726289143bfb9bfb9c9f604726fb4723cdca86c5d3328d36bc0eb2 -$BLAKE2$6c48877d87eca8c58568ee08d85b0bb9200f32351acb698fc549ceccdf6a7ab6a0d76a324adbc881fb21a322118ee8d8a9bc2cddd57b1817d214f5a9eb93d4fc -$BLAKE2$172b1c94a4fc84cf5eaf760a09bdd24ac2bca4b637b319e1ba31f44e9ad49f0f2e19892c2ddc392bf148a0626874c321d0f3a43a274da8daf203cc7bec66498f -$BLAKE2$ee1bae5c4860833c5d8472b4b8096b615c46cba42d5dd2167c0eafaea2d1906c76508b447f1dd8352822062e075c5b03fec07b57b8a33526c66238424bebff9a -$BLAKE2$38751cf75ee0fe260af5b44b08693dcc4ee46cdca8db26a20c1c3bc40ba6c466e33969d9024b5471b4486d52be7ffe6ce86ebe265afb960b43f4d4f29ea7bc97 -$BLAKE2$ab86d4d768a3ea3ed87079ee56fa4c87a10f6017b9499e0f09d76b8fe3e7b888a4c12751305aa13f2b63f076fc774f3658ec850066a1347b4ccbb234dff51444 -$BLAKE2$0cb190c66b572096f92bed3021e7c6ba2624c8d69b406fa4ffc647123ef197c1197f5b724eb2757a50ea437e256df0548aa796c0afb5e636c183e7ab08bea48b -$BLAKE2$d314d18618826ea1f6e03f850dbff9740f0fd580b2beeb336ed218c36934c44f713920f8562cfaafc43994c2ea20f7546c798042b22d0167ed3c28f779b96be7 -$BLAKE2$913a50c4b88335476b74c25743f0b1e013b9484ef4b5ff7de814786aeeec3ffb90b6143ded6f9c621f4823bfd335b13aa5d8877c687550b7c16217bc12778f33 -$BLAKE2$d613015a0526bf0143970a8a35fb1e2fa0b6607471bdfa0f1c9bc5681797dd9fafc5e4e67909df2acbedc73344d4dbf42e6b827805b6accbb9d891c889c08c01 -$BLAKE2$5e8359de5cb720082a02bdc19d3b76d7f3c06fd4ebf8873e22b0bf503d9fd993c009b01b7d61e93bba79291de9ca437aa598d665a88a7bc6d96f7e1b5bbbb5ec -$BLAKE2$8d3eea8224b4c160d049a7cc06491c1933620fccc99e72f252b4004253a276c12bee78c1c45804a34211f8300911205f9c04381b73f1b37126167c4cb1495bd2 -$BLAKE2$b67a60a8d7b2da4bf025b78524abbc40c33f298b68481164ab2bc9dfe20273e2bf7cd73c6f42e4e9582cb61dc8d1586836898ae8382dc8c9e2597a7b56575379 -$BLAKE2$fbf120be3fa5b44d731993fbcfa05b850796334d070b65f5221aae0db7cd0eb0fba62ec3289590da65dc7ae9c8d6cb0bb3eccfaa992ac5d93387ce0a9894aee5 -$BLAKE2$2c49d4fdc47a1de33fe7b943ba4dbccd61e3d26431b47459912567772023ac6914b41cafc8a83ccfc473f97ff6554e64dc5285b61107177f5fb018bfc34192e3 -$BLAKE2$0266e7cd7024b8c153269d171a4b2d5805c7e02608191983d3fd3a249418c30345ddd4ddc24837b35e82cdd0fd77eb0a1e5a89583b88bb5f10f0f6c0b14719c3 -$BLAKE2$a33d872e99fb13a2d62de5a2b244809686e589d7793cede6e4ffe16a947b24befb3735e619c362914aabfed243e532107533fcbd90e7df110415f8a47970a5bf -$BLAKE2$2e06e0d638c1bb18a6911b1131690fc75af3bd827f75ecd23bfdf9577ee979d52e02ff02f19be2892f9ad5076f40849e5c4ee66bcd6d2f2c5fad50d8021b0659 -$BLAKE2$e004149c808f89616b5f87b0508cbd8bb901bc3553813126d64d307d5056782d6ebc755aad96c8ca1b4f630c765aa0617ae791a43c1c47a1bc3e2b817aeabc3d -$BLAKE2$441298d6bbb9f9c4a16c3a3ae186de38a22bd0a001dfba194f7c746add25a75b67ffe4ecc3610df6cf9120a3433fd8ff68cf539a9fd6e02805686c1179d32fc8 -$BLAKE2$2a967cb234958b87df06955bee72c80b17abf88317648fd2adc6560473bdc9f8523d4d0fa767cc78cc76415e8cde5bd76d7806fb0b331e5e6810198bcd02a83f -$BLAKE2$2bc255530ce7f9ecfd99b6881e92972d352d49874204a4fe51fbf402744e628741943bad3aacfc80e99f82634c6be3d7f4f588d1fd4fbbea1b9d9ffc7dc647f5 -$BLAKE2$58e0b32f03fdc861e354b8755b77aba52b2f9b5153f7b523afac6606980cfe7e330f5cdfe1c816587fc50d8ce0586b7bcfd1dfaafa31a725e85f5915691d08db -$BLAKE2$a52166efa50f37e735d1aae3ea5a8493f6a3e9557318ec1235b06b4854d74c0b86bc4a6e654f2efe6335684ad5b0b0a5a43f976d0d2ab12ee8488763e0a660bd -$BLAKE2$65ec99984c33a671e8515e52ed344fb6608a7524c8fa82002bdd0566361980948e365163cf69b9ca6e312fa8f43b93ab3e6de185e2014094b86cb0f8faad4f6a -$BLAKE2$5cdf5b06f9a576ecd3727088506c9c3a2d184286b48b50d751c7e56afed178e2ca9b3da184419b10997a8a0a41a38111e4c6db27f2513903a7e895c389eae0ab -$BLAKE2$84a3e61ce9a1e25fe581ed5cfaf38289d1256859406eab6842d781632c457caf35c1890c0edf42d4ea36a70f82f56f2e29db2b524cf8dca8636fbd3c2da160a3 -$BLAKE2$3d09ca0191a282e7a8b3ff1e59fd28f9720560e4a51eef8ae420362b6d4b2ee6d226231ae036aed3ab156b885a4110fa4af46855ebb0ade147bc7f67867b7394 -$BLAKE2$c31297fc1f9642c1cb7613334433020a364b0ed69fcb38d0a99515bf5485e39ba1536bfde15d0c0ee43f472e06fac8b2404c7a994bcb986df4468d2b65b8be85 -$BLAKE2$78c9fa4c233052d7b83f31ad4f27f977b181044779730a05e87606c29af739c46fe14f2611c6ffe83db7b48465b9acc3f6d34b44d78c382de13589c93fafd741 -$BLAKE2$1a7ab9ec3179abd457b44f4846e69fda3dfe925e7308d66f32e0ff0f0ea26c1623ec160849183e09af4c90114ff87a004b12c1d3597f44a3f154e73a53348e80 -$BLAKE2$b1c93f67f335b83c63888d3abdbafd9556c5b4fec81f018091bda200fc1b5596e11348801643e8d60a76f8ed9f752cfa0ab68ff8c145fd64bbb10622891731ca -$BLAKE2$274be19a64e615b129075e4f2a24639cf48493ddf0cde30fc10fa94da389eb8779c6b97ac0bdc80212092013ff8fa4c09f6db885c72925e46a9735980ee325f3 -$BLAKE2$ec8e4b21eef1eb92b89fa59b0eb8b58b284a2211dc8fbc58a32fb1b45b352442c87345b099efd15e0c604c4a23dffe7224775d3bc49702d96fc2b5bdf0af0340 -$BLAKE2$f26b2c442346f70dddacd2cab76b300913304e93c1899494e53161a1078d6ac9be880f073a293a126e182451298e53b034b2a71f5cf2df1b12210b2bccedecbd -$BLAKE2$e513ef6eccd637d0d270a62256da94e959bf9d1fce056252763b177932d1e4920e5f58dba5a372e2c901142a563c47a6084523129a4637b2c616da98fdf7e4bd -$BLAKE2$f6f82a44839a7442ace1c2430e97f2934271015dfdad8ceca790e9403f1494c49e705ebb19d191b760896f58c342e58ddd2243e8beaa18bbd009e1720548172b -$BLAKE2$9d6f8f2d6e28fc26844cf3517e22b336c2d98956e04cd8a194a8bf933589dd880f80cc34c3e23eb1d1ddd1b2909bea04e15fa3671667a32527d5bba884c263e7 -$BLAKE2$3061bb380c7b4b2aa128756ba7eb053d049ebf42c229fa16e09349139e418b28ece5d7d70e392fa2a166358e3c4f3c95af2e3ab778826d64b65a6dd26896ed7c -$BLAKE2$813d252e68460b73106e263c3c7acf38c20ab03bd4a3f430c5f39a5c8f5102d00519943111f69b3cad490bc60298dded25dbfa22e1ac7e8a145430aa7e206111 -$BLAKE2$4000f7a304c50a5c8124840bff0fcbee640b853a7e4f4e2c28e165d71898775689b38d46d11c038ec72ebd15dd2f099fbe6e4954ec48dc55af7bf8d84f085b5a -$BLAKE2$095c0f87bd114cf32d22128f60bfe9e805e266151cd8d5a90b96b308402d991001c930f9711a037f9c9dae2c5405685f8fafc46f9180f0f26d723d46dd372418 -$BLAKE2$cabbbe87971b6aa09a0254aeddd9bdc00a3182db7b2b5def1f27f681db4baa50dc79ef8596c71bd12e237521d29dbfd87d644868c3edce4d923a035e6d409022 -$BLAKE2$ac1a05f7d0f726ccc4551577de1af4423da6729aa7b7085810122d63a5ce0dc63019bcc5eda7905d3a428ff0c88f9426040a15e1a5d8200cf83c92ace161dd13 -$BLAKE2$a47e24caa8f6cea048b6d292081a96289116bb7643c255ea6cd3b836afa91405fe5e3979aba578f551d6f62bd0dc11db9a366b6b7048ff76fc0836cba4737668 -$BLAKE2$e384544bf57238dc8c0b6d40da682cf0a57e16e38d2ad9d3609a742115036894c71ed14460348abb0e1e392ae3769a02738e0bd9c11b4e15addbded9730ca73f -$BLAKE2$a8b211e1cca5ccd00375382cd39ae4affbdb5f0d545d3481ee2c15eb8a57cd1a7f1827f41f2509356edc4002fcca0a58f69876a3e6d326d5307ab4a42fc86f84 -$BLAKE2$bd72c86087f1ae9b8c5ad9cdb8e0855a94310dbabbd0a3b9651def42f2100b0433a40ea5eee588345dee019ca41ea77c542d91139e4324369cf780d12c0ff219 -$BLAKE2$b29645f46b8930db065da8d961b67739342c289bb5a564c478ea26a4f983c6e28a823bf976bdd5abe8a98ac2a57a3389d74c232cb3958861bc7064fa4d9c3207 -$BLAKE2$9411c6ef701d83b6f2a95e5c7cbf77ec744d6dccbf98c42423b9df1574b9cbfac36ec55f4385a2969a114140543b1495e46e2a5546baff5eba0500cfe11249cb -$BLAKE2$92b71f7b0917ea971206ffec9b1c223c4cd39f9fb1ae66ba1b93ad667f30e77a6f91c31f3bb4262fe8e7781dd852bb040615be1e61e82eb4c6b868aa82919cfb -$BLAKE2$e1d4857475ee74205f25a922b437caedc673fe3a1eeda09b36135fe0ad85f46391b045cc3a01302a2bac726c0781bce0e18fe8ba69ab888b48175be7860a90a3 -$BLAKE2$e48b6c988672a821e0aba37840072ec88b99c64d75b33657fbc4932e0de62bc1a1bd564061a99dfe36d9f916e2a77f783b577178648bdaf52ab6382d689d37d0 -$BLAKE2$b4eec1e8630e8bc1ddd87afce074e648ed00fcdf109b24e2b58392916616cd6c8bda8a90feeb84053d642a1f8096aac377069f715146a47adb8d3d2bbde5aacc -$BLAKE2$00c04282dc7c935820f42f1db13e69e7d6f3feb0601fedde868c8972722b43dc7b3bc060aa2af36fc6692dd79aff68bf76818ff2e52fa2ac073719418b603c5f -$BLAKE2$ab6443324ebbfda3424ba6f0038a60e9cae3ab00810d558cb837b3202d6c7532bc634bc5d8de6705320ae11c38db8671ebf520d8aaa2a021f54b53dc0186849b -$BLAKE2$254128cdc6e2e6c71ed24fcb26ca6ad4cce3eb7de6f214bad22f6a6fa7c3d91f8723813d6a543d5f52015a5e65229befa8e9783d24c076f9107649b66416097b -$BLAKE2$9ac1fe335755734ac688e9bafd14de14115c758d00fdc57833bcbd8463a19377defbfdcfa77a28c8c5a3ec00f4641fcc29f3b4f8d808cd76c094c167c2406f32 -$BLAKE2$728d2b5c4da03c8ebbd0d45e0e54392fa2bbf4dea0b0d5582db7ee7abb1a399e54f9d1f24917526de572df7dd2412f937ccc3ba334e160e4088da18d9748b3da -$BLAKE2$36b807d56cea731cd7d1a9b42da1083e8bb6b2c99cc50e1b3816689a8940704c0f847dedd41042a1e3d9d600d067f370825b5eaa9ba22691b96c5a13cf30f5fa -$BLAKE2$8eb614b5c2f8c7d250339b3298bd60a5a738b4116098136833379098435c9944bec5ff8d5f8bd7bfe949622303d066ed5e6140ace7895926dd7678c7bdfa6a67 -$BLAKE2$fab6df628b0a6b09600b56fe866841c2dcb8a76fe670eb4f6f4bd75821da669e15bd207a141227b7d978c59bad8f9b6dfd13e38e49c53ef32432f41fb18389de -$BLAKE2$8f0fcbca863918aceea2aa14d217ead65ef4e976f7965a3d3ec6942f2bf144b430143f4a15ba9478e2746230151f9c40a1d42a97ac98083083423fb0af8f3c36 -$BLAKE2$8fa04bb0b00e5ac3746c57acc4aab3b75fd77f09df6e8fc815e5f7983fe2dde00139ec7fef1310e784be8639c003446d367844cddd718bf04cc4ce77349e1cdc -$BLAKE2$dd408948d376e681d808c5dbafecef031d0438c7ce2cbd8baf225ceb109cfe1597f1a7673a878099509012808d8214a35ccf625e8a56878bd0d8213a5569bb83 -$BLAKE2$e15903386e3b2ee1f440bb67127b04737bbcd603c7e48ab114ce5bc080902906de3bfe21081e91a6eb7bebab829dc3c3c35330a5dce5fcd35ec51e903c9c4935 -$BLAKE2$cd7503e595f9421c4e6033f27a4aa392c3f3c2a0666fe0fdb0fac51b4a2024680a44203739c9e34a0913030aed48758ef42b059f2371e36bf47a55de3e3f47ea -$BLAKE2$9784745714723cd7f2be48af4025fa54bd890177790bc614a6db96a4a3b641e53129dcb3db6dd2941ada25a25ab2827ed73fa4f0d9f64f0a5ca7d5076f28216b -$BLAKE2$df2274ab2d217236d841b1ac4395b4d00e4a7877d9098e325b089464bd4dbdb79b779c9458dc955b1b41f35532e10f59ec190b26619e80770d839c6e07caa2ce -$BLAKE2$d0c939c512dfb389ebcf3643e870288ab533220ec7f005ceff79505fccf3786e400140e23985abcc6f00be4641f59c3cc9826c110cbfb5db8f438a88528b0e65 -$BLAKE2$f5beb53ba581ad5969302928857a0f82e53623d77aec0a12a78f6da01b79083bc994285f068ce0f1a90ec133d209014d8e9846f5debc3d641c287c1b74423fdf -$BLAKE2$043ba531b850a37037a0dc758bd73f149d2de0615e6f0fd76cfed62e85a718cdf1e50e63be6bf00df2be4c514cfe1915c60a07b3bfb9230097264b1aa819ab03 -$BLAKE2$85f7dfe3a339e379c2651e29ebf6be2404469538887449f85c1301be2102a18b586ba517fcdc6691588e1ffa005dc7c80b586a5d6e1895a64fa3ee24fc884675 -$BLAKE2$115229af04ef9b5b79f5243dfe8b290e5ea5571d8d0e4b6e391cb2e5f3d36dacf6abc8582d667070d40e4ab56d73cb8e57e7183d6854baa5a50740342c4cb865 -$BLAKE2$310af7c5d611683855645d248d36a8fd725ab779810f6c4d711810c66acc5f8af18afdbbca8ccea8ff7049b9b2c664255c656ababd36916a78bb2f7fa3f569e1 -$BLAKE2$cd06254d828e4ef42aa1e1402b3dbdb0fa9b682f280523084e8e5592ad9fdfdc7a9511a4c6f5866ca1167aafe3ef445ec77db751a9b92d37436f5d53c8d4c882 -$BLAKE2$e682788b927e40caab4f775a0b91c39d11c01b13c1595c64f105d853cacc0a48f4f6a9e9b394040b87e044e48ebdefdc25fde89225e4d5192f0f09c0630c14a3 -$BLAKE2$3165017564a5d9b87af8613a403e2c7c7b1aeafa808142655d16b8537fbea6d43fb4b85af2ad2d3d4df02f52a726e0649eb88f4d99d65d9d6fad985fcab1aab3 -$BLAKE2$f2ac77da19f9db5690c93c1452857cd95575881afe4c57a9e170d4b57e94f90fa7133721c3ed9e4f0ee928af3312738a78ee57215c28f4c19ba05ce3a27d924a -$BLAKE2$b3f7223662d8ec46fee6d090817a1ee6bce3585eaaac90ee742d1d3b2f4a3b1b58349663b7f9a739a1b3f867ceffff500c8c3a0bd0022d536bc1fc219767b68c -$BLAKE2$8a0a908701a7af939dd81e8eb3b34688fcf4d74e420a7bc314a1d5a9054b5b47db35ad9437b0c9ac5b6a225be390e129226297e95dd7d1dfa4d460e83c046ab0 -$BLAKE2$924355746838b6cab5cbeb68d28d9cb5e3be5126c3e174de2d4ccf70d9d8c132436a09c8cde23ec3e9c62100b1ad03c6849dca44306ca102539e12b356c85d39 -$BLAKE2$cb71fbcc60051762f76a57919bc0933def990e9e920b79323f17f2425e73675cb930364b39a47ad712766093d47da5055175670b6e09c7d2a35db96e27f797b3 -$BLAKE2$bc26fc591ba160b9b57c074bcc7aa231043acb62f828ba4a732651bf14334068f6eaa92ef55c70c705825fafd949ab9809d964e25225a931616e06346a569bbe -$BLAKE2$32cf22f6f0e7745db087dd04610138738ac26119288aabe9cbca1573b70d0de0f4ce96e60396bf351579b39b3d2ecddcd9538e8471e0d232be6b09a2d809f39c -$BLAKE2$2551c52832b4a7bd618fc40a935651cccea3240a7654c5b5667e9a4864529ff994cf252039c208b353c9084fa11a99ee22d7dc191044d606cf63dcd5bd6d798a -$BLAKE2$1ac354d1cc93dc563a21060a59fa08fdd94691acb2724127a74660b5f37eed80cb6ec83bb09bfc46f85099c70cb26e2d4fb7b3c63ed1ac86dddb5d5b3087a2af -$BLAKE2$e7491bb3c390a56e22db3af175a66b5df136940eeeeea6cc7d6785a713bc50e95f3028ba0eaf5399d165079b975936284cac9263cc4202514f1c22110d8393ca -$BLAKE2$b739320c8de5b0dc3f10ab0d9f35286369ade07b4cc9467cb81d2e7aede120e0d19899112fd20ce07ef7ea695e53de29151962b61c8848a02f4651f3bd49efb7 -$BLAKE2$8616f30f2a552152dcc6aea8ebef797896b6f068d37aa5db4ebf9fa0c4f8e8414549e44956b7aff4b725a5f512d5a897da5dfe7a8de99c4af291d991c6771911 -$BLAKE2$8c23845b0912b45126ac59e0de9c71ac05b9fa63fb1b05f6a5d194d0352b91d9b34af2f5e8cbe553ee20a27405d3edf30de557d7131b2d9c214721ea83452b03 -$BLAKE2$2d025039f1569ff0291938ab317f885038063b1544cfdecce39935f6094137cdfba8e3bff615e5e45737a3cde9384ac722defd8dddce9310138b1b86a95e8e2e -$BLAKE2$342dc072288c006b02ace35cf861097f6f538c7cfcafc26694baac7b166ba50e0e73390e262f6928057134d8cf2c9f3625ec4cd63e90418d573f512f8a3c9a13 -$BLAKE2$8486978063ec884885eda4f2f2a60dc0e8030d82c7a21bb13f7f6e78c1f7143e742905f7db5d3b79dfe85b242ac9a82cc662f7a4c6f3a64e233201ac69393fc2 -$BLAKE2$bf1a8425a94ff4d99444adce530a70ad4a40e0cc8f9c9616fd96070a71eb8b180c21323765c176ba98cf8f1a830ab52a305a1e27c45c18a4e19e97dead7108fd -$BLAKE2$a425c40ead0bf1405ecadc8f5c2907f6c2912166dbca5602890d4f6c3a8fd126507cd52362fb45b13aa6285ca33a7487e8f201d69f7b7ccfb737debad45c253e -$BLAKE2$3a9443abaf284c000229f445c55e0b6d80911ae1082e1a9089b0b55b3693947e32498665de9f6602338d4da6f8f6fbdfb3c658fd7befec862bdc7b162830d988 -$BLAKE2$a8cdd064c7ad4c217232b2f1131b674ca4fe9663b4efbf5fcb3d6b1f70e6eb23a6295776f6b20950e4911d9e4947a9d6109668f93cf575608aa5c00e859cf62c -$BLAKE2$883255d457dd92da7e58c1930eca42d5ef9b75524c98c2519ce1aaf212f6b126a3dcfff0f0cc8f786e0fde9a017cb2f2b520fcb1796faac08e013191e538e7e8 -$BLAKE2$7fefb6db03d9a3e0a0a6156b6724354762b109b710d2ac4943447aebc359edb5e3d76b2b573dbc4a3cae30c1a6e7fd0b0d1c8c6ca230890d2f5b7175f1163602 -$BLAKE2$3da149c80ee1977da983674a71c44867d6ece9b9b0f4b462c2774e20880d3dcf0dbd792ea24d7091dcb2226b35e4be237b92e6b76d06fc7089cb6938d6697642 -$BLAKE2$a88237e96aef7ddd2e8f733005e3301f7f5456e95a80a28367c04b12f19dd0ee8a906a64aa910d97c0e5ea58c928f94b209d9f720bd9eb671582660394b8e7a9 -$BLAKE2$dce84fd1cb43566fe592720b8414af8c67f9bebf2940408baf7d9ba3071b4eddae30c7c49428603efa897d031be97931b257ffdc0c754e82ea2260c2cf4e644b -$BLAKE2$58563664ab23547f298ef854f67081c77f9662836870133d70e59f61f3224b24b7e3335ace9e0d7d4c53962728477594cafe0c8c55868806074cb785146d70ad -$BLAKE2$3aaa6e653c31f8512aec3535384cd86e103f03b29e3b91f773793c906413af2698ec1c4b472ca56b157eed7242897b106a9575681f7750baf084ba42afd129a4 -$BLAKE2$8902f5bf39eb7401b6f26ffbb0fbc3dd18b6319a9abb4e9223397735c4139e9648dcf11111b731620dbf6f291f2bb78984925d140f6da8ae9dac0cc6893c1a16 -$BLAKE2$be2a2f8d6d04b98d9f3c000241a7fad0fb3647a2a7ac413cdd6742935fc6e5029d5f75cf5d5389a731ba7f1ac9caf417289f13abe14fd256b79dc6f841ad33db -$BLAKE2$e589c0918b405101c4e509f64ba5640b594f898c6460ebe0cbafb8602ebf7a9d01dbf5b34c1c91a9353dfb5378764fb11833e418b03b993ae2809456a888bc07 -$BLAKE2$c3a3d43fcad821575cac2b358195ac1e7f4fd373343f5e49dcdb2dbef43d30489fec24ff9bf78656ac2c8ba3bb7da621269ff2a86b0fe98a6dc16e4d20fdb5e5 -$BLAKE2$1c09b0c9d6c09786e1e7c352e984febc812090b7d8e3a0f0b4a9f195550fb246ab2472f39ed9b7a9887ed489373d5d6ba97d1538c516b9ff2d4f0708ab246cb7 -$BLAKE2$e1407db035fff6b06a7938492fc0b2d9e96bc3c420125da2f26f03d85dd48be5d0d762d2f54a698f887036eb0fa6cd8eebdebc5de30056513473201f2bc20d6b -$BLAKE2$5b3ff8a714eca6ca2c9f354918abfd3e09c9218afa482be9b4e14a96abd4620da499d044350f766c462c3d53f26d2f0eb184fa4258c89105e09f0de49c8aff89 -$BLAKE2$493e15a872b3c6177eb4a1d781d1525cc44bd029695e2632a16cca7809873fd6f3e3ab101f1a66c9236bc54346374756ee46c79be778ed2b29df8d562ed41c06 -$BLAKE2$5ebc1ca068a6ca2eeaef9df28a22e53b1582331c1e4c887da2b4a6677be8edb1093834c3c2dfc8ef5fbfa53de69bc0dc2c71a52800009080b630714ffb6c77cc -$BLAKE2$4e6bd1be88874d61e95c89fed117170e3723aaa39eae0607e1edab1474a4befe2cab8c03287369a1cb036ba74150b2f705684beff67c31904d59e5651e413ff9 -$BLAKE2$c574c0c0a2a917dc470cc7907497d7bc389af0b3953cb9771720fe88973e5541c9461a581459f31b541940f97a497d70aa1ff7a7be83296f3ba89037eda6f37c -$BLAKE2$c9c8538a0c1eb41cbad8a68198be815c89cd52a908c363c23a5e6a05953b7c6417efb2051f20295b0cf465ccdc2c42cee9f321b5e23e65de7c7049ac8b552df1 -$BLAKE2$b69b0b1b53915f856f4380cdc851a684adbc17fdbb72c04f4160628e8d5efd3b023264593a7b1442174e559ac74e655f204e7f36c259bbb28dd0618f266974f4 -$BLAKE2$cb0007642d88c092f9046b50354c2f7e7a414637fb230f8ab826f7391fb32726c644b54da750dd2f6a7a2551ac0d982a77e3d6ef385df200cb0f5130c273b144 -$BLAKE2$3aa0a3fac0c41df997d8110ae74839adadb195046b1ac430e73d480f32ac721a78c11c7cc48b516e5dd17e99ae99b77cdded3ad2a6f53df29cd1f8dcd7796a36 -$BLAKE2$1ab8626178f453a3cc84001c4e92932cd30bee39d95b31050e252fcda68bf037b9e17adc6ae84ff24f961b946cbf81b8049dfa2da82e5ccfe50b8ee26aa38115 -$BLAKE2$19a6a43a49b3f40c2ab698f50b515dd90805bb79120bd9099f01d34b83528dc6071609ed958051f142fbd0c6116bdeb66e39682ca9a3827a5fc18db388fa47dd -$BLAKE2$e0361c764c4fe9867befb980dfd27746a0f649475146113a8635fa9b4c3cbe2f888d9304a68d12ca5e00ef43e314c418f64d7fd92fb31f09eedde1c86c27abfb -$BLAKE2$8fa545e2a5ce8ba666bf01291284685b9f993efd584355352872ba726c77357fdb18e0d734be164f1a4daec17d2da7ef6dd9e0ae5ea412dfd0818d27e7ee0232 -$BLAKE2$db59fe44ab46e92bd908d36aaf8b63139709af215c4ee8badc1a2616c45741617ca7b537dcfb9b533a1ea99f74d20ec72572051630d026060aa61779850b121a -$BLAKE2$74f980758800c519a79e6aaf12fbe7d79aee0108abb2d4ea79b997f1a383d7be6c96aafb704ff3db85192f551ce584d9572fc1a9dec4af5dc40d0b1b005b5c08 -$BLAKE2$7c214d5a9f8e7327e0453ab682e3d538e2679b000287efc03e8109b901ac14e4cd66c25d92e077a00011abb7915cc12ef8d2d5069cf082760946e0f3fe87bffe -$BLAKE2$3546ceecf39e33d11f84588eea6f9a6f6ac888cc78f0e224c83c172a6b6e2fbff8bed9d62b1485afaf607a07022410448028ceab7db108f95cd737904a2b926f -$BLAKE2$f5d9042eafa754ad235b2d13ecf1d32cef3882e3e050c5eff016e77c0ca66f0474fa1e25e55b6d833e37dc85c6801d33960886fa48d45fd9ad38824e5714ad2f -$BLAKE2$6e308191b71d8140626429355bd3c57f281e0fe6129f850e177837f75df4ae818c3dda284e6df186a1c9a53bcb705cc0e4fd88005bcabced11e56c48bfa70a72 -$BLAKE2$a200466ed33534fac112b56e2087d8804eb746cca888c92c93c5e0527de9597d8be04ed860b2e167b301a13ab197331a8edb9420e33cef4c06b8b1e68f27bbad -$BLAKE2$d226d0748b1960776714f78b71efb73f5c1f961c90c4a9ef47186a8097e2df924f68c99675dcca6f2c59967eb9afa3db52521f4c356924fc24520086b6625a89 -$BLAKE2$03b0118b338ceea7978af2e6188755a33d492e925b0b22fa17730f081d713bb705f4da9749c7e15e74e6ab08a814fcad6280dca113d5e999aa453df32f69c270 -$BLAKE2$a77694e76b9a4fc450690d54ce8c80e5f573edfd8ea8862ec700df4a8bf1ab273c161ca657111a7367f2eb3f945559c5fa04f38154495aedb8c6308490ea0af6 -$BLAKE2$e2b63b929214448f9b729b066991ea87e1e205a45b33818e830c2cf64ac1f642ba0122c35136f1ced876590a1982bc054375da059ebfdd93017186a052c4da3b -$BLAKE2$4f2c5d7f5373b4401a035e70b407d9df944829c77a52eb05093df70bcea81557aace170ecd4f2554a5100ee9b5d6babb7a80bb972b73fbb04b8cd5ebc3e22f66 -$BLAKE2$be4103a28d5a214ecfb317378d64c3d5d03a010115f874ab9790d27ea1db94bb481470a11e7674c394a2b7e9028084c473759fab70e832f4cd1745f30dddaf7a -$BLAKE2$6d82a0394cb3ca98ec1488ab50f4436099e1defb91f41015768bebe8a41864a67f5d0850dac9cb9992d3bd73bb2210bfe3dac70f147d72ca6b0a96cb05ada968 -$BLAKE2$e74ba0620e0364aeeba56d371bfe634a094676a9bd9c14c38a1f9cba0d6eb93e5d2bad905899b2b19ccc31d40ddcc1862749f58485f96877357ebc57e3bb975c -$BLAKE2$493f920a9e1b0ff9c4b42cea30e356c4f13aca53082dc64dc40a214dae0673e796680af7d418b96a233b970d45e1acc19d7892b217b573e34ff68ed5084b2f64 -$BLAKE2$37bc8d3bfab6135ccf451980da3b2b5c7a23cf9eccb22ab13c168f6f462f9dc78ea6dc9f9c1e7f665ae65d5ef81a215f9bb8636c4dcb39eb8a1e6cf96a914b8f -$BLAKE2$8a83250f8b1f9a075cf26d6599d805faef9ea4f8f02ed9d4a8c22b611f1f8621ba715f6c48b461cb6006ae79fdd8b09e7ac55789b2042e9872bc2682a044e599 -$BLAKE2$f9da8bbb9a4263b4604adbae5478fd9e864ff266dbf97c2353eb41c4f8730ce0b8d05b8ba5dcb6326bad09e73900570a8f11575fc16942108b4663c1b8aea423 -$BLAKE2$d2af84c19b8b690cb6df172c81c37d288a3431ef5790cabc123592b06682ce516f4727aacc3ecf86ab68d43daedabb87070f0837430e6a6cbfd06161acdcb76d -$BLAKE2$c9370983b0bfca907940f6df62e1b9943b1ae0b61d362d080f7472714e4cab38c2488d14302b4f5500e4b62e1b4169404042440ef7ff2ced68ab70b506a08333 -$BLAKE2$801cac93a3293b996223c83787a960ba96239117bd5d3623e51d3c960839dda8adaf4b56cb3fc69559034c6570d7914a1da089e5d952a969c72c7461a223d544 -$BLAKE2$62326a9d08f46c41f7b9cc70961d49b58d1a5d0bb1777cc9ae0fe1fb4be644d28004e8831c19877c715778de4aa20e3647b2f4812de5bf8399c115df6d54ee53 -$BLAKE2$0085f7b878df8fce8c7754b6090ac1c2bab4057869ac92206b95193705f91c80d8893cb04ceaf648c72311bb6145837f2af0a71582347b0d074cc59c4f24078c -$BLAKE2$8a1eebfed501933c1d23e099038af75ef4a619c76f8063b1b1e84687eb0cf43241d23ab33570255f7c69efc0020076a99f1f8c7f71784d0b538df94cdb934dab -$BLAKE2$0c2325ce4881542136d992416179813d292babe44a9f3165a6a31f37ce2a9ccdddcb98545610aba1eab9174aa0874ebfb7c4e0a4b4ace1ea0c0c22cc6bfc4b23 -$BLAKE2$40081bf9552e32082763da70b61f9e4062df7357156fccb05011312468628324bcb10df8e27a362a43d725a83f7da5b1d42b213f0702df79c9067846779a2f91 -$BLAKE2$0affa0a92a9a0b0f7a245727c462a5df6e881deffbe17c9dad0845debddc706bbab41cdeb8bca3f1d5b7e70d9292428925c724d2a8d6451997f28fe683b65f0e -$BLAKE2$82c11cb86056c2fafe345c6cc32454c3038ca7b24f45022feee933a43b37e781520312a5b7196e50c29a61789588f0c74ae980b98404561a8b83c334e4dccbf4 -$BLAKE2$65d3a95922e97197f0d686d0e087b7adb3e49c3af42648e026215aaceb83f8644ce6412539d97e0bec3e913a72f0ad0d8559a778f2dee2df7ec650cccb86aaa4 -$BLAKE2$f919a41db7927edf7b8732115cf9c3da552bbf9a5e24a7ea96dab2cbd7d5664343ca7f85165d3730485d1fa873e84d4597cea18575027c11654fc41c4cb1324a -$BLAKE2$4e51cbc3336739726af1ea1919d9b2f9b5828b4fa30a4a625919f66687f8d48e1020253f46fe7bf5dc700f25e1e0450e43bc4311aeaf99091e1cdc12c25c40dd -$BLAKE2$ba3847d5b9023ac17ec95175099a4196ed8833b02304cbb23291134bc26c1461454d45f92185346ed2edd567f79fab9f746cd71b4314277fe1fb218b0b4e1e6d -$BLAKE2$1de3581bb9deec069932af971c594abc98082d14104a35ba426c9d2922783189101119ea5bd53ee7810f887c49cf4a09a55502de227a86f704b9236247ed0e47 -$BLAKE2$aaf6703b772eee22ea4dc30c6276ea65d1c752329d83b720eeb15299eac1ef65997a59350264bfeb8596e6f7cedafbe56ecf5be49b578d84104b01f4135becd5 -$BLAKE2$002203c252b02bfeb8a11366442ef1b6329f48603e9ef19f5d3207da5216d7491956454b12f7b48dbdc49315da6fca0d0807f3d7c028d678e1d8746cc8b0775a -$BLAKE2$231bff52c897875d741e5d153c5c314f0c70d7de03108d764945e5340657c04c6963d45c0da391309b6b4576ca646f8f58cc809a887a407023934a6adce0b4f3 -$BLAKE2$bec628241aae52e16c483a540cc92deca37189301f4a5a2308133333ec1d9375787be15e3b6e6bdea8c3433917a557e8a6f07a7f96be88684e3e801c255131d5 -$BLAKE2$f091d8a0c3e21e140f755a278fcc5450cbdd613d7c9e9232c93cc07f54be6f54496e9a18cf23f6d639c59fd137913ac6d691872eaa913da5b7a3e2107a9ce08e -$BLAKE2$b1fe890a132d6ce894fc73a972262662a1e599e12b3001dddade660414e034e690aa065abc3b5d5fea3c1ee6081de87bb1259ebd26467de65277c4ff3654a68e -$BLAKE2$37c1afae59e1ce30a3d795aac3763cdea764992bf6bceb65b277d0eb183d786c1955e0a9d26f78429217595446b74bb230da7915f5d012272c194f238f51dd96 -$BLAKE2$3f27196151510d20160451c63992e607cdf0fbf588461788012e1cc9b0d5791a8bb75552e72a3b491696c019eb609cb2e3256292f087a4a88215fc0a6397d0c3 -$BLAKE2$c06e2e90084d2c908dddef57230ada575dbfdf703c9437b6f560f0eb797d4ecf2e40899d7995612a7ca29206de2eea19c5d1d9960074b0d79ce0e9805cf7bb85 -$BLAKE2$3523fa249ee28b20f051ae7321192716b8d9619748a863d12abdaae000e9b264be66e480897e158cc8036352430c7278161d61118f1b6918819685b7583ea483 -$BLAKE2$5ae563d8d61af6190ed2ed52126c0cc28520ecae42a463cbc1e5855a052acf821af4f67fb969ea2e635336cd943c583831c77901697f0fe63d98cdfdadd87ccd -$BLAKE2$cd780adc7678d5da51b821d81507fa468759c039d7c07fe702b63b94db8720555ee42bde3c9e6b5638aebd7c33185b175d71571bfb30085b0613bd5b6e4ad65f -$BLAKE2$78a51d8373ff58ecbd84b1cc8c0d05a2af11edf1bf64f36e9595bed80a95e67bbf6915ec702eada9a7149396e142335fbdbec8a8070ba0f45401395b8f47c495 -$BLAKE2$180f7567e945f516574ca61f9d2734193be46bf12be6862cb11d7e433becec7de7f540a294978e9604907c9598a0c6abce5920990fab2d5e1e8f0199d620a9a0 -$BLAKE2$98e33877907923b23a6d6a853ff57bb01d37be9799d86e9e7760a32feb0959eabd331823d0255f02db5702e7c0047371d364755e1cef91ddc869c7b703815804 -$BLAKE2$8a09e62b0ed66fccebde07555cb2190954b0cccfacafd2d54a760ac72af57453cebd275019409e2ac31e2fb88504a7a5416d9d0dfa9b6eaa6eb67f7fd06bc93f -$BLAKE2$bc4984ef5a4aa05a0e52cdf7f9c8aaa3d9359474cde295bcedb79d79569f0ae1d4bd270875ed1a5fc2bcc5afe99a6c3adc47d066fa596567dd6437eec9265cfb -$BLAKE2$dbf23f37c0bb04ad17ab5f448338b0f45aa6450b5c842c4c48f1694e52f4f7a0ea1207c93f04d6efd20e025435a73d6dec65a44177a7f854b4bff1f9c8375068 -$BLAKE2$eb882471c099618c16c33d46d9f4b0e62a4af309e9b8485d2eca323c13b6c5a4043acb6e71efb334aa23ba7065c6584e8d3a8c6504a6c77386bcc4837cfe0ba8 -$BLAKE2$3f91cec9365b1e1d3a1dd611306efc49f54c900c9a4925c377ceb4a71595765f05fa1016a5142255ea491e3e1b5ae9065684994de46c9d5a34f26aa323215ae8 -$BLAKE2$b73ac80837f21b81721d854b7efdcb3b3792b6e67bfb33b509060607665555fabb2dc0c4e0ded96eed5ad790b52d281503dfd33fc5f4cae36b7987e10e7b16fb -$BLAKE2$0a499b3ddcf123a90fec6770a512c97c77f03e81af18bda4263a4635ee6dd22a1cdb5c2c8872b5cb5c6e330a6db74002b1143ed729048a77c73e8cf7605875dd -$BLAKE2$9293524c0ba44bc38525b4bac6c91fed94514887154a1a01c4e2236b99b1566c851edda2a78e98196cde8645ef0a84e7a6c0a4c13090fa34f338a89afebb99ab -$BLAKE2$4c59239bde3a315290160ac632aaf1b44a2f7e6db80f4a60e7f92798c2383f70f48ebd707c9fa51bd0f0b70f710ff80293925c6c7019c95907ad246d77773158 -$BLAKE2$670fac352066f2b5d20a2acdceb2c6f16032749393b62a9b896cc283a9f352150e132d1cf1a52efee6d2685f711a69a8aa736b07af1e8efa5dcdb70f1b3f310b -$BLAKE2$e48437d890017faa1a80fee8900b059280629b129737fe3e919e069120a3e6c6a3b6104b73054aeb2aba49dfe4556a33af558bb99b3d6abe5dda93478dd83b54 -$BLAKE2$81833d8e9d4a684fd721a6b22ccfeb907c11c908be91b27369c0246404bb61b3fd96dfd9537f6974e2008f1a66845fabc0d04156d7428e6d61bb716a7ef2ea0d -$BLAKE2$7597ec39ac5f52f550b703043766888477bb29090f8ce27d9aaf0c68563c51b79bae63bb27de5603f4664eb80611a23a7c962b4780560a9512db821868ff378b -$BLAKE2$d1571a4db6c612651fe764fe1c407d294fe11252206b9cbeb90a8088b14dbeb5e184be30d50e24c188d3b61bb576ae188f04e27c9945bc8030dc97c735b7b5a7 -$BLAKE2$24a097efe872d84e2c5f8a9fd249492ca9ba6598cc34243dbb0c52a3052912107e7bad231f983b7df33813973fcdbee387dc9ca67fd7d702b527cfa555600bfb -$BLAKE2$dfccbe2a0f9f6b2db6757cd6a55a125f3e52774c19dfe1e9df950fe3a84e8e7c240db0127ffb4aade0c4140394f87128e2ec0ee022952141866ca3ba77002e5b -$BLAKE2$28d02ed24bdcf453d12ace1cb76b5e5e70dd10e46029f06b35ae899507801b8f0770dc38c71d2229eb0383586770adac21edf94c850967e0c688b447fa34b0ec -$BLAKE2$1f2a1eeda52d333f22a4f8e09ecee1507c21d5188fdf7b2d958c4b7a20758c6c0b4d4a103a39caa9146a720627b920603d2d6404abc97c55188bdc435d1a903e -$BLAKE2$bc41adaaabb0f5f936e8f345848b6c7d9c27b59bb45e4e117c9c22336facc9584a6dcb729cfe2a88f4074f1a6474359a288ecd1c999b3a5b6c4ec0f7b87bf526 -$BLAKE2$8af9915031e22f0aa84fdef5138b11ad79173c318e2506e8db5313fee03584078e09dec7ff42303ba2b454939d1dcf9f2e6bb1530e6b0cdd880d981e2d195739 -$BLAKE2$a6f35bd64b2456d61b1943db414fd7760e99e9bb7531b6aa67bcacdc0924410fad2802178ba34767a53ccd025557edd63853cd2935bc226aaad99b4cf5e8fcc5 -$BLAKE2$a0520535f6dcb32d7cb3ba79d6b5b6440585df15e9c60a924236cdd76e4ef477059f1fcefe3013c87ce8a224ce539fc7b362ccf0366adc7ac50565630e0d4cac -$BLAKE2$d803cf0670d041926db6432ee7d40023cdc3f933e7c7c83fe89103ea13fd40b815384865a82ace84ba25c99f508812ca0afd85b832cf32e444fc9f4152f15c13 -$BLAKE2$2607e54fc5391748181c799f925d2a07cfbb92c88eca911ff091e88749cd2a4d1520d5e470c5656343a49c8b6b29f76aa54491e7d6fddf143d9af3797dc1eb4d -$BLAKE2$90c2d1b533c9290ea0bb8162ee836a61127fc206a0c22ee3a0d7c9d25a8a94680c536ce7a102f485c00b009f479e450d2b829c149328d33a0c9ea9c38fdc0620 -$BLAKE2$6a94d0c26f92ade52ec37d3aa6962f0cb8a18b191480b06ee5739a5b7f1e99fba97b63135be4b049eb627f94534c71e4050aa3f9ff0b17561d5af74e81d8b1b8 -$BLAKE2$1d3c4d25e553ea62dba815b6a77b54b9c9fdb20325cfd903d363364984819345d959fc24dc1d54f0204386aecdccbdfad3d77b54df6db93c6f0292f49834847e -$BLAKE2$77a7996653b980b36577ce18f73361b9fab4d657ab0dc8c15c96778d26517406dd09de521ac6516fa35831ed87683796fbbe1cabdd1f1d297bac6e96255c051e -$BLAKE2$606c5c3526dbc01b0f8b9c9af3e8587acd5a874ce61a3ad6d726a82307b9b1867c96e97057cb6edf5ec772ebd04c60159fe2b6f06d26234d5a499ceb4d40bd03 -$BLAKE2$0876f1afe65ba36a435ef18ad12dddd7f05f5ff4fb3e6820ee98b5a480435f72db38b456d2e279accb0c826cd89885786aaa7ce87ecbaf19a0d7539ca7690095 -$BLAKE2$4f5d81a3ef9f9f888fbd8ffe6d177f241e5c90a234bbb910a3404b6d71518e52a615634f893fb8bcba2923722b0678238a0eead86f20a146072bdfc3622f6e05 -$BLAKE2$a3eba04036329c20b7ef4a92afad9c6903ad23b568f49d90ceb24b20e748fb06b5dcbf9bd51230097a790575c29463614b7d1706b2489685d89bb60f3c52e16c -$BLAKE2$a5f91a2f7fb0114232134dc0b4b58ab2df52f828c9b9d90d05bd9b6c706c4891e7d854a788bf21d39376c8afa3114c99adcb96003f0a81d044428268096c0164 -$BLAKE2$25b96a413cd7ece5a3c87a3b5820b971c5ee36d7dd8e380205f0bf9ea06f63cb9e6f980dd88809639a3ecb9cfdae39673a3e48dd49208225500223689cc5b442 -$BLAKE2$e3a568a78dfeaefc24e44480e18b65317b4f7ba0429ce29d4fbd293cd7cc9dee3cb269843b6161f24727849af0651f5ac317e839f7e1590849c565ffd224b171 -$BLAKE2$c0d01f6bd4f67c1caa67a6f6618390a09578064fceb019cc9ca1825ee74fb4e3232e215bd0349a042a72b5ed6d92b01e41b5e0468de39b3905979b491adcee50 -$BLAKE2$7915e16796d1876446220e7302a8d010e519af094073c12e60191151dd3bbc4d3a7bde583ad832966e891161718daafc749413453e221db82b053dbc2c496d60 -$BLAKE2$1f683bdf755306087d5d6b95149529e8f2c1c18d55247666135c2740daaff5e43c72e7a1619e1eb1eecb38f98c838361474486978040d9be10ef66645b085d57 -$BLAKE2$f2766de2d835ecde82274758a6be243881bcaff141a893739c2121213429088279115b206740afefce91cc19c32b949fca57fb1dc15c8d6163d02bbbeeb312c0 -$BLAKE2$ab646135de72b67164d42f15fd680e9f282695fc48b64a376c6dafeeccb7b9c9df0abaa5de9ad639ad66afadbf972058148ee5c9371488d54640cebf87d938cb -$BLAKE2$8af1cf71c35df8442d57fd2458b4a46f992d79e5dd8131ea74342984fa35037a1605b6ba454e91d3f3870aadac242bd7b055c93360f7117594827eb03433bb5d -$BLAKE2$32bce12b631d4e111eb9f5ff9c0840cc0ac89b424110a3e3c757d046f69ceb8d57111b7a80fbfbc6be9ecee4744dfc8f8ca576569346d7259226adccbc67e3e5 -$BLAKE2$9a4c00caa577fbcaa5ef2b475dce9c34448e1eb6e1623c96c50996364ba61dfd12a98d9f8017ad5020ff86fa4597b5d329a667746dd556cc2ebae0cb8d6d777d -$BLAKE2$4c8b8eeea32bc797322e0d469d12cafa0800ffb77fa5587257fcc5cffe9dc64c6362c2b6c5a7b49a10eb8bf20662eac30811e26009414b34741a92ee64a3293f -$BLAKE2$72328365a05eddf1a9d5eb1e03b2b1060d5f7a67130b26ab36cf62c26a0059b41beb46b2c91291b681501732e00d75d5563f32dd52924cd9d9f42c9ba460d8a8 -$BLAKE2$cfe6e4f844450e6c08d538096d0eb2a73675ecaedb282155b119bef54658aaaba11c79862edecbe298b1d1af91aa39200e451f2a8ed5e094b6a9523bfbc24fe4 -$BLAKE2$3675f6aca1fe8beb6a24d2c1a97646529bdb321a9db4a761e97bfe87ec2a08925910319965b900c8c0a15aea888a9fc5298be563d78cb6ad386cf69fa381a912 -$BLAKE2$2df105478cef0c02878ff56b6e5f5bbc1b546745b602a6aa9344e6a25b825797c99090ec996919b313c9157003983392ad0582e3ce934773badddf20ceb40c8c -$BLAKE2$9318caebf9d76d8e126f6e8bd610443b4cd863d8d13dd7d95136c902ad95a4ded96e682f9a41dba12c60cfbc884c85f88c64d5d82d2543c0dda9be49d8cacf78 -$BLAKE2$fffcf786a7a220e822b13995207c0d619d329cc7275810ba8b10e4853c56741d227c2e2fee7b3d681508c73da991d657da6f225a22f595f92d256ad981aa880d -$BLAKE2$19f164559cd1a3b66e440d9e33cc6cb1b6d5cef280c4b1f36b5decef9f82b761e4e2604d4a2df8fcd8183862d9bd32ade49fcfda8b65ab48efbff349356a489a -$BLAKE2$46b2cccf47255361cb98098d5d801c69f0045e4ab544cd11351e10614f6e13e4ffb453e800455c89ca19a47860ca3857d488394fdd4bae41d8f08925d202eb5f -$BLAKE2$3c428e7aa3238c72455b8e7243bd323f2ae1a561d22890701de2c34905252011c9438a2cb5a56ecaa1ac6b35427d3ff29f6047619d088de98d27c69eafd1d7c3 -$BLAKE2$3fdf5fd5437418d9a80ef65cde9748cbaaf05545b49ebbc4bc24dcd840d163c419525bbc6fdf62b05d728ffbff67a28101e07517735429fe81637c9cc483e634 -$BLAKE2$c08adf507b20ab8e687ab3a8883386ae9abe009bcb980873460db1e063cb4a58400d5dfba454bc76c345152a7273601806c78fe075bcd8d388327efdc0ede30e -$BLAKE2$a2adf65b6d4c7342fc840ce368f3401651d6b8616a9261e343b05cfb5af1227b8d2ba9beeaf675444cf3d35975f938f06c4fd001e2a51a7764aa5ab2af7bf236 -$BLAKE2$cf7fa77f3e03ac15c35392a3256678b1ba7e85b166e33ba632f4608a13dc1598f2e64e702edd618cc8bf855d3563c7712efc64a8700bfdb5713154c12ce353ae -$BLAKE2$c76f2ff1efad42026ea4f22f2b4cfe6d0e3c450b7a505d287f9a0c9370d50bddf75793347542fd4ed988042073cfe12937ebd0b4c442a16b916b7a4decdd1b86 -$BLAKE2$235184b3fee6759f485847d049c1e67f115a9daccc3949eab36cccfca6ed22dd3582f0d6c8bd8976c886e80facb0a888688744d013708e482897fb4044b88f9a -$BLAKE2$b30119d28eedc18930b855a8dc138aee59509a2f36a23ef5ff74adc5bfbda1b246c1c75d914d23541c71e968f00f3ea25528b2c229722913c74900f27070f327 -$BLAKE2$7f524d55ebe1e0b21b38936148223f40fbe0e2f88d87e4bf0b4d7fc37b0b6a8af4ca7c70466534efc85a0eb4eed8aa1f8241ea2db4888d58f54218b90e3cbe5e -$BLAKE2$238ee93568395424cb13e177584dc4b4be2c1132a864baa08304193452fc5616f431fe2c0e035f0b62e0559b205ea2bb0a6f31640534719a3d6c6c1bb5239efe -$BLAKE2$c9aa0e9feb18b4444cc3bf387e4d1c1313c8737778c6e2859b23cc229d453b2d6bc5c919cf0cba4e540d596d967f886dac495397f401765ed3c54049d4ead501 -$BLAKE2$29fed39b24d75809577a69e9abccc889f11ec7850069a08f2b8b12dc75de975cf683b56b2cbb8d8bc318f51b763c64a8bb56f52e8b78a16bb6f63ba7662aaf08 -$BLAKE2$d72401f5d987ff46fbe4321115d770d90bba725889650e70c765ff6f71a5fd9c127447df445fb448b50c0b7af1900db3922170799991f36391bca0332345b9d3 -$BLAKE2$d0f5b54347f1ef54df7bdb9f1250c259f20a3dd741d97abee856294279b3c405f9b3072b3f8506b7debb366ceb8fab9907fd787e223ad85161a51042441eb401 -$BLAKE2$8a3189f3e75037718823ce706644c4d173910911bcc7b67533d315e99bdedb84d0355519d974861d44a5c5fb80dc22047cc5d5f34996a66cd413bb41fc527fa8 -$BLAKE2$ed5c6da539fd44ad11bdc9774dff0168d40559d1a1c146af4f77cf471b7c92ee24bf46033568ddd6272b8d59d972c1600f8854fb79879f9a4fba6ae15430824e -$BLAKE2$45763280f19cd54507e86cdf4ab9bb4faf391c6b00bc412257a0f4f1c33b0598050bef4cb0944d14b1eab9dec1033928ec8275f3ee7bc221f02707a3a7f151b5 -$BLAKE2$76d06720951051143a7cbfb22c23d1dcd22358b37c93da3cd24439a3d5eba004b5deedc630680d09c549c44fe317a223cc54d01040039320283823aca07ed315 -$BLAKE2$511b05c8bb2e96cd231d62e548d5d8eec029feff897913a0360e565cb6d825fe8322c07a665b01dddf23e5aeaf80277f010adf8d654823ee1267f121e71b0dd3 -$BLAKE2$b1e269329199585d518b64b9426ce02c716a20945cfe02877f9adb33bcfa4fc85785f7ee0ce8a1aae888dfefe026d0da16dbdbfb4145e412bc2a8fa5dce88679 -$BLAKE2$b2453d9b2484791e60e098e835405d3a6e6cd8b8554a983fc0a17fd1d58dc8feab8c720255d347c0d60b72f95119a8f57d0c5b07d056fbae9ba8b80d0acfdb85 -$BLAKE2$99a65731af842c389b36a86843fb576ada3232b16ef2120d46c8aac85074a00a8743d7290dc64e1a52033994649d769836f3782e5580eb793177da5bc51843a6 -$BLAKE2$0f0245808bd80447bfd4b17b278ffbeab859c9cf8763cae292a1f5b2b11f35c0895556524bfa6f086b9cb39ac2dc1c70bb6b374694a54b6deca96fe4c1323f4e -$BLAKE2$627c29fa6b8dcfc888778771dd74020e4e0ad63b4111f1b2b893ac2c99566200d91d8bf56399caff63e464459656982e311f7d37c599752e2faca68b24fb9ab8 -$BLAKE2$ecd3e4494485d2c32af3f74f67e565fe3fb2d65baacc6274e2bed62c0d13432569b18fbdace98a213c7594c939b4561e7cfa3642362c10a05b35a7d48bdbe4c7 -$BLAKE2$acd66c1c5e4460d2637089e7bfaf60fdbb045193fc5dce1bb42450f6f6e377c74a1a7d4978b8010a565b67a3d833f38a6e7b53538656f5853ebda0d7fd262e1f -$BLAKE2$1fcb6a245100a20682eeb976e2b3dddb36c18edc8e78a21d4afd44f362ec9dcecf85be5b7193dd5711ff920ddda01d60ec51313ef99fdfecdc77b9bcfa99dc63 -$BLAKE2$9159a7bd60526fd503a4ba5fd7280885696a9156918457b351153da5f816408030564fb2ac6d25c810c9c63a3cfeb7bbe54e1c29ee64e715307efb01d4102299 -$BLAKE2$8836997db41526a5c8e0045f638648ca957dd9b555bd05ce4ea15070766000682d3889ee150aad892dd2c86bd5035dc19731d591be76989227ac97a7fda61abd -$BLAKE2$36fcf20a00b9c539dc3e8d27d5046309df08252481cad3b723ce2af0e8531bff8b1fd5d144f6c1b8fdf375e2657f827f65d985958abe0358b7b0979283bf42ef -$BLAKE2$588b0c629cf198f9539a87eb7a326aed75a37fc17b6cbf08c92f1b8ccfb93a28fa7a737052dcaf7f021b69e99c59018c09233342c6fad48fce68fea1d77e8dc2 -$BLAKE2$141e7c0f4eeb9c44c545b2ca9e7301e49740b67812ba9e693ceb1f23856c094a537eab95e801574da8f1f091caa6af3f700d8dfdad67d3adba8b6c7beb162b8d -$BLAKE2$4fffab302c7a9559293ebd0ee2f6dbbec55b5a1e9fbe92d75ee56fd913f6400f6a63e3b9461eb4aa186a6dd8bc4b7db18c6e38c1fe685d528761308c05e0b181 -$BLAKE2$65e4622a45e700d9396bd55446b7938b6adea5f54175ff0f4d1637365b12fcc868664940324b4363b80108d843efbfd634fa7de6de79337f2d0cfcde84483a34 -$BLAKE2$1a99e4e983bcafff36fa7b56c69a82add8d1140e5c38decd058eff370a7753f3b8f60ce94f1ea98e139c25fee6e33e93f2f03a100e75f1bb8ee9171bafe12e75 -$BLAKE2$d4bd48c98404d8469f6595b3dbd7e2e5610c714d546562fa7ff3edc7caa5f21c25e985d5037f37fd62d7ce996d5638cbd0ae52a3d58215f3683a8936ef126b7d -$BLAKE2$e732f639d94e7613132b127cf37a3bf0b38801c29a5f4c694766629b3d9b73d8ec1a428c43a7c96aae0b4e9b9435843dfff2e95761ac13008219168978c0d04e -$BLAKE2$029effdfed05253bd0c89c7f7dec5f83d8841645ea675fea98c5338eb46baf0c6c8ab4366db632467f66ce6991871ebd244d657c7c79391a9b8eaea2d1859408 -$BLAKE2$b58197a3583d73c60d30b1713716b938f676aa6b79fadf0ca59a754dcf635427c6bd90665c3a27c03997f790d3ea27bb96d8218127707a79c966aad1c076e8e1 -$BLAKE2$51fe01da0f2109ecb0ebea5f3fbe5963023943f28c1028c6513286a40c0748183b65b7f3fd1ce79018de4c4cf8da9b4c8af3fd75dfc1721a6c250443fb1cdeb0 -$BLAKE2$5e6f9d1fb8182c0c86c5730cdb876f069b085f90bd9d42700bd115d31cfcfaeec40ee6e2ebb745b0266f2fbdea99fe7ac4c9798f606fb35ac7cb351cabb1ac88 -$BLAKE2$ffb049275f440cabee8c7c0d8a8e9e67aa68594dd10dc88a0402eb62cee33255177d032011e984d3aa967e07f96d9da067a4d7b325f4298aece43ebcb7d6ba93 -$BLAKE2$ac81370122dd21d4b54e1d638789d0a81a8c0f980f7e4a416a857eed3b831c12eb04bb6dd78c5f1abd8e632649b9d72cc5a6591a0c372a743c3798739337a507 -$BLAKE2$2e67878a3c0e45f9814d50b034f8ad1eb8479c47991d3b44dbc10b098c7267334d285ba61f0d14268ce6587c96490d053785b52f9a8520fed749158f20372aac -$BLAKE2$6a66944cca1aea01ce47243e93dc94f42e0bd55a38aadec9c7f588cdf6ab6f647ec044cad832edb68b4bca2c1baa9f8fbfb5c49354c64ecb963d8c66ed0b1d7e -$BLAKE2$f93a3a848d3e55eecd3fa2625f4e4a2380604dddf8a2e592743a8b0dbd036161a1d516d2e51c0028614acb80717532c091509b856f1ecdaf13c12785240656c8 -$BLAKE2$88126af898d6400d26eff899eec6ee2c026d76b248a66fe8255ab1ff0a45916cec51e725b4636b08a66debf22e81371ed61c849565b1628dbda2dd2c142615d6 -$BLAKE2$a46c4f844c4efd3dde68aee7e6b12adc1afd952f86ca60d76bcb5b9f9630be675057a15607558c275559712876b74d25bdee4d8847b4edd7178425391b3762e7 -$BLAKE2$3eefdea9a2ede7762cbbe1f9378dbb4d3d6888d4fcbb68863911b04b28a4d4bba0082daf1b27469349669899118b36456b09e18b98a06171b4806c238a9a2e28 -$BLAKE2$a92f2f54c537bb6158f4fcc073329e02182540e9bda366bb8d49eb091119848a7c9d2243864f3af9feeb36baa55aae2b75717ca28854efb9f39e45ff659e9a04 -$BLAKE2$6154b70364d43086e648733c2e402e64ddc8ce08b13aec1e2e8e9dd05e41408b39f5f1bded226a45ec85ed5a37ca0439b7022e31ce9c6093bf4a3c948f774c3a -$BLAKE2$4ca4a38d3404947e4781f0445c5e4b9a07981715edfeb7e567fb82ce6432677f309aa7375dfdedee9ac4421e73940c8e0fd5c1aca445cb48120605ff52f1d10e -$BLAKE2$4a1177ed10926e449e3f1f0a8d79cea639bc7c467f36af6ae2c1c30abaa4ef42367b98d3bfc60faa89fff8893d23762de3c3261eb260886414ea887d9c375eda -$BLAKE2$e420ba19ae3e0d8f97e6590f72c3e6ca56fe233f296ad53c6ab3d6b08effbbf8e5958fc18949537f070dd2fc2b2b4230360f42497cc84272af6690f3a9bf04ce -$BLAKE2$bbca4ca9d49d4f53040d2a06da6a472003c8c4c628e7dcec87b4f6a279e612932830761a8282fa5bce8a051f4974c2c3376d863275f03fde8119132976e63e95 -$BLAKE2$357e440f0f8704848e108b4192af9a0ab75b53e4198dd1acf87bb9ad24eafd7cb8b1449a968817f40ecbe62a362d1731c972bdc729f5b79e4fb89d8f718bb706 diff --git a/tests/blake2s-valid-hashes.txt b/tests/blake2s-valid-hashes.txt deleted file mode 100644 index c3ac195f3..000000000 --- a/tests/blake2s-valid-hashes.txt +++ /dev/null @@ -1,499 +0,0 @@ -$BLAKE2$ba2649757ec72ed0b9bd8b3063687767946145f13abcb38e2718fdaad6c771e0 -$BLAKE2$4c81099df884bd6e14a639d648bccd808512e48af211ae4f44d545ea6d5e5f2b -$BLAKE2$93f9b0b205276f1c3b03464d5e890d6c99e7e22eb4d7530e53ba2e3a8066d103 -$BLAKE2$90931556d9513e8c26040a9ec2a2f1300bdc79a890907da9cc2b3a2c690574c1 -$BLAKE2$032a6339c8bc09e668daf8365b72f3d34ee7876f18a58f8ff7c35b5b02081d6a -$BLAKE2$a076a699190673026fe44f7b523d321fcae79e70945007bdb1c86295a11c4135 -$BLAKE2$4bcdd2aca1a694cbea5e3751b293c8107e0af50399766ae05cbf9fefceedbeb3 -$BLAKE2$4bb6d05aebc19ab25a7abfc3d283fc66b738f9295065fc684c23b16db775b662 -$BLAKE2$990e6d6fcdae520432dc402546775ab4fe2b6144928ca14bcf6c2cb634a021da -$BLAKE2$69f5eb7158a965665ac14505bdc7570beb3e5330c41cc70887c2b875a0d634a2 -$BLAKE2$e2ed9a2893f7c1e2a4a62a47ae29ef26af4914905797e1ff6c868ab6e0b94282 -$BLAKE2$329f06c7b90bf9605db11aaa10db43bf739bd08ea4a55ef4d4b1c6d3b4ea9d16 -$BLAKE2$2f185fbcef16ddfab9451925d69b0af28181a7a5efcfa9c6b47f76a2aa430e9f -$BLAKE2$486d9ad7d50e802bd36bd446bb25177913fbab5c93ef50099bdacfcc417dba3b -$BLAKE2$0022cb6f32dc58bc06cdcfce7aa9435d8fc2652b65ee269d1ab0ba1992f44145 -$BLAKE2$cdd32c872b68e6f9c080183077c7a540523047877469738f2d8a8a9e505e370f -$BLAKE2$4b97c169b3c7431df3fdc07f600271f837f837f2c766f8e93b92695d1dcf867c -$BLAKE2$bb48bdae67206a493787b69821008fcd6249d013125972db3660e75ab6f3c884 -$BLAKE2$4f5a01bbbf0ce658abcacc64c7efdb3f108a18705ca66196340090bedc11f431 -$BLAKE2$3642fed93aaba6bb4dd577a34bce709fc0c8b25c1e221feffb64c582b9d97d11 -$BLAKE2$bd749ded0335a0c42781be6315ebfd508620770f44380677594629367eab65b1 -$BLAKE2$145684b91040baa65dcc5434dfb3067900c07e90a47aed1f41d89c629a96bf2e -$BLAKE2$832024bf2a91cf3449c115314eef133af04f92314a4e05c8b02b615ee000396d -$BLAKE2$3ba62bae321b71dfd07a5972c204207952fb4a32df5a3676c61d92545ec2ad37 -$BLAKE2$7f893557a2ab7dc30d144715408f108e2b8a4b05402ca2163fcad8d6cbe502a5 -$BLAKE2$1d46d0098de9f1aa93d1427277bbf93c6b1ab85c33b4fdea11c9509c2fc05acd -$BLAKE2$080b2e76be2a828b09d3606bce6d7808a4374ea890b7a9ec48e1fb586e630a79 -$BLAKE2$e0f8b904ae65fe6a9338ba01296cd630862777e9d1334c4d7f51826f2632a252 -$BLAKE2$83950fbcf5c8140c7548cb746c7c58f09065822485428c229b3d8106b3a6e7a0 -$BLAKE2$f308fc02ce9172ad02a7d75800ecfc027109bc67987ea32aba9b8dcc7b10150e -$BLAKE2$34653cffb9d72a352426a7ec7e5cbed85295cf6c69439d0167825bfc3ede0c28 -$BLAKE2$ae3df7a88d739bbdf1e4ed824c7fc72366a5abbb7c79e41082b6aa0c0422a8a8 -$BLAKE2$fac0c123165a4f1faa161574bae73f6e4c68cede46dcee6c9b3573cad93de0c5 -$BLAKE2$0d31af450ddbd263036b1d9d1d48a8563c3973b435c06e0b01fed25bc4e44930 -$BLAKE2$00402f0fd560780ec23a0c3df2489eb9524f793330ff9c4460d7765302361cbe -$BLAKE2$13ed751afcecd936bcbe496a38545e63d2fb97f2ad8fc5b72f17d29784c34db5 -$BLAKE2$68bc019c5c54bdd50a1de6966ba1abafacc3c0e4ca80b42737380e1522e565d8 -$BLAKE2$ae739292848421b911d76657fce6a7b9ce0b013bb59ce4200be53c0321b59e78 -$BLAKE2$0b685d35374aa46e3816bcd141eb5d3a236b9ca8e6b0f8c64cc8e7ff1fcfd18d -$BLAKE2$2ad25fa5eaae90d02ce5d2285683ad39ff84d5c70ee5d74b8c874cc2896de653 -$BLAKE2$1532ebecef55533003540dd76735389f4ac58353b9b855819db71a75ccf7520b -$BLAKE2$aa8cf7e82062d965ae6f31fdbf16e055e8c5a44cc19c7980a08d598ebd4dd70f -$BLAKE2$67804f7b50f59148324f23ffbf44c59ff73bb938f4059c8d9b69cd3c83e0b85c -$BLAKE2$6319f3a2b2a080577e60fb01d623f0faf78fb47b4328970338a55f426b6f7f8a -$BLAKE2$b9ddba80fb4652a8f25f9347bd55442c1792c41f4a178714cc518c241e94c0da -$BLAKE2$2d7b78bb9f4750e8bbb1753ba2373be0db5cea3d5a8316715b164535460dc55e -$BLAKE2$9495af2bfd7926e8a8cdb642728a3b728f9500dd99343995c7262d37b023884c -$BLAKE2$4e2ca5712df5f9b1a776f76e513caf00294607e4a5818247a1c48fd7c4494b11 -$BLAKE2$d13ed8bda27d7a4be55ade4a533b7359812e19d8eed5c839cd7b09ff0eff651c -$BLAKE2$2abe661f649fd51b22450ba31b34035006fb1ed3faa73d59a1de1d12da652477 -$BLAKE2$8eab43845d6b7de88327826325bfb8ed6406dc54104ed91a7d0b292d64321e2e -$BLAKE2$e161489e0104903446c77865b85f097e1ce7a86cfeb548ee39b0fc32c894e8ec -$BLAKE2$1230face1de3dbfbc082256da4e9d0f3190e6284d7b20ad19f78434325216fad -$BLAKE2$b29d405f772295c6b2be416d3cf56c95b67bf07ec5b42d0d597dc90b98806930 -$BLAKE2$ee953fc5ab1a48548364aa752eeb3e68dc403eb3e9046062fedf815ab3cfd570 -$BLAKE2$424295c55946c5bc68a7ae2b60642b2aa03b891cfb6879b41239788fb2332b18 -$BLAKE2$511a408dcce9c359fdf9f546905429aef12de4c249d2899f7b3b84a364486cee -$BLAKE2$898af616fe84691502695ad3227ade34c7890a9461e977833ddf376f107ef9ac -$BLAKE2$1ef5707324b3b7a191102458d7c4b9d9f5cca5554c526608a2d523d198a6281b -$BLAKE2$b1bd6aaee62fb45dfc1269a117478b122c6c7ee873b729b29bf4891852741b6a -$BLAKE2$2d90b2b6a2c74a7dbea6571c7f8ced992702ace9712792765fa1553e8a68e543 -$BLAKE2$f982fd819b1a54c9d8a0c7fb47661bb154efc198a2f005d96699ad30495d90d5 -$BLAKE2$8f351ee660559c72a0a216e527107c208114b8ff25a4b21c0835f0935cbc66fe -$BLAKE2$728feae6d4e00341bf9898b60e686b4d3c77c9a2023c2a00b368a9b18220276b -$BLAKE2$2a9d636630b2335767df7deef95581a136100b8f4b76bd44c9216b736d77adbd -$BLAKE2$8e8dc50a1706531ef090ff98321b982b437a684cc443b48d44af66383cf8714e -$BLAKE2$44d17b6cc4dba17f3f67b1e7634206ce18d40e47e960b9f94b0922026626f8b2 -$BLAKE2$688ee6d3052bc38c7a7b3bd8eb48aadf98ccbd6c41def4bc852bb2f4db527d99 -$BLAKE2$9912dd90784b9b867f66852a4939905cbd2dc6513dc18ed84d6bed9e33fc4659 -$BLAKE2$7acf5e75fb0898fbc9c59109d59c868b3716caa5b58ade990c21b57e561de870 -$BLAKE2$221bbb02c00e7648ac4ecdffb9eb425556e256b72da846b3681515b98bb4a6a7 -$BLAKE2$55cf6bef9b6db824fd6a01b2a7dae7fd2a94f6c1b58bdfbd3c389fc941e20605 -$BLAKE2$9ea4ee3e61219bf1a416e72db8caf1f68e7704fbbdf3859178867c327042e615 -$BLAKE2$2ec7f1618229865129c27dfc428c4a26a4901fdf704199d9b013279e16adf01e -$BLAKE2$8de6542b39fd96aa62052a8675d0d10d0e1a6f2b544d92feda1e8cbb4eff8db3 -$BLAKE2$a21cbe2430e98abecf247f6d29abdfa15b7f3713fd7ac0a53e0c026e401f2950 -$BLAKE2$240520632594ef39f078020450f095a1bd4d6286381eb185cd0e200caab5f820 -$BLAKE2$87ac32a09864233afbd83da0190131de4cd398ba7307a977e6aaf10e93ed6ed3 -$BLAKE2$0e7eca2504a53b6d571a733581fc09ba7cbb9c7e1b3455d991d531953d0d0bb1 -$BLAKE2$568560feb38eef0f9c824d581639d374aa460faf8aa28cd8518d159ce2173b88 -$BLAKE2$7eb9f4c75f1fa7fe5c47181b8cd401bdde5f491052a4afc942f972e5d537f3e4 -$BLAKE2$bb0ff2a62622fd6683ecf617260d11e435d1f29b03de9171d7964ec0538517a0 -$BLAKE2$56b2750405c44e0f11e8105a69413a616b4c1a969389321b7fa027129d0f826c -$BLAKE2$44fe15604782e4a9d6b8d751c7cb36d2b13a3fe489bdb55f8f53dcb8b7fe54d7 -$BLAKE2$5fbc237e891a2a9a33f81a5071f27c78eb9234f889c6578b240607cd9c95f649 -$BLAKE2$743183ee56d8a004e447c0c1626bb63e75a529e333c2ab9350d36fe4281df40f -$BLAKE2$8bce53222ad873c9f0ed4acf195c77669d8d28ed5a45e3e20f103255e1397b80 -$BLAKE2$24b2ddfcd7acb20683bc59b29e09ae0b658a7c2359ef7dbd87d6c55377ee2823 -$BLAKE2$a5e7097a1ff743736dcc0bae36815b68207b086a17271076452901650c2f532a -$BLAKE2$66e754709229a1a76f12b770d612d4dba1d51e28894e2dce1b53ca15104f84c0 -$BLAKE2$a6608b013f3ece2993bd8b23ed90b5143bc563a456d103557478f0f3158a2698 -$BLAKE2$dc439f6904f3e669e765ed3bdcc6e457331e3344273944aa1c83b410bfb7b05a -$BLAKE2$bb0ca907d4573967d1f6e5dd64a83b1f983a6e228483aed0cb8dc5c01ef5ca60 -$BLAKE2$7a5d748f09ca6985da962fa6259d674a3e9a6b7f36a82d7630b7488e36bbafd7 -$BLAKE2$3d8e73ed957ac24b116f1886071facd87e9b95be76140010868849e20deff890 -$BLAKE2$82a1424e827c594ec1a9392c4d0a2e455131a0897f5bbb44e5563260ab8f9151 -$BLAKE2$b41737e947353e12e463488e4c2ec43cd858a146d518400ea64f128654b2446d -$BLAKE2$19213bacc58dee6dbde3ceb9a47cbb330b3d86f8cca8997eb00be456f140ca25 -$BLAKE2$298df4a8b8570f3c4411cf3d2abe8b0d65c4f93991687efa7ed97aca2b4793e8 -$BLAKE2$628a29b8e86535b02602574a6899276db369f940df7b69709c2e620f95bc0ff9 -$BLAKE2$bb8f658367c1ee69939bafba52f8d7c12227d61d2c1992989b1dbc1ece3e50d3 -$BLAKE2$7e5d2a54c52b4309b0b84ab024266896042cb7723b503a1b4f81f6d756064d9e -$BLAKE2$1c81a85e90d29bb6c057399749a1987c62530edeca97fd7e7eb938379953849a -$BLAKE2$f6bd2ac65de8eef1a0cb5429f8555710c2ebd8d8c9b37a4e0153b39c510c4f0e -$BLAKE2$7ca7c090076d7cd7d7922a99f50285b4f664d63fb2162af62c89c67ff1d7d23f -$BLAKE2$71909c2416ca99d1421313c9511b072e97a9f494c9906d82d3083b6f6f74597e -$BLAKE2$987ebfadf7d1e1cd1451f7312c81ccb3a640a36294b7a5b8220e06a4eb125bce -$BLAKE2$0b0213cc7ecbbbcfe5059ebc60c27d2c80edd705eb3b592cbb957e692fb496c7 -$BLAKE2$89e3b0095abd465cc170529b8a6967ef1a0549e49934f538d963d4104dcb3f1e -$BLAKE2$89db98a21af3715f3707917d07cb76d66e39c908e4e34d3a88dfa0dd60739e7c -$BLAKE2$c222b999235a8d659bc2c36afc51cf80e50a56d67372b4ccb6858f4e9f196d6e -$BLAKE2$880715b219548c28664347edc95bfb3f7482ed4cbfbf7439081c70771e825285 -$BLAKE2$3f70dcfd80c078b4fb65ff7b0be5646e93fc7b12a295f54cc2f2196a955b14c0 -$BLAKE2$93778e00d9b5322f763341e3c2e40037d049993b79cf95e928967105c367dd3f -$BLAKE2$32e10a70af6b1cb91f195b6759c6023fcb043e4c162013cf34ac2e0a827dbaca -$BLAKE2$dcc8eee61be37e2a83400687bb3a10c6beb2c7d7aa8a74d21a3175a800414445 -$BLAKE2$60d7226b5bf788ee4850a358fedbcfd6afd7c005ef6139336d656430314603be -$BLAKE2$ab160fcf0f0db1652cb12946de99cf98894292c53f335c625d2024558454b812 -$BLAKE2$8655797fac3ac685c37827fc1f5728687f729aee14020b4369dadc405b20cfa4 -$BLAKE2$4df2f2e0f765c6dad3f37e4d4ff49e4f5f26b23b4d00c12c413d67174676fe8b -$BLAKE2$1d00e734310c40bb1dc667fa70d7e5e125ade99daba57bc47bf039f4ef496856 -$BLAKE2$dc53832e260d1622516d7e612599fab282c64421a0a97d563bb0cd2f4695b5dd -$BLAKE2$f26efc093ce5dfbd20b0d34628683f7111187b391ad5a920e7a77f77b0b3dd67 -$BLAKE2$a2bce50004e2cc4a74ee1e72f82d181f75880e1ea5c61b2fa501efb2c7ab880b -$BLAKE2$a9657982ff5ac27dfa97fa1c7e19b4751ceaa14a9195f40b9fee52525100d1aa -$BLAKE2$fe1f5e72e2b18e2eddacdd1667794144de0f4545d79f49d0e52209fa88884846 -$BLAKE2$1e618596f5d03bf2b4cdcdb785a94b063bd16bd13d57149f9bcbdbef86c072c4 -$BLAKE2$6d7c68a2cfbaae287bcae0f23bba96275795763d9388fae9f68e6326e03213aa -$BLAKE2$0348437df36281aa42ed2b1342dc0d73cc11abf5e20d3f8fb14b16c8b51d2357 -$BLAKE2$138050e830b1670e27eb670686e4c94032ea4da8704046903d42fb4ce6700ea2 -$BLAKE2$56f56a46930c611dfcba0ff17e9ee4eda96f36b36115dd1c28cd601278865394 -$BLAKE2$833b85dd48f4fb8f8ebfeeb42b1a7a0411b77b8716a8cd7b160aeac5b40fa164 -$BLAKE2$8d90a523a4ee222c882fe4ec45ed59d27f169a85e7d36e32d1cb55228de13faf -$BLAKE2$a176176c2c19fd0619c3ad59a3ea20a5968d898c953e98487cba09510ca060da -$BLAKE2$3f6a93d572d9e990f0d681c67a6d1c5f2e98e5d4d27c9e5752b4d389bbc39c38 -$BLAKE2$50cff6e7b8f5e15a6b0f82188aa9d3530cf7d7e3aaf69be889571df611858c25 -$BLAKE2$0804906da951485325563540e1492f0905738f6b083cc6580d711ce6849dd4be -$BLAKE2$ce75455765beb1656eb303a0be75e882e68907e20f6986d19db4345851f51ebe -$BLAKE2$1bd6d86c18ba72fbd2af44e01d7ac686fd552bd4a73dd1932d007ce44161e1ce -$BLAKE2$9982ec2341a071264d506d125844d6ee2db86e26dd73c42ff8f52e4a5142ffa2 -$BLAKE2$fe345f283b661232168f2779c75616d10c7e2281b3e3f6d643c2b8e803b53251 -$BLAKE2$06ed8343267c8251f04d5d528ff3fe9cffbafec0052bff3f615b3eaea24df4d4 -$BLAKE2$959e4a641cec59a8e54b790b050e4bfed06ab1d61f40d0446fd5112993f20023 -$BLAKE2$61df4ef60395fb66adbc10109d60f871fe560b882d79af8b5583af75a14ee8ce -$BLAKE2$d1c096068e4da25f293410c5c67d95a99565b148f5ed32bf72c7e75a542b79c5 -$BLAKE2$8e440548b92331e306bc9a272127e63703afa8842e69200a9208a14ecddb6448 -$BLAKE2$27b134de8bc9df18658f8ebeb10545f272e860524c4d7023ccf465ee04e95cd6 -$BLAKE2$de434569f0fae5fa3e4cfff037249f0d9381b32578ea877c5053c910ae144841 -$BLAKE2$9815a1161e532fb71377abe2849fcc56620f87bd63fbf86e97ff07723256195c -$BLAKE2$db735243278a3cb481e740c233e3213907e637de746717507be609217577109f -$BLAKE2$5c3e17158535a9b5b4b4dbb0c4ffbd9085ec3513ff7d1cf8454ddad70d3a72e5 -$BLAKE2$4ad331b3abd2e8ccff1302c187443c1b4e0e4bd9db6cba420a541ac2f2a3131e -$BLAKE2$690def41dba850992221f866d4376ed88fce306f3fb288084fcdeb1dccdea8f1 -$BLAKE2$d228af78b69531845a66102d7bb098756d0b329728f66ba73aacef506af9a91a -$BLAKE2$30f6b4b27cf99db530e12e37abc0dafd84d99a089d7003cbc7d84b77e1cf2c22 -$BLAKE2$10d435494b8d2b6ff727c14da1af5412dfc429b8e2638cc252583a91485ac0e1 -$BLAKE2$67dd92c381bcfe42ae85adfb1e6cdc76c46813971d8ac709a89e1c4604b33ebc -$BLAKE2$7da550375c51a41eeb21d62654891cebecf234bf64c78980b8bd0d57aa648703 -$BLAKE2$555d134ce333e334937731c9af1e935639efd0545f68613e5466fdcbe04bda18 -$BLAKE2$20a89c387bcb809ad0ec92e0e8e6db2a52dc6df9983580c887d87e00f1bb5cc9 -$BLAKE2$e62ec493833c80bb3d846beb3186ff4d7deabd212fed9d877935cd50950a53e2 -$BLAKE2$2392450ea313eda847be14c522dd349b9fd30291ed0cb3c7a546588660880b39 -$BLAKE2$23a0d7fe8847d33a92dd7dbac3844a723d73a091ba505bdef32012ae25deb65c -$BLAKE2$b5ba1059763a4d68026b069a7c04447d146ba10176e1332fc66cd7f09eae7e13 -$BLAKE2$367d59fcf26e5ae012dd76190fd04400e2ed4843abf2aa95e4d2b8950374e0d4 -$BLAKE2$0d0a5294b4baa9ee0374ad0b5bd9fc86ca436866f4f6b4e5d92d4e1dae1ec503 -$BLAKE2$f54dbc383338bfa8b349e78a7300d65d9117f961dcb810ff57d1796536024c59 -$BLAKE2$09aff5884adcbe647189dbffd70ab42405694ed7a58344a578b85740f3d5a386 -$BLAKE2$d44e6c500444602c3ae2964a4cdd5e343eb9d564cf95dac0345756228a12bb5f -$BLAKE2$e3fa2e331dc0ac6c7c1657bceac5b42b04b101bd788e4bccf99cb9f2940f9aa4 -$BLAKE2$aacb2dfeb831f44d74cc5e299d6177c5c2070fd8315e2b33f005472cdb160e9c -$BLAKE2$aa7b587de5f8144e58c3951c473324b3b00af4c8ec2fdd3cd0d872a05f5b8afb -$BLAKE2$228c3a8526197e63044a1654a9407707d7e250a7ccac489d3cad024ce6cd9ad7 -$BLAKE2$293870d366d1b9c003eca7035cde9d5101500cfb06acb7c8d33b2f66b73d0270 -$BLAKE2$43490af39081d4e751108109066152b28dd59d9f9b3ac50a0b0cf00d13b4aca8 -$BLAKE2$719c84b76de2dc17d3eb08f6a44768191ac55be0fb5d2ce8acbbb3078b600363 -$BLAKE2$796e81141db1e41c52e4e3984627793f7176e73cc842e372255cf6b908d0b470 -$BLAKE2$475824c5f786c65570d052cc77298f777077623c27278456b471141d3fa47f35 -$BLAKE2$8c52fa190286c474375c2845495f3a05e9ba043947425cb7b8728341565795c2 -$BLAKE2$21cc1b7c470fac8c790628c07cf0578e5118007b010ba3d7b47d30e0765cd94f -$BLAKE2$cafe7b7e290c983b47826b4982ee33abba456374e6b140212bbf1d37c91f6333 -$BLAKE2$71c76fd14da3289decf906c595c3440861eb1b085a43c181d027a3c827783e94 -$BLAKE2$fa1757466d853ee92b45fbfdc250caffe005e77448dce9c7601e0ee2efb010e2 -$BLAKE2$3636af26e7f46a9ecd9b3c5a0503e94cb6d2f377b75025589615b37f4d607f9f -$BLAKE2$b1074d4a2f2c5c8e6a732be9bf2456d207351197981d6f33c1c03b57fb8187e3 -$BLAKE2$1fdcf7142190b146846acb0d0fa92450dcc683bc14ea030617678a2be39c5516 -$BLAKE2$f2c7c7b19a02deabc1cbbef727cbd0a345aee7529981e9f97d8ed2995fd9afb1 -$BLAKE2$dfef52f8249dee94595eb98bdb7fd148e05e7c17d9114bce3509b6e8b12dc2eb -$BLAKE2$1254bb4d1ca2e98a8b08fdfd6cfcb39a906c61f6db8005b77794706b47ba966b -$BLAKE2$0d144496ad4838dcb51562576788ee5329fb118ee5e3805e3b6bd9d50633ad1b -$BLAKE2$ce3fac07937b7afcd45ff96c03d8dd8e0a925e7b9f109a3b6ca0cfc323e07107 -$BLAKE2$96aa78bedc35d77ac412e933c01c4af4f43ea80d758c43eb4da92c2e6451d8d5 -$BLAKE2$c655ca9d43cd8b5fa04ca8b9203f71669c2df7586ae208b2380f055d3ef1d1ad -$BLAKE2$74863b5ce73d25d943de21111394018f7d3cb73fba41282db621db3d36621be0 -$BLAKE2$31f0637dc8a4d1f2b1013097da6bd77584e34694bf62388ea01de4204d724366 -$BLAKE2$5ef956927d502b95f5465203241589e472706ef4d2e214602bf4ae0954e15975 -$BLAKE2$1cbf7398a7a40f7467fd544de2eb862ac00039685cded72b33aac7c20ccaa145 -$BLAKE2$29839df3d35c57baa48800184a143e87f2ea9f00932915ef33f49a95eae0ef24 -$BLAKE2$c6513d2f7f02b3512870d58bdd3c4d5e81714090788a5ed5b13bc9d2b184134e -$BLAKE2$0277c87e9a9266b0c93f92927bed2b3595e68d8aeedb75188630c5781f0c59e7 -$BLAKE2$faa98659687b0e732090ad638a9b484380d00668d33d477a195c4c43b7a4f6f0 -$BLAKE2$f6873f981e87bbc0bfd80309e04b2a096d4c0623a4c8b3365910fa5057b22216 -$BLAKE2$113bba0c5038beb2e1265a3d6fbbc3da219e51053b8124a3f87a398bc57d5f47 -$BLAKE2$2d0ac2bbb16801e88b47b7a42eb5669aad31cb3a3492e71e13a49d7cdf675ce4 -$BLAKE2$1b55819e5b0f7d197e21a83e49f664f3c3d9b35b4e1f397cbbfcf1bc775f5522 -$BLAKE2$58dcd045bea82982caa3937cfd36ef5bd55a8c1b35e451baab7e5f3e643ee040 -$BLAKE2$eb9c75c55c5df3f6ea8064da957a6040c63dca8c1175bef377f86835b2056d62 -$BLAKE2$6842e2f9d41bd74a4bca6730a202f3720a636871346da27a9d66a67f0b2c21d6 -$BLAKE2$ab8ff5cc3142e952e875da6a8b5e79e2297efe4d29562c681ddf9b5283757e3f -$BLAKE2$c73925d0d6e4fbbea461512dd4c38c524f96d61affe78534b373e88f484c06db -$BLAKE2$805e7904be0d3e179ff510fe441e3c581461caa68ee65f9f04b941752fe459e1 -$BLAKE2$f7262995c54e4c2dad3fb559926ae798ef3f5df56b4ecd769bd577491ad89a59 -$BLAKE2$18476e912bbb81ac3811a254b483518abcbd76406be6b939385c2c46bddde6ff -$BLAKE2$de0c0bce76b60fb97991ff8b63fa84d8cad2f4e5ac26bdd239f31c9d6d307d23 -$BLAKE2$21dd11c925ffca3ee6944b86bbf2fba058a2f9a7155bfd6798fbbe9da4947b53 -$BLAKE2$2d6e8cb56d5b0cce26d9d63103fe8d0882bf633703178d08ac6a42dc9dd9514f -$BLAKE2$63829235701b1f12bebe777f8e7761f3b34a410bc274c8b1cea6021a74a16adf -$BLAKE2$98e24d0456f640c0d9bb70cedd79c1c9e23fa0adda2f65e8130c3bbc6e98e6f1 -$BLAKE2$381baacfc328c56293933a6d2ac19617007057ec6800c2a514f7cb34ad18587c -$BLAKE2$55a8f99b49611df268daf7aa03feec9c3bf9fb5f46c46f952eaa39dc2e17bcb0 -$BLAKE2$e4a8ec8a3a914fcbc25b3ebfda17aa16fc49ac356d040740d36054a9a3e2d900 -$BLAKE2$f8531219997559ae134725dbfb9fa77517054daaed882d8b7577aba9b294f902 -$BLAKE2$68866764c27974f7665a3de24106ce3a3d35c2f61e543b6509e663d3f801d9e6 -$BLAKE2$bcc5764ef11994d1da371b86a90d4efdb87bb0199e88fd8af1858282e2928557 -$BLAKE2$3b6b66f05723ec4fb352252ca0a49ede480eb36d2d686a75c157da6b1c1cba82 -$BLAKE2$f33f199799c69cfafc3a2317237989fc365aa99bcd6cd9bd5e344c2efc98daf0 -$BLAKE2$6e848ebcb316015a57201de09cc2694adc8c03b28c8172a29c1cb0d6f34b68c2 -$BLAKE2$b973c910c4c3564125b3b85544cacd21f21d06458ad01e8f91a5eb5eb9b4a8a3 -$BLAKE2$888855206e83e4f8e325e27dff142eaa1bdfbe68098fc6a9ca51fd92af61279d -$BLAKE2$94bd2b2c92c0d893991b42b73f85e3408a296c3c58dae953b15acb6f179c69da -$BLAKE2$41e6adda8982e8f61a73006243ee0730740a340a093458d844416f554690414e -$BLAKE2$09aea42fbecbd83cad903695fe4bad46c092096d86113e28ef3124baea99151c -$BLAKE2$aaace208a2077392668297fb009e158fa67ed0a866ec52016780a8c217c12274 -$BLAKE2$663a85530cb84d6f76e9a6b918632157d74bd0fd9d65a419aea38b53aeeb6eaa -$BLAKE2$cdf08b582805406fde43465fa4336aa11fa7079883f9b9a617e7e8d74250c7d7 -$BLAKE2$4849bdc5500c26e99b215784b644bb29121f75412110d756f6c88e74bb46691a -$BLAKE2$c1e4db74d99f5deaf0a5d7c21c37f4e518df1d570c480dbe6301c387a6bdc52f -$BLAKE2$5da43d4fad0657941a6b75991e394c9febebdb0421442d07eadf222bd4027008 -$BLAKE2$4115d139c82a5701d825a7f0f1d8e57b9a1c2d5600cb4df9a61fe0bc2ef69a51 -$BLAKE2$258d200b5ca62216b316d90f48485c7c1801e02e966274b9ab25d17fa7f05a16 -$BLAKE2$2adc7e785f1621b866acab6491de080cabbc2b36e5e97b93f1d32602f8b38391 -$BLAKE2$39d9577413b84030a7ba37a2ee7d780a60bf7bf591efb852783677fd9ad8f819 -$BLAKE2$00ce8c47edb66b8b890e11743bc0614b3dfb65fb047554710fd65a5cf7003231 -$BLAKE2$177b8507bb2fab9d1f6bf448632ac653ff05e11cf4a3eaf8e071f90c6c14a899 -$BLAKE2$9264d317f1f3d906379e4037f6fbcf7609c7cbee3b22566cd3dcc1d4865f4e19 -$BLAKE2$05ab55ec7919c8fa215bb54a3d6eaba371448025d16d38c6765e2a8424637ce6 -$BLAKE2$b0864a1546f15dbe3ece13d4f542bd20a169dbccf93d9b9728dc40483b0d452c -$BLAKE2$acde82278c3f832c63156caa5dcead2c96578f97fcca45a8638bddaae6c9e5b1 -$BLAKE2$ec37190796ee8c0b3cfc49355ae8e313410a77458e0836713e1feaa85e228701 -$BLAKE2$e9341c40111060cdb0b4f1f632c0641d0974ccf90dab42d5e9f6551ffc39dab4 -$BLAKE2$6552aced3ee8c909b537bf61057745d85f17b0ad52457091c1e508105ef912ea -$BLAKE2$04339265cbd585598dff41824389171eb4cb8bb7c70e6a45975486c2d641fecf -$BLAKE2$cd6cb1e0a60293b877ec0d5a4c036bd597abba686d682a694fc39f95e5818ea2 -$BLAKE2$d2e07adddfb6793e4f7f253e571f86c4e968012f31f2abe7ec5b9f6f2e73b898 -$BLAKE2$5584430e228c822ed50f0e2d5ff4f717c1051ce290bad5ec8ef5e81ea6525ac7 -$BLAKE2$b2f27a6a9d33958b20a111341d647ac51cf33f038e7085ccbcd2406509e18f51 -$BLAKE2$f3d77cd60a1dc2938b6f8f892ce9e6486d52509589641b17367207b8c953fca9 -$BLAKE2$3c21c6a0e701496c35c0b19db25ba759e3663f423099a2f73fe8043be5d1cf0b -$BLAKE2$aab7c09268c430943ecfb771c7af8515510083771d46260cf3c502c96eca54c6 -$BLAKE2$2a44c5e435a51ff2588a4b56fe5b30430fc49ef89989dc431919210b599c41e0 -$BLAKE2$283687e7e72c88cfeb137a126d28c6c6da0513ad0622aaadbc5de6286621098e -$BLAKE2$14799e0f64d4a15f3ab7f71a9950f789d279d4d6e4122f0da851c50750e67bca -$BLAKE2$f8b2476c7b1bb64ccd6940e0cd2bf43487304d7f66298acbb5c55ba5954e2833 -$BLAKE2$0152a86080d5d81993950f65ad24816c96c9aa3dc5c8fb1ac2ef2896ce7f25fa -$BLAKE2$76f68688f6994b86b700cdde3b91dc200b0bfa66885c2a07f89788f7ce17b115 -$BLAKE2$03e72b7059c591ba0496b9df64cdf275fe4f5d57be7f43b645f9ed1df8fdb0f4 -$BLAKE2$2c08445f590283992f7f674eabf98073ba63b98ffa84cd9b99a3dc4a9eea4104 -$BLAKE2$8b4d516f6a292f13e3724e63ea16db9075bc3a5f2f9e89c4578a6252c8487d48 -$BLAKE2$d379006d336835438160622121e2bcbf179af9068d040062c505a69de2ca231b -$BLAKE2$7b866d188933ccc5dfc6f79bd6366c759f7661ff500626bc1b013b6947eb5831 -$BLAKE2$bbedcf6a6e76c2c5a1280385a2b128b968d995d4f39720d2cc9281fdae095a5b -$BLAKE2$4b9d03d17e8b1d3b1396c587ead71a287b1500089efdcc9187308a277b2155c6 -$BLAKE2$03cbe79aba81e2bd12e5f5dc9ad0639a9378413b15190b8a05cdb3a16b410771 -$BLAKE2$24670b3dfcaa95bc27d1428e62d771de5509e0328787555b9e9aa87585db1b10 -$BLAKE2$8a0a605a1d34d2519bad5f376da059b2c02c06362ecac4aef548e9a98df3e07c -$BLAKE2$9b85d11b75ded647c0ac83fe56e444cabd447906ba71b15373b07b14dee39182 -$BLAKE2$df5b62c942121f6226e89bc08949226027803958d6e8f39496d1cfb971493483 -$BLAKE2$298b0e82711cdb7359cb8268de07f956cab08222e0030d9f8a5590692eac47d5 -$BLAKE2$961df075b5e1e6267dab94ebe237a349d3e32081019ddc7d9b0667bbadab1718 -$BLAKE2$64925664838af40e90f514e7a118be11de9d44023a516705955fc408581e97df -$BLAKE2$db72d44e69236b37042ffe1a0044c6f3e10cd106c63a06980f271fa59470b3f4 -$BLAKE2$6479e21642f5163b4cb35caaa639e55df18b9b040545b780a5e28571e5c3cf65 -$BLAKE2$ba551366ab1d92ba483692222646e79a9716d4280f52b2918638be0ae228c941 -$BLAKE2$b8842fe5ff138642e12b3d17ef388d8415a1a491aa5b041500e86de127d96a60 -$BLAKE2$e7ed62eab1512a35d23cf11c8611c9414edb0400932f36d0302a914307f5be5b -$BLAKE2$b49ee38ffac14819104036a016ee5f2833ed3f743909cee679fb563178565737 -$BLAKE2$0be9e34669ed2907ab7f9358a28439ebe069aec95e859c5018f16204b778c0ba -$BLAKE2$888097b78d3bf5214ddf448ddc78fa3afca8eff6f4bc23ea84ae8523de6f27c3 -$BLAKE2$120bcb536d799df1476bcef64eacf67d33eb53f57140a56a7de4861ef8afd636 -$BLAKE2$454c64974d780de7e6890461c8dd9e34824bb44e8cd1c3de0d8f727d53123d4c -$BLAKE2$0d33302c103d199d093e3818a4ad2eda680e6b48bfe0d0224d721d5a409eeb66 -$BLAKE2$579601731732fdca1002d64a9a037837c44e8d3aae75bd3657c3cec981310aeb -$BLAKE2$1aab0f37423a78e1345f30411476e9fa0a3e152523a43a07e6d74ea3cc8f9abf -$BLAKE2$409235fadd2872061457b34c35ce892bf48e555942d72f7251380951de4efaea -$BLAKE2$9ca1c373f9deb41fe39ec7fdf4866ee06b83570e3ef3fd388238d48663426959 -$BLAKE2$7cc48ba40ce7b42373306280efeee2f9ac70ab30a958b5e5697b0b7df0842ffd -$BLAKE2$a2ba4967029c718389f10c6bf20b13984480c5a38e6d42bd20c263084a52fdc9 -$BLAKE2$41a3e0510f79cb03dd7cc25f9e8992d13ef436beb64ea8f6b977df8af6556e96 -$BLAKE2$f6bddb051aec6d01742704121def4365dcff3684356da6781edc4468cfed7e90 -$BLAKE2$119ab7042b676e038ea72d1ae99e1805474f0e09b33dc4f57c7adef3951fdcea -$BLAKE2$8010bc4cc463597d7ad6739011d7d854179172d206a9b7e716ea98ed0859f470 -$BLAKE2$e85f5fd6a65390cfd48432e12ee6c099ca547a2c5f1c54e08f44102f1611cc60 -$BLAKE2$a9cde7fd6a516abff30bfcd0b758c76e05c32683d7f52433c4979c8501f5ea93 -$BLAKE2$a593dda642e80415e495b66e16d5bdeee8be7dd3cb076b8184df1be1f8e808a6 -$BLAKE2$44574f15485d5da7ae2faa002914cbef28996da3a0e65393b412f4d5b13d42e6 -$BLAKE2$33a4c493833df3fff51a1259fcf8cb20d8d4c74d2999bb37355f567c4d15872b -$BLAKE2$59e4448fa3f89955d7be5628664e82c298e83858f08ed092627ac9a0c250633e -$BLAKE2$e2c65a953f92e8843c99e7db0cddd03e0b27d701f033c349ce3ae525de190955 -$BLAKE2$b38213b7f71b6c34d2a75c0b79ba58251223f826d98bed62d8902b7aae286c1e -$BLAKE2$33893c0070e20d2852da0705431ef548c50a4f158308b0ebc09335c9c1deee65 -$BLAKE2$287b450c1e64fde47d40d99160a6814f2856a3246c038f8739eb89e29713f0cd -$BLAKE2$7b0de268c392b3bb82a8d2c01fc58c5cb8437886b6ef5d30ec338e456d5de122 -$BLAKE2$fee08e3483a69a25d61d59adeeccdf29248b4151e8d3e186fd8aa3d3bceba44d -$BLAKE2$d7ed3e24f1672858c4dfcb9db766009bf2bbc742768b68ffdfd2853eadc253eb -$BLAKE2$b9b53865e6e605fe3244198542594c759db8a2c7f77f8ec6ef1400664dfc6c84 -$BLAKE2$33c3792f382447be39e0ee2152bd836c1d939bb560081bfee97f500523841553 -$BLAKE2$8cf71cc32390b5650edb5300fc6a09b9638104c70434d5da1f13471d594125ed -$BLAKE2$8acf293fdd4fcb175431807b8f4560dcc593f8a56040e4185ed665044a7022ca -$BLAKE2$480d0a491818e4c90c9d214d046a80b459645018dcdd4239a5d8d03357981d8a -$BLAKE2$23823aa75ef195ce5f1bac0acda8878c16652c11d0e858f4ef00107ea0336800 -$BLAKE2$323a5ddc289790bcd634c2eac7673926d123af90bfbc4fb4f827144540f791f1 -$BLAKE2$e8c413e19f34a867cc0a8375e9d78f3ad897c2319299c0f54587dbc6dde5159f -$BLAKE2$f3bef0b6a94d61b9cf53621b9a51571ce7858bb2005c9a40f476d2d2d5e5d7f7 -$BLAKE2$33cbee81cadf9e8499e674f0e0dcb8f3d901155f1acbe1622f18394b021c88ad -$BLAKE2$b0581ff689ac8197972e0087540f2f4ee986d27482f3747746d16903d02a0e83 -$BLAKE2$e025091a0e57f93446a7cdf38c46cc22a5751020ecdb66c3e6a78fbd572797b5 -$BLAKE2$f06e05e85c5843e562e779a5e820c9d43aa2b47361e70a4c9fb8354917b6dae4 -$BLAKE2$fc9089fe18504e0d199b74d6616f9ce30139b2d07ff3a3c4c422b13e045ea76f -$BLAKE2$79818563830881644a327148cb7f7ed47aaded782afbd28aa4f24e478a401acf -$BLAKE2$7172bfa6701402cd4aae80f4b749a5a38a84eb1e25b3266bc760d534cbb44f1c -$BLAKE2$b0d90f2fc6e559be6640e1566a080ff40840e62250c01ac0fd2dc263ef4290ff -$BLAKE2$1b1c22577bf5d13e9c9666e603b39025b809a56106d57519bb6a6fd4d993d88f -$BLAKE2$f60436db0565ae85baca46c10c385310b9375fc0ac8d32e0361d3bdf0e30569f -$BLAKE2$8e9e5a2d0242516d47cfbaad2033ac61fbde571aa3b5443455241f767cf3a395 -$BLAKE2$b836d63e7dcf69603843780a5be37a19d985948b4e7f41187fd248afb897c3d1 -$BLAKE2$6bbb6d560949c88c6f8b092a9719bab5e136dacedf65e3efba777b4a5d60ebac -$BLAKE2$ac94238676484e2d80b04ab0f2079dd06d20af206bf6e36f2b9f1670b1133b1b -$BLAKE2$af9a78ff80600e9f8c61aecc3fbc63c02ea858a87aa04c62b4d38f346f21c94d -$BLAKE2$486419662f5693d90cd9577e734bf9fa6b81f207eeafcf97a6ca3fbe7f84f929 -$BLAKE2$3d7b8722caebc629ac4af139b0f5b46cc1a0a13979c7348506d2832583c213f2 -$BLAKE2$3b8cff904f2987d1124f5dc7e52517db3dab3e47cabcb5ac927f351492dbe63f -$BLAKE2$c5b7969f0118521feb28360b9b70b3579b83f93acfef25be12da7c0b60e6fd96 -$BLAKE2$98011816d9c03a6c87cdf6f9e1b80db6986f6a09ee6bb41b85fbfff599ddf702 -$BLAKE2$ace2bf2083cd3372fab3ce26fbccad8983d0da40aed58caf5252c8df3d4f483f -$BLAKE2$64ec6957494dc7f23f9e043758a7034cff646cd27d3e89e5eba735507830ac86 -$BLAKE2$79c69cdd9b2e7f74fb317bc72688f1b4fccb200141bfe35503e906131dbbf60a -$BLAKE2$893bfd833ac55678022b35c32178c6e8f74d91ee5edc60de38e74b59faf500d7 -$BLAKE2$3aca5c20db4743aa9c74c7c308452313a20339b8d4592dd35bcccf20d4994a6f -$BLAKE2$ce50232e292f5aff0f9c4b1abed992547c1c6ed2f943441dcfad51381546a1b5 -$BLAKE2$9fcffdce732346b5bb4407cf98370890fb1e024df3c2c30cb027e83de7dfcf07 -$BLAKE2$0fec76fbcb42d309ec5848405711b03d3f4009b096bcf9676b0844977ba23aa5 -$BLAKE2$d5493231061d970b57675b3b09e35c177637fcfafc14fe7d6e837cecfc0d73b9 -$BLAKE2$61b8d8cc6b8b4e61eac39fe7ca0bef91f0c208c8cb3175837623d75bc625e32b -$BLAKE2$fec7528d885d2ddd2dfeb0a2eb5386c542f97755ce0ec0b194802d09823512e7 -$BLAKE2$75490d03af118bf4993de9e15c861a1765b1fd927ea23d0497973014ee02a84a -$BLAKE2$73b0241ee5ad394b6de3f2c13111d250ba2dfd22f85fb37f781955efc74b55fb -$BLAKE2$ed6063bc1cfa4271e834750f6018d0005a5f3668924dfbfa757b2f892211579d -$BLAKE2$652e530edee5893b576f72b875ea1c918e85e29d859e7e3fa78b623d8abca3de -$BLAKE2$01986c1d10eacf4136a0f65e0681e9a54e86b6e8ec9c5518034cb7f4b6caffdf -$BLAKE2$08e046c66bc1b9002629de7e8cc832ff2aa881ab763bcc87d0c5fc0c8e307248 -$BLAKE2$4689f057807254c08974172c6daadff3e00661612f84e142e04073630876f13e -$BLAKE2$bf54ea2168382e5bfdaef7a6974fa3de72d964e986fede6ce34250d7e444040c -$BLAKE2$3be4a9027b3a3d4d9d1e11697bd302c04c1b53204ab648b8259b5a278beb4f85 -$BLAKE2$45340590ce89c4c1dba706ad95a1e0659c1e169fd5cd09dc028d3c7b816625c4 -$BLAKE2$8b2632d59279efc3a7a2986b3c391fa5149f1e9e3438081de98b798699bbae74 -$BLAKE2$9287a4b82d570eec913302d857de50aa41175df70adcf1fb13aeeca166d1a0a4 -$BLAKE2$b5e914d742755fb69a38eb891c5ed96cc22121267de38b6be3f3ea2f12feed39 -$BLAKE2$fa80eea6eee00712d0844da005fdb83d35c1b569395733f8316939b6969c41e7 -$BLAKE2$eaab955d86dbf396482a32d33782f1fff6cef0fb37ee0ca6fffb1beae40de8f6 -$BLAKE2$7f1f4291f68e29eb6c97fc2f1c0ca40051331a78034cf885cbdb486972502ae8 -$BLAKE2$d93c5eaabcc590e1c1645ade73031522e1de49c37499c4b338b06feea3095f8c -$BLAKE2$d906e125fb36a9fc1cd54f2ac5d38404c9f63957886aabc130d74b5e187f2158 -$BLAKE2$38f02cfad604c899a6a4769016f455cabb7908b7d2c2f6100325b3e7b9ed1958 -$BLAKE2$6c6264d8e101913608896986b51e7023abd4402ff08a5300f9a300c0cbeff5a0 -$BLAKE2$930e3d41f391e89059fec25def2fada1cd9c7281554275badd9a3f6e8634abb5 -$BLAKE2$81d7dd368b3fe9a1d3c18fcea48b783e2d7b1a1c06745e89f0adfe3c05e13da6 -$BLAKE2$ed968b602562ba3bcf2c1cf6d704482327c62b13934612f892de4cf92d0fe664 -$BLAKE2$a2d5182f1b2b5f128376bf63c569f075a862cc3dfbc9603dd93d3c410687c6e5 -$BLAKE2$2daf0d45039e1caf73ae06a8ed02f0ca297af5304adb997daa0126f6be5bc7a4 -$BLAKE2$949b013b8b648407e9ab0124d7890763dd0b740ac1bdab0e9f24f1d9f6a7741f -$BLAKE2$538a67c71d41d61efb6c205dd52597c050f30e4d2a258988c1cf2e5a1bf513ed -$BLAKE2$587719ed1be6846b76c55b1fedf0f62424517a6e91d19fb4ccc316f8da0e55f7 -$BLAKE2$f8d595be8c82df44c56cd83203ea6bc6ffd559b0827c4b3144789c118a7c5b44 -$BLAKE2$e6690315e1e4ee8b324d2d03a8c9fd2830198177011ee49029c765e9d8bb86f5 -$BLAKE2$68f0d04ebd6893ccd92a01d4bdea5a3bc9ba314444bc5d1234d62629b7df07e9 -$BLAKE2$7c393177aeb7617999c47989daec84ff20368db8a2a2e2ef06a31fb15ee67b47 -$BLAKE2$7180761f558c7f83b2b75286322179a20900df1c67e864cdc541f4ed97c3e0a8 -$BLAKE2$b53b795542ea28f63bfb5424ffb637bcfe966f70659be018c43396a5e5fddc9e -$BLAKE2$a5955467c532837e86c2c1127d602c853c3fd4dac5eab9610aa76346fd9ae868 -$BLAKE2$e691facd69c598bfa85f383be3531b4578776b74ee00032b9031e3b6a6265b17 -$BLAKE2$3efa6319f354bd951db0aa0c365ef05a576b00975acc8829c47524dc5eae2e34 -$BLAKE2$36391a904c044aa58b5fe9cea180bb30b3e2362fa0c92064d6f24a5ddadf7162 -$BLAKE2$53e7b67110ff5acb614e45f3418f3e1d8eac1b5c904cf23d59333ba9f1b86472 -$BLAKE2$3d456f321016555157074e13a1c392ac6382b6b0b9dfd7d864069c4c03c98cec -$BLAKE2$b0929e1bf76d5ab18a0001c8ab374762196cb7e0dc47e4b19fe2cd5c41c46bb6 -$BLAKE2$d0608aab38f76a84c24a7b71ad5e25ab27825cbd75ef7fdcd79404f7252f924a -$BLAKE2$4e2a49cdc35c80214af9f5ecafe10213a00170869dc9941d7a926bf195cad51b -$BLAKE2$0a155826bde3b2f65efb87cda1bcfe879f74e893fb930a540e59d0ac7a9233d4 -$BLAKE2$59d507983ed8bfdeae7efa93e5623fd561734adffc0a35425d5049b660f3b17b -$BLAKE2$1e0fa2e466698a5525de7e3d4b4b1bee5b320b6e7c6dcd54bac4060120509e92 -$BLAKE2$5e0823cdd9d1efd400a3efa94566fee45ee4b6e824261683d8654d237a8ab251 -$BLAKE2$dc4b22b3148c33e07c4210950a31d69245375b2562f5d74631e4371ee87ec666 -$BLAKE2$64b3970cf1d09103d2f25f94cd95e3fb1fee8fc105ee6773f48febba66c1de44 -$BLAKE2$4e5c718fa65c35825df637ca8eb16000185cb34d806420c435af7cd7e88f9088 -$BLAKE2$2333d366154ad3648e3b41993ee968a9c2069019b7ceaaca4ffcbda660a5384f -$BLAKE2$2968e7b402ac0b5cdd449cd3e0bcf8a5a64765cf8cdb078cb1f19ae82b06aab3 -$BLAKE2$8ffeec150d7f95a3fa974ef5fd42dc507907a4606fd66b28a2380831b81a7041 -$BLAKE2$80338e292c9e939e2f31330611a11b64d8588287e7dc5c1b9fa2833b5b7c7357 -$BLAKE2$91178dfbadb5baa743f24b333f4a413471261dacec663878b1b91baf2b230b76 -$BLAKE2$65e78ab72344ef09c018e2af036d5705ae8eb6ce5a26fd20774cd2220f1a04b3 -$BLAKE2$0578a014319eb0ad0d2a87c9e8ce19b0b0da49932137257fd84140219f53f080 -$BLAKE2$5688d3c8f3505ade75ca89ff4777b76fe007c93a610266bfc13d4fc2f43918cd -$BLAKE2$3f76ae440efd61f0af0da06e6082112d87640a4042ceb722c0e3f2d54f177149 -$BLAKE2$18a6b5111846d58440fe644ba96ae72acc30824687bd40a18ce40f3e758039a2 -$BLAKE2$5e62e397455a50d3d218590f4fedeb6a8dee708c3b310fe11f7920782d98b956 -$BLAKE2$87c2f94098a9e22e4c61827bc2c8ea02a9c466fbe0aeacb4ab171ae11d820554 -$BLAKE2$7c7bde6b7187cd9af5622843e2d140397e86f08e1b325fdbcbeb861d113c3110 -$BLAKE2$dd50e9f4e074015b62ca38a54bb2488d24ffbc928e40acaa71ed5c38bf6a5a04 -$BLAKE2$5a6f425bb0c849a781ab51f3eef1062e624dbe04fab4cee15f22aa926ed2510d -$BLAKE2$282965ad7d263c3a4ab813a1290901a982e22b842c8ff8a2d0088fd542aaa524 -$BLAKE2$6fbd3f8db4d30309cc4a7b2d9e6970871845e5dc5f5f7e46d5893fd5a1fc05fb -$BLAKE2$c4751cd77815b0e20f47f9741d2f3e47194629e975531bd4d826bc5907b82f8b -$BLAKE2$3c594c22afc4621bb398bce521b8a5d5890c9298d1ca75e74be3865e9b3e490d -$BLAKE2$2002db7a173ba4634de7f3a8f5d5c71c411cbad2e2b83c9c7e07c3b0b50e66ce -$BLAKE2$febe60b44de192e848846b9db1da1623532ca7fcdb36018e5ba14f1407a49c2a -$BLAKE2$3f9048bd29845ee46e4a49e9735d2e75559d3c134e8ddf9373a573cf7639d77d -$BLAKE2$9a83c8959db31f57bd3d7b44c85b7533019cd92d9160d4a4089a12d0d7c68026 -$BLAKE2$efdd65853b064a109c2def6053afd0cf07d677224e9e48b1d3756bc0b3b93b53 -$BLAKE2$3574c6c7d378898e4cafe2c4c1e2a0827725ab1e1a52888b9771d672ab0655f3 -$BLAKE2$cde6654f33ae4298ebf4d53abb0187bc063320ef4e1a12fbfe7de4a389f04a2d -$BLAKE2$e540abe5f1acdc5ad5319f199288d2be68c89fcd8a10f4358686841cb3124be0 -$BLAKE2$9e53b5275acb8564d6274cc484967b740652d858337180cdae37054847aaa2d8 -$BLAKE2$5574fe62a1c99686b2565c408a54428135cb556e16f24f2eea59c57a7cbacea8 -$BLAKE2$207f895181d964f72068aeb45a23d2d6ccfdf9343acd26105cc5335155f19896 -$BLAKE2$46e2fe963948f8d31141190e0cb7ca894513b479387576530d7ed1320dfc6178 -$BLAKE2$bd8d172213113626bfd2a9ebbbc859fc1690657ba4dc26732ff5a93775561071 -$BLAKE2$37e9e0f5d86735c51ab1a87e1bf45d32ad1434dce8aa5c21dda2016e288ce12f -$BLAKE2$049ac209613c5f09776970cfefbd86fe6f4510927eb5eb6077a4813d79186f79 -$BLAKE2$b949b6ad37926a0fdf6fea4c7ca516f4ea7ad27e547afc138209bf8749237d10 -$BLAKE2$2706001e1dc5803f991be424468a7b84af12bb166093da61f293cabf3bc2fb78 -$BLAKE2$f863f79187f035e1d078a3cdeb714e051a349a82f2454c7231e807a9a2efbeba -$BLAKE2$3a5ec04a46ec2d905bbaec9653cbaabb79ac43e37f7081cdb6e89e1b69cf99e7 -$BLAKE2$78c92111d21f3d8f6a0f4b9b3c25f4c8db22414f2848e5e20795aadbee5a4f23 -$BLAKE2$9b4a4b4d414fc9afc67c5d82978d2c27e620f24b359953c9982f576f4cfa23fc -$BLAKE2$f52e248fafc6b9701c371f362ea79f2056c9d2da7c26fd40d23b86012b65f924 -$BLAKE2$ca038df2d3c805609a2174bde2ac274ff8ef74f33999a2e6fc862ffc6407a8ee -$BLAKE2$875c4c5a5d466e78752d59d475c89e9702449e65adfa529eadcbec0e06452bc3 -$BLAKE2$a3bc7e65a8f379069b587c8542436a9e520a3e0c0a1d392d65f07753540fbbfa -$BLAKE2$626aeabf317c32b3f3997ff76ff73818515ca85e5630941f6e311a327023c9fa -$BLAKE2$345083deb54e99d43195872fa21882f4f0fa3453d3d031198f1b324a9449aa58 -$BLAKE2$b5135282f6fafc4bba09726951896e784d692e2d3d940d21c160e416b9783272 -$BLAKE2$085adac994ca9a6a31bac3bb1fa3df81ea39f8ea042fa17eac37e97473003dc1 -$BLAKE2$f098c8d259af820926bbca1496c3c359444fcc36f86e020f3bfd2f8dd3ad9c59 -$BLAKE2$2953cc95dc62af0a5cf11f6ddf31b63c21ba5d320baf141ed2d818506bb821da -$BLAKE2$1da5f77d42f375a4645efa990df2fbdce40e8f11b5808a0eac54ce911730671d -$BLAKE2$2236ca12e6e31bea4a44fa4f67ff05fb444098f986093fe549cf4733659f82fe -$BLAKE2$52ee0be10fe17ce449cd2d228e19a6c4def4864e23acd527808505ce0e789e4c -$BLAKE2$974d0d5b7549390f27a7a0b11d181c4aa3c429bd83799e756d85f635ac329764 -$BLAKE2$7373280ae8695037ceb9fc1aaa75c7b5c10d6fb523ea3301bd65d81788f82a8a -$BLAKE2$6f8839ae82b7e03ad2588043c694b6c7edcc39b7ea68916c2371d3ae3494ec75 -$BLAKE2$e31f09be7a566168d760a776ff1269292d5f42e6d38af06a203365e133530e50 -$BLAKE2$b0d8848742d2d41f859b5828bdf5d6df84f3678b37d1c1cbb716dec13868bedf -$BLAKE2$9e38c84fbef7d15e7e7f2016076e4f1b4c65440599aef83afe0a71bb8aa77153 -$BLAKE2$47e839b482156bb1c82f274df937ef5dd90916efea02e108de65e1f8ed22e415 -$BLAKE2$0e2887ab09c54dc4a82ee76abd50db9a109a1290729179aa09bcc4582907cad5 -$BLAKE2$e90a5eded5e9f7ae5c65d0ffbbc1ec695455e6c91ed0897418aab6c13cc06374 -$BLAKE2$95ed24e3b2ee9e9ce5457bc40a0934466d187d9b35c33991a221262cb1598f7f -$BLAKE2$104ea23e86e5287aed53f9a431fa0ba2443541b24c9b2e8ec5e98309a8dd4d26 -$BLAKE2$8e7bd21b016032b906c0ad7352113e57fea0ea37e9f637dec4434de472f43e55 -$BLAKE2$934804255c453972da99bcdec2e4d99aad2c277bc7469bb335d4a835cd32e529 -$BLAKE2$031cbf165ad350a6e2c7d5fa04f3c03d31eb91368b39b1506adaa6cef9c3086c -$BLAKE2$4b35f5862ef53c672dbf8b313c8f0225fdf46e7f404b06f61669000756be7751 -$BLAKE2$e7f88b81b336b04395256eee73b7a60f6713db665351c8078aed25f5ed8fdd99 -$BLAKE2$0a18ba9040c94bd6d72471a221ff016ceb82de69752c38ddd7952a4efd6025f5 -$BLAKE2$06db81a4be2822fc52858450e9e9100fa2b89fa5e09598da325e17d4dc1127a8 -$BLAKE2$be8200a007952a68dd7407040028b94c0080544e68ef6239aba7e40009efe2f8 -$BLAKE2$b9b8040b08920fe3d8379b282ff65aa3dab42b91397d228b250c7bcf56734228 -$BLAKE2$a8b395a6f825ac658a69bcd6ae80a2e91770852e70ad688085167f407c798063 -$BLAKE2$7912e75f9d076247398b58b48d5c008807fa4668b5f9a7f267239ba31b641e0b -$BLAKE2$666a3bf29564b3daf0f668870c1f8d218196da950077e766762b0653a847a77e -$BLAKE2$c952b8bd73692e5c7ef6c66f00a3b1fbe46d7362d785d2063b48ac3787b72b52 -$BLAKE2$7b6b97bd37214d7f85de662a59b63807a11c1337502d2fe6378d3a1b7c6b2f34 -$BLAKE2$6efd1a5b1982eebdb1f0878e158fca1bf7606417920f728185e94cd09a0c10bb -$BLAKE2$be2c187d29093a4887202a7ecaa09be6d6eb32cd5bab23e533f7d903663e4db8 -$BLAKE2$121abdc19e79ab77db06babf454fe8cf309215fe70a1ecb2e71c2bc04c590357 -$BLAKE2$3e482e5657458545fc823a9bd3fbb2640602be668df7617d49d046e4ac090116 -$BLAKE2$d9e0cc2020aeaaab71ac6247b31ab3506ac8709d7b62a7d01edbe97050ee2db5 -$BLAKE2$5b811e5086a5a60b894c87074b90d80ed4138e8bdcbfefad3bcfd71a49733d9e -$BLAKE2$ae91562e06aabefec841193e9cd87207380068014d5e4f8a9e9c7bb7d8fc8547 -$BLAKE2$4915b02d60b890812261f5f5ec8cdfb819b6b0275625d12d5a01e269bd41a4b0 -$BLAKE2$d7c3f784cdd2d2ab1948e9df4daefb2697958630d66f541c1a704a4f479a11f0 -$BLAKE2$ff12b0795450cb0e4b23513031d7f409a5473517e1a700bcc30d7062ec62783b -$BLAKE2$580e72783b73dcc4b9fcba255af89571b94ae4a7c662da40c87a4bfd68b99b92 -$BLAKE2$72111e378267af6248f2e11e7bbad998686967026a0c8960582d343d8ed1e8ab -$BLAKE2$414f47ac1a8f16816fb8af23af8c17145a619ad99d2d0346a827b1a18997c88a -$BLAKE2$a50840909dbe7acb0d8fe0be85514cfa8d764c64f123b856fe55e6f84deba436 -$BLAKE2$133f5fbd7f7256148e34afde7ab858dc01ed14b18ab7b9da84f31c653c3b960c -$BLAKE2$e2ecca65d1905a278b976ad9b1f4775b6c3d04150ff7e92ffe02f49b9e37baf7 -$BLAKE2$7737f32c3a90859809b8dcb7ecc6aaa9ae71404bb0084aa0d908512d80de025f diff --git a/tests/dico.txt b/tests/dico.txt deleted file mode 100644 index 8baef1b4a..000000000 --- a/tests/dico.txt +++ /dev/null @@ -1 +0,0 @@ -abc diff --git a/tests/password.txt b/tests/password.txt deleted file mode 100644 index 068d492ad..000000000 --- a/tests/password.txt +++ /dev/null @@ -1,3 +0,0 @@ -$BLAKE2$508c5e8c327c14e2e1a72ba34eeb452f37458b209ed63a294d999b4c86675982 -$BLAKE2$2c719b484789ad5f6fc1739012182169b25484af156adc91d4f64f72400e574a -$BLAKE2$ba2649757ec72ed0b9bd8b3063687767946145f13abcb38e2718fdaad6c771e0 diff --git a/tests/password2.txt b/tests/password2.txt deleted file mode 100644 index 0735e7e4c..000000000 --- a/tests/password2.txt +++ /dev/null @@ -1 +0,0 @@ -$BLAKE2$ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923 diff --git a/tests/sm3-test.py b/tests/sm3-test.py deleted file mode 100755 index 7a8be7503..000000000 --- a/tests/sm3-test.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/python3 - -# need to install snownland-smx package : pip install snowland-smx -from pysmx.SM3 import SM3 - -# Python script to create dataset of passwords/hashes for testing - SM3 - -PASSWD_FILE = "500-worst-passwords.txt" -VALID_HASHES_FILE = "sm3-valid-hashes.txt" - -# Password source file : https://github.com/danielmiessler/SecLists/blob/master/Passwords/500-worst-passwords.txt - -def createSM3Dataset(inputFile, outputFile): - # open password and hashes file - passwd = open(inputFile, 'r') - hashes = open(outputFile, 'w') - # for each password in file - for line in passwd.readlines(): - # compute SM3 hash - d = SM3() - d.update(line) - # encode in hex - formattedHash = d.hexdigest() - hashes.write(formattedHash + '\n') - print("Done") - -def main(): - createSM3Dataset(PASSWD_FILE, VALID_HASHES_FILE) - -# entry -if __name__ == "__main__": - main() diff --git a/tests/sm3-valid-hashes.txt b/tests/sm3-valid-hashes.txt deleted file mode 100644 index 7fbf09fa9..000000000 --- a/tests/sm3-valid-hashes.txt +++ /dev/null @@ -1,499 +0,0 @@ -91a6eed57b1d72100cdb2a0c5bb83e8cf764d7c08eb257906d119083ccec51d2 -2dad53f9d5ac7170f049b8679309e64658a573e475bb9c12d50f0d5368e85abc -ba1acd8697d133eb096c5abd6becf078b825f0e0671b5bd9ab13e1ff4c879ad8 -2851fa25211a48023794ae9515909603da80e405a4998c351b0717093cbe86ab -be59ac5b4fdf08eec25b056dbe3d5826f2c802c75bcc7f323efc9f22e51ef32e -f3f23d4aed55260d2b35c105ca0d68b04eb4e4d983533f52081c5ffd6123db58 -73632c6994116149124991e1d561473a4f053269e01fbc57341ed4ed10ccce2e -c7bd1b69dd9c629b3a9c7e151f30a708e440a8ec047ef2860a4ca6b2c6843f06 -563a4b31670cf55a7ac82f504299976e0e0055e0845389cd8092efdfbb58d3c7 -abbd8dbfb379dc2674b0f470868fe7e187eb5fe1a425394a7d6eab65a7b183e5 -b640b11f51e9c049b260d24ff37eb2946ca96725768f267202c2a15ca8cde28a -66fcc1a3b5e43ab7adb86a9165ec08cbbd521aa759706ee9b4cc4b0c47dc8f1a -92e4ac6ad0fcc66f3a69d2e9f354c317e2a00b3b1b6469bf6556bc6adede7ea5 -8eaed38a7a6feb181f73756cbc3d55b739dbe64e5796cdb209dece09cff39bb2 -39b955d5b82a8d2edb4fa882acd2706854d9e3eadf4986f280a1e4b486d2dbef -0ab2f2a0916d77dc1a4c67a9ba8a3ab07c06996d5b4f4e1495978f29518f80b6 -3a4cb4d39364b8a75f2bb7d1470efc2a1273801e14587da3074ed8e94203b1e1 -b136036b0f17776dce03a0f6c3840fcfda5de75ef6d56c68c8d83ad52c294b5f -fd5cc9e527a43c0dbccc3fb278f4da144d187c307e8903f7388e26812fbc3c1e -eca7b52a3971fc67a227fe129dd5c2548233d19e8d46cc18ce8b42ba18eaaeb8 -5d816a7ca91b7a0a5ddf7cd2240cb0c2546d36a2c57b23ecea14302eed5adb78 -e912e6642a96c1858b2f5d888ca9530137a2b9dccc1ab60f024a78e68b690740 -844509afb66cae151127f59c8f03dd58f38cbb1fec9775ad141e80fdd49554b6 -b32bc30cce74c19d9181a96d60c0bb5506f5f06e0379cfaa1f2ac60ff68f8f5c -bc39c6f1606cccc1573a907007debb1fc42e18f61a30061f46a37fcca80cf8f9 -da7161c56946ff85f98eb79002a639c89fa379fd6bf7273a7e32ff28b911b2e1 -777b30baa39194fa626e7eee8282e1ee669e6d6c014699e45d5fcea4999940a7 -de4bde29725e0eed9d2e69e8c6521c5fed399ece57386eda7370779ef186c0da -dfd8ab0fd3302830493b87c2a6f9dc262ae813993842c0de7d09748b0314be32 -d583e38313ef3fcecbe58271326ab9e79c951a90d0577be4c2456fc5d1e8ddfc -e9fc1e96459a887c8b0e833216f248a987b7adf222f44171505f3ec91f2717b1 -36a686ca4915aae915d8bb8a786f43dfb98a1fe858b0b7ee7aebeb47b8f2fd7c -7ac10e5bbb693f5fe88a3912503d65ffc37db385bc53e69f20f82a57f63bf71b -70204277cedf0bd87946c77af286d5b389c65b0b0cef31482e66ad6acd6ac5eb -b2eba89c4b09cd97ddb448250a69e6024e05a0d15748456fc5ee8d1a719dc042 -be96fe8cacb16a9da906a3885c7e65a3a7e34eacb453ea154a88d187a53e1d73 -0046c7842cdb0ed2cb830c3219f010a1dceebe334ec6eea44c596f9cb5e2ec37 -9ac8a47b8e336bc51a5dadc89ba70bceacfb1f4d9742976c9227708f8584f8bf -79eb8233922522e35927a32ae3ca085d3db0168fbc373cdcb5fb781fd012742f -52d0a833d647d575745d6c0533dfd476f36cfbe85233d9f4dac2709bd982abda -9b361976c771019a692558354d1a3e4280b7fcec487c7312c6aae8e9101494a8 -9a2bd1b16bc90c4bd2c3256cb797ba9b1f42cba12ab2551e2b5d40dfdd2f687c -560a693fd10f993492033630743c26d223b83138f3c6c6f5336140a190a7f8cd -368464e0b2b6a44292b6c3b1e4a5e095901cd6f348004376ab654ce70842edf9 -e0d7e07eec3f10795e622b75b9d33681d09af2d0c4b660175b04b80d6f07d243 -103bb692af00a89c0b74d28f5cf5cbcbf334f6be37eb9deca654a9cca5bc06fd -7379675a8d7f2aa4282bd2bee3e6cfea2a761deab7e3ee7db950f0b266261194 -154e4cc42b68bb6b4d3d0f99852139a9bcf14ae3c270b39722e9d64a2aab9874 -248f049573f2aa1d3b9876a1e210c41facb3fa4ca6a71eb376c96d746ab6715c -df54e67e38cf39980187bf0405d2a4810bda65ef6f69bac87497d41e9d4c9aad -90b2619b05f8fd2d4f0f0815ab59c8092e54a45852a8ed768635638fd0b87a8a -527d0c5d653980ef781a5c6e1f640ba810ea24134f0763aef14fbdeaa85596e0 -a4cce21e5402a502e9e3c9efc5b567231900ae125e1ce1447d6893118f434d26 -ee41b5ecc50ca025ef400677285fae52d57a8fcf105a3fe48a09b0597f46216f -59ba7587242a902b51cd1009f03d999db8c1d5ed56355d2ac55d6f7072a60274 -cab5d435ec21810b6b644df644ebd0884e2aae7d7f620aba71fee083a94e0ab3 -8e73cef2dcd6525a1b3ea132aa1004e39c8325d0b52284ef04bdac75f1f845c1 -34e3d688250e8c299856f1b4648c4940663aea686c4e4141ca2df28394e3ea2a -be0c2182267a763ff521bdf9a76a904a36e30de1ef0148686099da42fc0d89a5 -16a8fc29d7c0a815688a42a0faece2c120265facfe95581f1ccad03eb0bf82c7 -923a24256713e740d42a431e61953e497883de5296fadfff7258cc684d0d09cb -e0152d4b2c2c1337c3ece743533536e0a46542760dcc890ba592fb70804546dd -bad4f2526ca443c1a75b0b555a345756622fae88dc92438c95ca0d519ccde701 -3fab911772bffa9c3b706a5d55d17609911b6ec7e361947f0a709bdd4897733b -387aba72e994d4ad4727278e51c626e673cb58c4289ac04a2b8f95dfacb6bac1 -2a9ee7df1da03bfda2e336f44dac6fa898dccd5c401c95212388daaf4b0fa12f -11b316bd422f0856f1222a29f16a689351386b72d05f73dd63a086bf37cc02ec -eb79afb56a8cd0a43ba98f9a3d7663ec253a97cd9837ac709525d73ca1be76f2 -70f48d7eb4467da45ed386b5eb029501b2cad93c2191e15bff749784c5789da5 -b67f607ee98c91f78cca76e575d2e5f1828b79aa3df1f1586be2c1a791d88d05 -1312dbb821931c777d286ccdac8bfd98ac5c212335f569aa69c076b7882e65db -50dae9a4ba9e98417d1c69b0982d4e6357bbb91a8276a349ce3eff05f376580c -4b0fd50755d4c599176424d6eb396372f368f9a386cc94e9ec4b5afdc9e692e3 -527ac6a05cbe2585edd865eeffe129d453d10a40dbe6ef299e0c89e22cd5208b -831709978181d98c1ceb3ac704e4b7015520f300103ed1ae51bbc600b33eee4f -2dc033fc05ad61bc02ff80460cd67ef120a44eaca75c69f59f721cd48b48a9c7 -c91a43079a6d8d481e8beb685064e7c7c4b62e7049cdc5ccf410fa282d414b09 -2d0b38747b3ef9853fd2f0f908d90ef55c846fb660a34a83cb179ae4a4b3eabe -9a4ac448dfb0ab539118436bf7c58a35840d703479bbdbe6315f2041b575a445 -a1eaf04e7d7011ff58dec44438e522c5ac2e5cbfb0545813bb819a59b928ecea -fe7698763c5f4d87d9a9e52a8ffd45168d7a5c5db2a934d192a05baaba52e382 -d3b96d0e9856cf46cbd12682f811805d65eee52b2e0ca5e813e3b53579b86542 -1faca700ba062102a9c2b6083b27c959efe2f46a40c17cec664c879a12519e46 -928c66bd63599b81f62e73aa4436577c557596de5abd040bf71c306313931121 -2f488d7f01ee72ee8cc4cc00175ffd8c01f2253957d60a6eaa58e31ed6b9de6b -de1a8fdbfb026340dc738fe03fe6d6199c5d4b23b174f93a1e6e266b21de0f3e -721d41c6a4f8315d1579ec5ff69676855b8b9e83d7692207b57295ad884e8931 -91fce09d6230ddc038ca233f456201bc1f53510bb6368706a961d588e7e98350 -c293e4e40c0626e43905a69232eb19b2271ca293c9afc9ab91100fa15b8e4b7c -65e512368df4c011d8b459abff79486df2bd28f218069a06d5f7e8e7f366def8 -002fcdcf12700eb6a2de504d3f585035887e72fc03b9c6e7ce9d1a7aef053eaa -598f1121a6eb0dd3be91f6309db212c5fa03c273b78777bd72af176a4dcdba51 -40323c03c362c6ce4e333fcdf291d233896804ba3f8e391872396e20c55335ef -1de16b8eb4be0f0eb37ecad5ae7680ed010927bb8743331ba594b84d5e33a2c6 -297302b3cecf9815e087e9e8a49bf203323300d48b3c1bd2ce8164ccf83314e0 -025fa5e4cd34cd59dc5690ce834522e2e08e53e2bbedcd0409521cddaa357f82 -965365e14a920d7d2c0a38dd158d4ddb0ea32e33cdaa62ce149ad1c468be69c0 -f7a87a195b0cc0052b9d598482212ceb07e4ea60e8d139a5dfeff36c24abf2b3 -710f4dc74907f8b61312adb89b20740d5efb1cbd69c3ee4ce8a1145e80f0a073 -cdbe2efbf726f16f41d995946998f9e0af38b1fdfa320e4199655eca236ee27f -abbbba8b7b49fce719887a4bb29d32ae014d4296ad40af7c46d639e34323cb84 -70bc42e66d357f2adc8f37cc8d7fa316e7f94d2cfd8ebd2f1fa1561f22fd815c -ffbcc2d98a8b720d9d1e866395b56b443ac4d027ab02f8e3f6df8c223d9a80a8 -efd689bc26a21f6698a1ecafda892547f35406cb936ec73c8d73334f0b5d441b -f467ff28b10d1a9adf6c1dc53e97eff2a17a8b398093767a8615a3b72a7e29f5 -22ac5488a6c627802f705e33e106aa22568a69e3c8db9069116404456d59dc2d -6a81929ba5e51b57177eddf42dcd273ef5a6bc526ec663db6f0e65aff4f5585b -0b739e0fd20518152dd21340e6fe163d3e80ff609427466220586186756bc6be -4b35ab3d68e09055fda93076f99cdf0851ec52685f3a0338fdba0a11b2256c6c -d5ad664831df64e90b24193d0984e9fadf073625e0f80cea7bf194f4004a26b1 -6032fad1b4a5a061aac602ee3f8817911f0423ea19293d00e693014b88ab294b -4b1f8fa31efe18c43d5ca727c7fbbdef3b330cbf779144f23dd6d2443e2fbe31 -08735ba25f29b6b1ce1f2b81c563d63c8d96a675cd9da0480c9857485082df2e -0452bdb72c828448b9022d67bbe235b5d11a9b7270bb7ac76c9cabf23a5a36b6 -9fe8fe25f68d6105204ba56ddf363a03524981f35a5ca3acc421c444299e5dd3 -9a9d3693c9a3a3874005725e73722f1f6e74b97af2c701979a2853a9a44c4ecb -e4bc2725e617cf2255e00f5ef186f8d18d7516b6e62743a656609e8a17f750a2 -525558247f86f20748185456096eb1200603579366cc27e7e13283fa1dd5306d -b0923bba1279af8539390e5a65317009ac8deac1c661e23f60dd0bbb3494d1aa -745dd9d5a2a8e883bfcca7a1962ce61baf6448a5d282d5535cb08e0605ab4c15 -0c6a3316d4b5eea818043482be67075a3e6e0745883782db658308dd1283ae6c -bbf081f01a72da14ed2fb6ff398d369bcf3de989f08e2fa52b4ec061c7bb4c2c -478641e1e570808b6cf593cd63f308c28cfb466658f28029a02beee6c9cdc870 -3cac0a24efbe467899d81f0d789fbdc668fe9eb34ce5f350fd539840f40d288f -ca3037146464c76bcdab8dbaf0ab630f83b499f46183fe12a655acfb1e6426ce -768d3262e894500aa693affc11c59c3df1cf4510a238d630c01c820927b8d9ce -d98de59dc1814d10fd89ef3d91d513ec9e6a5700b16564e2e5a2a66aa77a535c -f98a18397c45cb5d2744af9c70036a5521df3d8a319e29202003528b73941087 -c3050df45fc371c8e32e335efa6abdc2975b48578584b34802312023d1c0a216 -ef9ac2945c264f3df779b1a4b04015aebeebc0b019094516371ee2a14bdafa7d -12db0ebba02c57705fea7379bfb67f8e5d8b6c4618f3f5100173f42463e06591 -9d77570a1cf60ab3e8a0ae2f387d5f686dd6a0b4f0d239a9e3b1deec69e11e44 -463a97cceea4ec077bbd1d68426e857a4b1fe348600ebaf02c3aa010a5a6f235 -6539ed4f15d683ef22943a9a7588bc6f5951fda6a0dc482fde32c38609f95bf4 -3594c2a93524d46bd62e40344e0f0667ddc83ced39307dc44ea99c1b374cf212 -695b9a71ac5388cb3d02cd0ee84e542f7ef3b832558440bfc39e1dc9fe530997 -459999297dc71006faae981cf571e82de2681072ee3a1b52e8dfee8879a512b3 -c4941d52a175c66291421bd677819415712ccf86a8cc94b4a9e0c516714c35a8 -fb3277716ebceb1b60282950174dda842d2161e4ebb3dafaa08a2353231b6195 -f9645734a5af2ef7ed72c4114069cd48d76dee60a9ecdbb702d9e602f1743e9e -aa6a87879c5791ecfb3caddccdb7d9b4ef4ee72f0a93b42b93fdffdd71b2c979 -f68e60c5a826968d38593954d06b0970b6bda62ab79369866ec860d64ad6482f -15d2b2b88b84851c0662956aa809a8e1ddf3a302245088c37549ad8bd5a61f3f -2dca8b13a1ac51066a16447b678125b2e6c0290873fcbd9ad8915344e164f264 -387a44769600245668395164cb4ceef8a487d8bf7458eec3029852c17bf80cfe -202f01d90d81484ea788d4c56f6a2d455412781e2889e8bade1a90d94f6e714e -2fe3c4dd3870b76a540b6bb8e710122d5a4ba5655d88a59c0f8d5b86945afbab -01b82e3a1d6b7d3075a262b98bee4386a4ef6547599b80a68a8ea8713920a646 -a7ed0e8439b9efd51d89eb100215363410ac25fa0cc2a452541efc8e11dab6e9 -2593eb683ff99cdff1e4c95a394579acffcb60fbfc223ae3aceea3e64b49b299 -63262fe891b66c1d3603c39ce4324914fde70d415aab44b57d14212a26859158 -995b06977640c0e4fc07404d6e8711852ecadcf9c9d91225ddc1b9a22a537e55 -41a8f6fa94be40c630f1545e2dec27a836d3dc7bcdbbb23158c5b4040f5eafa2 -7f65c2db175ee3e34ce849ec3ecf257a1adcb263bfb716b14875b2bd5fc711c4 -41d30bd4d9e1b0004d4811fae24585d7ffdf9ad4bb5c8fb76250843bbe36048a -e694b91def2bd4c77c4d8faad59849a0f7274502bb8f8dcc4febcfe1317b0a95 -e636db509a333350bd946ee90f993b608564c7b5d1dea3c8dc285a53a48b0124 -750454e509d093ee54753cc53438f943611a4ed88227d48236b5a46a87604279 -233d0ef4cbf07e2b950693621d742e6e81f3bb68c9197c7e712357e3c10e5cf6 -ea5b8f859aeb22f1768bee05797d9eaa5197e6f7d7b76a3ae0d801a554fe84c6 -ffe655d53995f465c2e7a262ffbc34a01e1d25796836f2ddac0c95683799a10d -942da211ff64bb0109455d4030165bc110928df21ad450a920a08bbfd28e96f1 -0c96df93f0d933b8a088c7ad310f4dfd5961bba06f12459110c045e31c3f4534 -bc32cf52d65b4724dd7dce59afc2132905aeaba180600c14260dda636bbcd4f7 -eae150fd4a807336ae51e23dd3ba01d2c41d261943b57570efcdb8ad52ee3c6c -577f3f09a8fb7f37785058ba2297f6a190cf454d5ddf85904ebe8973d788f680 -3d031ced85fa8919ffb3d2b869515b4ea079a0529da6c32741719b6b29436a82 -aa6bed0d1b06ae1c4beb2db376f91940f837dbe02b2941e0c5fa90335087c995 -5eef1f5ee5f9aa0b55bf7898f98d2eaf983d2e000e238417cabb5c8edb4db394 -3cbf62addf0d5554b8cc2e1de82a7aff900374da6103db47ccb61ed0aaad2a81 -9cb21e0ad89149895ebad140555e1a648e8a06b2b57296533535597d2c575339 -e6633921bc504b40d83883d444e8cc5bbdfca11315992840fa087516b1bde0bd -f502a760d338c3a73ed490eec55f6fd7e142b7fa20c338882ee99a9e7024e397 -e2ce21419d2179afef85234122a8ce567edbe4e3f2b49fc5759a4253f0a69c8f -d0898c679b7c535a95456ad37d4840210dbc0f1bdfb77308e61cebc8aac348ea -3dbc564a35054db266bdcbf51ade746621cb49bd12d8e20da146dcefca7dea19 -02eab9b22a3ada01c74c9f938c69289c9c2072237139aa30b6e3e981e856b1fa -82ff87be9395d05147a1e7fdfaebf5c8548faeb256c8a4ee1cc0864f40070ce8 -1a57b79269051cc2aa136f76a5db7f8a9b078fd92fa4c6473d878c7f57ae932d -8212f436cf81de9ad4e4d5940f5616df7e139953345661cd7b4d0d5eb1bc5afe -aa2333a8e441e3f1d0af9913157b124a28f4e0d3e92764c1b6b393e6152b8c20 -ecf94b595d1f463949c4fa89a4e89b318820e6599128b4883fa8c0f57186af87 -155740dffea4866091197e15df919028feb17ccf786e8c267698ee35553afda8 -11c7071d97318e09377c9863e13132a53df632963044124e67504eebb19772ab -370d132535474b9c46d4406ea780c9902ef5f1c68acd40134f204f2baa8e7194 -2decf22287a9d7e3b80ede0350478b75cc6ff9424a99e535e227d1c7e14cd2ea -078286d1e0c17fd9e8a82d3cdbfb8345d80698d3d4c75ecd45026e724d5f4358 -9082d686a9f883218970eda0bab87dc9cdcf973719f022bed0c808daa4eb8006 -da59f9505327815eea70785d7d247e9afbd9c156f07b68a669f5845ed6bdcdaa -a40b2507ce09e1cd2189f083164d6d42666540c8a6e3c2a7255fdf4b081f5d3d -0832f4533400f8c085e9281e9a87e337e7f8524b0edea248e4cc7eea9ca96d53 -b3e431763d6149d28583f3e234e0a57024cb462c98069a10cded8f59ea46f4ec -9906b44020ac5ca00b381980be68b124a0b1d80ff607576e90370416f894d28c -43e426249cde45dfeb27419f9b594814bc2253d66b6b35f09ff9ce11505d599f -037f0461fe12818d13252718e3ce0d6e641441f7571daf55027020696a7f9ff5 -cf5713229b6a1265a4f72a832648f4246ada8d2f238b9bae95faff0d236ef3d8 -a6248afd1ab3a605f473251cee308b550b0577088f0a8d30d03d8cb4491fdc3e -d8bdc4e5a5fe0448ba6382a6ac2be604921f50a7c566ecf444bbff30ee53a84e -7bee959f305062d919664f67a2f9704d3c959c4fe191ced17370dbf8a5c8b94b -d7e956acc0a7b63978deec1dc030439b1e4b309028b8866f23869794bf8fa19b -1b0b5ce974e50e0201c4885c15444c118d845a578a1d82e3d466085426b840ac -a4a0623dc1c6e91d1033bdabfa3caa1e8dd15c6f6682b249e4c853ac65f55ada -a668516cc3dab5aec8c263c838e32ee0fda194178c963113a059297b09ff3635 -ecd59a2767ba17aa9363e908c193953c5f0d57021c7e3ad84077f62c96e5fa6a -059009e8a2a8797ac95f2bfdc5578501535f1a50c67d297399c51b68a53d9133 -1135a683a6be330f13a9e36a53dcff74c5b91ceccd04c5c7993e1c661472dbf8 -f813dbf71563477610f9ae33fce7d87bbb15c2978a7697d33d5e8fea208ca1c2 -c7cb6c361490c73a7cd74649fd73d75701319ea1b62e183a38de97d351036917 -51673424c45b95a3ddd81d03399c0a851c54705325f5fa00df6c70b15db379c9 -f2fdebc0ec841f69e424b9f62a2a18ed06e6d917fabf97c711dfca02c61537e0 -49326b937b9870bfaa79cd459b2d60001ba09c649dd41ed9dee371f1b933b550 -6fb24e9010b2da98ca57b439336b1c1718b1332c585abd8e23a153b9cf017260 -4b5da20eba796c9333f714e62f68b8495ea5db9ae96078316efd1c4a39687eb2 -12909fa006e0e149b4a24d0eca88b2cc18576098155bd2755019f2360d26f92b -14bcfd78ae4ba2246c1cb95ec37778781b99b886202486ffb150d2e6e7cc640b -0d974b281aa9c678bb091cd328d7442c9fcb96c9b8a04013a3796524446e33f5 -3ab4c6826e535fc59d8f5d889d4a371d85f2ebf79c9ade474010170037cb6d6b -2d048ba67a87d1c1468fd8104133d21bb592b00f2c1d11cd9d90c1f3aecdaac9 -7d4dbbb57c46561d7697851f5bf5bd5a9ca6e05b70933f317aab57540885fea9 -976a16ae818d10e4122bb7364645c44e680382b21112a83f25301d694fe904ab -e59b149905ee08f4cab9bb2a55c3394ffabedd61a33e8852e11b46ea499a8bb7 -fbf712dfa28898953ba7b34c57b6a7e166919e9918dd0b45b55e1c6e79f1a019 -7fe3212ebdf55920f7f663178da7d7460575fbe8b4b3a6656f937eb8cc0bea45 -8b171934bec0b334b40e5488ef6ef9905ada69f7f86da2ef60113e0dca93bf8b -9c4756170e23c3712ca9d8295a834131f40ec48ae08ce7267b37d070f38923f9 -927bb700970ddd5f9c03a7ffb954a907d1095af6fa400c578f7fb54bb3afb0b1 -d96ac5e061f86d40de1ce55e04cdfa3cfd79b22ef08fcc73c7f46a9f7ace3511 -b45f40f68dc252ec9528b2068ab96b9b6b77757bb6fdb4b27eba9f52f5c32fd7 -96270148971bef60c42556ad83631ef785fa575731145560aca62339e7036a2c -3d080117feb31d33d34ab7f87fb0f8b1d1f4f3454e73b75d49c5b68534ef70c4 -5fadcd605d610f81d04da4c4296e6ce2f3877addba82fe09403088238e043558 -01bd2e40b0ca4d8f2ba2d4bc0b29e92bf4c7863aedad4953cbaf52e3c2b3d10a -815123753068312db0acb5b0bbb6eec9ba3415052d4173dcee456fe397a7a8f0 -219e82e5fee0dbad4652345228d6c9911e08c3dd71f4f01e58511b6573b73f95 -e24e3a387ae75f6c4838c24fc78766249d9bedca0c26d7a1c2bd1875daf7392e -8f6f50ffc8c1d91d75051222e6cb3af29f2b204d328665a5ad6990e58559cc27 -7df500d373f145a189f24485bf43b8fd940f9858e5c467490ff1834917784984 -c7f92cfea07a3bed3cc03a2e96ce24111ae01a89d8e6992d098c1183e45009f1 -f80ad92a086cda5ed7bd675478cecfdb43604c16e2f57f71850d1e76dfabef71 -562e59d4fae346ee85d54de040723d628556bdd78beb3fe9f5a4dd17b68d241f -8f887d4dc61ec229888d05d5dc47b4aa0308e932d16b3b0d29871c78fc3ddcc5 -ce71d033666f219a0347fd1dc8f5d49d6d486baeaec4f2660b56280c634ebb04 -b8e89a99f0362a623b959dc0d0886343a77d061c73c4eceb7f42d5bc5b3be8dd -53cd9a27c57af815313f87d1593395265a986a84bc07998ed901a8ece6fc835b -8695b4ee73842aa52a15e6471b54a9160be4fb1adc0dc7adf0f9bb94df2d3baf -0fb304447071686597a56f5f4600340c26708e3833d40ac7464bb152afaca337 -53ce7371db847ced5b52372b069aed83d3c9a33751919b157570a4cf087a9f38 -6318c8f6f9dc82e36de732647e9f6ed94253462c237e1dd421120de878a60924 -f416309680c569b61b8f93f40f3f75981799a683a156268e763ec1711c992ab5 -409120279d466d8e5eb9de417f5e85e905d5de7a2f22a6ce9b831efe53fd8898 -8b4c63229f801d3f52b60702f813ab6630fe0c1c461e1bf288d537ef14435cdf -2352d7ff82e7ac8d48a6990542f23eae52d15ab56375d7664403b2711dbcdaec -98dde7ce017456b5897d935f49d5613acf9fdf7f237147a3c3f8efdcb089fe2f -23aa9c8cf1aab36c86f923208f6594edfb53d72b5c70a38be0853b13b9f0097e -c1248c430cf8e0096ffc4add63ca94d150d2a903636b78d06129e18ff0cf2b9e -3c9fb8a7d02785e3ac939a55a87a4acdcf7491f1a3310c44e885f903f8cffe36 -c836d3a85b3fb3a1c95032e8b22d783bbf179c0a089799a400b3ccda19ee7c95 -42a898fcf398b5b09f65beba5a3410822114f3a312413fa4a17eb6a864b47cbd -f9e6955bfc17d3daec3f96a9f53cdb13feccb475d55e6f17dba1f8176476572d -ea390bbb5f6bd1fdd63c36fb219a550b05a73410e50400f4ba0b337bc0ed0264 -7200a6f44155011503888a69ecb4497e6a2b75bb69f429ba6eacfe70e3d1f97c -fffc0e8315670238626519949a4d5ac2970208b72c8bc043e5eff4d56c3d484e -df17165852ef4e728ab24d84b15473f6347544469fab2533d5225132747ee8d0 -984a2d2d2b76cf5111cebc467796957cd0cd3f8964fcca3d35dfe754a9ee88fb -3172b0fcb1c1b72b8216c99c4fc0765f351fdbe2e875788c157bfa5c8574a31b -1424475106ce38add700b1759957b37b0ddb5a052cbadc77165f408c59049033 -7d5561ccdb9678f131704f4ce4703432e1f28151d639ce530fe1c8eff0c3e68e -416035685294418434528324b062c1b313af8e39c9fc72e8d415778ce354ad68 -066e5271414a3e8577c9965c12637bb2bf416d979cb433f9533c46fb9a14aaad -2861ae632f72ae3c19c33a6b335bce32802de9cc280405ac13362adca9f64258 -29bf9b1a2f96e118036f718787d9e55397e99cc296ad672a9ac09af64b5467f3 -fa2451c931b80226eb84ba5f75c859cf4c45de91b031a5dc1f5f3e2a8ff132e7 -fe0ce735a0a8e39ec74d903b058bac01edcaecc32233c78992615a9b2c66cfcc -8803fb505549ce12ebdb78235d8af8f85d033fae1f2c2678d75618cf7e985994 -607b34e55bdc6d82f9f4c4852164260a144540dc0130aa3715d50e0c46012fda -1b539a456c1d6e4a38f3acebb05652b36e3924f0ebc468a77238f16c11f1f39a -ec44953cbf43d2774b09b35203f395b449b6398acd2cbc9d6f28aab29b11fa7a -f7f80f76782dd24b6acf7c123e8d42f6e5f885003b66c12e035617778463bfc5 -74eebd55eb9e29c838a6c3dd404dd443af813efe28b64cbed9fa6e2a6b9faed6 -93b2cf9644dbd1c03588a920c59e95c0b392d7d19cae508f0f083281897e7b4f -88158be8140b3086eb927aaee15e5532d784d98bffc0401f00ddfe35002f3e6f -37e5047632fdc8c0e1346f81a64f4d5adaef7e80b108188c0ca66dbbb338036a -0ad8224abdbc0ada662796d759afb0c3f72bdb0ef2629693172c8cbdaa1214de -bcf20a14f9a346cc5cf57b713206c1794b41cd97733cd305d959e22122b56654 -d137041bd490d3702d45382f69931a1d15ea876a6e7d5d703e4b79f7587a8012 -f8e5d2dad56aece2846344dd61d0703c06749a97972ae1fcbdd3f66a83141747 -c0970ebc41fbc61c04cbb858476ae0680e171f9b117306c7414b8ece8a2ec3b9 -41376e6213c5b3ffa68c66280b1956d11a6bf7816ad732ad126dbf3c6b5c96a1 -a3c3a4052e853672f1409f553e07793abbf847ce388babb323d75461c488174f -453c167275be4e0262c0b2a7b8e91de14d37be00d78dba4aee4bd94ace8bacf0 -46e9e07a2f5134b66e81079500414f919cd40220db116bea8d8999bd6291ceec -1d49cd5f6b6c58d29ce28794aa5abee6eac4d8e2f5ab4c0d1d750418064af399 -5e7458dbffd6e2dfbd87b0a58d4354e143ac2ecdda84bb0bad3e6fc42a86be23 -b1707eb7d8a2c31f794d39aaa417bfee74354f1495a715101fe38a9378c8b669 -bbfcfbdb82e4ebdf453ab281da395c7499a484d9d2ad3f2ebaf91e86ffe5136e -41a071f441e3ff69b5488f61b04cb14dc41daa5f4fe322d82873fb2425f4e341 -9a44d15cd41958cf2aa3b01e4ead6e1b3863861f2f953fdb708be567347fec5e -61a76660f5b7e4ec28beeb7041bd4932ad0b9923a2434026134280da2e19f760 -abee8fd8a2457b790ad6b49f2240a2961bb6ee1a6a0550f41ff22fc6905f70c3 -1b9c12cdde47ea248a29827a2928db4532a3e52c83cd01cc4edc4a0c1884847f -c1709dc5eeaa055c6ad49e6d96017bab014823148daa42d068339dcccf9cab35 -7fd86211af2996abaa8230daa8baa8b664401a46764f7baac6b73ea7ad8a33ca -ae8ae25c282ec1e6f6bb469cc53e51a5a9f1856f707b346a518892172081f8e0 -d0d3582c2448d0e2e94ad6578c5acbe2f6271fb78b2ab091b9725537a7594a15 -47a79c964044121797db1743821b5a0e08d4733e289d91845ad6d5562b4220e8 -2e333b084cffe0d4fd9b91e223ec948fd66097647b3e9b4bcefa7c1b6a6c5a77 -e947d86b06130683e942323a4e8e5c211f9252f55922f83dec26f35c109d6fca -15191e7307cc1ac993a73887562037836d126445f3bc3fdc5a929c19ad8f57fa -cd1cf6e4edbcb92b44b767710925c5d75904da307c0a893fa09c0ea5831185fa -2077b88ad5ce5ad00b855a080310913cc35c0a4c1874fcf1dc32ecebcf7bd591 -988266891e4ad44fee764377fe8d1a98d7ba6da27cd0eb4d499011a477a1dff4 -5734fb551bb0151191fe38542953fdd85e619845d48f650480a11b472165c779 -ee0c18ed9a9de34392ef7421f64e2a7f98a105c57f1fe17d64f85ddb6a346482 -d1ded67aa90af0a1e0c14ad45be4b26e179764d584b703bd026df6519331b600 -edd482c15b97abeb5a5a959d5c48ec96e35e5ae8b089b296f8b8e3ca31adc888 -87d148f5ed5363d48117f6c8ce009edc5f19982d89ab4e2ba21e60a56ec3d863 -03c361d3498fd4f59e0c076932b452f7de4936dcd58f9b2faedc5fd80aca9d5a -0581c003620dad3546803eaa4fc02bcd4846b496a42f529a3f765f26021aa98c -afdc151969f6ab4062b1191339bc3bd18cb9d2f75a431118aab925e9b6aae48b -e93762c1345539600561df7c016d0119fc41f1006fcb0a1a6cac8bfc8d42cc19 -494c5c62c97151062feaf56f2eac065c50ab290941a677986f5630ab97949791 -0be9ee9db773bf44407227b17ec312da6ceab108cbcd537c44da2c7f71bcd077 -f7713fd729a8826546a004da701b698e0bf2cea82570706e37f9a0c620492439 -55da1575fd76cf5b7d78b59c6851b7e78994d2b7ee35d012f9d944f8996c5af7 -6bc49a930e7c51533234f5898f498219f8866315f719e6f21b4af810745ea5c0 -754ced3f6f2435654532054e25d279e2071722d855b2ab090e4ec0c7adc2258f -0db6ae9cdf20f7ce3549880a48eb576214947e0b5e63fa22ed2f78a5e9a27c8e -7907dafb9b8095f4a9847684f7fdcc7afab9cbdd473a36e6366169a349438d62 -966f34839933aaa1037796ecee65807da72d10b5d407018c665fc97f21409388 -6b02be5a99db1bd977c0e2471266690304baaa8e483deceeee1852b9a0d8aa71 -b16e7c3dabfbfbee085b9587b4b1748009cd99267a8e2bcee84506b284c2fb38 -bc2da5be4d34e57117177977b9f9eaad4dfbeade344322067a38ee92c07d41ab -90fc508d43980780a0c4528d8e6bc8e1b0ad4c60c92fba4c1643778f980de56d -527b346d964b5e7a711e3d9115ed3feca36c01cbb64069e5b707af0103524936 -4652370c756189f7a860aa0dca1dba43b2e5448c30e11c4ca781e06d927a8e3e -8f579e172aa6a6a446ec96445705df8ad675509d821796e63d1739410ecb0a61 -f60a223f4f955bb355fbfa7e5c47737952af673d3a23616f4cb44b26600039c2 -0559fa92019935ae60d9c1aaa80e979134bb14cf47a988152907a4b77868ad71 -a3cf176fbecfb7942934dd3c47668258e716365b38297c400438deca908c359f -61ca4b88503adadecb182cf22320a14ee2cd9c92b2cd87cce54e36cb868eac15 -02e2b6d82f69e67f9015e74bd412ae5cfc08ab43627dbd24a326a32bdded13ca -8e8d1321bfaf88e9b8c665fdf59269d2c524a13668e88211ea42f60d1735f74c -3bfe8dcba4523937e00e3ac820f2818c93e1f423599429150663471d10fb13ff -f766ec92c5c7404e11f2e33ee4a7ce95192ffbfd8cc2503b846fa20ff67e0745 -22795a728b32fdf749fdeac09e58a881752800e0edde695b92e14a00969bf400 -6ec13158397845f2f6313b2b79a6a08ddad01a6cdb7c3b4b0ad8391c1b382b4f -ae43ce086f242bce64092a9097becaa1fd4142fa2172feeabad0a5e92adda9ac -6661c53aac9e3da2bd2d748a1fd2868b37aa9881ed6d5460737ef2bb1a52daf1 -59e0808bebfcf36a2ad06630fffcbb6c8ffd9d4617775ff5fa1a89067e8ca637 -5ddc6bc1c220394bca911eb8c90ea5024af4fa2002866574fa788800486b18ff -d6b144ca682c446d596b42720dfab2cca91e3b544d5daa8ca149219f619b5e84 -fe5bf9c51f1d24d7a3b3986bc1803967c979828ca2535fdebb1d75c74ffb423b -da6bbbfdd8587dea1836c2cab216dca9784adae242a5f0c0a9b0d8a67eea3525 -b87d5c8976d2a9470d7f1b8634248e472bee8052761f72b16a04378dfa60afd7 -ef9866c5244c887e9ca5de4d310fbb69701d30d42cca44e4ffbe2f6dcc4a745d -0f9c761893f224306ab743c73eaf2fd8644597d4cad6f6d41d3be7565ac149ac -3f2ab18d02558eef5d49e4b8d0e304e7f4151f8e78ba05b388d4974713a18034 -3cdacaeeaa584f96a7790ad1a4ec41774cdf2928169079d7c86114f1be65c75e -c97a9c27e83480e7b4b02bdad59b92f1821675ccb1fe6337c470b57dea22b969 -cf60b55e318bee317c374e63fea4c7c722f6a5bc34fc848e1834c4ea6a277dca -96d3ed9c28fbd332d61da189ed5a615e3ee71d0714f5b18ffff0b1eaf6840e43 -7332536928b57007d941246d44e02a64cd4071840e306509675c7f3be79d6b5c -fd4a34fcc252f4a7885947b1737570ab972c6f0ea8de905c4cecd9bb77289d9b -cf6a6b89da7752e5fa8aacf24d3348854b33438e1bad1797189590ea479215f1 -9724d2b9df31eac5cb7e15a97bbc83a88069eea41811303913be27dbbcd74197 -269405852a11f3dea4dab4ce528ae7e96df9b85735e8f035bf74188b1fa23099 -075f3e657431e273a6af50cafe17c8ef3cd93dffb8188b024e85bf4a05c40452 -03b258c4111dd80a81a2b97bb3dd922c4b456ddf3100238a69d5307073fb589e -ffbad5792761923f527e48cda6c0d8785f39fb53a2a78b04e877930407c6e03b -1f85d7bb7e2b3dcca1c40b7ea7107d9e4ce56b866ab08524096d86df0cea68f5 -ca8417ff762bcb31121ff04fd4089da15b193403ddf0b2928a9ef182b0cb3c5b -ceff60b2258df91ec65a364ef6b90dcab793426d24d0d3a445e0523ef4b42df1 -fdf47f4dc2cf20a90702a5b17008f24973ec50e6a9229f61abb1e9ed05cc0cc7 -4ad64ca5069ec770678b4b2ed5f7d1f51a72a4ed9ab87b9bff5b8e08bd1ca7c0 -c9f4671d5098da0a4b2546f84ca29fd57d1625880432e4e21352b52c18f975f1 -6f083c8289a90e9ab8fe90cd8ea737879eb589f986032c5d153141ac4ff0374f -bf859c225b151c19c76369e0ca31610ad1b96f74e99e257460d63462297555e8 -f9d4be6a95cf725aacea0862955d94c0bddc116118995fd823fba7dabddb7b09 -cec5a706385c6e7044ccd15c73be4c2a9b10a49d7a490483608828457017923b -b4983e893077f0b1eacf1edbb95e438885ebe1455a7920ab666d12c72376d3c2 -4d859628f72d7c627f7edd4d947e5b50eb4d36f70fe0a07a403ac514fcc07866 -bfb8fc64bced8cce8b1db977a7da94882f2b5397c1787f2f2369a3fccfb2df80 -25d2a36cd343f342e1c33fd15fb51aee61315e36d47e268b340c2054d5cb0911 -57b267ae70bd70a030a9b4a95e853221bde1c2ec2116dd3fc21e95d9ab2830f6 -16ed7a62e0832aea2b265a53f7ae4cb2ea173062a8ee4573812d10503cfd147d -1b3c9aa5444d82fc0f7ad9f4348fab1e1db05687bc6b8e55b49a6e1893a57007 -7a6a92dbcbdc16a96bcfcd594580bed0c68554fd1d465547f0b23a8d4812ab6b -ca77f22ac0b9022c7105b9a18ac4d3cedff29a29c2476b71f25e8daee9b6bb9c -e0d97e4629f8aac9cb0ad2408e34242118b446e6933ea0e42e39c75136167f13 -d41c6b9252de67cbc401b366a3aa3f4d32c07c7a943058495633e9c586079913 -7a12a6cffa7c304180ba8c4bd19e929786ad3f8c85aff4734ebfc5eb9472956a -7d2645344ba34fb0e5849b42294ed7cc00bd5ece1081b37a01e4e00ff407fb8d -b1f3509f57d68c379e0bc81548ff2c12f840035fbd5ed30a1879db15009be45c -b5850d908ce0b3b3425b4e79ec298dfd542eb320415651972635727d9031acbd -f4f71b49ac82e44d099ea77dc43faba4143e96956eaed34cc459091f77f825ed -ba1c774e72583ebfc373b565389230ff18bd7f12cea761bf341b6aee1c6d6a19 -ee5ac125fa54fa86487ac62d12cef673acddf8b49b0aa2c4fc5a1910af5191d0 -499c55710766f4da43ecd2d9f9eaa620d9eb508814cbb149afe4174cdff7e017 -6290baee79146f98fc6c9e9aafb801cfebbf03a49b50820e9a0294beddd469ec -99f284da918055d60a719cebf94df593b1b7f36f8ba61f2a7d9d70961b3782cf -a38e27df794eed77342718762cbc659cf8179890c3b07788ebc88758cdbace66 -e8a4a1a9044cbf156090d6f3f9f4dbf5c139a45a00ed66bb5b849efe399a96e4 -0aff6b6eede83ca3c08fb41ce894b97563f945ae6f8d19ef1153002f012f0719 -ae49821f9ef8fcda418ad2d555bc8a92750af370466a15d109f72c0201557cd4 -9d9ed47bae7334b3a8c41497a1e9a16c493f2000f5dcaa615366dfcf49c03ddc -388c9a3556be2e4d42a7cc6b9cb93c129727576a2a71a1dbbe4b9216d4df45e4 -f818b2191ee925095e22f1c2fb568e4a91041315a0a46d2a48419b21e19eb2f1 -817449c9955d87ea59d215a9c72225089cab88d0ec1286cec111312be2f2fd2d -15ce3c6ed4f8a97b9c901e0c1b78c50413cc0ebf3be4cbf638d6f87a66abb5a1 -8816db062342e55536650d9cef84a0c2b732b2eaedb94f24d3f14dee938f5505 -9eb0ce1b6158204a3fc0ce773dc80f8cf04d4f490342f1e61e3e76131c9ebba3 -d37ae7a31c07f94fe704611c8acb82eff202e978dbbfafd4694bf8644f34efb7 -8dbd5bfb6bc31d8dd8dd75feeeec3538907e7c34afacf0ca38b73066dd03df90 -29fccf0cf2c11e3c32f931a73f3d2f878b7feb5949466f6b5b2dd8c4a5234dc7 -68da4de1eb9311ecbde751ca868c2eb1ec34407d446593ea89589fcb9fd7fd7b -41332d1662e1d23159171ca91b2ba32d4265d54c2f31db733dde8f7e35254e5b -16d61b0be99bf418d2c07ba289d935270c4b5e58b283d83bde386e0f3a363321 -8fc3e6444179d1e53570e29d8381d93d99e020544974fb2e29069b007466d80c -0fe18dd2fea487abb742cd6cd895322f4cbc870dbc4ac0dbc9b59c8ec172c764 -e9192406c15ca1728db37cfdb438ff7b2b4a46f26ecd54ce220a2d177688f797 -2315ea7b09932c1e3ce5c8a3aa31b67a4023b32ab5258b6191917fe84f7f138b -a88d893bbc85fea4c22d6fa59a0bec05c4f2bfc6d4abad38bd8a22b130f8f823 -2bb4682395d9db042e918ce3eb15bc649a5177a27345769ac8c7e37e1f018382 -75db6b96262280d82881cc078c177d6ebba6fd076b32545e47e777dbdc12b531 -5a656f3d3e0432a5725c503ac377f0976c4d4645ba8a62b85f2855723fcbf0bc -1bb16ff72236b2bbcabe1927b4fee83a7ccb4f8c576eeee4411e5c1836df2bf5 -fcda883b61c809a5a69c0174bbdc325216c05d100522faed7880e8be18c77c1f -469d64f39e5fb0b92770d55a6996f08871c4cf4fdc09f33646b06a5bcdd4229a -58bb3556e2a2bcc028768ca1b6ed15104c5b961eab6bf6c7153304f871445f2e -c27993619c52f4c05d3bec9e0ba6a29003538a792601a0c0aef1a2f799b42bef -07f1040a95f100c1d5f634cef2a7418606c229ee938383011ed5e9821a5b1ff1 -f4d168d933cb008b862a8161c1365d2e716d8b43eef14aa5e428a1114b69f42c -13c78d7387c1ed874362f6c9324cc18a9a1e021ae5572bf804126875580f2033 -b36b8bce6bda1afad5a8fe1bb70a5f0d1997f4d07474240bd86a9f78ef8b79ab -b00261cf19fea68a0e26044b48601761a22db022b22b68b5d1cc20846d188aea -167481bdce64bcbb6f83db97e88275cb69c4b0eea1e977fb372cb5dce6d0ed5f -b014870d25d5a4b0fbdfe1b0631cf06c05503e46504001b1ef38bc89b353d1b5 -d6df1d5fbd8caadad2a79f3251c362cb179b42bfb350a9656850fdafe00fa69f -af222f6e32e1edbb98ff629db8a7e712092c62abff1071d5b827ccb937aef491 -bc9af196382c4d646b6c0bafc87f3a21a96855c60592a2eb387e12961fb0edc8 -b8f2d25a159c8bfc6dedf61d9892b1e6311b4a25355f658dbe570ac2dcb6081b -5c53601a341398be9607c76e3f920bbdadb0ecafd168592f62009a8c7642c3c4 -0079107e049c7d5bdffe2c1111c48293d043a116601186e6145766691205adcf -9d9ff84952991b2b23eba2770885adfae3c33fae6b9cc1d50816ddca0735b68f -3374691bd27d31d02b74c45fb8e49337c60710fe831372da5415c15eef486645 -84e2211306e112ebe45c53316d9a3d5321b98d797ddca1d086f5c8e50ba5a112 -6e1943923a0f9385ea1dbe629da5f74b951a71413582ad57615c7a92aa2d7b3f -a9d5825596d4cd92f4596eef20d1bc5c15510d81fa7e1cdf6d2a34fc4023b492 -e5fdf751ae848e7b26e2dc72ed766ebfe1146ac1a2a11d463116520645d2e768 -d16d466fc6edad472a30cbd98c0e9e008bf6b49cca455575476b1658d8466b3e -cbc51ec8e3b52ae4361eb36852727f31acadd2020264a9f8f7e8eb6e95cae23a -83a16f953cf427ced1bb080642689198ebaad5b7cd45d4f6512613e97a37df23 -a59c77afde3912b08aeab2c03ac7923641d5e44f84993823e7e394b9c60550d7 -d2285defe44b842474db7c475282749610930bc6a9b89e187475dbcc72f36367 -4e40286b9d8fdcba50ced64c4b8a9b432b646eee842c48fc007f7901f3fc1160 -47ebef1f2bf1ae8217f59fb7afe388bfd40a73deab20c485ac50d0df450a2a15 -7c7e1847b538bd6712b4d7ba0492af115a4de59eda19349f85c1b2164392d120 -4a81dda27109c502c502941b2add6ed6ab415da9af37ca7d2761814eddca8875 -7aab159ee330af8429362fe44ea6a4adb495a813ab822237891826df1e622b81 -d2d7037594c12acee29e9c884286657f77f016310b2a6609bd3fc6adde3ab40d -8fd79361c53908594b363ad4376168ea4a25915010f8c5733079b5ae3a3755a6 -cab17d5bbb97223913c1d409a4603c715f8e709225f6af1f52f0c7027910840e -326216ed1dbb668651f0cf630579370802fdbe4ebac66aaf70324c34baf68392 -58261831369fa1083127db90491f3585ce706fce6cd6a407d66aaad4395163d1 -b7abd4db0dced900109e618b8bce5442f85571674980740ab0c85a243a3bf408 -decad7e7a973f09042c0ae718a773fede87142679ddfc47bc0c56c61162f0444 -70d9a2376219833883b7fdfb97334b5b032795a929428a9dd25c62568fca846d -499d461b4f00e366c04fce939d135e98587b3df9b2a2b2df05c14643d45dbd01 -791e88658ba3e020dee5ad84695956e302845145b92dda7957ab4ceed047ea3e -343687015c58893ecff2a14b2c4fd92eca727e1ecb26f9e85f059eaba8b90be8 -0b3e951661b6b3add13163437b6e404e6b816bd08b7bd776620d61542a6fe3dc -c3bd33272cc9bb0ddaec0f557e6477bf5a3306f416d6d2e965e2dd44ebdd1df1 -e9773769bb4e9a3ea52ad101dcabf10ba972978bd281db4deed4337d5cb9e38a -4dfc7c6251c997eb7e188ce325cbeec9b2c8eee0f600b6c5807ac789520a1891 -e7deb786644e296b449cb98211a89b56e5f577bff920d37dc849d43da1cded70 -d34479a1494f7f72f48fd56c809d8a8b6186298c2fc5688ed7b9825304909208 -996d91b74aedd334cd31a679ba2fad8fca9908eedb8a800e752048565e161cb2 -dc9f654be8c60f05a8dad139956a080673b6293fbaafa8ef52a9ca40c2792251 -fde97d5fd7b990d54fd3bf0a0eb960c6e9c96f977adc33f0542dda672b3d81b5 -7d64e97b680fa6ec5c84f52be3ab264d12aad0110b14788107e3b5e00d42c843 -5f65092cc5b9eadab9183cd69884f0079c48d0a606d55678beaafeda083b7b56 -efe6d56986564ea6b78c66004ff51d609309180c812e49ee92b785312af960fb -b751c7d867f93e40703fd88e60ea96d3a9af3837e433b0d6843741f01f0f1272 -0c56678d44194f4efd3d7071e11c4aea724f676789b55c8958e597580d4741c0 -10e2497c3dc0757b8b454b4b9bb89f1aa2e009b408d3e45d432887d42d225421 -e676e6deaffb5641769a2ffea8b06a40c42cff99a9c5b91a5d405169cd2ffdcf -7622a3b7af17178ce75ee248313ff426edabca3e8fa879d56bb621fde9ae43c3 -9b88216ca93a41f00abb5c376e6f94641f97df1d917b99dac76e62765fc47307 -8b985c8bdb81bfe53e37bc29798263f00daba58d7406504dab2d9c7555a5ec54 -0f83a6f483b20d4a0533a6a0fc68f086b91b15a9fa03b673d6d5e3bbb438fcfb -bf996ad62fac68c7f476cf2b8806d2f537daa331f66af7761c9dbed0b03e86b3 -8355747580918e37b3efc7d0ba05576a8153dbba711d77d6c57920ff195bcc26 -15fb1e901c72c2aa200b2d95b148bdc91cc45281703ea2a83902a409d3f059a4 -e3be3ff93baeb34c91f50f473056713dc643241b0d046245f6095be26abb9d79 -a846369479475db7756f55b00a2c3a803b1d72a4d4655e3b950b8b38133191ad -435bb0c45b0fd1ae0d20fed291899a8502c256c84cca2989bf419045d13e568f -5743a331fc7cbe1a68d348add976c506c1e3bb09bf2af3fcc63a02d83e389381 -53fcd5f9dc3e32f9b53b0729dd8603b390bb0f82b6759d9d8b4580a39ba7529a -f47498900c912826292964cdbdd6c63968f75c74bc59f8b8f439e0c40bc45d88 diff --git a/tools/test_modules/m35000.pm b/tools/test_modules/m35000.pm new file mode 100644 index 000000000..4c7ef55b2 --- /dev/null +++ b/tools/test_modules/m35000.pm @@ -0,0 +1,42 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Crypt::Digest::BLAKE2s_256 qw (blake2s_256_hex); + +sub module_constraints { [[0, 128], [-1, -1], [0, 64], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + + my $digest = blake2s_256_hex ($word); + + my $hash = sprintf ("\$BLAKE2\$" . lc ($digest)); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my ($hash, $word) = split (':', $line); + + return unless defined $hash; + return unless defined $word; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed); + + return ($new_hash, $word); +} + +1; From 52e379ef937e06c592812799106b9b129da49f46 Mon Sep 17 00:00:00 2001 From: Louka Date: Fri, 10 Feb 2023 13:44:35 +0100 Subject: [PATCH 26/28] disable debug option in makefile --- src/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index ab10c236f..04c1f7a0b 100644 --- a/src/Makefile +++ b/src/Makefile @@ -4,7 +4,7 @@ ## SHARED ?= 0 -DEBUG := 1 +DEBUG := 0 PRODUCTION := 0 PRODUCTION_VERSION := v6.2.6 ENABLE_CUBIN ?= 1 From a3b4162e5f51d6db3f4d78a50ea6f464964e9def Mon Sep 17 00:00:00 2001 From: bacqube2 Date: Mon, 13 Feb 2023 16:39:47 +0100 Subject: [PATCH 27/28] Rename module 35000 : 31000 --- ...a0-optimized.cl => m31000_a0-optimized.cl} | 12 ++++---- .../{m35000_a0-pure.cl => m31000_a0-pure.cl} | 4 +-- ...a1-optimized.cl => m31000_a1-optimized.cl} | 12 ++++---- .../{m35000_a1-pure.cl => m31000_a1-pure.cl} | 4 +-- ...a3-optimized.cl => m31000_a3-optimized.cl} | 28 +++++++++---------- .../{m35000_a3-pure.cl => m31000_a3-pure.cl} | 4 +-- .../{module_35000.c => module_31000.c} | 2 +- tools/test_modules/{m35000.pm => m31000.pm} | 0 8 files changed, 33 insertions(+), 33 deletions(-) rename OpenCL/{m35000_a0-optimized.cl => m31000_a0-optimized.cl} (92%) rename OpenCL/{m35000_a0-pure.cl => m31000_a0-pure.cl} (95%) rename OpenCL/{m35000_a1-optimized.cl => m31000_a1-optimized.cl} (95%) rename OpenCL/{m35000_a1-pure.cl => m31000_a1-pure.cl} (95%) rename OpenCL/{m35000_a3-optimized.cl => m31000_a3-optimized.cl} (91%) rename OpenCL/{m35000_a3-pure.cl => m31000_a3-pure.cl} (96%) rename src/modules/{module_35000.c => module_31000.c} (99%) rename tools/test_modules/{m35000.pm => m31000.pm} (100%) diff --git a/OpenCL/m35000_a0-optimized.cl b/OpenCL/m31000_a0-optimized.cl similarity index 92% rename from OpenCL/m35000_a0-optimized.cl rename to OpenCL/m31000_a0-optimized.cl index bf1694445..fbebe24f4 100644 --- a/OpenCL/m35000_a0-optimized.cl +++ b/OpenCL/m31000_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) #endif -KERNEL_FQ void m35000_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ void m31000_m04 (KERN_ATTR_RULES ()) { /** * base @@ -94,15 +94,15 @@ KERNEL_FQ void m35000_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m35000_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ void m31000_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m35000_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ void m31000_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m35000_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ void m31000_s04 (KERN_ATTR_RULES ()) { /** * base @@ -190,10 +190,10 @@ KERNEL_FQ void m35000_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m35000_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ void m31000_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m35000_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ void m31000_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m35000_a0-pure.cl b/OpenCL/m31000_a0-pure.cl similarity index 95% rename from OpenCL/m35000_a0-pure.cl rename to OpenCL/m31000_a0-pure.cl index 07db0954a..d6fdb0a51 100644 --- a/OpenCL/m35000_a0-pure.cl +++ b/OpenCL/m31000_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) #endif -KERNEL_FQ void m35000_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ void m31000_mxx (KERN_ATTR_RULES ()) { /** * base @@ -57,7 +57,7 @@ KERNEL_FQ void m35000_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m35000_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ void m31000_sxx (KERN_ATTR_RULES ()) { /** * base diff --git a/OpenCL/m35000_a1-optimized.cl b/OpenCL/m31000_a1-optimized.cl similarity index 95% rename from OpenCL/m35000_a1-optimized.cl rename to OpenCL/m31000_a1-optimized.cl index 8196980e1..edc4580de 100644 --- a/OpenCL/m35000_a1-optimized.cl +++ b/OpenCL/m31000_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) #endif -KERNEL_FQ void m35000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ void m31000_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -142,15 +142,15 @@ KERNEL_FQ void m35000_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m35000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ void m31000_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m35000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ void m31000_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m35000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ void m31000_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -290,10 +290,10 @@ KERNEL_FQ void m35000_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m35000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ void m31000_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m35000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ void m31000_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m35000_a1-pure.cl b/OpenCL/m31000_a1-pure.cl similarity index 95% rename from OpenCL/m35000_a1-pure.cl rename to OpenCL/m31000_a1-pure.cl index 9c1d45547..e90aa0d46 100644 --- a/OpenCL/m35000_a1-pure.cl +++ b/OpenCL/m31000_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) #endif -KERNEL_FQ void m35000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ void m31000_mxx (KERN_ATTR_BASIC ()) { /** * base @@ -55,7 +55,7 @@ KERNEL_FQ void m35000_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m35000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ void m31000_sxx (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m35000_a3-optimized.cl b/OpenCL/m31000_a3-optimized.cl similarity index 91% rename from OpenCL/m35000_a3-optimized.cl rename to OpenCL/m31000_a3-optimized.cl index ec5f903db..876542c05 100644 --- a/OpenCL/m35000_a3-optimized.cl +++ b/OpenCL/m31000_a3-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) #endif -DECLSPEC void m35000m (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTOR ()) +DECLSPEC void m31000m (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTOR ()) { /** * modifiers are taken from args @@ -84,7 +84,7 @@ DECLSPEC void m35000m (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -DECLSPEC void m35000s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTOR ()) +DECLSPEC void m31000s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTOR ()) { /** * modifiers are taken from args @@ -166,7 +166,7 @@ DECLSPEC void m35000s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m35000_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ void m31000_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -203,10 +203,10 @@ KERNEL_FQ void m35000_m04 (KERN_ATTR_VECTOR ()) * main */ - m35000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); + m31000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m35000_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ void m31000_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -243,10 +243,10 @@ KERNEL_FQ void m35000_m08 (KERN_ATTR_VECTOR ()) * main */ - m35000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); + m31000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m35000_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ void m31000_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -283,10 +283,10 @@ KERNEL_FQ void m35000_m16 (KERN_ATTR_VECTOR ()) * main */ - m35000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); + m31000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m35000_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ void m31000_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -323,10 +323,10 @@ KERNEL_FQ void m35000_s04 (KERN_ATTR_VECTOR ()) * main */ - m35000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); + m31000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m35000_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ void m31000_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -363,10 +363,10 @@ KERNEL_FQ void m35000_s08 (KERN_ATTR_VECTOR ()) * main */ - m35000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); + m31000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m35000_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ void m31000_s16 (KERN_ATTR_VECTOR ()) { /** * base @@ -403,5 +403,5 @@ KERNEL_FQ void m35000_s16 (KERN_ATTR_VECTOR ()) * main */ - m35000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); + m31000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } diff --git a/OpenCL/m35000_a3-pure.cl b/OpenCL/m31000_a3-pure.cl similarity index 96% rename from OpenCL/m35000_a3-pure.cl rename to OpenCL/m31000_a3-pure.cl index edf01db97..24ce691db 100644 --- a/OpenCL/m35000_a3-pure.cl +++ b/OpenCL/m31000_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) #endif -KERNEL_FQ void m35000_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ void m31000_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -66,7 +66,7 @@ KERNEL_FQ void m35000_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m35000_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ void m31000_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/src/modules/module_35000.c b/src/modules/module_31000.c similarity index 99% rename from src/modules/module_35000.c rename to src/modules/module_31000.c index 3c36c99a9..cf35180ac 100644 --- a/src/modules/module_35000.c +++ b/src/modules/module_31000.c @@ -18,7 +18,7 @@ static const u32 DGST_POS3 = 2; static const u32 DGST_SIZE = DGST_SIZE_4_8; static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_HASH; static const char *HASH_NAME = "BLAKE2s-256"; -static const u64 KERN_TYPE = 35000; +static const u64 KERN_TYPE = 31000; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_32 | OPTI_TYPE_RAW_HASH; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_NONE; diff --git a/tools/test_modules/m35000.pm b/tools/test_modules/m31000.pm similarity index 100% rename from tools/test_modules/m35000.pm rename to tools/test_modules/m31000.pm From 0e7fdd3c55792bae76ef48aaf32439220006f722 Mon Sep 17 00:00:00 2001 From: bacqube2 Date: Tue, 14 Feb 2023 10:21:16 +0100 Subject: [PATCH 28/28] Fixing bad vconv32_t usage --- OpenCL/inc_hash_blake2s.cl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenCL/inc_hash_blake2s.cl b/OpenCL/inc_hash_blake2s.cl index 06d6f857b..c10006068 100644 --- a/OpenCL/inc_hash_blake2s.cl +++ b/OpenCL/inc_hash_blake2s.cl @@ -72,7 +72,7 @@ DECLSPEC u32 blake2s_rot08_S (const u32 a) vconv32_t out; - out.v32 = hc_byte_perm_S (in.v32.b, in.v32.a, 0x0321); + out.v32 = hc_byte_perm_S (in.v32, in.v32, 0x0321); return out.v32; @@ -84,7 +84,7 @@ DECLSPEC u32 blake2s_rot08_S (const u32 a) vconv32_t out; - out.v32 = hc_byte_perm_S (in.v32.b, in.v32.a, 0x00030201); + out.v32 = hc_byte_perm_S (in.v32, in.v32, 0x00030201); return out.v32;