github.com/aquanetwork/aquachain@v1.7.8/consensus/aquahash/algorithm.go (about) 1 // Copyright 2017 The aquachain Authors 2 // This file is part of the aquachain library. 3 // 4 // The aquachain library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The aquachain library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the aquachain library. If not, see <http://www.gnu.org/licenses/>. 16 17 package aquahash 18 19 import ( 20 "encoding/binary" 21 "hash" 22 "reflect" 23 "runtime" 24 "sync" 25 "sync/atomic" 26 "time" 27 "unsafe" 28 29 "gitlab.com/aquachain/aquachain/common" 30 "gitlab.com/aquachain/aquachain/common/bitutil" 31 "gitlab.com/aquachain/aquachain/common/log" 32 "gitlab.com/aquachain/aquachain/crypto" 33 "gitlab.com/aquachain/aquachain/crypto/sha3" 34 ) 35 36 const ( 37 datasetInitBytes = 1 << 30 // Bytes in dataset at genesis 38 datasetGrowthBytes = 1 << 23 // Dataset growth per epoch 39 cacheInitBytes = 1 << 24 // Bytes in cache at genesis 40 cacheGrowthBytes = 1 << 17 // Cache growth per epoch 41 epochLength = 30000 // Blocks per epoch 42 mixBytes = 128 // Width of mix 43 hashBytes = 64 // Hash length in bytes 44 hashWords = 16 // Number of 32 bit ints in a hash 45 datasetParents = 256 // Number of parents of each dataset element 46 cacheRounds = 3 // Number of rounds in cache production 47 loopAccesses = 64 // Number of accesses in hashimoto loop 48 ) 49 50 // hasher is a repetitive hasher allowing the same hash data structures to be 51 // reused between hash runs instead of requiring new ones to be created. 52 type hasher func(dest []byte, data []byte) 53 54 // makeHasher creates a repetitive hasher, allowing the same hash data structures 55 // to be reused between hash runs instead of requiring new ones to be created. 56 // The returned function is not thread safe! 57 func makeHasher(h hash.Hash) hasher { 58 return func(dest []byte, data []byte) { 59 h.Write(data) 60 h.Sum(dest[:0]) 61 h.Reset() 62 } 63 } 64 65 // seedHash is the seed to use for generating a verification cache and the mining 66 // dataset. 67 func seedHash(block uint64, version byte) []byte { 68 if version > 1 { 69 return common.BytesToHash([]byte{version}).Bytes() 70 } 71 seed := make([]byte, 32) 72 if block < epochLength { 73 return seed 74 } 75 keccak256 := makeHasher(sha3.NewKeccak256()) 76 for i := 0; i < int(block/epochLength); i++ { 77 keccak256(seed, seed) 78 } 79 return seed 80 } 81 82 // generateCache creates a verification cache of a given size for an input seed. 83 // The cache production process involves first sequentially filling up 32 MB of 84 // memory, then performing two passes of Sergio Demian Lerner's RandMemoHash 85 // algorithm from Strict Memory Hard Hashing Functions (2014). The output is a 86 // set of 524288 64-byte values. 87 // This method places the result into dest in machine byte order. 88 func generateCache(dest []uint32, epoch uint64, seed []byte) { 89 // Print some debug logs to allow analysis on low end devices 90 logger := log.New("epoch", epoch) 91 92 start := time.Now() 93 defer func() { 94 elapsed := time.Since(start) 95 96 logFn := logger.Debug 97 if elapsed > 3*time.Second { 98 logFn = logger.Info 99 } 100 logFn("Generated aquahash verification cache", "elapsed", common.PrettyDuration(elapsed)) 101 }() 102 // Convert our destination slice to a byte buffer 103 header := *(*reflect.SliceHeader)(unsafe.Pointer(&dest)) 104 header.Len *= 4 105 header.Cap *= 4 106 cache := *(*[]byte)(unsafe.Pointer(&header)) 107 108 // Calculate the number of theoretical rows (we'll store in one buffer nonetheless) 109 size := uint64(len(cache)) 110 rows := int(size) / hashBytes 111 112 // Start a monitoring goroutine to report progress on low end devices 113 var progress uint32 114 115 done := make(chan struct{}) 116 defer close(done) 117 118 go func() { 119 for { 120 select { 121 case <-done: 122 return 123 case <-time.After(3 * time.Second): 124 logger.Info("Generating aquahash verification cache", "percentage", atomic.LoadUint32(&progress)*100/uint32(rows)/4, "elapsed", common.PrettyDuration(time.Since(start))) 125 } 126 } 127 }() 128 // Create a hasher to reuse between invocations 129 keccak512 := makeHasher(sha3.NewKeccak512()) 130 131 // Sequentially produce the initial dataset 132 keccak512(cache, seed) 133 for offset := uint64(hashBytes); offset < size; offset += hashBytes { 134 keccak512(cache[offset:], cache[offset-hashBytes:offset]) 135 atomic.AddUint32(&progress, 1) 136 } 137 // Use a low-round version of randmemohash 138 temp := make([]byte, hashBytes) 139 140 for i := 0; i < cacheRounds; i++ { 141 for j := 0; j < rows; j++ { 142 var ( 143 srcOff = ((j - 1 + rows) % rows) * hashBytes 144 dstOff = j * hashBytes 145 xorOff = (binary.LittleEndian.Uint32(cache[dstOff:]) % uint32(rows)) * hashBytes 146 ) 147 bitutil.XORBytes(temp, cache[srcOff:srcOff+hashBytes], cache[xorOff:xorOff+hashBytes]) 148 keccak512(cache[dstOff:], temp) 149 150 atomic.AddUint32(&progress, 1) 151 } 152 } 153 // Swap the byte order on big endian systems and return 154 if !isLittleEndian() { 155 swap(cache) 156 } 157 } 158 159 // swap changes the byte order of the buffer assuming a uint32 representation. 160 func swap(buffer []byte) { 161 for i := 0; i < len(buffer); i += 4 { 162 binary.BigEndian.PutUint32(buffer[i:], binary.LittleEndian.Uint32(buffer[i:])) 163 } 164 } 165 166 // prepare converts an aquahash cache or dataset from a byte stream into the internal 167 // int representation. All aquahash methods work with ints to avoid constant byte to 168 // int conversions as well as to handle both little and big endian systems. 169 func prepare(dest []uint32, src []byte) { 170 for i := 0; i < len(dest); i++ { 171 dest[i] = binary.LittleEndian.Uint32(src[i*4:]) 172 } 173 } 174 175 // fnv is an algorithm inspired by the FNV hash, which in some cases is used as 176 // a non-associative substitute for XOR. Note that we multiply the prime with 177 // the full 32-bit input, in contrast with the FNV-1 spec which multiplies the 178 // prime with one byte (octet) in turn. 179 func fnv(a, b uint32) uint32 { 180 return a*0x01000193 ^ b 181 } 182 183 // fnvHash mixes in data into mix using the aquahash fnv method. 184 func fnvHash(mix []uint32, data []uint32) { 185 for i := 0; i < len(mix); i++ { 186 mix[i] = mix[i]*0x01000193 ^ data[i] 187 } 188 } 189 190 // generateDatasetItem combines data from 256 pseudorandomly selected cache nodes, 191 // and hashes that to compute a single dataset node. 192 func generateDatasetItem(cache []uint32, index uint32, keccak512 hasher) []byte { 193 // Calculate the number of theoretical rows (we use one buffer nonetheless) 194 rows := uint32(len(cache) / hashWords) 195 196 // Initialize the mix 197 mix := make([]byte, hashBytes) 198 199 binary.LittleEndian.PutUint32(mix, cache[(index%rows)*hashWords]^index) 200 for i := 1; i < hashWords; i++ { 201 binary.LittleEndian.PutUint32(mix[i*4:], cache[(index%rows)*hashWords+uint32(i)]) 202 } 203 keccak512(mix, mix) 204 205 // Convert the mix to uint32s to avoid constant bit shifting 206 intMix := make([]uint32, hashWords) 207 for i := 0; i < len(intMix); i++ { 208 intMix[i] = binary.LittleEndian.Uint32(mix[i*4:]) 209 } 210 // fnv it with a lot of random cache nodes based on index 211 for i := uint32(0); i < datasetParents; i++ { 212 parent := fnv(index^i, intMix[i%16]) % rows 213 fnvHash(intMix, cache[parent*hashWords:]) 214 } 215 // Flatten the uint32 mix into a binary one and return 216 for i, val := range intMix { 217 binary.LittleEndian.PutUint32(mix[i*4:], val) 218 } 219 keccak512(mix, mix) 220 return mix 221 } 222 223 // generateDataset generates the entire aquahash dataset for mining. 224 // This method places the result into dest in machine byte order. 225 func generateDataset(dest []uint32, epoch uint64, cache []uint32) { 226 // Print some debug logs to allow analysis on low end devices 227 logger := log.New("epoch", epoch) 228 229 start := time.Now() 230 defer func() { 231 elapsed := time.Since(start) 232 233 logFn := logger.Debug 234 if elapsed > 3*time.Second { 235 logFn = logger.Info 236 } 237 logFn("Generated aquahash verification cache", "elapsed", common.PrettyDuration(elapsed)) 238 }() 239 240 // Figure out whether the bytes need to be swapped for the machine 241 swapped := !isLittleEndian() 242 243 // Convert our destination slice to a byte buffer 244 header := *(*reflect.SliceHeader)(unsafe.Pointer(&dest)) 245 header.Len *= 4 246 header.Cap *= 4 247 dataset := *(*[]byte)(unsafe.Pointer(&header)) 248 249 // Generate the dataset on many goroutines since it takes a while 250 threads := runtime.NumCPU() 251 size := uint64(len(dataset)) 252 253 var pend sync.WaitGroup 254 pend.Add(threads) 255 256 var progress uint32 257 for i := 0; i < threads; i++ { 258 go func(id int) { 259 defer pend.Done() 260 261 // Create a hasher to reuse between invocations 262 keccak512 := makeHasher(sha3.NewKeccak512()) 263 264 // Calculate the data segment this thread should generate 265 batch := uint32((size + hashBytes*uint64(threads) - 1) / (hashBytes * uint64(threads))) 266 first := uint32(id) * batch 267 limit := first + batch 268 if limit > uint32(size/hashBytes) { 269 limit = uint32(size / hashBytes) 270 } 271 // Calculate the dataset segment 272 percent := uint32(size / hashBytes / 100) 273 for index := first; index < limit; index++ { 274 item := generateDatasetItem(cache, index, keccak512) 275 if swapped { 276 swap(item) 277 } 278 copy(dataset[index*hashBytes:], item) 279 280 if status := atomic.AddUint32(&progress, 1); status%percent == 0 { 281 logger.Info("Generating DAG in progress", "percentage", uint64(status*100)/(size/hashBytes), "elapsed", common.PrettyDuration(time.Since(start))) 282 } 283 } 284 }(i) 285 } 286 // Wait for all the generators to finish and return 287 pend.Wait() 288 } 289 290 // hashimoto aggregates data from the full dataset in order to produce our final 291 // value for a particular header hash and nonce. 292 func hashimoto(hash []byte, nonce uint64, size uint64, lookup func(index uint32) []uint32) ([]byte, []byte) { 293 // Calculate the number of theoretical rows (we use one buffer nonetheless) 294 rows := uint32(size / mixBytes) 295 296 // Combine header+nonce into a 64 byte seed 297 seed := make([]byte, 40) 298 copy(seed, hash) 299 binary.LittleEndian.PutUint64(seed[32:], nonce) 300 301 seed = crypto.Keccak512(seed) 302 seedHead := binary.LittleEndian.Uint32(seed) 303 304 // Start the mix with replicated seed 305 mix := make([]uint32, mixBytes/4) 306 for i := 0; i < len(mix); i++ { 307 mix[i] = binary.LittleEndian.Uint32(seed[i%16*4:]) 308 } 309 // Mix in random dataset nodes 310 temp := make([]uint32, len(mix)) 311 312 for i := 0; i < loopAccesses; i++ { 313 parent := fnv(uint32(i)^seedHead, mix[i%len(mix)]) % rows 314 for j := uint32(0); j < mixBytes/hashBytes; j++ { 315 copy(temp[j*hashWords:], lookup(2*parent+j)) 316 } 317 fnvHash(mix, temp) 318 } 319 // Compress mix 320 for i := 0; i < len(mix); i += 4 { 321 mix[i/4] = fnv(fnv(fnv(mix[i], mix[i+1]), mix[i+2]), mix[i+3]) 322 } 323 mix = mix[:len(mix)/4] 324 325 digest := make([]byte, common.HashLength) 326 for i, val := range mix { 327 binary.LittleEndian.PutUint32(digest[i*4:], val) 328 } 329 return digest, crypto.Keccak256(append(seed, digest...)) 330 } 331 332 // hashimotoLight aggregates data from the full dataset (using only a small 333 // in-memory cache) in order to produce our final value for a particular header 334 // hash and nonce. 335 func hashimotoLight(size uint64, cache []uint32, hash []byte, nonce uint64) ([]byte, []byte) { 336 keccak512 := makeHasher(sha3.NewKeccak512()) 337 338 lookup := func(index uint32) []uint32 { 339 rawData := generateDatasetItem(cache, index, keccak512) 340 341 data := make([]uint32, len(rawData)/4) 342 for i := 0; i < len(data); i++ { 343 data[i] = binary.LittleEndian.Uint32(rawData[i*4:]) 344 } 345 return data 346 } 347 return hashimoto(hash, nonce, size, lookup) 348 } 349 350 // hashimotoFull aggregates data from the full dataset (using the full in-memory 351 // dataset) in order to produce our final value for a particular header hash and 352 // nonce. 353 func hashimotoFull(dataset []uint32, hash []byte, nonce uint64) ([]byte, []byte) { 354 lookup := func(index uint32) []uint32 { 355 offset := index * hashWords 356 return dataset[offset : offset+hashWords] 357 } 358 return hashimoto(hash, nonce, uint64(len(dataset))*4, lookup) 359 } 360 361 const maxEpoch = 2048 362 363 // datasetSizes is a lookup table for the aquahash dataset size for the first 2048 364 // epochs (i.e. 61440000 blocks). 365 var datasetSizes = [maxEpoch]uint64{ 366 1073739904, 1082130304, 1090514816, 1098906752, 1107293056, 367 1115684224, 1124070016, 1132461952, 1140849536, 1149232768, 368 1157627776, 1166013824, 1174404736, 1182786944, 1191180416, 369 1199568512, 1207958912, 1216345216, 1224732032, 1233124736, 370 1241513344, 1249902464, 1258290304, 1266673792, 1275067264, 371 1283453312, 1291844992, 1300234112, 1308619904, 1317010048, 372 1325397376, 1333787776, 1342176128, 1350561664, 1358954368, 373 1367339392, 1375731584, 1384118144, 1392507008, 1400897408, 374 1409284736, 1417673344, 1426062464, 1434451072, 1442839168, 375 1451229056, 1459615616, 1468006016, 1476394112, 1484782976, 376 1493171584, 1501559168, 1509948032, 1518337664, 1526726528, 377 1535114624, 1543503488, 1551892096, 1560278656, 1568669056, 378 1577056384, 1585446272, 1593831296, 1602219392, 1610610304, 379 1619000192, 1627386752, 1635773824, 1644164224, 1652555648, 380 1660943488, 1669332608, 1677721216, 1686109312, 1694497664, 381 1702886272, 1711274624, 1719661184, 1728047744, 1736434816, 382 1744829056, 1753218944, 1761606272, 1769995904, 1778382464, 383 1786772864, 1795157888, 1803550592, 1811937664, 1820327552, 384 1828711552, 1837102976, 1845488768, 1853879936, 1862269312, 385 1870656896, 1879048064, 1887431552, 1895825024, 1904212096, 386 1912601216, 1920988544, 1929379456, 1937765504, 1946156672, 387 1954543232, 1962932096, 1971321728, 1979707264, 1988093056, 388 1996487552, 2004874624, 2013262208, 2021653888, 2030039936, 389 2038430848, 2046819968, 2055208576, 2063596672, 2071981952, 390 2080373632, 2088762752, 2097149056, 2105539712, 2113928576, 391 2122315136, 2130700672, 2139092608, 2147483264, 2155872128, 392 2164257664, 2172642176, 2181035392, 2189426048, 2197814912, 393 2206203008, 2214587264, 2222979712, 2231367808, 2239758208, 394 2248145024, 2256527744, 2264922752, 2273312128, 2281701248, 395 2290086272, 2298476672, 2306867072, 2315251072, 2323639168, 396 2332032128, 2340420224, 2348808064, 2357196416, 2365580416, 397 2373966976, 2382363008, 2390748544, 2399139968, 2407530368, 398 2415918976, 2424307328, 2432695424, 2441084288, 2449472384, 399 2457861248, 2466247808, 2474637184, 2483026816, 2491414144, 400 2499803776, 2508191872, 2516582272, 2524970368, 2533359232, 401 2541743488, 2550134144, 2558525056, 2566913408, 2575301504, 402 2583686528, 2592073856, 2600467328, 2608856192, 2617240448, 403 2625631616, 2634022016, 2642407552, 2650796416, 2659188352, 404 2667574912, 2675965312, 2684352896, 2692738688, 2701130624, 405 2709518464, 2717907328, 2726293376, 2734685056, 2743073152, 406 2751462016, 2759851648, 2768232832, 2776625536, 2785017728, 407 2793401984, 2801794432, 2810182016, 2818571648, 2826959488, 408 2835349376, 2843734144, 2852121472, 2860514432, 2868900992, 409 2877286784, 2885676928, 2894069632, 2902451584, 2910843008, 410 2919234688, 2927622784, 2936011648, 2944400768, 2952789376, 411 2961177728, 2969565568, 2977951616, 2986338944, 2994731392, 412 3003120256, 3011508352, 3019895936, 3028287104, 3036675968, 413 3045063808, 3053452928, 3061837696, 3070228352, 3078615424, 414 3087003776, 3095394944, 3103782272, 3112173184, 3120562048, 415 3128944768, 3137339264, 3145725056, 3154109312, 3162505088, 416 3170893184, 3179280256, 3187669376, 3196056704, 3204445568, 417 3212836736, 3221224064, 3229612928, 3238002304, 3246391168, 418 3254778496, 3263165824, 3271556224, 3279944576, 3288332416, 419 3296719232, 3305110912, 3313500032, 3321887104, 3330273152, 420 3338658944, 3347053184, 3355440512, 3363827072, 3372220288, 421 3380608384, 3388997504, 3397384576, 3405774208, 3414163072, 422 3422551936, 3430937984, 3439328384, 3447714176, 3456104576, 423 3464493952, 3472883584, 3481268864, 3489655168, 3498048896, 424 3506434432, 3514826368, 3523213952, 3531603584, 3539987072, 425 3548380288, 3556763264, 3565157248, 3573545344, 3581934464, 426 3590324096, 3598712704, 3607098752, 3615488384, 3623877248, 427 3632265856, 3640646528, 3649043584, 3657430144, 3665821568, 428 3674207872, 3682597504, 3690984832, 3699367808, 3707764352, 429 3716152448, 3724541056, 3732925568, 3741318016, 3749706368, 430 3758091136, 3766481536, 3774872704, 3783260032, 3791650432, 431 3800036224, 3808427648, 3816815488, 3825204608, 3833592704, 432 3841981568, 3850370432, 3858755968, 3867147904, 3875536256, 433 3883920512, 3892313728, 3900702592, 3909087872, 3917478784, 434 3925868416, 3934256512, 3942645376, 3951032192, 3959422336, 435 3967809152, 3976200064, 3984588416, 3992974976, 4001363584, 436 4009751168, 4018141312, 4026530432, 4034911616, 4043308928, 437 4051695488, 4060084352, 4068472448, 4076862848, 4085249408, 438 4093640576, 4102028416, 4110413696, 4118805632, 4127194496, 439 4135583104, 4143971968, 4152360832, 4160746112, 4169135744, 440 4177525888, 4185912704, 4194303616, 4202691968, 4211076736, 441 4219463552, 4227855488, 4236246656, 4244633728, 4253022848, 442 4261412224, 4269799808, 4278184832, 4286578048, 4294962304, 443 4303349632, 4311743104, 4320130432, 4328521088, 4336909184, 444 4345295488, 4353687424, 4362073472, 4370458496, 4378852736, 445 4387238528, 4395630208, 4404019072, 4412407424, 4420790656, 446 4429182848, 4437571456, 4445962112, 4454344064, 4462738048, 447 4471119232, 4479516544, 4487904128, 4496289664, 4504682368, 448 4513068416, 4521459584, 4529846144, 4538232704, 4546619776, 449 4555010176, 4563402112, 4571790208, 4580174464, 4588567936, 450 4596957056, 4605344896, 4613734016, 4622119808, 4630511488, 451 4638898816, 4647287936, 4655675264, 4664065664, 4672451968, 452 4680842624, 4689231488, 4697620352, 4706007424, 4714397056, 453 4722786176, 4731173248, 4739562368, 4747951744, 4756340608, 454 4764727936, 4773114496, 4781504384, 4789894784, 4798283648, 455 4806667648, 4815059584, 4823449472, 4831835776, 4840226176, 456 4848612224, 4857003392, 4865391488, 4873780096, 4882169728, 457 4890557312, 4898946944, 4907333248, 4915722368, 4924110976, 458 4932499328, 4940889728, 4949276032, 4957666432, 4966054784, 459 4974438016, 4982831488, 4991221376, 4999607168, 5007998848, 460 5016386432, 5024763776, 5033164672, 5041544576, 5049941888, 461 5058329728, 5066717056, 5075107456, 5083494272, 5091883904, 462 5100273536, 5108662144, 5117048192, 5125436032, 5133827456, 463 5142215296, 5150605184, 5158993024, 5167382144, 5175769472, 464 5184157568, 5192543872, 5200936064, 5209324928, 5217711232, 465 5226102656, 5234490496, 5242877312, 5251263872, 5259654016, 466 5268040832, 5276434304, 5284819328, 5293209728, 5301598592, 467 5309986688, 5318374784, 5326764416, 5335151488, 5343542144, 468 5351929472, 5360319872, 5368706944, 5377096576, 5385484928, 469 5393871232, 5402263424, 5410650496, 5419040384, 5427426944, 470 5435816576, 5444205952, 5452594816, 5460981376, 5469367936, 471 5477760896, 5486148736, 5494536832, 5502925952, 5511315328, 472 5519703424, 5528089984, 5536481152, 5544869504, 5553256064, 473 5561645696, 5570032768, 5578423936, 5586811264, 5595193216, 474 5603585408, 5611972736, 5620366208, 5628750464, 5637143936, 475 5645528192, 5653921408, 5662310272, 5670694784, 5679082624, 476 5687474048, 5695864448, 5704251008, 5712641408, 5721030272, 477 5729416832, 5737806208, 5746194304, 5754583936, 5762969984, 478 5771358592, 5779748224, 5788137856, 5796527488, 5804911232, 479 5813300608, 5821692544, 5830082176, 5838468992, 5846855552, 480 5855247488, 5863636096, 5872024448, 5880411008, 5888799872, 481 5897186432, 5905576832, 5913966976, 5922352768, 5930744704, 482 5939132288, 5947522432, 5955911296, 5964299392, 5972688256, 483 5981074304, 5989465472, 5997851008, 6006241408, 6014627968, 484 6023015552, 6031408256, 6039796096, 6048185216, 6056574848, 485 6064963456, 6073351808, 6081736064, 6090128768, 6098517632, 486 6106906496, 6115289216, 6123680896, 6132070016, 6140459648, 487 6148849024, 6157237376, 6165624704, 6174009728, 6182403712, 488 6190792064, 6199176064, 6207569792, 6215952256, 6224345216, 489 6232732544, 6241124224, 6249510272, 6257899136, 6266287744, 490 6274676864, 6283065728, 6291454336, 6299843456, 6308232064, 491 6316620928, 6325006208, 6333395584, 6341784704, 6350174848, 492 6358562176, 6366951296, 6375337856, 6383729536, 6392119168, 493 6400504192, 6408895616, 6417283456, 6425673344, 6434059136, 494 6442444672, 6450837376, 6459223424, 6467613056, 6476004224, 495 6484393088, 6492781952, 6501170048, 6509555072, 6517947008, 496 6526336384, 6534725504, 6543112832, 6551500672, 6559888768, 497 6568278656, 6576662912, 6585055616, 6593443456, 6601834112, 498 6610219648, 6618610304, 6626999168, 6635385472, 6643777408, 499 6652164224, 6660552832, 6668941952, 6677330048, 6685719424, 500 6694107776, 6702493568, 6710882176, 6719274112, 6727662976, 501 6736052096, 6744437632, 6752825984, 6761213824, 6769604224, 502 6777993856, 6786383488, 6794770816, 6803158144, 6811549312, 503 6819937664, 6828326528, 6836706176, 6845101696, 6853491328, 504 6861880448, 6870269312, 6878655104, 6887046272, 6895433344, 505 6903822208, 6912212864, 6920596864, 6928988288, 6937377152, 506 6945764992, 6954149248, 6962544256, 6970928768, 6979317376, 507 6987709312, 6996093824, 7004487296, 7012875392, 7021258624, 508 7029652352, 7038038912, 7046427776, 7054818944, 7063207808, 509 7071595136, 7079980928, 7088372608, 7096759424, 7105149824, 510 7113536896, 7121928064, 7130315392, 7138699648, 7147092352, 511 7155479168, 7163865728, 7172249984, 7180648064, 7189036672, 512 7197424768, 7205810816, 7214196608, 7222589824, 7230975104, 513 7239367552, 7247755904, 7256145536, 7264533376, 7272921472, 514 7281308032, 7289694848, 7298088832, 7306471808, 7314864512, 515 7323253888, 7331643008, 7340029568, 7348419712, 7356808832, 516 7365196672, 7373585792, 7381973888, 7390362752, 7398750592, 517 7407138944, 7415528576, 7423915648, 7432302208, 7440690304, 518 7449080192, 7457472128, 7465860992, 7474249088, 7482635648, 519 7491023744, 7499412608, 7507803008, 7516192384, 7524579968, 520 7532967296, 7541358464, 7549745792, 7558134656, 7566524032, 521 7574912896, 7583300992, 7591690112, 7600075136, 7608466816, 522 7616854912, 7625244544, 7633629824, 7642020992, 7650410368, 523 7658794112, 7667187328, 7675574912, 7683961984, 7692349568, 524 7700739712, 7709130368, 7717519232, 7725905536, 7734295424, 525 7742683264, 7751069056, 7759457408, 7767849088, 7776238208, 526 7784626816, 7793014912, 7801405312, 7809792128, 7818179968, 527 7826571136, 7834957184, 7843347328, 7851732352, 7860124544, 528 7868512384, 7876902016, 7885287808, 7893679744, 7902067072, 529 7910455936, 7918844288, 7927230848, 7935622784, 7944009344, 530 7952400256, 7960786048, 7969176704, 7977565312, 7985953408, 531 7994339968, 8002730368, 8011119488, 8019508096, 8027896192, 532 8036285056, 8044674688, 8053062272, 8061448832, 8069838464, 533 8078227328, 8086616704, 8095006592, 8103393664, 8111783552, 534 8120171392, 8128560256, 8136949376, 8145336704, 8153726848, 535 8162114944, 8170503296, 8178891904, 8187280768, 8195669632, 536 8204058496, 8212444544, 8220834176, 8229222272, 8237612672, 537 8246000768, 8254389376, 8262775168, 8271167104, 8279553664, 538 8287944064, 8296333184, 8304715136, 8313108352, 8321497984, 539 8329885568, 8338274432, 8346663296, 8355052928, 8363441536, 540 8371828352, 8380217984, 8388606592, 8396996224, 8405384576, 541 8413772672, 8422161536, 8430549376, 8438939008, 8447326592, 542 8455715456, 8464104832, 8472492928, 8480882048, 8489270656, 543 8497659776, 8506045312, 8514434944, 8522823808, 8531208832, 544 8539602304, 8547990656, 8556378752, 8564768384, 8573154176, 545 8581542784, 8589933952, 8598322816, 8606705024, 8615099264, 546 8623487872, 8631876992, 8640264064, 8648653952, 8657040256, 547 8665430656, 8673820544, 8682209152, 8690592128, 8698977152, 548 8707374464, 8715763328, 8724151424, 8732540032, 8740928384, 549 8749315712, 8757704576, 8766089344, 8774480768, 8782871936, 550 8791260032, 8799645824, 8808034432, 8816426368, 8824812928, 551 8833199488, 8841591424, 8849976448, 8858366336, 8866757248, 552 8875147136, 8883532928, 8891923328, 8900306816, 8908700288, 553 8917088384, 8925478784, 8933867392, 8942250368, 8950644608, 554 8959032704, 8967420544, 8975809664, 8984197504, 8992584064, 555 9000976256, 9009362048, 9017752448, 9026141312, 9034530688, 556 9042917504, 9051307904, 9059694208, 9068084864, 9076471424, 557 9084861824, 9093250688, 9101638528, 9110027648, 9118416512, 558 9126803584, 9135188096, 9143581312, 9151969664, 9160356224, 559 9168747136, 9177134464, 9185525632, 9193910144, 9202302848, 560 9210690688, 9219079552, 9227465344, 9235854464, 9244244864, 561 9252633472, 9261021824, 9269411456, 9277799296, 9286188928, 562 9294574208, 9302965888, 9311351936, 9319740032, 9328131968, 563 9336516736, 9344907392, 9353296768, 9361685888, 9370074752, 564 9378463616, 9386849408, 9395239808, 9403629184, 9412016512, 565 9420405376, 9428795008, 9437181568, 9445570688, 9453960832, 566 9462346624, 9470738048, 9479121536, 9487515008, 9495903616, 567 9504289664, 9512678528, 9521067904, 9529456256, 9537843584, 568 9546233728, 9554621312, 9563011456, 9571398784, 9579788672, 569 9588178304, 9596567168, 9604954496, 9613343104, 9621732992, 570 9630121856, 9638508416, 9646898816, 9655283584, 9663675776, 571 9672061312, 9680449664, 9688840064, 9697230464, 9705617536, 572 9714003584, 9722393984, 9730772608, 9739172224, 9747561088, 573 9755945344, 9764338816, 9772726144, 9781116544, 9789503872, 574 9797892992, 9806282624, 9814670464, 9823056512, 9831439232, 575 9839833984, 9848224384, 9856613504, 9865000576, 9873391232, 576 9881772416, 9890162816, 9898556288, 9906940544, 9915333248, 577 9923721088, 9932108672, 9940496512, 9948888448, 9957276544, 578 9965666176, 9974048384, 9982441088, 9990830464, 9999219584, 579 10007602816, 10015996544, 10024385152, 10032774016, 10041163648, 580 10049548928, 10057940096, 10066329472, 10074717824, 10083105152, 581 10091495296, 10099878784, 10108272256, 10116660608, 10125049216, 582 10133437312, 10141825664, 10150213504, 10158601088, 10166991232, 583 10175378816, 10183766144, 10192157312, 10200545408, 10208935552, 584 10217322112, 10225712768, 10234099328, 10242489472, 10250876032, 585 10259264896, 10267656064, 10276042624, 10284429184, 10292820352, 586 10301209472, 10309598848, 10317987712, 10326375296, 10334763392, 587 10343153536, 10351541632, 10359930752, 10368318592, 10376707456, 588 10385096576, 10393484672, 10401867136, 10410262144, 10418647424, 589 10427039104, 10435425664, 10443810176, 10452203648, 10460589952, 590 10468982144, 10477369472, 10485759104, 10494147712, 10502533504, 591 10510923392, 10519313536, 10527702656, 10536091264, 10544478592, 592 10552867712, 10561255808, 10569642368, 10578032768, 10586423168, 593 10594805632, 10603200128, 10611588992, 10619976064, 10628361344, 594 10636754048, 10645143424, 10653531776, 10661920384, 10670307968, 595 10678696832, 10687086464, 10695475072, 10703863168, 10712246144, 596 10720639616, 10729026688, 10737414784, 10745806208, 10754190976, 597 10762581376, 10770971264, 10779356288, 10787747456, 10796135552, 598 10804525184, 10812915584, 10821301888, 10829692288, 10838078336, 599 10846469248, 10854858368, 10863247232, 10871631488, 10880023424, 600 10888412032, 10896799616, 10905188992, 10913574016, 10921964672, 601 10930352768, 10938742912, 10947132544, 10955518592, 10963909504, 602 10972298368, 10980687488, 10989074816, 10997462912, 11005851776, 603 11014241152, 11022627712, 11031017344, 11039403904, 11047793024, 604 11056184704, 11064570752, 11072960896, 11081343872, 11089737856, 605 11098128256, 11106514816, 11114904448, 11123293568, 11131680128, 606 11140065152, 11148458368, 11156845696, 11165236864, 11173624192, 607 11182013824, 11190402688, 11198790784, 11207179136, 11215568768, 608 11223957376, 11232345728, 11240734592, 11249122688, 11257511296, 609 11265899648, 11274285952, 11282675584, 11291065472, 11299452544, 610 11307842432, 11316231296, 11324616832, 11333009024, 11341395584, 611 11349782656, 11358172288, 11366560384, 11374950016, 11383339648, 612 11391721856, 11400117376, 11408504192, 11416893568, 11425283456, 613 11433671552, 11442061184, 11450444672, 11458837888, 11467226752, 614 11475611776, 11484003968, 11492392064, 11500780672, 11509169024, 615 11517550976, 11525944448, 11534335616, 11542724224, 11551111808, 616 11559500672, 11567890304, 11576277376, 11584667008, 11593056128, 617 11601443456, 11609830016, 11618221952, 11626607488, 11634995072, 618 11643387776, 11651775104, 11660161664, 11668552576, 11676940928, 619 11685330304, 11693718656, 11702106496, 11710496128, 11718882688, 620 11727273088, 11735660416, 11744050048, 11752437376, 11760824704, 621 11769216128, 11777604736, 11785991296, 11794381952, 11802770048, 622 11811157888, 11819548544, 11827932544, 11836324736, 11844713344, 623 11853100928, 11861486464, 11869879936, 11878268032, 11886656896, 624 11895044992, 11903433088, 11911822976, 11920210816, 11928600448, 625 11936987264, 11945375872, 11953761152, 11962151296, 11970543488, 626 11978928512, 11987320448, 11995708288, 12004095104, 12012486272, 627 12020875136, 12029255552, 12037652096, 12046039168, 12054429568, 628 12062813824, 12071206528, 12079594624, 12087983744, 12096371072, 629 12104759936, 12113147264, 12121534592, 12129924992, 12138314624, 630 12146703232, 12155091584, 12163481216, 12171864704, 12180255872, 631 12188643968, 12197034112, 12205424512, 12213811328, 12222199424, 632 12230590336, 12238977664, 12247365248, 12255755392, 12264143488, 633 12272531584, 12280920448, 12289309568, 12297694592, 12306086528, 634 12314475392, 12322865024, 12331253632, 12339640448, 12348029312, 635 12356418944, 12364805248, 12373196672, 12381580928, 12389969024, 636 12398357632, 12406750592, 12415138432, 12423527552, 12431916416, 637 12440304512, 12448692352, 12457081216, 12465467776, 12473859968, 638 12482245504, 12490636672, 12499025536, 12507411584, 12515801728, 639 12524190592, 12532577152, 12540966272, 12549354368, 12557743232, 640 12566129536, 12574523264, 12582911872, 12591299456, 12599688064, 641 12608074624, 12616463488, 12624845696, 12633239936, 12641631616, 642 12650019968, 12658407296, 12666795136, 12675183232, 12683574656, 643 12691960192, 12700350592, 12708740224, 12717128576, 12725515904, 644 12733906816, 12742295168, 12750680192, 12759071872, 12767460736, 645 12775848832, 12784236928, 12792626816, 12801014656, 12809404288, 646 12817789312, 12826181504, 12834568832, 12842954624, 12851345792, 647 12859732352, 12868122496, 12876512128, 12884901248, 12893289088, 648 12901672832, 12910067584, 12918455168, 12926842496, 12935232896, 649 12943620736, 12952009856, 12960396928, 12968786816, 12977176192, 650 12985563776, 12993951104, 13002341504, 13010730368, 13019115392, 651 13027506304, 13035895168, 13044272512, 13052673152, 13061062528, 652 13069446272, 13077838976, 13086227072, 13094613632, 13103000192, 653 13111393664, 13119782528, 13128157568, 13136559232, 13144945024, 654 13153329536, 13161724288, 13170111872, 13178502784, 13186884736, 655 13195279744, 13203667072, 13212057472, 13220445824, 13228832128, 656 13237221248, 13245610624, 13254000512, 13262388352, 13270777472, 657 13279166336, 13287553408, 13295943296, 13304331904, 13312719488, 658 13321108096, 13329494656, 13337885824, 13346274944, 13354663808, 659 13363051136, 13371439232, 13379825024, 13388210816, 13396605056, 660 13404995456, 13413380224, 13421771392, 13430159744, 13438546048, 661 13446937216, 13455326848, 13463708288, 13472103808, 13480492672, 662 13488875648, 13497269888, 13505657728, 13514045312, 13522435712, 663 13530824576, 13539210112, 13547599232, 13555989376, 13564379008, 664 13572766336, 13581154432, 13589544832, 13597932928, 13606320512, 665 13614710656, 13623097472, 13631477632, 13639874944, 13648264064, 666 13656652928, 13665041792, 13673430656, 13681818496, 13690207616, 667 13698595712, 13706982272, 13715373184, 13723762048, 13732150144, 668 13740536704, 13748926592, 13757316224, 13765700992, 13774090112, 669 13782477952, 13790869376, 13799259008, 13807647872, 13816036736, 670 13824425344, 13832814208, 13841202304, 13849591424, 13857978752, 671 13866368896, 13874754688, 13883145344, 13891533184, 13899919232, 672 13908311168, 13916692096, 13925085056, 13933473152, 13941866368, 673 13950253696, 13958643584, 13967032192, 13975417216, 13983807616, 674 13992197504, 14000582272, 14008973696, 14017363072, 14025752192, 675 14034137984, 14042528384, 14050918016, 14059301504, 14067691648, 676 14076083584, 14084470144, 14092852352, 14101249664, 14109635968, 677 14118024832, 14126407552, 14134804352, 14143188608, 14151577984, 678 14159968384, 14168357248, 14176741504, 14185127296, 14193521024, 679 14201911424, 14210301824, 14218685056, 14227067264, 14235467392, 680 14243855488, 14252243072, 14260630144, 14269021568, 14277409408, 681 14285799296, 14294187904, 14302571392, 14310961792, 14319353728, 682 14327738752, 14336130944, 14344518784, 14352906368, 14361296512, 683 14369685376, 14378071424, 14386462592, 14394848128, 14403230848, 684 14411627392, 14420013952, 14428402304, 14436793472, 14445181568, 685 14453569664, 14461959808, 14470347904, 14478737024, 14487122816, 686 14495511424, 14503901824, 14512291712, 14520677504, 14529064832, 687 14537456768, 14545845632, 14554234496, 14562618496, 14571011456, 688 14579398784, 14587789184, 14596172672, 14604564608, 14612953984, 689 14621341312, 14629724288, 14638120832, 14646503296, 14654897536, 690 14663284864, 14671675264, 14680061056, 14688447616, 14696835968, 691 14705228416, 14713616768, 14722003328, 14730392192, 14738784128, 692 14747172736, 14755561088, 14763947648, 14772336512, 14780725376, 693 14789110144, 14797499776, 14805892736, 14814276992, 14822670208, 694 14831056256, 14839444352, 14847836032, 14856222848, 14864612992, 695 14872997504, 14881388672, 14889775744, 14898165376, 14906553472, 696 14914944896, 14923329664, 14931721856, 14940109696, 14948497024, 697 14956887424, 14965276544, 14973663616, 14982053248, 14990439808, 698 14998830976, 15007216768, 15015605888, 15023995264, 15032385152, 699 15040768384, 15049154944, 15057549184, 15065939072, 15074328448, 700 15082715008, 15091104128, 15099493504, 15107879296, 15116269184, 701 15124659584, 15133042304, 15141431936, 15149824384, 15158214272, 702 15166602368, 15174991232, 15183378304, 15191760512, 15200154496, 703 15208542592, 15216931712, 15225323392, 15233708416, 15242098048, 704 15250489216, 15258875264, 15267265408, 15275654528, 15284043136, 705 15292431488, 15300819584, 15309208192, 15317596544, 15325986176, 706 15334374784, 15342763648, 15351151744, 15359540608, 15367929728, 707 15376318336, 15384706432, 15393092992, 15401481856, 15409869952, 708 15418258816, 15426649984, 15435037568, 15443425664, 15451815296, 709 15460203392, 15468589184, 15476979328, 15485369216, 15493755776, 710 15502146944, 15510534272, 15518924416, 15527311232, 15535699072, 711 15544089472, 15552478336, 15560866688, 15569254528, 15577642624, 712 15586031488, 15594419072, 15602809472, 15611199104, 15619586432, 713 15627975296, 15636364928, 15644753792, 15653141888, 15661529216, 714 15669918848, 15678305152, 15686696576, 15695083136, 15703474048, 715 15711861632, 15720251264, 15728636288, 15737027456, 15745417088, 716 15753804928, 15762194048, 15770582656, 15778971008, 15787358336, 717 15795747712, 15804132224, 15812523392, 15820909696, 15829300096, 718 15837691264, 15846071936, 15854466944, 15862855808, 15871244672, 719 15879634816, 15888020608, 15896409728, 15904799104, 15913185152, 720 15921577088, 15929966464, 15938354816, 15946743424, 15955129472, 721 15963519872, 15971907968, 15980296064, 15988684928, 15997073024, 722 16005460864, 16013851264, 16022241152, 16030629248, 16039012736, 723 16047406976, 16055794816, 16064181376, 16072571264, 16080957824, 724 16089346688, 16097737856, 16106125184, 16114514816, 16122904192, 725 16131292544, 16139678848, 16148066944, 16156453504, 16164839552, 726 16173236096, 16181623424, 16190012032, 16198401152, 16206790528, 727 16215177344, 16223567744, 16231956352, 16240344704, 16248731008, 728 16257117824, 16265504384, 16273898624, 16282281856, 16290668672, 729 16299064192, 16307449216, 16315842176, 16324230016, 16332613504, 730 16341006464, 16349394304, 16357783168, 16366172288, 16374561664, 731 16382951296, 16391337856, 16399726208, 16408116352, 16416505472, 732 16424892032, 16433282176, 16441668224, 16450058624, 16458448768, 733 16466836864, 16475224448, 16483613056, 16492001408, 16500391808, 734 16508779648, 16517166976, 16525555328, 16533944192, 16542330752, 735 16550719616, 16559110528, 16567497088, 16575888512, 16584274816, 736 16592665472, 16601051008, 16609442944, 16617832064, 16626218624, 737 16634607488, 16642996096, 16651385728, 16659773824, 16668163712, 738 16676552576, 16684938112, 16693328768, 16701718144, 16710095488, 739 16718492288, 16726883968, 16735272832, 16743661184, 16752049792, 740 16760436608, 16768827008, 16777214336, 16785599104, 16793992832, 741 16802381696, 16810768768, 16819151744, 16827542656, 16835934848, 742 16844323712, 16852711552, 16861101952, 16869489536, 16877876864, 743 16886265728, 16894653056, 16903044736, 16911431296, 16919821696, 744 16928207488, 16936592768, 16944987776, 16953375616, 16961763968, 745 16970152832, 16978540928, 16986929536, 16995319168, 17003704448, 746 17012096896, 17020481152, 17028870784, 17037262208, 17045649536, 747 17054039936, 17062426496, 17070814336, 17079205504, 17087592064, 748 17095978112, 17104369024, 17112759424, 17121147776, 17129536384, 749 17137926016, 17146314368, 17154700928, 17163089792, 17171480192, 750 17179864192, 17188256896, 17196644992, 17205033856, 17213423488, 751 17221811072, 17230198912, 17238588032, 17246976896, 17255360384, 752 17263754624, 17272143232, 17280530048, 17288918912, 17297309312, 753 17305696384, 17314085504, 17322475136, 17330863744, 17339252096, 754 17347640192, 17356026496, 17364413824, 17372796544, 17381190016, 755 17389583488, 17397972608, 17406360704, 17414748544, 17423135872, 756 17431527296, 17439915904, 17448303232, 17456691584, 17465081728, 757 17473468288, 17481857408, 17490247552, 17498635904, 17507022464, 758 17515409024, 17523801728, 17532189824, 17540577664, 17548966016, 759 17557353344, 17565741184, 17574131584, 17582519168, 17590907008, 760 17599296128, 17607687808, 17616076672, 17624455808, 17632852352, 761 17641238656, 17649630848, 17658018944, 17666403968, 17674794112, 762 17683178368, 17691573376, 17699962496, 17708350592, 17716739968, 763 17725126528, 17733517184, 17741898112, 17750293888, 17758673024, 764 17767070336, 17775458432, 17783848832, 17792236928, 17800625536, 765 17809012352, 17817402752, 17825785984, 17834178944, 17842563968, 766 17850955648, 17859344512, 17867732864, 17876119424, 17884511872, 767 17892900224, 17901287296, 17909677696, 17918058112, 17926451072, 768 17934843776, 17943230848, 17951609216, 17960008576, 17968397696, 769 17976784256, 17985175424, 17993564032, 18001952128, 18010339712, 770 18018728576, 18027116672, 18035503232, 18043894144, 18052283264, 771 18060672128, 18069056384, 18077449856, 18085837184, 18094225792, 772 18102613376, 18111004544, 18119388544, 18127781248, 18136170368, 773 18144558976, 18152947328, 18161336192, 18169724288, 18178108544, 774 18186498944, 18194886784, 18203275648, 18211666048, 18220048768, 775 18228444544, 18236833408, 18245220736} 776 777 // cacheSizes is a lookup table for the aquahash verification cache size for the 778 // first 2048 epochs (i.e. 61440000 blocks). 779 var cacheSizes = [maxEpoch]uint64{ 780 16776896, 16907456, 17039296, 17170112, 17301056, 17432512, 17563072, 781 17693888, 17824192, 17955904, 18087488, 18218176, 18349504, 18481088, 782 18611392, 18742336, 18874304, 19004224, 19135936, 19267264, 19398208, 783 19529408, 19660096, 19791424, 19922752, 20053952, 20184896, 20315968, 784 20446912, 20576576, 20709184, 20840384, 20971072, 21102272, 21233216, 785 21364544, 21494848, 21626816, 21757376, 21887552, 22019392, 22151104, 786 22281536, 22412224, 22543936, 22675264, 22806464, 22935872, 23068096, 787 23198272, 23330752, 23459008, 23592512, 23723968, 23854912, 23986112, 788 24116672, 24247616, 24378688, 24509504, 24640832, 24772544, 24903488, 789 25034432, 25165376, 25296704, 25427392, 25558592, 25690048, 25820096, 790 25951936, 26081728, 26214208, 26345024, 26476096, 26606656, 26737472, 791 26869184, 26998208, 27131584, 27262528, 27393728, 27523904, 27655744, 792 27786688, 27917888, 28049344, 28179904, 28311488, 28441792, 28573504, 793 28700864, 28835648, 28966208, 29096768, 29228608, 29359808, 29490752, 794 29621824, 29752256, 29882816, 30014912, 30144448, 30273728, 30406976, 795 30538432, 30670784, 30799936, 30932672, 31063744, 31195072, 31325248, 796 31456192, 31588288, 31719232, 31850432, 31981504, 32110784, 32243392, 797 32372672, 32505664, 32636608, 32767808, 32897344, 33029824, 33160768, 798 33289664, 33423296, 33554368, 33683648, 33816512, 33947456, 34076992, 799 34208704, 34340032, 34471744, 34600256, 34734016, 34864576, 34993984, 800 35127104, 35258176, 35386688, 35518528, 35650624, 35782336, 35910976, 801 36044608, 36175808, 36305728, 36436672, 36568384, 36699968, 36830656, 802 36961984, 37093312, 37223488, 37355072, 37486528, 37617472, 37747904, 803 37879232, 38009792, 38141888, 38272448, 38403392, 38535104, 38660672, 804 38795584, 38925632, 39059264, 39190336, 39320768, 39452096, 39581632, 805 39713984, 39844928, 39974848, 40107968, 40238144, 40367168, 40500032, 806 40631744, 40762816, 40894144, 41023552, 41155904, 41286208, 41418304, 807 41547712, 41680448, 41811904, 41942848, 42073792, 42204992, 42334912, 808 42467008, 42597824, 42729152, 42860096, 42991552, 43122368, 43253696, 809 43382848, 43515712, 43646912, 43777088, 43907648, 44039104, 44170432, 810 44302144, 44433344, 44564288, 44694976, 44825152, 44956864, 45088448, 811 45219008, 45350464, 45481024, 45612608, 45744064, 45874496, 46006208, 812 46136768, 46267712, 46399424, 46529344, 46660672, 46791488, 46923328, 813 47053504, 47185856, 47316928, 47447872, 47579072, 47710144, 47839936, 814 47971648, 48103232, 48234176, 48365248, 48496192, 48627136, 48757312, 815 48889664, 49020736, 49149248, 49283008, 49413824, 49545152, 49675712, 816 49807168, 49938368, 50069056, 50200256, 50331584, 50462656, 50593472, 817 50724032, 50853952, 50986048, 51117632, 51248576, 51379904, 51510848, 818 51641792, 51773248, 51903296, 52035136, 52164032, 52297664, 52427968, 819 52557376, 52690112, 52821952, 52952896, 53081536, 53213504, 53344576, 820 53475776, 53608384, 53738816, 53870528, 54000832, 54131776, 54263744, 821 54394688, 54525248, 54655936, 54787904, 54918592, 55049152, 55181248, 822 55312064, 55442752, 55574336, 55705024, 55836224, 55967168, 56097856, 823 56228672, 56358592, 56490176, 56621888, 56753728, 56884928, 57015488, 824 57146816, 57278272, 57409216, 57540416, 57671104, 57802432, 57933632, 825 58064576, 58195264, 58326976, 58457408, 58588864, 58720192, 58849984, 826 58981696, 59113024, 59243456, 59375552, 59506624, 59637568, 59768512, 827 59897792, 60030016, 60161984, 60293056, 60423872, 60554432, 60683968, 828 60817216, 60948032, 61079488, 61209664, 61341376, 61471936, 61602752, 829 61733696, 61865792, 61996736, 62127808, 62259136, 62389568, 62520512, 830 62651584, 62781632, 62910784, 63045056, 63176128, 63307072, 63438656, 831 63569216, 63700928, 63831616, 63960896, 64093888, 64225088, 64355392, 832 64486976, 64617664, 64748608, 64879424, 65009216, 65142464, 65273792, 833 65402816, 65535424, 65666752, 65797696, 65927744, 66060224, 66191296, 834 66321344, 66453056, 66584384, 66715328, 66846656, 66977728, 67108672, 835 67239104, 67370432, 67501888, 67631296, 67763776, 67895104, 68026304, 836 68157248, 68287936, 68419264, 68548288, 68681408, 68811968, 68942912, 837 69074624, 69205568, 69337024, 69467584, 69599168, 69729472, 69861184, 838 69989824, 70122944, 70253888, 70385344, 70515904, 70647232, 70778816, 839 70907968, 71040832, 71171648, 71303104, 71432512, 71564992, 71695168, 840 71826368, 71958464, 72089536, 72219712, 72350144, 72482624, 72613568, 841 72744512, 72875584, 73006144, 73138112, 73268672, 73400128, 73530944, 842 73662272, 73793344, 73924544, 74055104, 74185792, 74316992, 74448832, 843 74579392, 74710976, 74841664, 74972864, 75102784, 75233344, 75364544, 844 75497024, 75627584, 75759296, 75890624, 76021696, 76152256, 76283072, 845 76414144, 76545856, 76676672, 76806976, 76937792, 77070016, 77200832, 846 77331392, 77462464, 77593664, 77725376, 77856448, 77987776, 78118336, 847 78249664, 78380992, 78511424, 78642496, 78773056, 78905152, 79033664, 848 79166656, 79297472, 79429568, 79560512, 79690816, 79822784, 79953472, 849 80084672, 80214208, 80346944, 80477632, 80608576, 80740288, 80870848, 850 81002048, 81133504, 81264448, 81395648, 81525952, 81657536, 81786304, 851 81919808, 82050112, 82181312, 82311616, 82443968, 82573376, 82705984, 852 82835776, 82967744, 83096768, 83230528, 83359552, 83491264, 83622464, 853 83753536, 83886016, 84015296, 84147776, 84277184, 84409792, 84540608, 854 84672064, 84803008, 84934336, 85065152, 85193792, 85326784, 85458496, 855 85589312, 85721024, 85851968, 85982656, 86112448, 86244416, 86370112, 856 86506688, 86637632, 86769344, 86900672, 87031744, 87162304, 87293632, 857 87424576, 87555392, 87687104, 87816896, 87947968, 88079168, 88211264, 858 88341824, 88473152, 88603712, 88735424, 88862912, 88996672, 89128384, 859 89259712, 89390272, 89521984, 89652544, 89783872, 89914816, 90045376, 860 90177088, 90307904, 90438848, 90569152, 90700096, 90832832, 90963776, 861 91093696, 91223744, 91356992, 91486784, 91618496, 91749824, 91880384, 862 92012224, 92143552, 92273344, 92405696, 92536768, 92666432, 92798912, 863 92926016, 93060544, 93192128, 93322816, 93453632, 93583936, 93715136, 864 93845056, 93977792, 94109504, 94240448, 94371776, 94501184, 94632896, 865 94764224, 94895552, 95023424, 95158208, 95287744, 95420224, 95550016, 866 95681216, 95811904, 95943872, 96075328, 96203584, 96337856, 96468544, 867 96599744, 96731072, 96860992, 96992576, 97124288, 97254848, 97385536, 868 97517248, 97647808, 97779392, 97910464, 98041408, 98172608, 98303168, 869 98434496, 98565568, 98696768, 98827328, 98958784, 99089728, 99220928, 870 99352384, 99482816, 99614272, 99745472, 99876416, 100007104, 871 100138048, 100267072, 100401088, 100529984, 100662592, 100791872, 872 100925248, 101056064, 101187392, 101317952, 101449408, 101580608, 873 101711296, 101841728, 101973824, 102104896, 102235712, 102366016, 874 102498112, 102628672, 102760384, 102890432, 103021888, 103153472, 875 103284032, 103415744, 103545152, 103677248, 103808576, 103939648, 876 104070976, 104201792, 104332736, 104462528, 104594752, 104725952, 877 104854592, 104988608, 105118912, 105247808, 105381184, 105511232, 878 105643072, 105774784, 105903296, 106037056, 106167872, 106298944, 879 106429504, 106561472, 106691392, 106822592, 106954304, 107085376, 880 107216576, 107346368, 107478464, 107609792, 107739712, 107872192, 881 108003136, 108131392, 108265408, 108396224, 108527168, 108657344, 882 108789568, 108920384, 109049792, 109182272, 109312576, 109444928, 883 109572928, 109706944, 109837888, 109969088, 110099648, 110230976, 884 110362432, 110492992, 110624704, 110755264, 110886208, 111017408, 885 111148864, 111279296, 111410752, 111541952, 111673024, 111803456, 886 111933632, 112066496, 112196416, 112328512, 112457792, 112590784, 887 112715968, 112852672, 112983616, 113114944, 113244224, 113376448, 888 113505472, 113639104, 113770304, 113901376, 114031552, 114163264, 889 114294592, 114425536, 114556864, 114687424, 114818624, 114948544, 890 115080512, 115212224, 115343296, 115473472, 115605184, 115736128, 891 115867072, 115997248, 116128576, 116260288, 116391488, 116522944, 892 116652992, 116784704, 116915648, 117046208, 117178304, 117308608, 893 117440192, 117569728, 117701824, 117833024, 117964096, 118094656, 894 118225984, 118357312, 118489024, 118617536, 118749632, 118882112, 895 119012416, 119144384, 119275328, 119406016, 119537344, 119668672, 896 119798464, 119928896, 120061376, 120192832, 120321728, 120454336, 897 120584512, 120716608, 120848192, 120979136, 121109056, 121241408, 898 121372352, 121502912, 121634752, 121764416, 121895744, 122027072, 899 122157632, 122289088, 122421184, 122550592, 122682944, 122813888, 900 122945344, 123075776, 123207488, 123338048, 123468736, 123600704, 901 123731264, 123861952, 123993664, 124124608, 124256192, 124386368, 902 124518208, 124649024, 124778048, 124911296, 125041088, 125173696, 903 125303744, 125432896, 125566912, 125696576, 125829056, 125958592, 904 126090304, 126221248, 126352832, 126483776, 126615232, 126746432, 905 126876608, 127008704, 127139392, 127270336, 127401152, 127532224, 906 127663552, 127794752, 127925696, 128055232, 128188096, 128319424, 907 128449856, 128581312, 128712256, 128843584, 128973632, 129103808, 908 129236288, 129365696, 129498944, 129629888, 129760832, 129892288, 909 130023104, 130154048, 130283968, 130416448, 130547008, 130678336, 910 130807616, 130939456, 131071552, 131202112, 131331776, 131464384, 911 131594048, 131727296, 131858368, 131987392, 132120256, 132250816, 912 132382528, 132513728, 132644672, 132774976, 132905792, 133038016, 913 133168832, 133299392, 133429312, 133562048, 133692992, 133823296, 914 133954624, 134086336, 134217152, 134348608, 134479808, 134607296, 915 134741056, 134872384, 135002944, 135134144, 135265472, 135396544, 916 135527872, 135659072, 135787712, 135921472, 136052416, 136182848, 917 136313792, 136444864, 136576448, 136707904, 136837952, 136970048, 918 137099584, 137232064, 137363392, 137494208, 137625536, 137755712, 919 137887424, 138018368, 138149824, 138280256, 138411584, 138539584, 920 138672832, 138804928, 138936128, 139066688, 139196864, 139328704, 921 139460032, 139590208, 139721024, 139852864, 139984576, 140115776, 922 140245696, 140376512, 140508352, 140640064, 140769856, 140902336, 923 141032768, 141162688, 141294016, 141426496, 141556544, 141687488, 924 141819584, 141949888, 142080448, 142212544, 142342336, 142474432, 925 142606144, 142736192, 142868288, 142997824, 143129408, 143258944, 926 143392448, 143523136, 143653696, 143785024, 143916992, 144045632, 927 144177856, 144309184, 144440768, 144570688, 144701888, 144832448, 928 144965056, 145096384, 145227584, 145358656, 145489856, 145620928, 929 145751488, 145883072, 146011456, 146144704, 146275264, 146407232, 930 146538176, 146668736, 146800448, 146931392, 147062336, 147193664, 931 147324224, 147455936, 147586624, 147717056, 147848768, 147979456, 932 148110784, 148242368, 148373312, 148503232, 148635584, 148766144, 933 148897088, 149028416, 149159488, 149290688, 149420224, 149551552, 934 149683136, 149814976, 149943616, 150076352, 150208064, 150338624, 935 150470464, 150600256, 150732224, 150862784, 150993088, 151125952, 936 151254976, 151388096, 151519168, 151649728, 151778752, 151911104, 937 152042944, 152174144, 152304704, 152435648, 152567488, 152698816, 938 152828992, 152960576, 153091648, 153222976, 153353792, 153484096, 939 153616192, 153747008, 153878336, 154008256, 154139968, 154270912, 940 154402624, 154533824, 154663616, 154795712, 154926272, 155057984, 941 155188928, 155319872, 155450816, 155580608, 155712064, 155843392, 942 155971136, 156106688, 156237376, 156367424, 156499264, 156630976, 943 156761536, 156892352, 157024064, 157155008, 157284416, 157415872, 944 157545536, 157677248, 157810496, 157938112, 158071744, 158203328, 945 158334656, 158464832, 158596288, 158727616, 158858048, 158988992, 946 159121216, 159252416, 159381568, 159513152, 159645632, 159776192, 947 159906496, 160038464, 160169536, 160300352, 160430656, 160563008, 948 160693952, 160822208, 160956352, 161086784, 161217344, 161349184, 949 161480512, 161611456, 161742272, 161873216, 162002752, 162135872, 950 162266432, 162397888, 162529216, 162660032, 162790976, 162922048, 951 163052096, 163184576, 163314752, 163446592, 163577408, 163707968, 952 163839296, 163969984, 164100928, 164233024, 164364224, 164494912, 953 164625856, 164756672, 164887616, 165019072, 165150016, 165280064, 954 165412672, 165543104, 165674944, 165805888, 165936832, 166067648, 955 166198336, 166330048, 166461248, 166591552, 166722496, 166854208, 956 166985408, 167116736, 167246656, 167378368, 167508416, 167641024, 957 167771584, 167903168, 168034112, 168164032, 168295744, 168427456, 958 168557632, 168688448, 168819136, 168951616, 169082176, 169213504, 959 169344832, 169475648, 169605952, 169738048, 169866304, 169999552, 960 170131264, 170262464, 170393536, 170524352, 170655424, 170782016, 961 170917696, 171048896, 171179072, 171310784, 171439936, 171573184, 962 171702976, 171835072, 171966272, 172097216, 172228288, 172359232, 963 172489664, 172621376, 172747712, 172883264, 173014208, 173144512, 964 173275072, 173407424, 173539136, 173669696, 173800768, 173931712, 965 174063424, 174193472, 174325696, 174455744, 174586816, 174718912, 966 174849728, 174977728, 175109696, 175242688, 175374272, 175504832, 967 175636288, 175765696, 175898432, 176028992, 176159936, 176291264, 968 176422592, 176552512, 176684864, 176815424, 176946496, 177076544, 969 177209152, 177340096, 177470528, 177600704, 177731648, 177864256, 970 177994816, 178126528, 178257472, 178387648, 178518464, 178650176, 971 178781888, 178912064, 179044288, 179174848, 179305024, 179436736, 972 179568448, 179698496, 179830208, 179960512, 180092608, 180223808, 973 180354752, 180485696, 180617152, 180748096, 180877504, 181009984, 974 181139264, 181272512, 181402688, 181532608, 181663168, 181795136, 975 181926592, 182057536, 182190016, 182320192, 182451904, 182582336, 976 182713792, 182843072, 182976064, 183107264, 183237056, 183368384, 977 183494848, 183631424, 183762752, 183893824, 184024768, 184154816, 978 184286656, 184417984, 184548928, 184680128, 184810816, 184941248, 979 185072704, 185203904, 185335616, 185465408, 185596352, 185727296, 980 185859904, 185989696, 186121664, 186252992, 186383552, 186514112, 981 186645952, 186777152, 186907328, 187037504, 187170112, 187301824, 982 187429184, 187562048, 187693504, 187825472, 187957184, 188087104, 983 188218304, 188349376, 188481344, 188609728, 188743616, 188874304, 984 189005248, 189136448, 189265088, 189396544, 189528128, 189660992, 985 189791936, 189923264, 190054208, 190182848, 190315072, 190447424, 986 190577984, 190709312, 190840768, 190971328, 191102656, 191233472, 987 191364032, 191495872, 191626816, 191758016, 191888192, 192020288, 988 192148928, 192282176, 192413504, 192542528, 192674752, 192805952, 989 192937792, 193068608, 193198912, 193330496, 193462208, 193592384, 990 193723456, 193854272, 193985984, 194116672, 194247232, 194379712, 991 194508352, 194641856, 194772544, 194900672, 195035072, 195166016, 992 195296704, 195428032, 195558592, 195690304, 195818176, 195952576, 993 196083392, 196214336, 196345792, 196476736, 196607552, 196739008, 994 196869952, 197000768, 197130688, 197262784, 197394368, 197523904, 995 197656384, 197787584, 197916608, 198049472, 198180544, 198310208, 996 198442432, 198573632, 198705088, 198834368, 198967232, 199097792, 997 199228352, 199360192, 199491392, 199621696, 199751744, 199883968, 998 200014016, 200146624, 200276672, 200408128, 200540096, 200671168, 999 200801984, 200933312, 201062464, 201194944, 201326144, 201457472, 1000 201588544, 201719744, 201850816, 201981632, 202111552, 202244032, 1001 202374464, 202505152, 202636352, 202767808, 202898368, 203030336, 1002 203159872, 203292608, 203423296, 203553472, 203685824, 203816896, 1003 203947712, 204078272, 204208192, 204341056, 204472256, 204603328, 1004 204733888, 204864448, 204996544, 205125568, 205258304, 205388864, 1005 205517632, 205650112, 205782208, 205913536, 206044736, 206176192, 1006 206307008, 206434496, 206569024, 206700224, 206831168, 206961856, 1007 207093056, 207223616, 207355328, 207486784, 207616832, 207749056, 1008 207879104, 208010048, 208141888, 208273216, 208404032, 208534336, 1009 208666048, 208796864, 208927424, 209059264, 209189824, 209321792, 1010 209451584, 209582656, 209715136, 209845568, 209976896, 210106432, 1011 210239296, 210370112, 210501568, 210630976, 210763712, 210894272, 1012 211024832, 211156672, 211287616, 211418176, 211549376, 211679296, 1013 211812032, 211942592, 212074432, 212204864, 212334016, 212467648, 1014 212597824, 212727616, 212860352, 212991424, 213120832, 213253952, 1015 213385024, 213515584, 213645632, 213777728, 213909184, 214040128, 1016 214170688, 214302656, 214433728, 214564544, 214695232, 214826048, 1017 214956992, 215089088, 215219776, 215350592, 215482304, 215613248, 1018 215743552, 215874752, 216005312, 216137024, 216267328, 216399296, 1019 216530752, 216661696, 216790592, 216923968, 217054528, 217183168, 1020 217316672, 217448128, 217579072, 217709504, 217838912, 217972672, 1021 218102848, 218233024, 218364736, 218496832, 218627776, 218759104, 1022 218888896, 219021248, 219151936, 219281728, 219413056, 219545024, 1023 219675968, 219807296, 219938624, 220069312, 220200128, 220331456, 1024 220461632, 220592704, 220725184, 220855744, 220987072, 221117888, 1025 221249216, 221378368, 221510336, 221642048, 221772736, 221904832, 1026 222031808, 222166976, 222297536, 222428992, 222559936, 222690368, 1027 222820672, 222953152, 223083968, 223213376, 223345984, 223476928, 1028 223608512, 223738688, 223869376, 224001472, 224132672, 224262848, 1029 224394944, 224524864, 224657344, 224788288, 224919488, 225050432, 1030 225181504, 225312704, 225443776, 225574592, 225704768, 225834176, 1031 225966784, 226097216, 226229824, 226360384, 226491712, 226623424, 1032 226754368, 226885312, 227015104, 227147456, 227278528, 227409472, 1033 227539904, 227669696, 227802944, 227932352, 228065216, 228196288, 1034 228326464, 228457792, 228588736, 228720064, 228850112, 228981056, 1035 229113152, 229243328, 229375936, 229505344, 229636928, 229769152, 1036 229894976, 230030272, 230162368, 230292416, 230424512, 230553152, 1037 230684864, 230816704, 230948416, 231079616, 231210944, 231342016, 1038 231472448, 231603776, 231733952, 231866176, 231996736, 232127296, 1039 232259392, 232388672, 232521664, 232652608, 232782272, 232914496, 1040 233043904, 233175616, 233306816, 233438528, 233569984, 233699776, 1041 233830592, 233962688, 234092224, 234221888, 234353984, 234485312, 1042 234618304, 234749888, 234880832, 235011776, 235142464, 235274048, 1043 235403456, 235535936, 235667392, 235797568, 235928768, 236057152, 1044 236190272, 236322752, 236453312, 236583616, 236715712, 236846528, 1045 236976448, 237108544, 237239104, 237371072, 237501632, 237630784, 1046 237764416, 237895232, 238026688, 238157632, 238286912, 238419392, 1047 238548032, 238681024, 238812608, 238941632, 239075008, 239206336, 1048 239335232, 239466944, 239599168, 239730496, 239861312, 239992384, 1049 240122816, 240254656, 240385856, 240516928, 240647872, 240779072, 1050 240909632, 241040704, 241171904, 241302848, 241433408, 241565248, 1051 241696192, 241825984, 241958848, 242088256, 242220224, 242352064, 1052 242481856, 242611648, 242744896, 242876224, 243005632, 243138496, 1053 243268672, 243400384, 243531712, 243662656, 243793856, 243924544, 1054 244054592, 244187072, 244316608, 244448704, 244580032, 244710976, 1055 244841536, 244972864, 245104448, 245233984, 245365312, 245497792, 1056 245628736, 245759936, 245889856, 246021056, 246152512, 246284224, 1057 246415168, 246545344, 246675904, 246808384, 246939584, 247070144, 1058 247199552, 247331648, 247463872, 247593536, 247726016, 247857088, 1059 247987648, 248116928, 248249536, 248380736, 248512064, 248643008, 1060 248773312, 248901056, 249036608, 249167552, 249298624, 249429184, 1061 249560512, 249692096, 249822784, 249954112, 250085312, 250215488, 1062 250345792, 250478528, 250608704, 250739264, 250870976, 251002816, 1063 251133632, 251263552, 251395136, 251523904, 251657792, 251789248, 1064 251919424, 252051392, 252182464, 252313408, 252444224, 252575552, 1065 252706624, 252836032, 252968512, 253099712, 253227584, 253361728, 1066 253493056, 253623488, 253754432, 253885504, 254017216, 254148032, 1067 254279488, 254410432, 254541376, 254672576, 254803264, 254933824, 1068 255065792, 255196736, 255326528, 255458752, 255589952, 255721408, 1069 255851072, 255983296, 256114624, 256244416, 256374208, 256507712, 1070 256636096, 256768832, 256900544, 257031616, 257162176, 257294272, 1071 257424448, 257555776, 257686976, 257818432, 257949632, 258079552, 1072 258211136, 258342464, 258473408, 258603712, 258734656, 258867008, 1073 258996544, 259127744, 259260224, 259391296, 259522112, 259651904, 1074 259784384, 259915328, 260045888, 260175424, 260308544, 260438336, 1075 260570944, 260700992, 260832448, 260963776, 261092672, 261226304, 1076 261356864, 261487936, 261619648, 261750592, 261879872, 262011968, 1077 262143424, 262274752, 262404416, 262537024, 262667968, 262799296, 1078 262928704, 263061184, 263191744, 263322944, 263454656, 263585216, 1079 263716672, 263847872, 263978944, 264108608, 264241088, 264371648, 1080 264501184, 264632768, 264764096, 264895936, 265024576, 265158464, 1081 265287488, 265418432, 265550528, 265681216, 265813312, 265943488, 1082 266075968, 266206144, 266337728, 266468032, 266600384, 266731072, 1083 266862272, 266993344, 267124288, 267255616, 267386432, 267516992, 1084 267648704, 267777728, 267910592, 268040512, 268172096, 268302784, 1085 268435264, 268566208, 268696256, 268828096, 268959296, 269090368, 1086 269221312, 269352256, 269482688, 269614784, 269745856, 269876416, 1087 270007616, 270139328, 270270272, 270401216, 270531904, 270663616, 1088 270791744, 270924736, 271056832, 271186112, 271317184, 271449536, 1089 271580992, 271711936, 271843136, 271973056, 272105408, 272236352, 1090 272367296, 272498368, 272629568, 272759488, 272891456, 273022784, 1091 273153856, 273284672, 273415616, 273547072, 273677632, 273808448, 1092 273937088, 274071488, 274200896, 274332992, 274463296, 274595392, 1093 274726208, 274857536, 274988992, 275118656, 275250496, 275382208, 1094 275513024, 275643968, 275775296, 275906368, 276037184, 276167872, 1095 276297664, 276429376, 276560576, 276692672, 276822976, 276955072, 1096 277085632, 277216832, 277347008, 277478848, 277609664, 277740992, 1097 277868608, 278002624, 278134336, 278265536, 278395328, 278526784, 1098 278657728, 278789824, 278921152, 279052096, 279182912, 279313088, 1099 279443776, 279576256, 279706048, 279838528, 279969728, 280099648, 1100 280230976, 280361408, 280493632, 280622528, 280755392, 280887104, 1101 281018176, 281147968, 281278912, 281411392, 281542592, 281673152, 1102 281803712, 281935552, 282066496, 282197312, 282329024, 282458816, 1103 282590272, 282720832, 282853184, 282983744, 283115072, 283246144, 1104 283377344, 283508416, 283639744, 283770304, 283901504, 284032576, 1105 284163136, 284294848, 284426176, 284556992, 284687296, 284819264, 1106 284950208, 285081536}