1 /** 2 Tiger algorithm implementation. This module conforms to the APIs defined in std.digest. 3 */ 4 module nxt.digestx.tiger; 5 6 public import std.digest; 7 8 /** 9 Template API Tiger implementation. 10 11 Parameters: 12 digestSize = the size of digest in byte 13 14 passes = the number of passes of the digest algorithm 15 16 tiger2 = tiger2 mode (uses 0x80 as padding value) 17 */ 18 struct TigerImpl(uint digestSize, uint passes, bool tiger2 = false) 19 { 20 static assert(digestSize <= 24, "digestSize must be smaller than 24(Tiger-192)"); 21 22 /// Initializes the digest calculation. 23 void start() @safe pure nothrow @nogc 24 { 25 _length = 0; 26 _res = [0x0123456789ABCDEFUL, 0xFEDCBA9876543210UL, 0xF096A5B4C3B2E187UL]; 27 _bufPos = 0; 28 } 29 30 /// Feeds the digest with data. 31 void put(scope const(ubyte)[] data...) @safe pure nothrow @nogc 32 { 33 assert(data.length <= ulong.max - _length, "length overflow"); 34 _length += data.length; 35 36 while (true) 37 { 38 immutable cap = _buf.length - _bufPos; 39 40 if (data.length >= cap) 41 { 42 _buf[_bufPos .. $] = data[0 .. cap]; 43 tigerCompress(_bufUL); 44 _bufPos = 0; 45 data = data[cap .. $]; 46 } 47 else 48 { 49 _buf[_bufPos .. _bufPos + data.length] = data[0 .. $]; 50 _bufPos += data.length; 51 data = null; 52 break; 53 } 54 } 55 } 56 57 /// Returns the Tiger hash. This also calls start to reset the internal state. 58 ubyte[digestSize] finish() @safe pure nothrow @nogc 59 { 60 // TODO: code duplication 61 version (BigEndian) 62 { 63 union U 64 { 65 ubyte[64] temp; 66 ulong[8] tempUL; 67 } 68 69 U u = void; 70 71 foreach (immutable i, ref const b; _buf[0 .. _bufPos]) 72 u.temp[i ^ 7] = b; 73 74 u.temp[_bufPos ^ 7] = tiger2 ? 0x80 : 0x01; 75 _bufPos++; 76 77 for (; _bufPos & 7; _bufPos++) 78 u.temp[_bufPos ^ 7] = 0; 79 80 if (_bufPos > 56) 81 { 82 assert(_bufPos == 64); 83 //u.temp[_bufPos .. $] = 0; 84 tigerCompress(u.tempUL); 85 _bufPos = 0; 86 u.tempUL[0 .. 7] = 0; 87 } 88 else 89 { 90 u.temp[_bufPos .. 56] = 0; 91 } 92 93 u.tempUL[7] = _length << 3; 94 tigerCompress(u.tempUL); 95 } 96 else 97 { 98 _buf[_bufPos] = tiger2 ? 0x80 : 0x01; 99 _bufPos++; 100 for (; _bufPos & 7; _bufPos++) 101 _buf[_bufPos] = 0; 102 103 if (_bufPos > 56) 104 { 105 assert(_bufPos == 64); 106 //_buf[_bufPos .. $] = 0; 107 tigerCompress(_bufUL); 108 _bufPos = 0; 109 110 _bufUL[0 .. 7] = 0; 111 } 112 else 113 { 114 _buf[_bufPos .. 56] = 0; 115 } 116 117 _bufUL[7] = _length << 3; 118 tigerCompress(_bufUL); 119 } 120 121 static auto ref trustedCast(To, From)(auto ref From from) @trusted 122 { 123 return cast(To) from; 124 } 125 126 immutable ubyte[digestSize] result = trustedCast!(ubyte[])(_res)[0 .. digestSize]; 127 128 start(); 129 130 return result; 131 } 132 133 private: 134 135 union 136 { 137 ubyte[64] _buf = void; 138 ulong[8] _bufUL = void; 139 } 140 141 int _bufPos = void; 142 143 void tigerCompress(ref ulong[8] str) @safe pure nothrow @nogc 144 { 145 ulong a = _res[0], b = _res[1], c = _res[2]; 146 147 ulong x0 = str[0], x1 = str[1], x2 = str[2], x3 = str[3], x4 = str[4], 148 x5 = str[5], x6 = str[6], x7 = str[7]; 149 150 immutable aa = a, bb = b, cc = c; 151 152 foreach (immutable pass; 0 .. passes) 153 { 154 if (pass != 0) 155 { 156 // key_schedule 157 x0 -= x7 ^ 0xA5A5A5A5A5A5A5A5UL; 158 x1 ^= x0; 159 x2 += x1; 160 x3 -= x2 ^ ((~x1) << 19); 161 x4 ^= x3; 162 x5 += x4; 163 x6 -= x5 ^ ((~x4) >> 23); 164 x7 ^= x6; 165 x0 += x7; 166 x1 -= x0 ^ ((~x7) << 19); 167 x2 ^= x1; 168 x3 += x2; 169 x4 -= x3 ^ ((~x2) >> 23); 170 x5 ^= x4; 171 x6 += x5; 172 x7 -= x6 ^ 0x0123456789ABCDEFUL; 173 } 174 175 // pass 176 immutable mul = pass == 0 ? 5 : (pass == 1 ? 7 : 9); 177 round!(a, b, c)(x0, mul); 178 round!(b, c, a)(x1, mul); 179 round!(c, a, b)(x2, mul); 180 round!(a, b, c)(x3, mul); 181 round!(b, c, a)(x4, mul); 182 round!(c, a, b)(x5, mul); 183 round!(a, b, c)(x6, mul); 184 round!(b, c, a)(x7, mul); 185 186 immutable tmpa = a; 187 a = c; 188 c = b; 189 b = tmpa; 190 } 191 192 // feedforward 193 a ^= aa; 194 b -= bb; 195 c += cc; 196 197 _res[0] = a; 198 _res[1] = b; 199 _res[2] = c; 200 } 201 202 ulong _length = void; 203 204 ulong[3] _res = void; 205 } 206 207 /// Alias for Tiger-192(3 pass), result is ubyte[24] 208 alias Tiger = TigerImpl!(24, 3); 209 /// Alias for Tiger-160(3 pass), result is ubyte[20] (first 20 bytes of Tiger-192) 210 alias Tiger160 = TigerImpl!(20, 3); 211 /// Alias for Tiger-128(3 pass), result is ubyte[16] (first 16 bytes of Tiger-192) 212 alias Tiger128 = TigerImpl!(16, 3); 213 214 /// Alias for Tiger2-192(3 pass), result is ubyte[24] 215 alias Tiger2 = TigerImpl!(24, 3, true); 216 /// Alias for Tiger2-160(3 pass), result is ubyte[20] (first 20 bytes of Tiger-192) 217 alias Tiger2_160 = TigerImpl!(20, 3, true); 218 /// Alias for Tiger2-128(3 pass), result is ubyte[16] (first 16 bytes of Tiger-192) 219 alias Tiger2_128 = TigerImpl!(16, 3, true); 220 221 /// OOP API for Tiger-192(3 pass) 222 alias TigerDigest = WrapperDigest!Tiger; 223 /// OOP API for Tiger-160(3 pass) 224 alias Tiger160Digest = WrapperDigest!Tiger160; 225 /// OOP API for Tiger-128(3 pass) 226 alias Tiger128Digest = WrapperDigest!Tiger128; 227 228 /// OOP API for Tiger2-192(3 pass) 229 alias Tiger2Digest = WrapperDigest!Tiger2; 230 /// OOP API for Tiger2-160(3 pass) 231 alias Tiger2_160Digest = WrapperDigest!Tiger2_160; 232 /// OOP API for Tiger2-128(3 pass) 233 alias Tiger2_128Digest = WrapperDigest!Tiger2_128; 234 235 /// 236 @trusted nothrow unittest 237 { 238 Tiger st; 239 st.start(); 240 st.put(cast(ubyte[])"The quick brown fox jumps over the lazy dog"); 241 assert(st.finish() == hexString!"6D12A41E72E644F017B6F0E2F7B44C6285F06DD5D2C5B075"); 242 243 // Template API 244 assert(digest!Tiger("abc") == hexString!"2AAB1484E8C158F2BFB8C5FF41B57A525129131C957B5F93"); 245 assert(digest!Tiger160("abc") == hexString!"2AAB1484E8C158F2BFB8C5FF41B57A525129131C"); 246 assert(digest!Tiger128("abc") == hexString!"2AAB1484E8C158F2BFB8C5FF41B57A52"); 247 248 assert(digest!Tiger2("abc") == hexString!"F68D7BC5AF4B43A06E048D7829560D4A9415658BB0B1F3BF"); 249 250 // OOP API 251 Digest t = new TigerDigest; 252 t.put(cast(ubyte[])"Tiger"); 253 assert(t.finish() == hexString!"DD00230799F5009FEC6DEBC838BB6A27DF2B9D6F110C7937"); 254 255 t = new Tiger160Digest; 256 t.put(cast(ubyte[])"Tiger"); 257 assert(t.finish() == hexString!"DD00230799F5009FEC6DEBC838BB6A27DF2B9D6F"); 258 259 t = new Tiger128Digest; 260 t.put(cast(ubyte[])"Tiger"); 261 assert(t.finish() == hexString!"DD00230799F5009FEC6DEBC838BB6A27"); 262 263 t = new Tiger2Digest; 264 t.put(cast(ubyte[])"Tiger"); 265 assert(t.finish() == hexString!"FE40798B8EB937FD977608930548D6A894C20B04CBEF7A42"); 266 } 267 268 /// Convenience alias for std.digest using Tiger-192. 269 auto tigerOf(T...)(T data) 270 { 271 return digest!(Tiger, T)(data); 272 } 273 274 /// 275 @safe pure nothrow @nogc unittest 276 { 277 assert(tigerOf("abc") == hexString!"2AAB1484E8C158F2BFB8C5FF41B57A525129131C957B5F93"); 278 } 279 280 /// Convenience alias for std.digest using Tiger2-192. 281 auto tiger2Of(T...)(T data) 282 { 283 return digest!(Tiger2, T)(data); 284 } 285 286 pure nothrow @nogc unittest 287 { 288 assert(tigerOf("") == hexString!"3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3"); 289 assert(tiger2Of("") == hexString!"4441BE75F6018773C206C22745374B924AA8313FEF919F41"); 290 291 assert(tigerOf("a") == hexString!"77BEFBEF2E7EF8AB2EC8F93BF587A7FC613E247F5F247809"); 292 assert(tiger2Of("a") == hexString!"67E6AE8E9E968999F70A23E72AEAA9251CBC7C78A7916636"); 293 294 assert(tigerOf("message digest") == hexString!"D981F8CB78201A950DCF3048751E441C517FCA1AA55A29F6"); 295 assert(tiger2Of("message digest") == hexString!"E29419A1B5FA259DE8005E7DE75078EA81A542EF2552462D"); 296 297 assert(tigerOf( 298 "abcdefghijklmnopqrstuvwxyz") == hexString!"1714A472EEE57D30040412BFCC55032A0B11602FF37BEEE9"); 299 assert(tiger2Of( 300 "abcdefghijklmnopqrstuvwxyz") == hexString!"F5B6B6A78C405C8547E91CD8624CB8BE83FC804A474488FD"); 301 302 assert(tigerOf("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") 303 == hexString!"0F7BF9A19B9C58F2B7610DF7E84F0AC3A71C631E7B53F78E"); 304 assert(tiger2Of("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") 305 == hexString!"A6737F3997E8FBB63D20D2DF88F86376B5FE2D5CE36646A9"); 306 307 assert(tigerOf("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") 308 == hexString!"8DCEA680A17583EE502BA38A3C368651890FFBCCDC49A8CC"); 309 assert(tiger2Of("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") 310 == hexString!"EA9AB6228CEE7B51B77544FCA6066C8CBB5BBAE6319505CD"); 311 312 assert(tigerOf("12345678901234567890123456789012345678901234567890123456789012345678901234567890") 313 == hexString!"1C14795529FD9F207A958F84C52F11E887FA0CABDFD91BFD"); 314 assert(tiger2Of("12345678901234567890123456789012345678901234567890123456789012345678901234567890") 315 == hexString!"D85278115329EBAA0EEC85ECDC5396FDA8AA3A5820942FFF"); 316 } 317 318 private: 319 320 // Tiger round function 321 void round(alias a, alias b, alias c)(in ulong x, in int mul) 322 { 323 c ^= x; 324 325 a -= table1[cast(ubyte) c] ^ table2[cast(ubyte)(c >> (2 * 8))] ^ table3[cast(ubyte)(c >> (4 * 8))] ^ table4[cast( 326 ubyte)(c >> (6 * 8))]; 327 328 b += table4[cast(ubyte)(c >> (1 * 8))] ^ table3[cast(ubyte)(c >> (3 * 8))] ^ table2[cast( 329 ubyte)(c >> (5 * 8))] ^ table1[cast(ubyte)(c >> (7 * 8))]; 330 331 b *= mul; 332 } 333 334 // Tiger S Boxes 335 immutable ulong[4 * 256] table1 = [ 336 0x02AAB17CF7E90C5EUL, 0xAC424B03E243A8ECUL, 0x72CD5BE30DD5FCD3UL, 337 0x6D019B93F6F97F3AUL, 0xCD9978FFD21F9193UL, 0x7573A1C9708029E2UL, 338 0xB164326B922A83C3UL, 0x46883EEE04915870UL, 0xEAACE3057103ECE6UL, 339 0xC54169B808A3535CUL, 340 0x4CE754918DDEC47CUL, 0x0AA2F4DFDC0DF40CUL, 0x10B76F18A74DBEFAUL, 341 0xC6CCB6235AD1AB6AUL, 0x13726121572FE2FFUL, 0x1A488C6F199D921EUL, 342 0x4BC9F9F4DA0007CAUL, 0x26F5E6F6E85241C7UL, 0x859079DBEA5947B6UL, 343 0x4F1885C5C99E8C92UL, 0xD78E761EA96F864BUL, 0x8E36428C52B5C17DUL, 344 0x69CF6827373063C1UL, 345 0xB607C93D9BB4C56EUL, 346 0x7D820E760E76B5EAUL, 0x645C9CC6F07FDC42UL, 0xBF38A078243342E0UL, 347 0x5F6B343C9D2E7D04UL, 0xF2C28AEB600B0EC6UL, 0x6C0ED85F7254BCACUL, 348 0x71592281A4DB4FE5UL, 0x1967FA69CE0FED9FUL, 0xFD5293F8B96545DBUL, 349 0xC879E9D7F2A7600BUL, 0x860248920193194EUL, 0xA4F9533B2D9CC0B3UL, 350 0x9053836C15957613UL, 351 0xDB6DCF8AFC357BF1UL, 352 0x18BEEA7A7A370F57UL, 0x037117CA50B99066UL, 0x6AB30A9774424A35UL, 353 0xF4E92F02E325249BUL, 0x7739DB07061CCAE1UL, 0xD8F3B49CECA42A05UL, 354 0xBD56BE3F51382F73UL, 0x45FAED5843B0BB28UL, 0x1C813D5C11BF1F83UL, 355 0x8AF0E4B6D75FA169UL, 0x33EE18A487AD9999UL, 0x3C26E8EAB1C94410UL, 356 0xB510102BC0A822F9UL, 357 0x141EEF310CE6123BUL, 358 0xFC65B90059DDB154UL, 0xE0158640C5E0E607UL, 0x884E079826C3A3CFUL, 359 0x930D0D9523C535FDUL, 0x35638D754E9A2B00UL, 0x4085FCCF40469DD5UL, 360 0xC4B17AD28BE23A4CUL, 0xCAB2F0FC6A3E6A2EUL, 0x2860971A6B943FCDUL, 361 0x3DDE6EE212E30446UL, 0x6222F32AE01765AEUL, 0x5D550BB5478308FEUL, 362 0xA9EFA98DA0EDA22AUL, 363 0xC351A71686C40DA7UL, 364 0x1105586D9C867C84UL, 0xDCFFEE85FDA22853UL, 0xCCFBD0262C5EEF76UL, 365 0xBAF294CB8990D201UL, 0xE69464F52AFAD975UL, 0x94B013AFDF133E14UL, 366 0x06A7D1A32823C958UL, 0x6F95FE5130F61119UL, 0xD92AB34E462C06C0UL, 367 0xED7BDE33887C71D2UL, 0x79746D6E6518393EUL, 0x5BA419385D713329UL, 368 0x7C1BA6B948A97564UL, 369 0x31987C197BFDAC67UL, 370 0xDE6C23C44B053D02UL, 0x581C49FED002D64DUL, 0xDD474D6338261571UL, 371 0xAA4546C3E473D062UL, 0x928FCE349455F860UL, 0x48161BBACAAB94D9UL, 372 0x63912430770E6F68UL, 0x6EC8A5E602C6641CUL, 0x87282515337DDD2BUL, 373 0x2CDA6B42034B701BUL, 0xB03D37C181CB096DUL, 0xE108438266C71C6FUL, 374 0x2B3180C7EB51B255UL, 375 0xDF92B82F96C08BBCUL, 376 0x5C68C8C0A632F3BAUL, 0x5504CC861C3D0556UL, 0xABBFA4E55FB26B8FUL, 377 0x41848B0AB3BACEB4UL, 0xB334A273AA445D32UL, 0xBCA696F0A85AD881UL, 378 0x24F6EC65B528D56CUL, 0x0CE1512E90F4524AUL, 0x4E9DD79D5506D35AUL, 379 0x258905FAC6CE9779UL, 0x2019295B3E109B33UL, 0xF8A9478B73A054CCUL, 380 0x2924F2F934417EB0UL, 381 0x3993357D536D1BC4UL, 382 0x38A81AC21DB6FF8BUL, 0x47C4FBF17D6016BFUL, 0x1E0FAADD7667E3F5UL, 383 0x7ABCFF62938BEB96UL, 0xA78DAD948FC179C9UL, 0x8F1F98B72911E50DUL, 384 0x61E48EAE27121A91UL, 0x4D62F7AD31859808UL, 0xECEBA345EF5CEAEBUL, 385 0xF5CEB25EBC9684CEUL, 0xF633E20CB7F76221UL, 0xA32CDF06AB8293E4UL, 386 0x985A202CA5EE2CA4UL, 387 0xCF0B8447CC8A8FB1UL, 388 0x9F765244979859A3UL, 0xA8D516B1A1240017UL, 0x0BD7BA3EBB5DC726UL, 389 0xE54BCA55B86ADB39UL, 0x1D7A3AFD6C478063UL, 0x519EC608E7669EDDUL, 390 0x0E5715A2D149AA23UL, 0x177D4571848FF194UL, 0xEEB55F3241014C22UL, 391 0x0F5E5CA13A6E2EC2UL, 0x8029927B75F5C361UL, 0xAD139FABC3D6E436UL, 392 0x0D5DF1A94CCF402FUL, 393 0x3E8BD948BEA5DFC8UL, 394 0xA5A0D357BD3FF77EUL, 0xA2D12E251F74F645UL, 0x66FD9E525E81A082UL, 395 0x2E0C90CE7F687A49UL, 0xC2E8BCBEBA973BC5UL, 0x000001BCE509745FUL, 396 0x423777BBE6DAB3D6UL, 0xD1661C7EAEF06EB5UL, 0xA1781F354DAACFD8UL, 397 0x2D11284A2B16AFFCUL, 0xF1FC4F67FA891D1FUL, 0x73ECC25DCB920ADAUL, 398 0xAE610C22C2A12651UL, 399 0x96E0A810D356B78AUL, 400 0x5A9A381F2FE7870FUL, 0xD5AD62EDE94E5530UL, 0xD225E5E8368D1427UL, 401 0x65977B70C7AF4631UL, 0x99F889B2DE39D74FUL, 0x233F30BF54E1D143UL, 402 0x9A9675D3D9A63C97UL, 0x5470554FF334F9A8UL, 0x166ACB744A4F5688UL, 403 0x70C74CAAB2E4AEADUL, 0xF0D091646F294D12UL, 0x57B82A89684031D1UL, 404 0xEFD95A5A61BE0B6BUL, 405 0x2FBD12E969F2F29AUL, 406 0x9BD37013FEFF9FE8UL, 0x3F9B0404D6085A06UL, 0x4940C1F3166CFE15UL, 407 0x09542C4DCDF3DEFBUL, 0xB4C5218385CD5CE3UL, 0xC935B7DC4462A641UL, 408 0x3417F8A68ED3B63FUL, 0xB80959295B215B40UL, 0xF99CDAEF3B8C8572UL, 409 0x018C0614F8FCB95DUL, 0x1B14ACCD1A3ACDF3UL, 0x84D471F200BB732DUL, 410 0xC1A3110E95E8DA16UL, 411 0x430A7220BF1A82B8UL, 412 0xB77E090D39DF210EUL, 0x5EF4BD9F3CD05E9DUL, 0x9D4FF6DA7E57A444UL, 413 0xDA1D60E183D4A5F8UL, 0xB287C38417998E47UL, 0xFE3EDC121BB31886UL, 414 0xC7FE3CCC980CCBEFUL, 0xE46FB590189BFD03UL, 0x3732FD469A4C57DCUL, 415 0x7EF700A07CF1AD65UL, 0x59C64468A31D8859UL, 0x762FB0B4D45B61F6UL, 416 0x155BAED099047718UL, 417 0x68755E4C3D50BAA6UL, 418 0xE9214E7F22D8B4DFUL, 0x2ADDBF532EAC95F4UL, 0x32AE3909B4BD0109UL, 419 0x834DF537B08E3450UL, 0xFA209DA84220728DUL, 0x9E691D9B9EFE23F7UL, 420 0x0446D288C4AE8D7FUL, 0x7B4CC524E169785BUL, 0x21D87F0135CA1385UL, 421 0xCEBB400F137B8AA5UL, 0x272E2B66580796BEUL, 0x3612264125C2B0DEUL, 422 0x057702BDAD1EFBB2UL, 423 0xD4BABB8EACF84BE9UL, 424 0x91583139641BC67BUL, 0x8BDC2DE08036E024UL, 0x603C8156F49F68EDUL, 425 0xF7D236F7DBEF5111UL, 0x9727C4598AD21E80UL, 0xA08A0896670A5FD7UL, 426 0xCB4A8F4309EBA9CBUL, 0x81AF564B0F7036A1UL, 0xC0B99AA778199ABDUL, 427 0x959F1EC83FC8E952UL, 0x8C505077794A81B9UL, 0x3ACAAF8F056338F0UL, 428 0x07B43F50627A6778UL, 429 0x4A44AB49F5ECCC77UL, 430 0x3BC3D6E4B679EE98UL, 0x9CC0D4D1CF14108CUL, 0x4406C00B206BC8A0UL, 431 0x82A18854C8D72D89UL, 0x67E366B35C3C432CUL, 0xB923DD61102B37F2UL, 432 0x56AB2779D884271DUL, 0xBE83E1B0FF1525AFUL, 0xFB7C65D4217E49A9UL, 433 0x6BDBE0E76D48E7D4UL, 0x08DF828745D9179EUL, 0x22EA6A9ADD53BD34UL, 434 0xE36E141C5622200AUL, 435 0x7F805D1B8CB750EEUL, 436 0xAFE5C7A59F58E837UL, 0xE27F996A4FB1C23CUL, 0xD3867DFB0775F0D0UL, 437 0xD0E673DE6E88891AUL, 0x123AEB9EAFB86C25UL, 0x30F1D5D5C145B895UL, 438 0xBB434A2DEE7269E7UL, 0x78CB67ECF931FA38UL, 0xF33B0372323BBF9CUL, 439 0x52D66336FB279C74UL, 0x505F33AC0AFB4EAAUL, 0xE8A5CD99A2CCE187UL, 440 0x534974801E2D30BBUL, 441 0x8D2D5711D5876D90UL, 442 0x1F1A412891BC038EUL, 0xD6E2E71D82E56648UL, 0x74036C3A497732B7UL, 443 0x89B67ED96361F5ABUL, 0xFFED95D8F1EA02A2UL, 0xE72B3BD61464D43DUL, 444 0xA6300F170BDC4820UL, 0xEBC18760ED78A77AUL 445 ]; 446 447 immutable ulong[256] table2 = [ 448 0xE6A6BE5A05A12138UL, 0xB5A122A5B4F87C98UL, 0x563C6089140B6990UL, 449 0x4C46CB2E391F5DD5UL, 0xD932ADDBC9B79434UL, 0x08EA70E42015AFF5UL, 450 0xD765A6673E478CF1UL, 0xC4FB757EAB278D99UL, 0xDF11C6862D6E0692UL, 451 0xDDEB84F10D7F3B16UL, 452 0x6F2EF604A665EA04UL, 0x4A8E0F0FF0E0DFB3UL, 0xA5EDEEF83DBCBA51UL, 453 0xFC4F0A2A0EA4371EUL, 0xE83E1DA85CB38429UL, 0xDC8FF882BA1B1CE2UL, 454 0xCD45505E8353E80DUL, 0x18D19A00D4DB0717UL, 0x34A0CFEDA5F38101UL, 455 0x0BE77E518887CAF2UL, 0x1E341438B3C45136UL, 0xE05797F49089CCF9UL, 456 0xFFD23F9DF2591D14UL, 457 0x543DDA228595C5CDUL, 458 0x661F81FD99052A33UL, 0x8736E641DB0F7B76UL, 0x15227725418E5307UL, 459 0xE25F7F46162EB2FAUL, 0x48A8B2126C13D9FEUL, 0xAFDC541792E76EEAUL, 460 0x03D912BFC6D1898FUL, 0x31B1AAFA1B83F51BUL, 0xF1AC2796E42AB7D9UL, 461 0x40A3A7D7FCD2EBACUL, 0x1056136D0AFBBCC5UL, 0x7889E1DD9A6D0C85UL, 462 0xD33525782A7974AAUL, 463 0xA7E25D09078AC09BUL, 464 0xBD4138B3EAC6EDD0UL, 0x920ABFBE71EB9E70UL, 0xA2A5D0F54FC2625CUL, 465 0xC054E36B0B1290A3UL, 0xF6DD59FF62FE932BUL, 0x3537354511A8AC7DUL, 466 0xCA845E9172FADCD4UL, 0x84F82B60329D20DCUL, 0x79C62CE1CD672F18UL, 467 0x8B09A2ADD124642CUL, 0xD0C1E96A19D9E726UL, 0x5A786A9B4BA9500CUL, 468 0x0E020336634C43F3UL, 469 0xC17B474AEB66D822UL, 470 0x6A731AE3EC9BAAC2UL, 0x8226667AE0840258UL, 0x67D4567691CAECA5UL, 471 0x1D94155C4875ADB5UL, 0x6D00FD985B813FDFUL, 0x51286EFCB774CD06UL, 472 0x5E8834471FA744AFUL, 0xF72CA0AEE761AE2EUL, 0xBE40E4CDAEE8E09AUL, 473 0xE9970BBB5118F665UL, 0x726E4BEB33DF1964UL, 0x703B000729199762UL, 474 0x4631D816F5EF30A7UL, 475 0xB880B5B51504A6BEUL, 476 0x641793C37ED84B6CUL, 0x7B21ED77F6E97D96UL, 0x776306312EF96B73UL, 477 0xAE528948E86FF3F4UL, 0x53DBD7F286A3F8F8UL, 0x16CADCE74CFC1063UL, 478 0x005C19BDFA52C6DDUL, 0x68868F5D64D46AD3UL, 0x3A9D512CCF1E186AUL, 479 0x367E62C2385660AEUL, 0xE359E7EA77DCB1D7UL, 0x526C0773749ABE6EUL, 480 0x735AE5F9D09F734BUL, 481 0x493FC7CC8A558BA8UL, 482 0xB0B9C1533041AB45UL, 0x321958BA470A59BDUL, 0x852DB00B5F46C393UL, 483 0x91209B2BD336B0E5UL, 0x6E604F7D659EF19FUL, 0xB99A8AE2782CCB24UL, 484 0xCCF52AB6C814C4C7UL, 0x4727D9AFBE11727BUL, 0x7E950D0C0121B34DUL, 485 0x756F435670AD471FUL, 0xF5ADD442615A6849UL, 0x4E87E09980B9957AUL, 486 0x2ACFA1DF50AEE355UL, 487 0xD898263AFD2FD556UL, 488 0xC8F4924DD80C8FD6UL, 0xCF99CA3D754A173AUL, 0xFE477BACAF91BF3CUL, 489 0xED5371F6D690C12DUL, 0x831A5C285E687094UL, 0xC5D3C90A3708A0A4UL, 490 0x0F7F903717D06580UL, 0x19F9BB13B8FDF27FUL, 0xB1BD6F1B4D502843UL, 491 0x1C761BA38FFF4012UL, 0x0D1530C4E2E21F3BUL, 0x8943CE69A7372C8AUL, 492 0xE5184E11FEB5CE66UL, 493 0x618BDB80BD736621UL, 494 0x7D29BAD68B574D0BUL, 0x81BB613E25E6FE5BUL, 0x071C9C10BC07913FUL, 495 0xC7BEEB7909AC2D97UL, 0xC3E58D353BC5D757UL, 0xEB017892F38F61E8UL, 496 0xD4EFFB9C9B1CC21AUL, 0x99727D26F494F7ABUL, 0xA3E063A2956B3E03UL, 497 0x9D4A8B9A4AA09C30UL, 0x3F6AB7D500090FB4UL, 0x9CC0F2A057268AC0UL, 498 0x3DEE9D2DEDBF42D1UL, 499 0x330F49C87960A972UL, 500 0xC6B2720287421B41UL, 0x0AC59EC07C00369CUL, 0xEF4EAC49CB353425UL, 501 0xF450244EEF0129D8UL, 0x8ACC46E5CAF4DEB6UL, 0x2FFEAB63989263F7UL, 502 0x8F7CB9FE5D7A4578UL, 0x5BD8F7644E634635UL, 0x427A7315BF2DC900UL, 503 0x17D0C4AA2125261CUL, 0x3992486C93518E50UL, 0xB4CBFEE0A2D7D4C3UL, 504 0x7C75D6202C5DDD8DUL, 505 0xDBC295D8E35B6C61UL, 506 0x60B369D302032B19UL, 0xCE42685FDCE44132UL, 0x06F3DDB9DDF65610UL, 507 0x8EA4D21DB5E148F0UL, 0x20B0FCE62FCD496FUL, 0x2C1B912358B0EE31UL, 508 0xB28317B818F5A308UL, 0xA89C1E189CA6D2CFUL, 0x0C6B18576AAADBC8UL, 509 0xB65DEAA91299FAE3UL, 0xFB2B794B7F1027E7UL, 0x04E4317F443B5BEBUL, 510 0x4B852D325939D0A6UL, 511 0xD5AE6BEEFB207FFCUL, 512 0x309682B281C7D374UL, 0xBAE309A194C3B475UL, 0x8CC3F97B13B49F05UL, 513 0x98A9422FF8293967UL, 0x244B16B01076FF7CUL, 0xF8BF571C663D67EEUL, 514 0x1F0D6758EEE30DA1UL, 0xC9B611D97ADEB9B7UL, 0xB7AFD5887B6C57A2UL, 515 0x6290AE846B984FE1UL, 0x94DF4CDEACC1A5FDUL, 0x058A5BD1C5483AFFUL, 516 0x63166CC142BA3C37UL, 517 0x8DB8526EB2F76F40UL, 518 0xE10880036F0D6D4EUL, 0x9E0523C9971D311DUL, 0x45EC2824CC7CD691UL, 519 0x575B8359E62382C9UL, 0xFA9E400DC4889995UL, 0xD1823ECB45721568UL, 520 0xDAFD983B8206082FUL, 0xAA7D29082386A8CBUL, 0x269FCD4403B87588UL, 521 0x1B91F5F728BDD1E0UL, 0xE4669F39040201F6UL, 0x7A1D7C218CF04ADEUL, 522 0x65623C29D79CE5CEUL, 523 0x2368449096C00BB1UL, 524 0xAB9BF1879DA503BAUL, 0xBC23ECB1A458058EUL, 0x9A58DF01BB401ECCUL, 525 0xA070E868A85F143DUL, 0x4FF188307DF2239EUL, 0x14D565B41A641183UL, 526 0xEE13337452701602UL, 0x950E3DCF3F285E09UL, 0x59930254B9C80953UL, 527 0x3BF299408930DA6DUL, 0xA955943F53691387UL, 0xA15EDECAA9CB8784UL, 528 0x29142127352BE9A0UL, 529 0x76F0371FFF4E7AFBUL, 530 0x0239F450274F2228UL, 0xBB073AF01D5E868BUL, 0xBFC80571C10E96C1UL, 531 0xD267088568222E23UL, 0x9671A3D48E80B5B0UL, 0x55B5D38AE193BB81UL, 532 0x693AE2D0A18B04B8UL, 0x5C48B4ECADD5335FUL, 0xFD743B194916A1CAUL, 533 0x2577018134BE98C4UL, 0xE77987E83C54A4ADUL, 0x28E11014DA33E1B9UL, 534 0x270CC59E226AA213UL, 535 0x71495F756D1A5F60UL, 536 0x9BE853FB60AFEF77UL, 0xADC786A7F7443DBFUL, 0x0904456173B29A82UL, 537 0x58BC7A66C232BD5EUL, 0xF306558C673AC8B2UL, 0x41F639C6B6C9772AUL, 538 0x216DEFE99FDA35DAUL, 0x11640CC71C7BE615UL, 0x93C43694565C5527UL, 539 0xEA038E6246777839UL, 0xF9ABF3CE5A3E2469UL, 0x741E768D0FD312D2UL, 540 0x0144B883CED652C6UL, 541 0xC20B5A5BA33F8552UL, 542 0x1AE69633C3435A9DUL, 0x97A28CA4088CFDECUL, 0x8824A43C1E96F420UL, 543 0x37612FA66EEEA746UL, 0x6B4CB165F9CF0E5AUL, 0x43AA1C06A0ABFB4AUL, 544 0x7F4DC26FF162796BUL, 0x6CBACC8E54ED9B0FUL, 0xA6B7FFEFD2BB253EUL, 545 0x2E25BC95B0A29D4FUL, 0x86D6A58BDEF1388CUL, 0xDED74AC576B6F054UL, 546 0x8030BDBC2B45805DUL, 547 0x3C81AF70E94D9289UL, 548 0x3EFF6DDA9E3100DBUL, 0xB38DC39FDFCC8847UL, 0x123885528D17B87EUL, 549 0xF2DA0ED240B1B642UL, 0x44CEFADCD54BF9A9UL, 0x1312200E433C7EE6UL, 550 0x9FFCC84F3A78C748UL, 0xF0CD1F72248576BBUL, 0xEC6974053638CFE4UL, 551 0x2BA7B67C0CEC4E4CUL, 0xAC2F4DF3E5CE32EDUL, 0xCB33D14326EA4C11UL, 552 0xA4E9044CC77E58BCUL, 553 0x5F513293D934FCEFUL, 554 0x5DC9645506E55444UL, 0x50DE418F317DE40AUL, 0x388CB31A69DDE259UL, 555 0x2DB4A83455820A86UL, 0x9010A91E84711AE9UL, 0x4DF7F0B7B1498371UL, 556 0xD62A2EABC0977179UL, 0x22FAC097AA8D5C0EUL 557 ]; 558 559 immutable ulong[256] table3 = [ 560 0xF49FCC2FF1DAF39BUL, 0x487FD5C66FF29281UL, 0xE8A30667FCDCA83FUL, 561 0x2C9B4BE3D2FCCE63UL, 0xDA3FF74B93FBBBC2UL, 0x2FA165D2FE70BA66UL, 562 0xA103E279970E93D4UL, 0xBECDEC77B0E45E71UL, 0xCFB41E723985E497UL, 563 0xB70AAA025EF75017UL, 564 0xD42309F03840B8E0UL, 0x8EFC1AD035898579UL, 0x96C6920BE2B2ABC5UL, 565 0x66AF4163375A9172UL, 0x2174ABDCCA7127FBUL, 0xB33CCEA64A72FF41UL, 566 0xF04A4933083066A5UL, 0x8D970ACDD7289AF5UL, 0x8F96E8E031C8C25EUL, 567 0xF3FEC02276875D47UL, 0xEC7BF310056190DDUL, 0xF5ADB0AEBB0F1491UL, 568 0x9B50F8850FD58892UL, 569 0x4975488358B74DE8UL, 570 0xA3354FF691531C61UL, 0x0702BBE481D2C6EEUL, 0x89FB24057DEDED98UL, 571 0xAC3075138596E902UL, 0x1D2D3580172772EDUL, 0xEB738FC28E6BC30DUL, 572 0x5854EF8F63044326UL, 0x9E5C52325ADD3BBEUL, 0x90AA53CF325C4623UL, 573 0xC1D24D51349DD067UL, 0x2051CFEEA69EA624UL, 0x13220F0A862E7E4FUL, 574 0xCE39399404E04864UL, 575 0xD9C42CA47086FCB7UL, 576 0x685AD2238A03E7CCUL, 0x066484B2AB2FF1DBUL, 0xFE9D5D70EFBF79ECUL, 577 0x5B13B9DD9C481854UL, 0x15F0D475ED1509ADUL, 0x0BEBCD060EC79851UL, 578 0xD58C6791183AB7F8UL, 0xD1187C5052F3EEE4UL, 0xC95D1192E54E82FFUL, 579 0x86EEA14CB9AC6CA2UL, 0x3485BEB153677D5DUL, 0xDD191D781F8C492AUL, 580 0xF60866BAA784EBF9UL, 581 0x518F643BA2D08C74UL, 582 0x8852E956E1087C22UL, 0xA768CB8DC410AE8DUL, 0x38047726BFEC8E1AUL, 583 0xA67738B4CD3B45AAUL, 0xAD16691CEC0DDE19UL, 0xC6D4319380462E07UL, 584 0xC5A5876D0BA61938UL, 0x16B9FA1FA58FD840UL, 0x188AB1173CA74F18UL, 585 0xABDA2F98C99C021FUL, 0x3E0580AB134AE816UL, 0x5F3B05B773645ABBUL, 586 0x2501A2BE5575F2F6UL, 587 0x1B2F74004E7E8BA9UL, 588 0x1CD7580371E8D953UL, 0x7F6ED89562764E30UL, 0xB15926FF596F003DUL, 589 0x9F65293DA8C5D6B9UL, 0x6ECEF04DD690F84CUL, 0x4782275FFF33AF88UL, 590 0xE41433083F820801UL, 0xFD0DFE409A1AF9B5UL, 0x4325A3342CDB396BUL, 591 0x8AE77E62B301B252UL, 0xC36F9E9F6655615AUL, 0x85455A2D92D32C09UL, 592 0xF2C7DEA949477485UL, 593 0x63CFB4C133A39EBAUL, 594 0x83B040CC6EBC5462UL, 0x3B9454C8FDB326B0UL, 0x56F56A9E87FFD78CUL, 595 0x2DC2940D99F42BC6UL, 0x98F7DF096B096E2DUL, 0x19A6E01E3AD852BFUL, 596 0x42A99CCBDBD4B40BUL, 0xA59998AF45E9C559UL, 0x366295E807D93186UL, 597 0x6B48181BFAA1F773UL, 0x1FEC57E2157A0A1DUL, 0x4667446AF6201AD5UL, 598 0xE615EBCACFB0F075UL, 599 0xB8F31F4F68290778UL, 600 0x22713ED6CE22D11EUL, 0x3057C1A72EC3C93BUL, 0xCB46ACC37C3F1F2FUL, 601 0xDBB893FD02AAF50EUL, 0x331FD92E600B9FCFUL, 0xA498F96148EA3AD6UL, 602 0xA8D8426E8B6A83EAUL, 0xA089B274B7735CDCUL, 0x87F6B3731E524A11UL, 603 0x118808E5CBC96749UL, 0x9906E4C7B19BD394UL, 0xAFED7F7E9B24A20CUL, 604 0x6509EADEEB3644A7UL, 605 0x6C1EF1D3E8EF0EDEUL, 606 0xB9C97D43E9798FB4UL, 0xA2F2D784740C28A3UL, 0x7B8496476197566FUL, 607 0x7A5BE3E6B65F069DUL, 0xF96330ED78BE6F10UL, 0xEEE60DE77A076A15UL, 608 0x2B4BEE4AA08B9BD0UL, 0x6A56A63EC7B8894EUL, 0x02121359BA34FEF4UL, 609 0x4CBF99F8283703FCUL, 0x398071350CAF30C8UL, 0xD0A77A89F017687AUL, 610 0xF1C1A9EB9E423569UL, 611 0x8C7976282DEE8199UL, 612 0x5D1737A5DD1F7ABDUL, 0x4F53433C09A9FA80UL, 0xFA8B0C53DF7CA1D9UL, 613 0x3FD9DCBC886CCB77UL, 0xC040917CA91B4720UL, 0x7DD00142F9D1DCDFUL, 614 0x8476FC1D4F387B58UL, 0x23F8E7C5F3316503UL, 0x032A2244E7E37339UL, 615 0x5C87A5D750F5A74BUL, 0x082B4CC43698992EUL, 0xDF917BECB858F63CUL, 616 0x3270B8FC5BF86DDAUL, 617 0x10AE72BB29B5DD76UL, 618 0x576AC94E7700362BUL, 0x1AD112DAC61EFB8FUL, 0x691BC30EC5FAA427UL, 619 0xFF246311CC327143UL, 0x3142368E30E53206UL, 0x71380E31E02CA396UL, 620 0x958D5C960AAD76F1UL, 0xF8D6F430C16DA536UL, 0xC8FFD13F1BE7E1D2UL, 621 0x7578AE66004DDBE1UL, 0x05833F01067BE646UL, 0xBB34B5AD3BFE586DUL, 622 0x095F34C9A12B97F0UL, 623 0x247AB64525D60CA8UL, 624 0xDCDBC6F3017477D1UL, 0x4A2E14D4DECAD24DUL, 0xBDB5E6D9BE0A1EEBUL, 625 0x2A7E70F7794301ABUL, 0xDEF42D8A270540FDUL, 0x01078EC0A34C22C1UL, 626 0xE5DE511AF4C16387UL, 0x7EBB3A52BD9A330AUL, 0x77697857AA7D6435UL, 627 0x004E831603AE4C32UL, 0xE7A21020AD78E312UL, 0x9D41A70C6AB420F2UL, 628 0x28E06C18EA1141E6UL, 629 0xD2B28CBD984F6B28UL, 630 0x26B75F6C446E9D83UL, 0xBA47568C4D418D7FUL, 0xD80BADBFE6183D8EUL, 631 0x0E206D7F5F166044UL, 0xE258A43911CBCA3EUL, 0x723A1746B21DC0BCUL, 632 0xC7CAA854F5D7CDD3UL, 0x7CAC32883D261D9CUL, 0x7690C26423BA942CUL, 633 0x17E55524478042B8UL, 0xE0BE477656A2389FUL, 0x4D289B5E67AB2DA0UL, 634 0x44862B9C8FBBFD31UL, 635 0xB47CC8049D141365UL, 636 0x822C1B362B91C793UL, 0x4EB14655FB13DFD8UL, 0x1ECBBA0714E2A97BUL, 637 0x6143459D5CDE5F14UL, 0x53A8FBF1D5F0AC89UL, 0x97EA04D81C5E5B00UL, 638 0x622181A8D4FDB3F3UL, 0xE9BCD341572A1208UL, 0x1411258643CCE58AUL, 639 0x9144C5FEA4C6E0A4UL, 0x0D33D06565CF620FUL, 0x54A48D489F219CA1UL, 640 0xC43E5EAC6D63C821UL, 641 0xA9728B3A72770DAFUL, 642 0xD7934E7B20DF87EFUL, 0xE35503B61A3E86E5UL, 0xCAE321FBC819D504UL, 643 0x129A50B3AC60BFA6UL, 0xCD5E68EA7E9FB6C3UL, 0xB01C90199483B1C7UL, 644 0x3DE93CD5C295376CUL, 0xAED52EDF2AB9AD13UL, 0x2E60F512C0A07884UL, 645 0xBC3D86A3E36210C9UL, 0x35269D9B163951CEUL, 0x0C7D6E2AD0CDB5FAUL, 646 0x59E86297D87F5733UL, 647 0x298EF221898DB0E7UL, 648 0x55000029D1A5AA7EUL, 0x8BC08AE1B5061B45UL, 0xC2C31C2B6C92703AUL, 649 0x94CC596BAF25EF42UL, 0x0A1D73DB22540456UL, 0x04B6A0F9D9C4179AUL, 650 0xEFFDAFA2AE3D3C60UL, 0xF7C8075BB49496C4UL, 0x9CC5C7141D1CD4E3UL, 651 0x78BD1638218E5534UL, 0xB2F11568F850246AUL, 0xEDFABCFA9502BC29UL, 652 0x796CE5F2DA23051BUL, 653 0xAAE128B0DC93537CUL, 654 0x3A493DA0EE4B29AEUL, 0xB5DF6B2C416895D7UL, 0xFCABBD25122D7F37UL, 655 0x70810B58105DC4B1UL, 0xE10FDD37F7882A90UL, 0x524DCAB5518A3F5CUL, 656 0x3C9E85878451255BUL, 0x4029828119BD34E2UL, 0x74A05B6F5D3CECCBUL, 657 0xB610021542E13ECAUL, 0x0FF979D12F59E2ACUL, 0x6037DA27E4F9CC50UL, 658 0x5E92975A0DF1847DUL, 659 0xD66DE190D3E623FEUL, 660 0x5032D6B87B568048UL, 0x9A36B7CE8235216EUL, 0x80272A7A24F64B4AUL, 661 0x93EFED8B8C6916F7UL, 0x37DDBFF44CCE1555UL, 0x4B95DB5D4B99BD25UL, 662 0x92D3FDA169812FC0UL, 0xFB1A4A9A90660BB6UL, 0x730C196946A4B9B2UL, 663 0x81E289AA7F49DA68UL, 0x64669A0F83B1A05FUL, 0x27B3FF7D9644F48BUL, 664 0xCC6B615C8DB675B3UL, 665 0x674F20B9BCEBBE95UL, 666 0x6F31238275655982UL, 0x5AE488713E45CF05UL, 0xBF619F9954C21157UL, 667 0xEABAC46040A8EAE9UL, 0x454C6FE9F2C0C1CDUL, 0x419CF6496412691CUL, 668 0xD3DC3BEF265B0F70UL, 0x6D0E60F5C3578A9EUL 669 ]; 670 671 immutable ulong[256] table4 = [ 672 0x5B0E608526323C55UL, 0x1A46C1A9FA1B59F5UL, 0xA9E245A17C4C8FFAUL, 673 0x65CA5159DB2955D7UL, 0x05DB0A76CE35AFC2UL, 0x81EAC77EA9113D45UL, 674 0x528EF88AB6AC0A0DUL, 0xA09EA253597BE3FFUL, 0x430DDFB3AC48CD56UL, 675 0xC4B3A67AF45CE46FUL, 676 0x4ECECFD8FBE2D05EUL, 0x3EF56F10B39935F0UL, 0x0B22D6829CD619C6UL, 677 0x17FD460A74DF2069UL, 0x6CF8CC8E8510ED40UL, 0xD6C824BF3A6ECAA7UL, 678 0x61243D581A817049UL, 0x048BACB6BBC163A2UL, 0xD9A38AC27D44CC32UL, 679 0x7FDDFF5BAAF410ABUL, 0xAD6D495AA804824BUL, 0xE1A6A74F2D8C9F94UL, 680 0xD4F7851235DEE8E3UL, 681 0xFD4B7F886540D893UL, 682 0x247C20042AA4BFDAUL, 0x096EA1C517D1327CUL, 0xD56966B4361A6685UL, 683 0x277DA5C31221057DUL, 0x94D59893A43ACFF7UL, 0x64F0C51CCDC02281UL, 684 0x3D33BCC4FF6189DBUL, 0xE005CB184CE66AF1UL, 0xFF5CCD1D1DB99BEAUL, 685 0xB0B854A7FE42980FUL, 0x7BD46A6A718D4B9FUL, 0xD10FA8CC22A5FD8CUL, 686 0xD31484952BE4BD31UL, 687 0xC7FA975FCB243847UL, 688 0x4886ED1E5846C407UL, 0x28CDDB791EB70B04UL, 0xC2B00BE2F573417FUL, 689 0x5C9590452180F877UL, 0x7A6BDDFFF370EB00UL, 0xCE509E38D6D9D6A4UL, 690 0xEBEB0F00647FA702UL, 0x1DCC06CF76606F06UL, 0xE4D9F28BA286FF0AUL, 691 0xD85A305DC918C262UL, 0x475B1D8732225F54UL, 0x2D4FB51668CCB5FEUL, 692 0xA679B9D9D72BBA20UL, 693 0x53841C0D912D43A5UL, 694 0x3B7EAA48BF12A4E8UL, 0x781E0E47F22F1DDFUL, 0xEFF20CE60AB50973UL, 695 0x20D261D19DFFB742UL, 0x16A12B03062A2E39UL, 0x1960EB2239650495UL, 696 0x251C16FED50EB8B8UL, 0x9AC0C330F826016EUL, 0xED152665953E7671UL, 697 0x02D63194A6369570UL, 0x5074F08394B1C987UL, 0x70BA598C90B25CE1UL, 698 0x794A15810B9742F6UL, 699 0x0D5925E9FCAF8C6CUL, 700 0x3067716CD868744EUL, 0x910AB077E8D7731BUL, 0x6A61BBDB5AC42F61UL, 701 0x93513EFBF0851567UL, 0xF494724B9E83E9D5UL, 0xE887E1985C09648DUL, 702 0x34B1D3C675370CFDUL, 0xDC35E433BC0D255DUL, 0xD0AAB84234131BE0UL, 703 0x08042A50B48B7EAFUL, 0x9997C4EE44A3AB35UL, 0x829A7B49201799D0UL, 704 0x263B8307B7C54441UL, 705 0x752F95F4FD6A6CA6UL, 706 0x927217402C08C6E5UL, 0x2A8AB754A795D9EEUL, 0xA442F7552F72943DUL, 707 0x2C31334E19781208UL, 0x4FA98D7CEAEE6291UL, 0x55C3862F665DB309UL, 708 0xBD0610175D53B1F3UL, 0x46FE6CB840413F27UL, 0x3FE03792DF0CFA59UL, 709 0xCFE700372EB85E8FUL, 0xA7BE29E7ADBCE118UL, 0xE544EE5CDE8431DDUL, 710 0x8A781B1B41F1873EUL, 711 0xA5C94C78A0D2F0E7UL, 712 0x39412E2877B60728UL, 0xA1265EF3AFC9A62CUL, 0xBCC2770C6A2506C5UL, 713 0x3AB66DD5DCE1CE12UL, 0xE65499D04A675B37UL, 0x7D8F523481BFD216UL, 714 0x0F6F64FCEC15F389UL, 0x74EFBE618B5B13C8UL, 0xACDC82B714273E1DUL, 715 0xDD40BFE003199D17UL, 0x37E99257E7E061F8UL, 0xFA52626904775AAAUL, 716 0x8BBBF63A463D56F9UL, 717 0xF0013F1543A26E64UL, 718 0xA8307E9F879EC898UL, 0xCC4C27A4150177CCUL, 0x1B432F2CCA1D3348UL, 719 0xDE1D1F8F9F6FA013UL, 0x606602A047A7DDD6UL, 0xD237AB64CC1CB2C7UL, 720 0x9B938E7225FCD1D3UL, 0xEC4E03708E0FF476UL, 0xFEB2FBDA3D03C12DUL, 721 0xAE0BCED2EE43889AUL, 0x22CB8923EBFB4F43UL, 0x69360D013CF7396DUL, 722 0x855E3602D2D4E022UL, 723 0x073805BAD01F784CUL, 724 0x33E17A133852F546UL, 0xDF4874058AC7B638UL, 0xBA92B29C678AA14AUL, 725 0x0CE89FC76CFAADCDUL, 0x5F9D4E0908339E34UL, 0xF1AFE9291F5923B9UL, 726 0x6E3480F60F4A265FUL, 0xEEBF3A2AB29B841CUL, 0xE21938A88F91B4ADUL, 727 0x57DFEFF845C6D3C3UL, 0x2F006B0BF62CAAF2UL, 0x62F479EF6F75EE78UL, 728 0x11A55AD41C8916A9UL, 729 0xF229D29084FED453UL, 730 0x42F1C27B16B000E6UL, 0x2B1F76749823C074UL, 0x4B76ECA3C2745360UL, 731 0x8C98F463B91691BDUL, 0x14BCC93CF1ADE66AUL, 0x8885213E6D458397UL, 732 0x8E177DF0274D4711UL, 0xB49B73B5503F2951UL, 0x10168168C3F96B6BUL, 733 0x0E3D963B63CAB0AEUL, 0x8DFC4B5655A1DB14UL, 0xF789F1356E14DE5CUL, 734 0x683E68AF4E51DAC1UL, 735 0xC9A84F9D8D4B0FD9UL, 736 0x3691E03F52A0F9D1UL, 0x5ED86E46E1878E80UL, 0x3C711A0E99D07150UL, 737 0x5A0865B20C4E9310UL, 0x56FBFC1FE4F0682EUL, 0xEA8D5DE3105EDF9BUL, 738 0x71ABFDB12379187AUL, 0x2EB99DE1BEE77B9CUL, 0x21ECC0EA33CF4523UL, 739 0x59A4D7521805C7A1UL, 0x3896F5EB56AE7C72UL, 0xAA638F3DB18F75DCUL, 740 0x9F39358DABE9808EUL, 741 0xB7DEFA91C00B72ACUL, 742 0x6B5541FD62492D92UL, 0x6DC6DEE8F92E4D5BUL, 0x353F57ABC4BEEA7EUL, 743 0x735769D6DA5690CEUL, 0x0A234AA642391484UL, 0xF6F9508028F80D9DUL, 744 0xB8E319A27AB3F215UL, 0x31AD9C1151341A4DUL, 0x773C22A57BEF5805UL, 745 0x45C7561A07968633UL, 0xF913DA9E249DBE36UL, 0xDA652D9B78A64C68UL, 746 0x4C27A97F3BC334EFUL, 747 0x76621220E66B17F4UL, 748 0x967743899ACD7D0BUL, 0xF3EE5BCAE0ED6782UL, 0x409F753600C879FCUL, 749 0x06D09A39B5926DB6UL, 0x6F83AEB0317AC588UL, 0x01E6CA4A86381F21UL, 750 0x66FF3462D19F3025UL, 0x72207C24DDFD3BFBUL, 0x4AF6B6D3E2ECE2EBUL, 751 0x9C994DBEC7EA08DEUL, 0x49ACE597B09A8BC4UL, 0xB38C4766CF0797BAUL, 752 0x131B9373C57C2A75UL, 753 0xB1822CCE61931E58UL, 754 0x9D7555B909BA1C0CUL, 0x127FAFDD937D11D2UL, 0x29DA3BADC66D92E4UL, 755 0xA2C1D57154C2ECBCUL, 0x58C5134D82F6FE24UL, 0x1C3AE3515B62274FUL, 756 0xE907C82E01CB8126UL, 0xF8ED091913E37FCBUL, 0x3249D8F9C80046C9UL, 757 0x80CF9BEDE388FB63UL, 0x1881539A116CF19EUL, 0x5103F3F76BD52457UL, 758 0x15B7E6F5AE47F7A8UL, 759 0xDBD7C6DED47E9CCFUL, 760 0x44E55C410228BB1AUL, 0xB647D4255EDB4E99UL, 0x5D11882BB8AAFC30UL, 761 0xF5098BBB29D3212AUL, 0x8FB5EA14E90296B3UL, 0x677B942157DD025AUL, 762 0xFB58E7C0A390ACB5UL, 0x89D3674C83BD4A01UL, 0x9E2DA4DF4BF3B93BUL, 763 0xFCC41E328CAB4829UL, 0x03F38C96BA582C52UL, 0xCAD1BDBD7FD85DB2UL, 764 0xBBB442C16082AE83UL, 765 0xB95FE86BA5DA9AB0UL, 766 0xB22E04673771A93FUL, 0x845358C9493152D8UL, 0xBE2A488697B4541EUL, 767 0x95A2DC2DD38E6966UL, 0xC02C11AC923C852BUL, 0x2388B1990DF2A87BUL, 768 0x7C8008FA1B4F37BEUL, 0x1F70D0C84D54E503UL, 0x5490ADEC7ECE57D4UL, 769 0x002B3C27D9063A3AUL, 0x7EAEA3848030A2BFUL, 0xC602326DED2003C0UL, 770 0x83A7287D69A94086UL, 771 0xC57A5FCB30F57A8AUL, 772 0xB56844E479EBE779UL, 0xA373B40F05DCBCE9UL, 0xD71A786E88570EE2UL, 773 0x879CBACDBDE8F6A0UL, 0x976AD1BCC164A32FUL, 0xAB21E25E9666D78BUL, 774 0x901063AAE5E5C33CUL, 0x9818B34448698D90UL, 0xE36487AE3E1E8ABBUL, 775 0xAFBDF931893BDCB4UL, 0x6345A0DC5FBBD519UL, 0x8628FE269B9465CAUL, 776 0x1E5D01603F9C51ECUL, 777 0x4DE44006A15049B7UL, 778 0xBF6C70E5F776CBB1UL, 0x411218F2EF552BEDUL, 0xCB0C0708705A36A3UL, 779 0xE74D14754F986044UL, 0xCD56D9430EA8280EUL, 0xC12591D7535F5065UL, 780 0xC83223F1720AEF96UL, 0xC3A0396F7363A51FUL 781 ]; 782 783 version(unittest) 784 { 785 import std.conv : hexString; 786 }