github.com/Aodurkeen/go-ubiq@v2.3.0+incompatible/consensus/ubqhash/algorithm.go (about)

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