aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax <ikj1234i@yahoo.com>2017-10-05 19:13:47 -0400
committerMax <ikj1234i@yahoo.com>2017-10-05 19:13:47 -0400
commit20743ddc60d5213a5fba60241e5a0c12e5a16b78 (patch)
tree8a9ff629ea01f7f09ba49be0cfa7bf52ef254d75
parenta3f4963deac56125953a4efbc4b26e510f4e0520 (diff)
dstar update
-rw-r--r--op25/gr-op25_repeater/lib/ambe.c10
-rw-r--r--op25/gr-op25_repeater/lib/ambe_encoder.cc6
-rw-r--r--op25/gr-op25_repeater/lib/dstar_tx_sb_impl.cc1
-rw-r--r--op25/gr-op25_repeater/lib/p25p2_vf.cc1206
-rw-r--r--op25/gr-op25_repeater/lib/p25p2_vf.h1
5 files changed, 574 insertions, 650 deletions
diff --git a/op25/gr-op25_repeater/lib/ambe.c b/op25/gr-op25_repeater/lib/ambe.c
index 8767b80..aa43fb2 100644
--- a/op25/gr-op25_repeater/lib/ambe.c
+++ b/op25/gr-op25_repeater/lib/ambe.c
@@ -138,9 +138,13 @@ mbe_dequantizeAmbeParms (mbe_parms * cur_mp, mbe_parms * prev_mp, const int *b,
#ifdef AMBE_DEBUG
printf ("\nb0:%i w0:%f L:%i b1:%i\n", b0, cur_mp->w0, L, b1);
#endif
-
- deltaGamma = AmbeDg[b2];
- cur_mp->gamma = deltaGamma + ((float) 0.5 * prev_mp->gamma);
+ if (dstar) {
+ deltaGamma = AmbePlusDg[b2];
+ cur_mp->gamma = deltaGamma + ((float) 1.0 * prev_mp->gamma);
+ } else {
+ deltaGamma = AmbeDg[b2];
+ cur_mp->gamma = deltaGamma + ((float) 0.5 * prev_mp->gamma);
+ }
#ifdef AMBE_DEBUG
printf ("b2: %i, deltaGamma: %f gamma: %f gamma-1: %f\n", b2, deltaGamma, cur_mp->gamma, prev_mp->gamma);
#endif
diff --git a/op25/gr-op25_repeater/lib/ambe_encoder.cc b/op25/gr-op25_repeater/lib/ambe_encoder.cc
index 0349137..c425211 100644
--- a/op25/gr-op25_repeater/lib/ambe_encoder.cc
+++ b/op25/gr-op25_repeater/lib/ambe_encoder.cc
@@ -247,7 +247,11 @@ static void encode_ambe(const IMBE_PARAM *imbe_param, int b[], mbe_parms*cur_mp,
lsa_sum += lsa[i1];
}
float gain = lsa_sum / num_harms_f;
- float diff_gain = gain - 0.5 * prev_mp->gamma;
+ float diff_gain;
+ if (dstar)
+ diff_gain = gain;
+ else
+ diff_gain = gain - 0.5 * prev_mp->gamma;
diff_gain -= gain_adjust;
diff --git a/op25/gr-op25_repeater/lib/dstar_tx_sb_impl.cc b/op25/gr-op25_repeater/lib/dstar_tx_sb_impl.cc
index 6f37220..024daef 100644
--- a/op25/gr-op25_repeater/lib/dstar_tx_sb_impl.cc
+++ b/op25/gr-op25_repeater/lib/dstar_tx_sb_impl.cc
@@ -152,7 +152,6 @@ dstar_tx_sb_impl::general_work (int noutput_items,
memcpy(out+72, FS, 24);
else
memcpy(out+72, FS_DUMMY, 24);
- d_frame_counter += 1;
d_frame_counter = (d_frame_counter + 1) % 21;
in += 160;
nconsumed += 160;
diff --git a/op25/gr-op25_repeater/lib/p25p2_vf.cc b/op25/gr-op25_repeater/lib/p25p2_vf.cc
index d6efc63..cab6f7d 100644
--- a/op25/gr-op25_repeater/lib/p25p2_vf.cc
+++ b/op25/gr-op25_repeater/lib/p25p2_vf.cc
@@ -19,6 +19,7 @@
#include <stdio.h>
#include <stdint.h>
+#include <string.h>
#include "p25p2_vf.h"
#include "rs.h"
@@ -50,518 +51,518 @@ static inline int load_reg(const uint8_t val[], int len) {
}
static const uint32_t pr_n[4096] = { \
-2188835, 846719, 1581972, 3511912, 3170211, 1880711, 3779192, 7694256, \
- 4247119, 7279335, 7068578, 4613212, 4631701, 8096043, 6180930, 5429652, \
- 7812477, 8121555, 6185230, 2328940, 2593937, 687387, 3056118, 2826378, \
- 1363273, 1070325, 4044862, 1962450, 1076397, 3507245, 2693586, 5034554, \
- 6321893, 6664073, 4768298, 8145910, 7444253, 5586529, 5829604, 8268558, \
- 5474035, 4644665, 6978308, 2863814, 470827, 2279125, 4131548, 1815330, \
- 1507011, 3307037, 2068400, 1720538, 2543623, 212455, 898136, 6867348, \
- 6619647, 5344299, 8156608, 8190332, 5320755, 5541339, 7916844, 5058724, \
- 4307291, 6583351, 4836590, 852296, 3197089, 3601663, 1785110, 4100744, \
- 3293805, 1544071, 997082, 2816880, 480133, 200267, 7243554, 5925788, \
- 5747285, 7487393, 8314702, 5980758, 8334265, 6353489, 4554374, 4822890, \
- 7080561, 4244125, 1126262, 4011170, 1626249, 1399157, 3245242, 3943770, \
- 586215, 2439341, 2102608, 839102, 745519, 3647809, 5406088, 6280310, \
- 8067547, 7741449, 5696612, 7042446, 7247891, 4346109, 6803212, 7022144, \
- 6169259, 5495575, 3610320, 1609640, 1860423, 3271391, 2373424, 548848, \
- 3004047, 2433827, 44024, 4023828, 3792757, 1315563, 5261830, 8251388, \
- 5778993, 4493843, 6511086, 7314464, 4859097, 6777311, 7585830, 6168008, \
- 8049925, 7563455, 1483226, 1715458, 3101933, 250113, 407706, 2286846, \
- 3108101, 1605833, 3414114, 3233054, 1944793, 5775393, 7719854, 4283990, \
- 4757297, 7109629, 4284996, 4501418, 7866355, 8248853, 5338040, 7646050, \
- 8087183, 2082805, 170608, 2503326, 786247, 927273, 2263760, 1524564, \
- 2088619, 3847747, 3631372, 1296572, 4064595, 6987147, 4681828, 4389192, \
- 7120283, 4803703, 5620108, 7354752, 6141039, 5858750, 7637074, 7373033, \
- 4808101, 2946138, 2111674, 360757, 609357, 3970210, 1162102, 1538781, \
- 3851057, 4067178, 247430, 2587477, 2798585, 5226004, 6506318, 6458275, \
- 6173201, 6027228, 7765666, 5407307, 5737413, 7030324, 7126746, 4273031, \
- 6674989, 2639560, 820498, 3274879, 3437027, 1621256, 1901804, 3524919, \
- 8475, 900324, 2749740, 2382299, 4229299, 7284028, 8060100, 5648427, \
- 7576063, 8373462, 5917720, 4695521, 6518791, 5165210, 4855792, 6524445, \
- 2548679, 1719138, 4175388, 3366869, 1360683, 3746434, 2991940, 65337, \
- 269009, 2724686, 806566, 59105, 7682845, 7983798, 5791338, 7604105, \
- 7449317, 5005886, 4773266, 6757485, 4444589, 5138898, 7021690, 5750199, \
- 1200457, 4102152, 3876278, 1502559, 2254993, 3084652, 1038414, 152723, \
- 2600313, 204948, 2021506, 3691883, 5577879, 5300828, 8152032, 6925959, \
- 4527951, 6347696, 7152248, 4796231, 4515751, 7625320, 5870484, 6061887, \
- 3206755, 1385344, 723564, 3069681, 2318107, 500334, 2779812, 3065625, \
- 1253079, 1446334, 3862856, 6237377, 5481791, 6441426, 7327896, 4930861, \
- 6710727, 6351898, 5046646, 7968989, 7625737, 5371362, 6105150, 3686485, \
- 314849, 70702, 2930886, 2646329, 363569, 2428870, 3691306, 1964769, \
- 3356637, 3600180, 1721058, 5212943, 6436773, 4620024, 4973330, 7275207, \
- 6475369, 5723920, 8108766, 8270399, 6213505, 7571016, 6687284, 586715, \
- 884251, 2207140, 262604, 641043, 4043263, 3161468, 1373312, 3754475, \
- 3965239, 27800, 390520, 6926503, 4720847, 4572530, 6491316, 6205517, \
- 5929251, 7853226, 7507028, 6160817, 7071851, 6766406, 4372364, 936561, \
- 2868115, 438158, 1209952, 4193161, 2036565, 1216182, 3491722, 2732613, \
- 834237, 2119514, 6671954, 4719277, 5024609, 7435930, 5611070, 5804917, \
- 8211081, 5368164, 4470270, 7142427, 6902129, 4622764, 2270210, 3108347, \
- 1814973, 1448004, 3397098, 2049059, 1747165, 2535832, 2317410, 955599, \
- 2754823, 3137648, 4418717, 7517447, 8247530, 5856000, 5547861, 7352059, \
- 5108482, 4742092, 6592053, 6418227, 5071838, 6859300, 3481577, 1169105, \
- 3938870, 3711994, 1437185, 480941, 2793470, 1004050, 256761, 2500453, \
- 2795018, 2054650, 7491893, 7781581, 5989698, 8382766, 6426847, 4693265, \
- 4937128, 7219398, 4499723, 4277497, 8182868, 7868814, 1439971, 3236869, \
- 3935644, 626802, 2447531, 2160071, 795760, 650168, 2376535, 1056303, \
- 1947552, 3898192, 7512767, 5705587, 7067144, 7232164, 4340599, 4711067, \
- 6967028, 5146476, 5446281, 7860819, 5926846, 2033280, 3918665, 2511791, \
- 177238, 2702808, 2941349, 2127, 329098, 3800368, 1863773, 1157511, \
- 3490922, 5819630, 4987157, 6369401, 6683810, 4736262, 7178489, 6373553, \
- 5700958, 6173862, 8071457, 5685725, 5375670, 3129210, 750531, 457253, \
- 2295672, 3084178, 714271, 3554277, 3387904, 1986142, 1757175, 3473929, \
- 96968, 4781862, 7151135, 6390481, 4475692, 7907020, 8208323, 5305147, \
- 7651572, 7933192, 6137323, 4225255, 6664476, 597488, 967727, 2279695, \
- 3350768, 2028600, 3825111, 3637347, 1247274, 4122068, 2866237, 463027, \
- 186694, 6702092, 4959729, 6170971, 7533206, 7707620, 5834505, 8187543, \
- 7627646, 4307840, 7100097, 6872877, 361106, 74330, 3997485, 1644261, \
- 1415754, 3163062, 3993213, 1680905, 2505634, 2282094, 991121, 765945, \
- 6447212, 5765510, 6002043, 8281269, 5431708, 5712202, 8037539, 7232861, \
- 4444372, 6787250, 6974799, 5235845, 1120312, 3445074, 1596567, 1680491, \
- 3452288, 1073180, 907639, 2694531, 2422348, 93156, 2991035, 3710547, \
- 5527460, 5364520, 8135363, 5959615, 5719676, 6525632, 5151529, 5207783, \
- 6532762, 6685496, 5954277, 8345103, 3391314, 1499900, 1272605, 4165571, \
- 660522, 457044, 2191833, 830521, 542150, 3496334, 3248177, 1588693, \
- 8250398, 7405794, 5540297, 4740117, 7175410, 4240682, 4483077, 6930925, \
- 8199474, 5420242, 7827823, 3893537, 2000584, 3297078, 2356151, 932424, \
- 702244, 2576111, 197211, 2005904, 3899116, 3667459, 1182683, 8290940, \
- 7949972, 4470729, 6339111, 7168926, 4837208, 4458033, 7730127, 5863746, \
- 6042808, 7376221, 7684375, 1607850, 2897248, 2227349, 344315, 2754914, \
- 3049614, 1274981, 1490353, 3805342, 2082918, 1525161, 3288129, 7336374, \
- 4946362, 7242817, 6423949, 4713318, 5911122, 8273823, 5494629, 5589640, \
- 7897882, 6106743, 4322969, 2366272, 2624238, 640671, 2387793, 3191480, \
- 1931782, 1693643, 3411641, 1123188, 1960924, 2635299, 432111, 4409756, \
- 7266352, 6958571, 5747975, 7593056, 8262072, 6260759, 5465327, 7793952, \
- 4855876, 5230815, 2280755, 402634, 764036, 4026657, 3185883, 1381654, \
- 3795436, 3989697, 1058067, 368638, 2970128, 559881, 4532207, 6417942, \
- 8180698, 5773941, 7722541, 7366602, 6203954, 8061693, 6807377, 4380202, \
- 5188334, 7070485, 421561, 1218534, 3873550, 4127465, 1745777, 3616156, \
- 3396806, 940323, 2855309, 2452564, 58682, 821443, 7934021, 5559720, \
- 5274706, 8232991, 7956901, 5559360, 6659230, 6893943, 5040219, 6301056, \
- 6655332, 5789883, 1896915, 3391356, 1533612, 1755971, 4133823, 2334388, \
- 423768, 2812587, 3113575, 411486, 1236656, 4141677, 6011791, 5662210, \
- 7507576, 6264725, 4749899, 6616042, 6369156, 5099101, 6833075, 7706886, \
- 5354700, 1867169, 3719257, 1116310, 1365282, 2653417, 897157, 65918, \
- 2378994, 2851845, 2046317, 3338418, 3570970, 5998069, 6162469, 7500106, \
- 4701686, 4930623, 6996441, 5196704, 4425262, 7765971, 8024601, 6265596, \
- 7342022, 3460619, 1651445, 897820, 2128522, 345827, 626445, 2892496, \
- 1112888, 1390351, 3968711, 3687208, 1403892, 7454295, 7108395, 4970976, \
- 4653068, 6458807, 5137651, 5978124, 7836132, 7490681, 6278291, 8069622, \
- 6731816, 160897, 2825599, 3047478, 158160, 517453, 3751079, 1888602, \
- 1130776, 3476725, 3712843, 818050, 2200190, 6561565, 4769409, 7171690, \
- 6366086, 5282521, 6119033, 7964582, 5515855, 5300897, 7307196, 6952542, \
- 449443, 2319209, 3124804, 665520, 3658619, 3349127, 1443116, 1764720, \
- 4153495, 432511, 136416, 3136648, 7020887, 4499635, 6417496, 8213956, \
- 5806253, 5529683, 7466386, 6038588, 4757953, 6672779, 4291710, 5023188, \
- 2646281, 2213991, 1316782, 3710744, 4187889, 1256239, 1475138, 2842346, \
- 1038141, 146133, 2550442, 780070, 5115597, 7508537, 7830514, 6022798, \
- 8007457, 7848945, 4446750, 4995030, 6862825, 4549121, 4227540, 7085370, \
- 1692691, 1440205, 3153956, 4050130, 1656159, 2398261, 2111688, 914690, \
- 847031, 2097401, 514304, 1799406, 8306031, 7545235, 5753084, 8030500, \
- 7214475, 4455531, 6714164, 6458328, 5195299, 4972463, 7778892, 5454384, \
- 1820667, 3950151, 3181194, 357240, 2752021, 2930591, 68450, 2474628, \
- 2637789, 1881971, 1145498, 7654212, 5801889, 6098587, 6418774, 6305980, \
- 5084257, 7032133, 6734014, 4372594, 8353161, 8057957, 5638242, 1278362, \
- 4156533, 701869, 474378, 2314338, 3066301, 664913, 2604266, 3570094, \
- 1610055, 4000921, 3229492, 5565134, 4797067, 7200625, 4216540, 4491794, \
- 6890347, 7108237, 5291540, 7672826, 7981591, 6055751, 5615592, 2306608, \
- 941023, 694199, 2559584, 191436, 946999, 3907323, 4150656, 1198116, \
- 3580139, 3878163, 972028, 4331748, 6783233, 4940015, 4746294, 6665496, \
- 5314761, 6082855, 7876042, 7709776, 5269821, 7098831, 6921218, 347580, \
- 57813, 2959899, 628714, 1334790, 3150493, 2075633, 1992254, 3337934, \
- 2560865, 758457, 7237334, 6498098, 4696745, 4870981, 8314686, 5453554, \
- 5696325, 8020909, 8324704, 4431642, 6574999, 7202913, 599432, 2411718, \
- 2118783, 1907089, 1617988, 3435694, 1158531, 1900633, 2676924, 2454852, \
- 76811, 2941367, 6834524, 4560024, 7478627, 8057199, 6250640, 5475704, \
- 7783871, 4872711, 5223272, 6958772, 6735455, 4393979, 3117730, 3866188, \
- 1540017, 3383859, 4082382, 1623940, 343657, 2405335, 584470, 869992, \
- 2199425, 2380622, 5894902, 8207121, 7374669, 5557412, 5832970, 7125203, \
- 4224053, 4582728, 7012546, 5163071, 4718077, 7550096, 4110382, 1720807, \
- 3656729, 3290616, 981492, 782347, 2559459, 165180, 999452, 2865651, \
- 1455151, 5299908, 8242008, 7866939, 5289671, 6651660, 6927072, 4983511, \
- 4312863, 6678242, 4733704, 6091653, 7429875, 1410842, 1575876, 4059757, \
- 2341763, 399318, 2803260, 3099553, 434763, 146486, 4183536, 1808473, \
- 1966245, 7597422, 7828506, 4894897, 7231869, 6538370, 4632042, 6824253, \
- 7207061, 5313882, 5545382, 8208589, 5892441, 1326514, 2102350, 3004675, \
- 524457, 2403932, 2189206, 1964651, 3674693, 3497868, 1173114, 1974931, \
- 3848973, 4675168, 4366242, 6956895, 7301879, 4449192, 7741248, 8099511, \
- 6249275, 7515088, 7743148, 5988199, 5165715, 2234428, 386420, 617611, \
- 2924611, 3152372, 1135640, 3974225, 3680687, 1433614, 3235280, 2921789, \
- 4790343, 4547018, 6335784, 4981973, 5888411, 7756066, 7513292, 6253837, \
- 8077555, 7772922, 4658950, 4456169, 3039785, 699222, 475902, 3298849, \
- 2015173, 1778238, 3664690, 3278809, 1941029, 2708450, 2391002, 42519, \
- 5066749, 6867712, 5247622, 5619711, 7955473, 6056152, 5341542, 7691395, \
- 6878425, 4995380, 6398094, 6702155, 658721, 2076892, 3373392, 1500587, \
- 1772655, 3916036, 1464824, 144503, 3128719, 2836968, 442400, 2297247, \
- 8386163, 5930664, 5546956, 7440999, 6047419, 5816150, 6634116, 6419113, \
- 5001043, 7177886, 6409076, 5534529, 3718799, 3999606, 1100696, 1327633, \
- 3782503, 917386, 152144, 2591677, 2819221, 977986, 3289518, 7846005, \
- 5424345, 8015274, 8366182, 5452169, 4652337, 7017598, 5212558, 4374881, \
- 6716653, 7976212, 6052218, 3195051, 3473669, 1682636, 3994674, 2177375, \
- 103117, 806432, 2680794, 342679, 1094193, 3989448, 3739142, 5612543, \
- 7498643, 8320532, 4923372, 4641571, 6474331, 5187572, 4964144, 7754443, \
- 5739303, 5967420, 8316624, 3336999, 1519854, 2792512, 3036473, 108797, \
- 335878, 2686378, 1957093, 1118493, 3459546, 1598562, 1944973, 7345601, \
- 6346810, 5083614, 6892869, 6612009, 4280788, 6133790, 8000699, 5696833, \
- 5448204, 8268530, 5953395, 482973, 2339556, 2517802, 781975, 2824053, \
- 3546040, 1233602, 2043759, 3844023, 1460816, 1168300, 2957223, 6831691, \
- 4580272, 6367860, 7116363, 5791619, 7729260, 7415964, 6055251, 6147183, \
- 7409796, 4501832, 555193, 3007895, 2100554, 413856, 3922269, 4142559, \
- 1223858, 3621228, 3901829, 1973307, 161146, 2615444, 5120109, 4902371, \
- 6772246, 7584382, 6173617, 8089097, 7718630, 5243698, 8190553, 6911909, \
- 4501294, 4195010, 2968469, 628605, 1326786, 3273482, 3754983, 1871505, \
- 3163928, 3504870, 569871, 3026761, 2344176, 477214, 4895171, 8353833, \
- 5993532, 5670358, 7473211, 8372709, 5913932, 6730808, 6769139, 4931871, \
- 5147808, 6452712, 1440031, 1579255, 3966264, 1133700, 1401063, 3717947, \
- 2979536, 118348, 2360099, 2665155, 882206, 1357748, 7379529, 6112003, \
- 5885926, 7743064, 5487505, 5198831, 6983174, 6719360, 4418173, 7273143, \
- 8009674, 1564266, 1263285, 4106585, 1810610, 1277166, 2528589, 657585, \
- 1042814, 2123030, 2407593, 1675625, 4020630, 7373946, 5582193, 5894541, \
- 8149068, 4232626, 4572315, 6842437, 7119264, 4537418, 7460055, 8133565, \
- 6005312, 3665542, 3307311, 2005713, 727960, 3131238, 143075, 500491, \
- 2874228, 4085436, 1220419, 3630055, 4123196, 5903184, 6788795, 6413871, \
- 4989888, 4827832, 6645367, 4251103, 6033450, 7977184, 7660957, 5254163, \
- 8231418, 2707724, 318533, 2172411, 2746646, 835788, 138537, 3642627, \
- 1734878, 2023728, 3351745, 3660813, 708902, 7289082, 6530069, 4616165, \
- 4883178, 7281154, 5437437, 5406257, 8334210, 5882862, 5529141, 6395865, \
- 2965362, 582182, 2378699, 2164529, 843452, 1602398, 3518979, 1126125, \
- 1886036, 3676826, 340603, 326917, 6972552, 7309426, 4407711, 6741197, \
- 7552288, 6238605, 5949527, 7751098, 5479912, 5140549, 7010735, 4654450, \
- 199700, 3064237, 2830435, 1293450, 3433844, 3721329, 1900681, 1081190, \
- 2422462, 604817, 885589, 2114222, 4575042, 4798425, 8157877, 7390034, \
- 5574538, 7898725, 7896029, 4699034, 4406902, 7229327, 4964865, 4663928, \
- 2291614, 4095559, 1802985, 3541284, 3302494, 2096315, 2830625, 2543820, \
- 216482, 1017211, 2894045, 28964, 5610984, 7931015, 8177975, 5333496, \
- 7715840, 6831567, 5001459, 6391824, 6563292, 4779047, 5076555, 3251156, \
- 1327668, 1789913, 3909379, 3551790, 187348, 2561809, 2789119, 943046, \
- 2353928, 2594553, 1711927, 6275722, 7547616, 5680941, 5928671, 7330418, \
- 6329134, 4222661, 7201833, 6891962, 4493398, 5332265, 8226273, 1613838, \
- 1337758, 3265905, 793613, 561606, 2451826, 2204825, 830933, 2838572, \
- 3659906, 1453399, 1762493, 8350928, 5411146, 4626599, 7042641, 5222168, \
- 4334262, 6806383, 7034753, 6198900, 7515006, 7824259, 6000235, 1841068, \
- 2218896, 94843, 831399, 2680396, 348840, 39859, 3946079, 3796608, \
- 1401704, 3181263, 4052119, 4808058, 4501636, 6301965, 5229947, 4854930, \
- 6461788, 7860705, 5467139, 8291678, 8079796, 5754905, 2243015, 3060902, \
- 779384, 412113, 2265149, 1015010, 1832322, 3418237, 3244789, 1953546, \
- 3938018, 2145189, 4553497, 6866674, 7081774, 4313933, 4553409, 7878462, \
- 6139862, 5325323, 7654185, 7878340, 5240346, 6454259, 2491085, 1019404, \
- 2848738, 2538015, 1192085, 2084328, 3818506, 1444311, 1308987, 3109936, \
- 2792900, 460079, 6539507, 7106904, 4734260, 5633251, 7358731, 5800116, \
- 6104188, 7470355, 4468967, 4790380, 7194000, 6311129, 307751, 2718594, \
- 3987016, 1052597, 1510367, 3924554, 1998756, 759629, 2574867, 443322, \
- 667468, 3094145, 6486891, 5640726, 8095390, 8351593, 5431969, 5716574, \
- 7018354, 5164729, 4194637, 6662566, 4747450, 843093, 3481013, 3227754, \
- 1894850, 3745213, 3521649, 20880, 821262, 2696295, 355736, 63572, \
- 2953447, 6003979, 5661760, 7514300, 8331603, 5921987, 6477740, 6753092, \
- 4973209, 5138235, 6528966, 4657800, 5921633, 4106239, 3354142, 1500128, \
- 3693229, 2987543, 77818, 2419256, 2728517, 860139, 316978, 3170014, \
- 1942333, 5793825, 7652814, 7445782, 5050609, 6873561, 6630662, 4424942, \
- 7231761, 8049109, 6274286, 5383426, 7792841, 2031669, 1809808, 2522314, \
- 2351143, 1026541, 2770000, 2546742, 1249775, 4110849, 3696552, 1429374, \
- 1151507, 8147945, 4783972, 4531868, 6327291, 6832951, 5086860, 7452512, \
- 7633595, 5890783, 6097684, 7397032, 5535303, 768799, 3056376, 151120, \
- 509839, 2824291, 4124946, 1277340, 3638373, 4096395, 1726790, 1553524, \
- 6438329, 5169475, 4933806, 6784416, 4389969, 6123711, 7977318, 7605448, \
- 5293221, 8223093, 7909530, 4520994, 345453, 2722461, 787314, 131006, \
- 3489285, 1610569, 1887162, 3229270, 3588057, 1734433, 3144270, 2818974, \
- 4623923, 4450013, 7304068, 5945962, 5396187, 7851797, 8061672, 6208162, \
- 7567111, 6757629, 4882736, 7096654, 2223335, 275747, 1628632, 4018228, \
- 1117551, 1353155, 3766308, 3797500, 269459, 2147371, 2974180, 534544, \
- 6599899, 7429623, 6262796, 5900480, 7857461, 5471903, 6165458, 6986536, \
- 6770381, 4368211, 7221050, 7336660, 1268493, 3540651, 3927670, 2056988, \
- 1227489, 3413611, 645006, 797430, 2105913, 2486213, 611950, 8166314, \
- 7406545, 5631037, 7873954, 7870786, 5625901, 4216309, 7122266, 4808838, \
- 4712807, 6427673, 7740560, 1827198, 4073603, 3318849, 1529212, 1824918, \
- 3018843, 208289, 255108, 3017050, 692659, 1530493, 3336076, 8269728, \
- 5851775, 7721879, 7348072, 5092968, 4811655, 6595195, 4198064, 5068556, \
- 7928431, 5515939, 5613404, 3755764, 3969579, 1121099, 2487942, 2813752, \
- 917969, 247943, 2512238, 1750480, 2041881, 3400183, 1494402, 5968904, \
- 8387061, 6451231, 4369490, 7275940, 6998061, 4634833, 5322042, 8252534, \
- 5784769, 5605673, 7426294, 3997087, 571177, 2427620, 2212622, 804851, \
- 2735865, 3240716, 1371104, 1607211, 4001687, 1241820, 5650984, 6535107, \
- 7294543, 4901424, 6788056, 6520335, 6223591, 7998296, 7832084, 5394423, \
- 6223115, 8370306, 217596, 443697, 2690259, 2994542, 31140, 3454169, \
- 3771703, 1851574, 3205192, 3486113, 1703167, 810066, 6390176, 4556909, \
- 5010437, 6880698, 7671930, 5425541, 8275785, 8105570, 5747614, 5403485, \
- 7315105, 4917198, 453446, 2257593, 1032025, 1758852, 3558058, 3384147, \
- 1781405, 4128380, 3298146, 367247, 575093, 2912176, 4305434, 4528999, \
- 7919021, 6098000, 5349878, 7627071, 7896131, 6133160, 6298932, 6611155, \
- 5056907, 4830308, 3038348, 1265939, 1540343, 3828876, 2024768, 1251563, \
- 3576095, 2776400, 992424, 2337029, 2511823, 4972090, 6233940, 7775181, \
- 5401123, 6105082, 7904796, 7623221, 4320235, 7153158, 6876924, 4543481, \
- 6361619, 3972846, 1599266, 1419921, 3146749, 1892150, 1660618, 2173701, \
- 2531637, 747738, 3120386, 2233837, 1505345, 8085778, 8334590, 5424135, \
- 5724553, 8106212, 5123094, 4384219, 6750305, 6953100, 5166542, 7699507, \
- 7446973, 1837380, 3785898, 3481083, 1061717, 846520, 2715488, 296719, \
- 23295, 3011440, 3751580, 1320551, 3263275, 8209048, 6200916, 6977467, \
- 6808259, 4328004, 5113788, 7069267, 4666255, 5421990, 8340032, 8114073, \
- 5637495, 3340366, 3144064, 664933, 429215, 2310418, 653416, 799909, \
- 3276099, 1425658, 1574966, 3966285, 7435433, 4503654, 6816222, 7195825, \
- 4310377, 4471182, 6877234, 6127609, 5277589, 7733838, 6286314, 6027029, \
- 2506333, 2343856, 1001994, 2795215, 2506549, 258648, 2005718, 3804967, \
- 1558217, 1277456, 4109118, 744131, 4572929, 6590444, 6824630, 5110043, \
- 6321639, 7640100, 5851592, 6152691, 7388223, 5584320, 4839456, 7077935, \
- 2133463, 353336, 2685160, 3053895, 1774619, 3394800, 3547420, 1816717, \
- 2053603, 2284830, 426196, 748409, 7268235, 6436550, 4692792, 8082321, \
- 8302174, 5482414, 7699137, 7918109, 4725684, 4556386, 6319627, 5024741, \
- 627320, 2449042, 3200871, 1845805, 3793792, 3440506, 1087159, 2988481, \
- 2711912, 304294, 208223, 7327891, 5134500, 5420364, 7810195, 8020091, \
- 6199772, 7541888, 6806635, 4876695, 5218396, 6507896, 4609415, 694351, \
- 4141488, 1109272, 1320029, 3775395, 3756906, 292564, 2207677, 2958955, \
- 576130, 267052, 2203377, 6059667, 5794670, 7701220, 5332489, 5562229, \
- 7025334, 7318282, 4343745, 6426157, 7312210, 4881362, 5695021, 3354053, \
- 2066714, 1724534, 3620309, 242697, 944354, 2802078, 2559003, 120049, \
- 2914572, 3743942, 1410299, 5524793, 7917780, 6109482, 4257059, 6573277, \
- 6881596, 5081570, 6320207, 6668069, 5844984, 8176152, 7490471, 1521259, \
- 1768960, 3044308, 231999, 198275, 3067852, 2847268, 471763, 3329883, \
- 4081316, 1805256, 3552017, 7536311, 5191518, 4786944, 6603497, 4287863, \
- 5094802, 6844536, 7391525, 5571727, 7908474, 8188340, 1145053, 2462819, \
- 2641322, 901214, 73905, 2407849, 54342, 2035118, 3834233, 3565717, \
- 1308046, 4144482, 7262345, 4377437, 6762358, 6989450, 5143365, 4444837, \
- 7802392, 5949266, 6285999, 7549505, 7643088, 4740798, 2982519, 2108297, \
- 321060, 647158, 2691995, 1346161, 1140716, 4042498, 1585395, 1366463, \
- 2219348, 2893032, 4778287, 6778967, 6528184, 5117216, 6015183, 7839759, \
- 5384560, 5954780, 8344583, 4364779, 4595850, 7073044, 3126777, 137219, \
- 2609614, 3894764, 1877521, 1074143, 3529510, 1611296, 802777, 2220599, \
- 338682, 825152, 6905381, 6673149, 5286674, 8138494, 7980901, 6101761, \
- 5280506, 6782774, 4974493, 5155553, 6443814, 2613214, 668753, 4104617, \
- 3631310, 1278978, 4103611, 3887189, 522252, 139754, 3050567, 742557, \
- 301424, 6305802, 8217999, 5885281, 7602360, 7461334, 6124847, 6864043, \
- 6299988, 4540860, 4757235, 7092035, 4324012, 1401460, 3706779, 3999415, \
- 1268324, 3584904, 2768499, 1033855, 2247568, 2529857, 751533, 1015574, \
- 3580506, 5442469, 6276933, 8027850, 7779250, 4418397, 7226505, 6849826, \
- 4537550, 4321429, 8141177, 5801130, 5590022, 3162603, 1882289, 1930332, \
- 2215406, 2361379, 622941, 2981300, 2651194, 1358283, 1261861, 4115576, \
- 1713618, 5749047, 7568109, 5113728, 4951580, 6767351, 6486803, 4863688, \
- 8380132, 7488283, 5638867, 6006308, 4159308, 1104579, 328507, 2740180, \
- 812544, 15145, 2470887, 3693086, 1869816, 3223397, 3532815, 1864162, \
- 5839928, 6669469, 4213219, 5021738, 7027924, 4642173, 5396667, 8323270, \
- 8119598, 5663921, 7582041, 8329502, 705762, 404809, 2597269, 784502, \
- 939290, 3382721, 3615341, 1631122, 3944018, 3249709, 1366917, 2638408, \
- 7188150, 4286455, 4512329, 6886048, 6133614, 5303955, 7350193, 8235884, \
- 5788294, 8183659, 6367101, 4696724, 2810728, 3087779, 236575, 1462648, \
- 3860656, 2040911, 1236359, 3592376, 3872856, 763287, 2518123, 2326720, \
- 5181852, 7003263, 7665043, 5318926, 6070500, 7888273, 5608795, 5322982, \
- 7135528, 6942273, 4525751, 2151230, 2906816, 1947181, 1060711, 3457746, \
- 1677880, 2036709, 3341961, 419618, 762870, 3017245, 2283457, 4702122, \
- 8073758, 8317905, 5457721, 5742278, 8025038, 5959737, 4697301, 6423838, \
- 5031970, 4788427, 6667549, 3175664, 1951834, 3768583, 3415277, 1113400, \
- 1913238, 2664687, 279841, 118208, 2175102, 817591, 1701323, 7801892, \
- 7504356, 6181467, 8126003, 7747564, 4345344, 5227139, 7015295, 4634132, \
- 4423368, 8360807, 7998087, 1462104, 3667760, 3816077, 1897291, 2183090, \
- 2459356, 535381, 881579, 2227790, 1316756, 1622201, 4016243, 7452046, \
- 5520492, 7950449, 7178655, 4195446, 6352042, 7172425, 4896885, 5655994, \
- 7554370, 6269093, 1716653, 3669330, 3363998, 952677, 2777537, 2583690, \
- 177526, 3020443, 3918337, 1246180, 1486478, 3765843, 6118397, 5280260, \
- 6573634, 6940603, 4991509, 6339548, 6641442, 5852775, 6071197, 7433008, \
- 5633784, 5250959, 3969890, 871160, 141077, 2532607, 2840746, 1036548, \
- 3280125, 3646515, 1796554, 1970380, 3316769, 1529307, 4907030, 7219502, \
- 4449737, 4676613, 6951422, 7907666, 5595137, 7384557, 8131846, 5888154, \
- 5593589, 6333957, 896714, 607026, 2398909, 5841, 1961760, 3695342, \
- 3451479, 1169209, 3888884, 4111110, 205739, 519793, 6948636, 5151738, \
- 4452963, 7761805, 5941076, 6228536, 7592847, 7738439, 6012072, 7332304, \
- 6441055, 4490415, 875840, 2683020, 1321463, 1156443, 4048008, 3677540, \
- 1421579, 3242131, 2942326, 527788, 2461761, 6355327, 4469942, 5876816, \
- 8211369, 5685799, 5447258, 8386480, 8059509, 4588239, 6524834, 7231096, \
- 4897685, 2568977, 3401450, 2019206, 1704797, 3652345, 1210118, 2015054, \
- 2687649, 2214745, 317150, 2702882, 3012937, 5259397, 7638076, 7931354, \
- 6092935, 5304429, 7674336, 4834330, 5000703, 6402465, 6631432, 4914678, \
- 8291639, 3606745, 1237472, 1998126, 3912915, 481587, 180284, 3083460, \
- 737035, 455415, 2251284, 4163352, 1724131, 7791119, 7420880, 6108912, \
- 5037839, 6360007, 4563496, 4751260, 7141333, 4266539, 5522370, 7925580, \
- 8201913, 1686515, 3428878, 2217636, 855401, 680987, 2554102, 201064, \
- 760961, 4080767, 1288510, 1515730, 8027501, 8314277, 4391122, 6744346, \
- 6972853, 5225545, 4395394, 6707702, 5882973, 6106513, 7397486, 7622662, \
- 1941395, 2623097, 2386564, 107338, 2956899, 2676405, 351068, 1155746, \
- 3944235, 1601357, 1413808, 3152762, 7268295, 4943533, 6792040, 6708116, \
- 4936319, 7315427, 7480968, 5694076, 5966259, 8295451, 5397572, 4678060, \
- 2861147, 3024087, 253244, 2428992, 2668931, 1862975, 3237078, 3180824, \
- 1855845, 1703111, 2434330, 43504, 4997293, 6888707, 7116002, 4223036, \
- 7728085, 7931563, 6196774, 7558086, 7846457, 4892273, 5140430, 6799914, \
- 138209, 982813, 2848310, 3648490, 1213197, 4147925, 3905530, 1457682, \
- 189133, 2968365, 560784, 4495070, 6388023, 5091529, 6032456, 7456183, \
- 7686363, 5812496, 8191396, 6382703, 4489491, 4721148, 7205924, 97667, \
- 438635, 3917878, 2049496, 1219681, 3551399, 3930574, 658480, 2524861, \
- 2345799, 1012386, 704232, 6780757, 5491359, 6161258, 8044292, 5633693, \
- 5338993, 7113626, 6898254, 4583265, 6305689, 6863446, 5100478, 1052233, \
- 3442245, 1145790, 1964658, 3675289, 2477485, 114784, 2893978, 2798967, \
- 490725, 2281864, 4065638, 6022335, 5764369, 7747936, 6000814, 5197127, \
- 6456825, 6694964, 4976966, 7265419, 6427683, 5753308, 7956496, 3978851, \
- 1122255, 1430036, 2640632, 795551, 126535, 2127848, 2923280, 594655, \
- 3532731, 3157792, 6107852, 7985973, 7624571, 4361950, 5202724, 7006953, \
- 4593171, 4398910, 7330540, 8019969, 5418479, 7828726, 3856400, 1970665, \
- 207909, 2614666, 666066, 1022005, 2184653, 326914, 1581230, 4008405, \
- 3200273, 1318122, 7967046, 7170073, 4515057, 4261142, 6642830, 4772451, \
- 4991801, 7448284, 5533298, 5936043, 8329925, 7567164, 454586, 2828887, \
- 3113901, 155616, 431706, 2829247, 1729377, 1494664, 3348388, 2087551, \
- 1733275, 2598724, 6491692, 4997251, 6854995, 6632636, 4254784, 6054219, \
- 7964839, 5576020, 5275032, 7977121, 7151951, 4246930, 2376816, 2726397, \
- 881031, 2123882, 3638708, 1772565, 2019451, 3289506, 1555532, 681721, \
- 3033907, 6521438, 4669350, 7272297, 7023325, 5735190, 7491450, 8322689, \
- 6009613, 5536762, 6342290, 5050189, 4817637, 2390538, 2226138, 888501, \
- 3686921, 3457984, 1392166, 3191903, 3963345, 622636, 364006, 2123011, \
- 1046585, 4927988, 6737162, 7490787, 6260085, 8042780, 7762162, 5496111, \
- 7275719, 6998256, 4419896, 4701399, 6984715, 934312, 1280212, 3417631, \
- 3735539, 1929800, 3250956, 2410483, 552475, 897926, 2110316, 318985, \
- 1656791, 8227710, 5563008, 5341129, 8230447, 7871154, 4637528, 6500005, \
- 7257831, 4911882, 4675764, 7570557, 6188417, 1827042, 3619198, 1216917, \
- 2022521, 3106086, 2269574, 424025, 2872752, 3087710, 1081411, 1436065, \
- 7939164, 6069398, 5263803, 7723087, 4729988, 5039480, 6945491, 6623887, \
- 4235112, 7956096, 8252191, 5251959, 1367720, 3888972, 1971111, 174651, \
- 2582354, 2858924, 922221, 2350019, 3630654, 1715828, 4096897, 3365419, \
- 5742326, 6174616, 7071825, 4677863, 4200718, 7132368, 6913469, 5546261, \
- 7350466, 8242474, 5838165, 7608537, 3273010, 880070, 558093, 2365809, \
- 381150, 539662, 3941857, 3393577, 1525782, 3839486, 4161067, 1303237, \
- 6695916, 6948402, 5234651, 4338477, 6732448, 5990346, 6276919, 7473917, \
- 7541576, 6291206, 7874303, 6589201, 82576, 843372, 2635523, 358107, \
- 1174132, 3933076, 1674443, 1930279, 3193308, 3416144, 609715, 2934223, \
- 6567940, 4438456, 5207413, 8031367, 5636586, 5458016, 8320157, 5913979, \
- 5750818, 6506636, 7243109, 734395, 2586718, 2290020, 1969833, 2082627, \
- 3304350, 1356474, 1654593, 4016013, 35446, 330650, 2750365, 7110245, \
- 4232074, 7686738, 7914229, 6074269, 5322306, 7723694, 5784341, 4818513, \
- 6778552, 4387686, 5159115, 2823473, 3591540, 1187982, 4172067, 3896813, \
- 1498260, 1280370, 3097067, 715781, 407016, 2332856, 2773015, 6081999, \
- 7447584, 7694408, 5829023, 8197171, 7441608, 4481284, 4237951, 7190491, \
- 4808468, 4510444, 7416579, 4056859, 1605374, 3448592, 3642313, 1723111, \
- 3073846, 2305752, 512565, 678831, 3118786, 1289776, 1467389, 8041027, \
- 8330794, 5428708, 7759893, 7053817, 5238114, 6312974, 6396353, 5050673, \
- 5827742, 7630150, 1151273, 1890509, 3691862, 3517626, 73921, 2935053, \
- 2692282, 367698, 63903, 3956965, 1813608, 1185694, 7789175, 5976889, \
- 6269824, 6481518, 6770619, 4952913, 7230076, 6487974, 5711683, 5933755, \
- 8311796, 5447240, 1554083, 3828583, 909980, 331408, 2137967, 2912903, \
- 604736, 3515896, 3165335, 1429835, 1653152, 3994628, 5270877, 4522419, \
- 6848590, 5004748, 4306225, 6764667, 8044950, 5983272, 7804137, 7518615, \
- 6189182, 6007985, 2493705, 181486, 1013938, 2831195, 2555637, 1263404, \
- 4164554, 3805879, 1376061, 3225536, 3670530, 838511, 4278225, 6667800, \
- 4731878, 5097991, 7407115, 7606260, 5829148, 8223427, 7389155, 5522956, \
- 6933456, 3088699, 146599, 521668, 3098936, 1736947, 1461535, 3405096, \
- 4075744, 1710365, 3654903, 2296954, 958732, 6977765, 6812731, 4328850, \
- 6046844, 7989289, 5585347, 5289054, 7953844, 8242121, 4205071, 6580134, \
- 6422362, 791185, 560101, 3493710, 1156738, 1850237, 3756565, 1564354, \
- 1181546, 3074725, 2843225, 180018, 2496166, 7062093, 6286257, 5383932, \
- 7864150, 5984675, 6199401, 6423956, 4713914, 4890739, 7215493, 6413676, \
- 4539634, 3713439, 4022365, 1431712, 1086728, 3939415, 647359, 289096, \
- 2139332, 873519, 645459, 2400408, 3222892, 6154179, 8002187, 7770996, \
- 5463996, 5236235, 7252967, 4414382, 4707920, 6954993, 5153327, 5466818, \
- 3598264, 3841589, 2052823, 3406634, 2500196, 632541, 875315, 2134770, \
- 311052, 615685, 3729657, 3932438, 5348822, 7689385, 7912705, 5089758, \
- 6373434, 6610369, 4723917, 5109798, 6447578, 5680157, 5997605, 8346088, \
- 3321858, 1520895, 3140985, 2768896, 433134, 2332455, 3047065, 697212, \
- 1510182, 3393227, 1990513, 1686452, 7729886, 6311715, 5015215, 6888020, \
- 6615952, 4472571, 6923783, 8244104, 5259888, 5551639, 7946207, 6091360, \
- 2444, 2457943, 2841651, 947608, 2341188, 2572457, 1754491, 1969494, \
- 3387564, 1210721, 1979531, 2854078, 4669808, 4389001, 7287911, 7060974, \
- 4606104, 7471221, 8236463, 5796930, 5569386, 7410621, 5099089, 542602, \
- 2964262, 373333, 22425, 2936438, 3736270, 1371009, 3176049, 4013726, \
- 1671954, 412395, 2336389, 5193556, 4914938, 6705971, 4393933, 6211232, \
- 8285490, 7582175, 5707813, 8045928, 7294414, 4399159, 4649465, 2776064, \
- 889964, 68075, 3465235, 3747036, 1914276, 3201035, 3424463, 634164, \
- 2649304, 2421187, 71983, 5051608, 6868753, 5596095, 5352134, 8279810, \
- 8052729, 5702229, 6431514, 7270114, 4929061, 6790045, 6443634, 1043006, \
- 2041797, 3304993, 1495738, 1776598, 4107819, 2254817, 387908, 2691774, \
- 2940403, 120077, 2435212, 7905634, 6049051, 5870805, 7606632, 5564554, \
- 4842567, 7155005, 6344848, 4544584, 6927791, 7220307, 5431384, 1556916, \
- 3808335, 2020747, 1272244, 2596988, 659347, 972643, 2333356, 2241424, \
- 978811, 3886775, 7833414, 5380712, 6288053, 7974751, 4466338, 4246048, \
- 7164749, 4767379, 4486778, 6415300, 8227461, 5773163, 3268498, 3486236, \
- 1616361, 804225, 2214990, 299510, 669977, 3144909, 198054, 1476698, \
- 3887313, 4193597, 5420138, 7760002, 7061821, 5115125, 4633624, 6517102, \
- 5224679, 4883737, 7818736, 5361846, 6044431, 7911393, 3493436, 34774, \
- 2395075, 2718249, 915396, 15898, 2474675, 1657799, 1619468, 3456736, \
- 3240799, 1935895, 6948576, 6809352, 4422343, 7254907, 6987544, 4670660, \
- 5409071, 8270259, 6028508, 5723452, 7506401, 7030859, 1009078, 2276604, \
- 2502681, 645543, 2901102, 3189776, 1405433, 1669247, 3970434, 1115464, \
- 378933, 6824341, 7125322, 4282022, 6577997, 7111441, 5860018, 7731022, \
- 7345793, 6265577, 5981014, 6712982, 4367977, 1014661, 2806414, 2494066, \
- 239539, 4155981, 3816292, 1546170, 1269343, 3851189, 928552, 255042, \
- 2383295, 4723065, 5081296, 6382894, 7660647, 5257369, 8245532, 7888116, \
- 5514379, 4303171, 7168188, 4758552, 4265411, 2485423, 1599812, 1974736, \
- 3398719, 3560775, 1743240, 4137504, 2355157, 411423, 727650, 3134444, \
- 157189, 5680883, 8070074, 6216196, 5641961, 7552819, 8250070, 4745980, \
- 6653729, 6364879, 5036862, 4727794, 7679705, 1099525, 1858538, 3772442, \
- 3505429, 1107453, 2951170, 2982350, 54397, 2505745, 2859466, 1992742, \
- 5423245, 7806425, 6009908, 6224078, 7545155, 6786209, 4869628, 7262482, \
- 6502571, 4711781, 8048004, 8061690, 1416055, 1079181, 3980896, 1647410, \
- 836319, 2150002, 2439080, 637509, 2908695, 3248058, 1377872, 3734157, \
- 8188907, 5324370, 5558172, 7095157, 4954763, 4667278, 6487926, 7307417, \
- 5966145, 7783790, 7503018, 6274385, 3813565, 3590182, 230730, 998573, \
- 2814069, 489882, 492578, 3689573, 3981705, 1159280, 3423742, 3724679, \
- 6096993, 4293048, 6585622, 4847323, 5086113, 6292292, 5557982, 5844787, \
- 8172125, 7371396, 5494562, 8359643, 2777623, 457592, 210632, 3055111, \
- 672767, 1557040, 3387148, 1996783, 1825315, 3609560, 3312052, 5137451, \
- 7060939, 6598694, 4479228, 4836817, 8201259, 5826798, 5599488, 7445561, \
- 6034679, 5794054, 6676680, 2112885, 840991, 2707666, 2459936, 1058189, \
- 2059473, 4165946, 1186774, 1496645, 3895209, 3056342, 162334, 6774769, \
- 7050849, 5122702, 7594994, 7827001, 5936781, 6183782, 7557674, 5550035, \
- 4728701, 6935208, 6626114, 37679, 2977461, 3762008, 1345966, 3166439, \
- 4054345, 1582224, 1353854, 2189707, 873601, 564348, 2388372, 6547539, \
- 6169711, 8293764, 7557208, 5708211, 8039767, 8348748, 4442528, 4591999, \
- 6986903, 5207344, 4336488, 3580549, 3886971, 2086642, 3158660, 3533677, \
- 1926819, 527902, 2921468, 96929, 308811, 2633702, 6145592, 5327705, \
- 7609223, 7976494, 6123458, 7373597, 6556285, 4970370, 5143818, 6435061, \
- 4450589, 6243418, 3835110, 1521933, 1306833, 4074674, 3835198, 510145, \
- 2248745, 3063284, 734422, 510267, 3148261, 1934348, 5897522, 7369203, \
- 5539869, 5850592, 7196522, 6304279, 4570101, 6944296, 7079620, 5278671, \
- 5595707, 7928528, 1849100, 1281703, 3654347, 2755356, 1029876, 2588491, \
- 2284419, 918252, 3919640, 3598227, 1194607, 2077478, 8080856, 5670013, \
- 4401591, 7336010, 6878240, 4464053, 6389851, 7628978, 5813740, 7945285, \
- 7721139, 5294462, 1901716, 2747881, 293217, 37014, 2956638, 2672033, \
- 1370253, 3223878, 4193970, 1726041, 3641157, 7545514, 4907594, 5160853, \
- 6493757, 4643394, 4866958, 8367727, 7567345, 5692312, 8032871, 8325035, \
- 5435160, 2384628, 2726847, 874307, 57004, 2466620, 1910867, 1635515, \
- 3415398, 3250372, 1859641, 3730807, 2466974, 4282368, 5034465, 6888479, \
- 4695378, 5401064, 8310789, 5969351, 5660090, 7528468, 8071629, 5218593, \
- 6446274, 2594782, 735793, 942825, 3337998, 1515046, 1757945, 3963665, \
- 1156846, 339498, 2114321, 3005181, 595766, 6356938, 6578799, 5866293, \
- 6037464, 7362066, 5618607, 5841865, 7138832, 4277758, 4692055, 6959233, \
- 7237100, 240662, 3604635, 3856739, 2061316, 1555656, 3301747, 936095, \
- 755012, 2497824, 2290923, 991575, 2853304, 7619808, 5332231, 8237487, \
- 7878768, 5564316, 4263661, 7111267, 4750234, 4292212, 6661817, 6835083, \
- 1950278, 3219132, 3454801, 1604191, 3998638, 2264896, 411289, 783159, \
- 3095386, 165514, 479077, 3867613, 8043154, 5666146, 7601293, 8257601, \
- 4899322, 6778038, 6501445, 5159337, 4800550, 6654174, 5244337, 5569633, \
- 3764684, 3938594, 1084539, 2442645, 2992420, 536810, 326935, 2180445, \
- 821496, 1630978, 3505871, 1291953, 6165272, 8112860, 6759975, 4370379, \
- 7271056, 7035452, 4622299, 4591107, 8119148, 6241236, 5414427, 7854063, \
- 1788708, 958984, 2125811, 2488127, 531146, 2916704, 2223149, 1402071, \
- 1618226, 4020396, 1167557, 1051947, 7120114, 4847956, 4460937, 6331619, \
- 7161118, 4974996, 7743601, 7591177, 6282694, 5902394, 7776657, 222293, \
- 982062, 2757570, 514653, 517821, 2762706, 4172298, 1266341, 3579769, \
- 3675800, 1960934, 648047, 6561409, 4315004, 5069758, 6859395, 6563689, \
- 5369764, 8180318, 8133499, 5371557, 7695948, 6858114, 5052531, 118879, \
- 2536832, 666728, 1040535, 3295639, 3576952, 1793412, 4190543, 3320051, \
- 460176, 2872668, 2775203, 4632843, 4419028, 7267508, 5900665, 5574855, \
- 7470638, 8140664, 5876369, 6638127, 6346726, 4988424, 6894205, 2419703, \
- 1546, 1937376, 4019117, 1112667, 1390546, 3753774, 3066565, 136073, \
- 2603838, 2782934, 962313, 4391520, 7817430, 5960987, 6175985, 7583756, \
- 5652742, 5147891, 7017503, 6781396, 4386920, 7146787, 2737623, 1853500, \
- 1094064, 3487183, 1600551, 1868272, 2165016, 390311, 556523, 2994184, \
- 2165492, 18301, 8171011, 7944910, 5698348, 5394065, 8357467, 4934438, \
- 4616904, 6537033, 5183415, 4902494, 6685440, 7578541, 1998431, 3831698, \
- 3378170, 1507909, 716677, 2963066, 112822, 283037, 2640993, 2985122, \
- 1073502, 3471409, 7935161, 6131014, 7356582, 6629755, 4830549, 5004460, \
- 6607202, 4260227, 5090461, 8021360, 7813514, 5476431, 4083173, 3859608, \
- 469586, 2290607, 3038729, 761536, 492476, 2255447, 2089675, 1777452, \
- 3331700, 3558299, 5350259, 7122668, 6848264, 4559731, 6363839, 7137044, \
- 4812512, 5612207, 7396183, 6051578, 5876784, 3416517, 2154667, 613426, \
- 2987484, 2283525, 483811, 765386, 4068372, 1235449, 1511683, 3845126, \
- 2026988, 4415761, 6789341, 6968686, 5241858, 6496457, 6727989, 6214906, \
- 5856970, 7640869, 5268221, 6154770, 6883262, 302829, 54017, 2964472, \
- 2664054, 282395, 3265513, 4004388, 1638302, 1435507, 3222065, 689100, \
- 941634, 6551227, 4602709, 4907524, 7326890, 7542087, 5673119, 8091888, \
- 8365312, 5377167, 4637027, 7068056, 5125332, 179559, 2187691, 1411140, \
- 1580348, 4060603, 3274819, 1319340, 3722352, 2966617, 48575, 274534, \
- 2751112, 5048241, 5244543, 7723674, 7959392, 6078189, 7735191, 7588698, \
- 5112508, 6962949, 6813641, 4422322, 953174, 3884953, 1572385, 1192782, \
- 4078230, 3917425, 1511373, 2260998, 3111018, 654769, 2102293, 2361578, \
- 5882274, 6044751, 7386613, 5593392, 5882058, 8129959, 6382889, 4583640, \
- 6830390, 7111151, 4279489, 7644476, 3815678, 1798163, 1563977, 3278564, \
- 2066968, 748507, 2537015, 2235916, 1000384, 2804287, 3549151, 1310672, \
- 6255144, 8035271, 5703447, 5334712, 6613988, 4993807, 4841187, 6571890, \
- 6335004, 6103777, 7962411, 7640198, 1120372, 1952057, 3695815, 306286, \
- 86433, 2906193, 689470, 470498, 3662923, 3832221, 2068980, 3363866, \
- 7761287, 5939565, 5187736, 6542802, 4594815, 4948101, 7301448, 5400126, \
- 5676695, 8084313, 8180384, 1060716, 3254107, 2968243, 578412, 368516
+ 4377671, 1693438, 3163945, 7023824, 6340423, 3761422, 7558385, 15388512, \
+ 8494239, 14558670, 14137157, 9226424, 9263403, 16192087, 12361860, 10859305, \
+ 15624954, 16243111, 12370460, 4657881, 5187874, 1374775, 6112236, 5652757, \
+ 2726546, 2140651, 8089725, 3924900, 2152795, 7014490, 5387173, 10069108, \
+ 12643787, 13328146, 9536597, 16291820, 14888507, 11173058, 11659209, 16537117, \
+ 10948070, 9289331, 13956616, 5727629, 941654, 4558251, 8263096, 3630661, \
+ 3014022, 6614075, 4136800, 3441076, 5087247, 424910, 1796273, 13734696, \
+ 13239295, 10688598, 16313217, 16380664, 10641511, 11082678, 15833689, 10117448, \
+ 8614582, 13166703, 9673180, 1704593, 6394178, 7203327, 3570220, 8201489, \
+ 6587610, 3088143, 1994164, 5633761, 960266, 400534, 14487109, 11851576, \
+ 11494571, 14974786, 16629405, 11961516, 16668531, 12706978, 9108749, 9645780, \
+ 14161123, 8488250, 2252524, 8022341, 3252498, 2798315, 6490484, 7887541, \
+ 1172430, 4878683, 4205216, 1678205, 1491038, 7295619, 10812176, 12560620, \
+ 16135095, 15482898, 11393225, 14084892, 14495783, 8692218, 13606425, 14044288, \
+ 12338519, 10991150, 7220641, 3219280, 3720846, 6542783, 4746848, 1097697, \
+ 6008094, 4867655, 88048, 8047657, 7585514, 2631127, 10523660, 16502777, \
+ 11557986, 8987686, 13022173, 14628928, 9718195, 13554622, 15171661, 12336016, \
+ 16099851, 15126910, 2966453, 3430916, 6203867, 500226, 815412, 4573693, \
+ 6216202, 3211667, 6828228, 6466109, 3889586, 11550787, 15439708, 8567981, \
+ 9514594, 14219259, 8569993, 9002836, 15732711, 16497706, 10676081, 15292100, \
+ 16174367, 4165610, 341217, 5006652, 1572495, 1854546, 4527521, 3049129, \
+ 4177238, 7695495, 7262744, 2593145, 8129190, 13974295, 9363656, 8778385, \
+ 14240566, 9607407, 11240216, 14709505, 12282079, 11717500, 15274149, 14746066, \
+ 9616203, 5892276, 4223349, 721514, 1218715, 7940420, 2324205, 3077562, \
+ 7702115, 8134357, 494860, 5174955, 5597170, 10452009, 13012636, 12916551, \
+ 12346402, 12054457, 15531332, 10814615, 11474826, 14060649, 14253493, 8546062, \
+ 13349979, 5279120, 1640997, 6549758, 6874055, 3242512, 3803609, 7049838, \
+ 16951, 1800648, 5499481, 4764599, 8458598, 14568057, 16120200, 11296855, \
+ 15152126, 16746925, 11835440, 9391043, 13037582, 10330421, 9711584, 13048891, \
+ 5097359, 3438276, 8350777, 6733738, 2721367, 7492868, 5983881, 130674, \
+ 538019, 5449372, 1613133, 118210, 15365691, 15967597, 11582676, 15208211, \
+ 14898634, 10011773, 9546532, 13514971, 8889178, 10277797, 14043380, 11500399, \
+ 2400914, 8204305, 7752557, 3005118, 4509987, 6169304, 2076829, 305446, \
+ 5200627, 409896, 4043013, 7383766, 11155759, 10601656, 16304064, 13851919, \
+ 9055902, 12695393, 14304496, 9592463, 9031502, 15250641, 11740968, 12123775, \
+ 6413510, 2770689, 1447128, 6139362, 4636215, 1000668, 5559625, 6131250, \
+ 2506159, 2892668, 7725713, 12474754, 10963583, 12882852, 14655793, 9861722, \
+ 13421454, 12703797, 10093292, 15937979, 15251474, 10742725, 12210300, 7372971, \
+ 629698, 141405, 5861772, 5292659, 727138, 4857740, 7382613, 3929538, \
+ 6713275, 7200360, 3442117, 10425886, 12873547, 9240048, 9946661, 14550414, \
+ 12950739, 11447840, 16217532, 16540799, 12427010, 15142033, 13374568, 1173431, \
+ 1768502, 4414281, 525208, 1282087, 8086526, 6322937, 2746624, 7508950, \
+ 7930479, 55600, 781041, 13853006, 9441695, 9145060, 12982633, 12411034, \
+ 11858503, 15706452, 15014057, 12321634, 14143702, 13532813, 8744728, 1873123, \
+ 5736230, 876317, 2419904, 8386323, 4073130, 2432365, 6983444, 5465227, \
+ 1668474, 4239028, 13343909, 9438554, 10049219, 14871860, 11222141, 11609834, \
+ 16422163, 10736328, 8940541, 14284854, 13804259, 9245529, 4540420, 6216695, \
+ 3629946, 2896009, 6794196, 4098119, 3494330, 5071665, 4634820, 1911199, \
+ 5509646, 6275297, 8837435, 15034894, 16495061, 11712000, 11095723, 14704118, \
+ 10216965, 9484184, 13184107, 12836454, 10143677, 13718600, 6963155, 2338211, \
+ 7877740, 7423989, 2874370, 961883, 5586940, 2008101, 513522, 5000907, \
+ 5590036, 4109301, 14983786, 15563163, 11979397, 16765532, 12853695, 9386530, \
+ 9874257, 14438796, 8999447, 8554994, 16365737, 15737628, 2879943, 6473738, \
+ 7871289, 1253605, 4895062, 4320143, 1591520, 1300337, 4753070, 2112607, \
+ 3895104, 7796385, 15025534, 11411175, 14134288, 14464329, 8681199, 9422134, \
+ 13934057, 10292952, 10892563, 15721638, 11853693, 4066560, 7837331, 5023582, \
+ 354477, 5405616, 5882699, 4255, 658196, 7600737, 3727546, 2315023, \
+ 6981844, 11639261, 9974314, 12738803, 13367620, 9472525, 14356978, 12747107, \
+ 11401917, 12347724, 16142915, 11371450, 10751341, 6258420, 1501063, 914506, \
+ 4591345, 6168356, 1428543, 7108554, 6775809, 3972285, 3514350, 6947859, \
+ 193936, 9563725, 14302270, 12780963, 8951384, 15814041, 16416646, 10610295, \
+ 15303144, 15866384, 12274647, 8450510, 13328953, 1194976, 1935455, 4559390, \
+ 6701537, 4057200, 7650223, 7274694, 2494549, 8244136, 5732474, 926055, \
+ 373388, 13404185, 9919458, 12341943, 15066412, 15415241, 11669010, 16375087, \
+ 15255292, 8615681, 14200194, 13745754, 722213, 148660, 7994971, 3288522, \
+ 2831509, 6326124, 7986427, 3361810, 5011269, 4564188, 1982243, 1531890, \
+ 12894424, 11531021, 12004086, 16562539, 10863416, 11424405, 16075078, 14465723, \
+ 8888744, 13574501, 13949598, 10471691, 2240624, 6890148, 3193135, 3360982, \
+ 6904577, 2146360, 1815279, 5389062, 4844697, 186312, 5982071, 7421094, \
+ 11054921, 10729040, 16270726, 11919231, 11439352, 13051265, 10303058, 10415567, \
+ 13065524, 13370993, 11908554, 16690207, 6782628, 2999801, 2545210, 8331142, \
+ 1321045, 914088, 4383667, 1661042, 1084301, 6992668, 6496355, 3177386, \
+ 16500797, 14811588, 11080595, 9480234, 14350820, 8481365, 8966154, 13861851, \
+ 16398948, 10840485, 15655646, 7787075, 4001168, 6594157, 4712302, 1864849, \
+ 1404489, 5152222, 394423, 4011808, 7798233, 7334918, 2365367, 16581880, \
+ 15899945, 8941458, 12678223, 14337852, 9674417, 8916067, 15460254, 11727493, \
+ 12085616, 14752443, 15368750, 3215701, 5794496, 4454699, 688630, 5509829, \
+ 6099228, 2549963, 2980707, 7610684, 4165837, 3050322, 6576259, 14672748, \
+ 9892725, 14485634, 12847899, 9426636, 11822245, 16547646, 10989259, 11179281, \
+ 15795764, 12213487, 8645938, 4732545, 5248476, 1281343, 4775586, 6382961, \
+ 3863564, 3387287, 6823282, 2246377, 3921849, 5270598, 864223, 8819512, \
+ 14532705, 13917142, 11495951, 15186112, 16524145, 12521518, 10930655, 15587904, \
+ 9711753, 10461631, 4561510, 805269, 1528072, 8053315, 6371766, 2763309, \
+ 7590872, 7979395, 2116134, 737277, 5940256, 1119763, 9064415, 12835884, \
+ 16361397, 11547882, 15445083, 14733204, 12407909, 16123386, 13614755, 8760404, \
+ 10376669, 14140970, 843123, 2437069, 7747100, 8254931, 3491554, 7232313, \
+ 6793612, 1880647, 5710618, 4905129, 117364, 1642887, 15868042, 11119440, \
+ 10549413, 16465982, 15913803, 11118720, 13318461, 13787886, 10080439, 12602112, \
+ 13310665, 11579766, 3793831, 6782712, 3067224, 3511943, 8267646, 4668777, \
+ 847536, 5625175, 6227150, 822973, 2473312, 8283355, 12023582, 11324421, \
+ 15015152, 12529450, 9499799, 13232084, 12738313, 10198202, 13666151, 15413772, \
+ 10709401, 3734338, 7438515, 2232620, 2730565, 5306834, 1794314, 131837, \
+ 4757988, 5703691, 4092634, 6676837, 7141940, 11996139, 12324938, 15000213, \
+ 9403372, 9861247, 13992882, 10393408, 8850525, 15531942, 16049203, 12531192, \
+ 14684045, 6921238, 3302891, 1795640, 4257045, 691654, 1252891, 5784992, \
+ 2225776, 2780703, 7937422, 7374417, 2807784, 14908591, 14216790, 9941953, \
+ 9306136, 12917615, 10275302, 11956249, 15672264, 14981362, 12556583, 16139244, \
+ 13463633, 321794, 5651199, 6094956, 316321, 1034906, 7502159, 3777204, \
+ 2261553, 6953450, 7425686, 1636101, 4400380, 13123131, 9538818, 14343381, \
+ 12732172, 10565043, 12238066, 15929165, 11031710, 10601795, 14614392, 13905084, \
+ 898887, 4638418, 6249609, 1331040, 7317239, 6698254, 2886233, 3529440, \
+ 8306991, 865022, 272833, 6273297, 14041774, 8999271, 12834992, 16427913, \
+ 11612506, 11059367, 14932772, 12077177, 9515906, 13345559, 8583420, 10046377, \
+ 5292563, 4427982, 2633565, 7421488, 8375779, 2512478, 2950277, 5684692, \
+ 2076283, 292266, 5100885, 1560140, 10231195, 15017075, 15661028, 12045597, \
+ 16014914, 15697891, 8893500, 9990061, 13725650, 9098243, 8455080, 14170741, \
+ 3385382, 2880411, 6307913, 8100260, 3312319, 4796522, 4223377, 1829380, \
+ 1694063, 4194802, 1028609, 3598812, 16612063, 15090470, 11506169, 16061001, \
+ 14428950, 8911063, 13428328, 12916657, 10390598, 9944927, 15557784, 10908769, \
+ 3641334, 7900303, 6362388, 714481, 5504043, 5861182, 136901, 4949256, \
+ 5275579, 3763942, 2290997, 15308424, 11603779, 12197174, 12837549, 12611960, \
+ 10168515, 14064267, 13468028, 8745189, 16706322, 16115915, 11276484, 2556725, \
+ 8313066, 1403739, 948756, 4628677, 6132602, 1329827, 5208533, 7140188, \
+ 3220111, 8001842, 6458985, 11130268, 9594135, 14401250, 8433081, 8983588, \
+ 13780695, 14216474, 10583080, 15345653, 15963182, 12111503, 11231184, 4613217, \
+ 1882046, 1388399, 5119168, 382873, 1893998, 7814647, 8301312, 2396232, \
+ 7160279, 7756326, 1944057, 8663496, 13566467, 9880030, 9492589, 13330992, \
+ 10629523, 12165710, 15752085, 15419552, 10539642, 14197663, 13842436, 695161, \
+ 115626, 5919799, 1257428, 2669581, 6300986, 4151267, 3984508, 6675869, \
+ 5121730, 1516914, 14474669, 12996196, 9393491, 9741962, 16629373, 10907108, \
+ 11392651, 16041818, 16649409, 8863284, 13149999, 14405826, 1198864, 4823437, \
+ 4237566, 3814179, 3235976, 6871389, 2317062, 3801267, 5353848, 4909705, \
+ 153622, 5882735, 13669048, 9120048, 14957255, 16114398, 12501281, 10951408, \
+ 15567743, 9745422, 10446545, 13917544, 13470911, 8787958, 6235461, 7732376, \
+ 3080034, 6767719, 8164764, 3247881, 687314, 4810671, 1168940, 1739985, \
+ 4398850, 4761245, 11789804, 16414243, 14749338, 11114824, 11665941, 14250406, \
+ 8448107, 9165456, 14025093, 10326142, 9436155, 15100192, 8220765, 3441614, \
+ 7313459, 6581233, 1962984, 1564695, 5118918, 330361, 1998904, 5731303, \
+ 2910302, 10599817, 16484016, 15733879, 10579342, 13303321, 13854145, 9967022, \
+ 8625727, 13356484, 9467409, 12183306, 14859751, 2821684, 3151753, 8119514, \
+ 4683527, 798636, 5606521, 6199107, 869526, 292973, 8367072, 3616947, \
+ 3932490, 15194845, 15657012, 9789795, 14463738, 13076741, 9264084, 13648507, \
+ 14414123, 10627764, 11090765, 16417178, 11784883, 2653028, 4204701, 6009350, \
+ 1048915, 4807864, 4378413, 3929302, 7349387, 6995737, 2346228, 3949863, \
+ 7697946, 9350337, 8732484, 13913791, 14603758, 8898385, 15482496, 16199023, \
+ 12498550, 15030177, 15486297, 11976398, 10331431, 4468856, 772841, 1235222, \
+ 5849223, 6304744, 2271281, 7948450, 7361375, 2867228, 6470561, 5843579, \
+ 9580686, 9094037, 12671568, 9963947, 11776822, 15512133, 15026584, 12507675, \
+ 16155110, 15545845, 9317900, 8912339, 6079571, 1398444, 951805, 6597698, \
+ 4030347, 3556476, 7329381, 6557618, 3882059, 5416900, 4782005, 85038, \
+ 10133499, 13735425, 10495244, 11239423, 15910946, 12112305, 10683084, 15382791, \
+ 13756850, 9990761, 12796188, 13404311, 1317442, 4153784, 6746785, 3001174, \
+ 3545311, 7832072, 2929649, 289006, 6257439, 5673936, 884801, 4594494, \
+ 16772327, 11861328, 11093912, 14881999, 12094838, 11632301, 13268232, 12838227, \
+ 10002086, 14355773, 12818152, 11069059, 7437598, 7999213, 2201392, 2655266, \
+ 7565007, 1834772, 304289, 5183354, 5638443, 1955972, 6579037, 15692010, \
+ 10848691, 16030548, 16732365, 10904338, 9304674, 14035197, 10425116, 8749763, \
+ 13433306, 15952425, 12104436, 6390103, 6947338, 3365273, 7989348, 4354751, \
+ 206234, 1612864, 5361589, 685358, 2188387, 7978896, 7478285, 11225086, \
+ 14997287, 16641064, 9846745, 9283142, 12948663, 10375144, 9928288, 15508887, \
+ 11478606, 11934841, 16633248, 6673999, 3039708, 5585025, 6072946, 217595, \
+ 671756, 5372757, 3914186, 2236986, 6919093, 3197124, 3889947, 14691202, \
+ 12693621, 10167228, 13785739, 13224018, 8561577, 12267580, 16001399, 11393666, \
+ 10896408, 16537061, 11906790, 965947, 4679112, 5035605, 1563950, 5648107, \
+ 7092080, 2467205, 4087518, 7688047, 2921633, 2336600, 5914447, 13663382, \
+ 9160545, 12735720, 14232727, 11583238, 15458521, 14831928, 12110503, 12294366, \
+ 14819593, 9003665, 1110386, 6015791, 4201108, 827713, 7844538, 8285119, \
+ 2447716, 7242457, 7803658, 3946615, 322292, 5230889, 10240219, 9804742, \
+ 13544493, 15168764, 12347235, 16178194, 15437261, 10487396, 16381107, 13823818, \
+ 9002589, 8390020, 5936939, 1257211, 2653572, 6546965, 7509966, 3743011, \
+ 6327856, 7009741, 1139742, 6053523, 4688352, 954429, 9790342, 16707667, \
+ 11987065, 11340716, 14946423, 16745418, 11827865, 13461616, 13538279, 9863742, \
+ 10295617, 12905424, 2880063, 3158510, 7932529, 2267401, 2802126, 7435895, \
+ 5959072, 236697, 4720198, 5330311, 1764412, 2715497, 14759058, 12224007, \
+ 11771852, 15486129, 10975011, 10397662, 13966349, 13438720, 8836347, 14546286, \
+ 16019349, 3128532, 2526571, 8213170, 3621221, 2554332, 5057179, 1315171, \
+ 2085628, 4246061, 4815186, 3351251, 8041260, 14747893, 11164386, 11789083, \
+ 16298136, 8465253, 9144630, 13684874, 14238529, 9074836, 14920111, 16267130, \
+ 12010625, 7331084, 6614623, 4011426, 1455921, 6262476, 286151, 1000982, \
+ 5748456, 8170873, 2440838, 7260111, 8246392, 11806369, 13577590, 12827743, \
+ 9979776, 9655665, 13290734, 8502207, 12066900, 15954368, 15321915, 10508326, \
+ 16462837, 5415448, 637067, 4344822, 5493293, 1671576, 277075, 7285254, \
+ 3469757, 4047456, 6703490, 7321627, 1417804, 14578165, 13060138, 9232331, \
+ 9766356, 14562309, 10874874, 10812515, 16668420, 11765725, 11058282, 12791730, \
+ 5930725, 1164364, 4757399, 4329058, 1686905, 3204796, 7037959, 2252250, \
+ 3772073, 7353652, 681207, 653834, 13945104, 14618853, 8815422, 13482395, \
+ 15104576, 12477211, 11899054, 15502197, 10959824, 10281099, 14021470, 9308901, \
+ 399400, 6128474, 5660871, 2586900, 6867689, 7442658, 3801363, 2162380, \
+ 4844925, 1209634, 1771179, 4228444, 9150085, 9596850, 16315754, 14780069, \
+ 11149076, 15797451, 15792058, 9398069, 8813804, 14458655, 9929730, 9327857, \
+ 4583228, 8191119, 3605970, 7082568, 6604989, 4192630, 5661251, 5087640, \
+ 432965, 2034422, 5788091, 57928, 11221969, 15862030, 16355951, 10666993, \
+ 15431680, 13663135, 10002918, 12783649, 13126584, 9558095, 10153110, 6502313, \
+ 2655336, 3579827, 7818758, 7103581, 374697, 5123618, 5578239, 1886092, \
+ 4707857, 5189106, 3423855, 12551444, 15095233, 11361882, 11857343, 14660836, \
+ 12658269, 8445323, 14403666, 13783925, 8986796, 10664531, 16452546, 3227677, \
+ 2675516, 6531811, 1587226, 1123213, 4903652, 4409651, 1661867, 5677144, \
+ 7319813, 2906798, 3524987, 16701856, 10822293, 9253198, 14085283, 10444336, \
+ 8668525, 13612766, 14069507, 12397801, 15030012, 15648519, 12000470, 3682137, \
+ 4437792, 189687, 1662798, 5360793, 697680, 79719, 7892158, 7593217, \
+ 2803409, 6362526, 8104239, 9616116, 9003273, 12603930, 10459895, 9709860, \
+ 12923577, 15721410, 10934279, 16583356, 16159593, 11509811, 4486030, 6121805, \
+ 1558768, 824227, 4530298, 2030021, 3664644, 6836475, 6489578, 3907093, \
+ 7876036, 4290379, 9106995, 13733348, 14163549, 8627866, 9106819, 15756924, \
+ 12279725, 10650646, 15308371, 15756680, 10480693, 12908518, 4982170, 2038809, \
+ 5697476, 5076031, 2384170, 4168657, 7637012, 2888623, 2617974, 6219873, \
+ 5585800, 920159, 13079014, 14213808, 9468521, 11266502, 14717463, 11600232, \
+ 12208377, 14940710, 8937935, 9580760, 14388001, 12622258, 615503, 5437188, \
+ 7974032, 2105195, 3020734, 7849109, 3997512, 1519259, 5149734, 886645, \
+ 1334936, 6188291, 12973782, 11281453, 16190780, 16703186, 10863939, 11433148, \
+ 14036709, 10329458, 8389275, 13325132, 9494901, 1686186, 6962027, 6455508, \
+ 3789701, 7490426, 7043298, 41761, 1642524, 5392591, 711472, 127145, \
+ 5906894, 12007959, 11323520, 15028601, 16663206, 11843975, 12955480, 13506184, \
+ 9946419, 10276470, 13057933, 9315600, 11843267, 8212478, 6708285, 3000256, \
+ 7386459, 5975086, 155637, 4838512, 5457034, 1720279, 633956, 6340029, \
+ 3884666, 11587651, 15305628, 14891565, 10101218, 13747123, 13261324, 8849885, \
+ 14463522, 16098218, 12548573, 10766852, 15585683, 4063338, 3619617, 5044628, \
+ 4702287, 2053082, 5540001, 5093484, 2499551, 8221698, 7393104, 2858749, \
+ 2303014, 16295891, 9567944, 9063737, 12654582, 13665903, 10173720, 14905025, \
+ 15267190, 11781567, 12195369, 14794064, 11070607, 1537598, 6112753, 302240, \
+ 1019679, 5648582, 8249893, 2554680, 7276747, 8192790, 3453581, 3107049, \
+ 12876658, 10338951, 9867612, 13568833, 8779938, 12247423, 15954636, 15210897, \
+ 10586442, 16446187, 15819060, 9041989, 690907, 5444922, 1574629, 262012, \
+ 6978571, 3221138, 3774325, 6458540, 7176115, 3468866, 6288541, 5637948, \
+ 9247847, 8900027, 14608136, 11891925, 10792374, 15703595, 16123344, 12416325, \
+ 15134222, 13515259, 9765472, 14193309, 4446670, 551495, 3257265, 8036456, \
+ 2235103, 2706310, 7532617, 7595000, 538919, 4294742, 5948361, 1069088, \
+ 13199799, 14859246, 12525593, 11800961, 15714922, 10943807, 12330916, 13973073, \
+ 13540762, 8736423, 14442100, 14673321, 2536986, 7081303, 7855340, 4113977, \
+ 2454979, 6827222, 1290013, 1594860, 4211827, 4972426, 1223901, 16332628, \
+ 14813091, 11262074, 15747909, 15741572, 11251803, 8432619, 14244532, 9617677, \
+ 9425614, 12855347, 15481120, 3654397, 8147206, 6637699, 3058424, 3649837, \
+ 6037686, 416578, 510217, 6034100, 1385319, 3060986, 6672153, 16539456, \
+ 11703551, 15443758, 14696145, 10185936, 9623311, 13190390, 8396128, 10137113, \
+ 15856862, 11031879, 11226808, 7511529, 7939158, 2242199, 4975884, 5627505, \
+ 1835938, 495887, 5024476, 3500960, 4083763, 6800366, 2988805, 11937808, \
+ 16774123, 12902462, 8738981, 14551880, 13996123, 9269666, 10644085, 16505068, \
+ 11569538, 11211347, 14852588, 7994175, 1142354, 4855241, 4425244, 1609703, \
+ 5471730, 6481433, 2742208, 3214423, 8003374, 2483640, 11301969, 13070214, \
+ 14589087, 9802848, 13576113, 13040670, 12447183, 15996592, 15664169, 10788846, \
+ 12446231, 16740612, 435192, 887395, 5380518, 5989085, 62280, 6908339, \
+ 7543406, 3703149, 6410384, 6972227, 3406334, 1620133, 12780352, 9113818, \
+ 10020875, 13761396, 15343861, 10851082, 16551571, 16211140, 11495229, 10806970, \
+ 14630211, 9834396, 906893, 4515186, 2064050, 3517705, 7116116, 6768295, \
+ 3562810, 8256761, 6596292, 734495, 1150186, 5824353, 8610868, 9057999, \
+ 15838043, 12196000, 10699757, 15254142, 15792263, 12266320, 12597865, 13222310, \
+ 10113815, 9660616, 6076697, 2531878, 3080687, 7657753, 4049536, 2503127, \
+ 7152190, 5552801, 1984848, 4674059, 5023646, 9944181, 12467880, 15550363, \
+ 10802246, 12210165, 15809593, 15246442, 8640471, 14306316, 13753849, 9086962, \
+ 12723239, 7945692, 3198533, 2839842, 6293499, 3784300, 3321237, 4347403, \
+ 5063274, 1495477, 6240772, 4467675, 3010690, 16171557, 16669180, 10848271, \
+ 11449106, 16212425, 10246188, 8768439, 13500611, 13906200, 10333085, 15399014, \
+ 14893947, 3674760, 7571797, 6962166, 2123435, 1693040, 5430977, 593438, \
+ 46591, 6022881, 7503160, 2641103, 6526550, 16418097, 12401832, 13954935, \
+ 13616518, 8656009, 10227576, 14138535, 9332510, 10843981, 16680065, 16228146, \
+ 11274991, 6680732, 6288129, 1329866, 858431, 4620836, 1306833, 1599818, \
+ 6552199, 2851316, 3149933, 7932571, 14870866, 9007309, 13632444, 14391651, \
+ 8620754, 8942365, 13754468, 12255219, 10555178, 15467677, 12572628, 12054059, \
+ 5012667, 4687712, 2003989, 5590430, 5013099, 517296, 4011437, 7609934, \
+ 3116435, 2554912, 8218237, 1488262, 9145858, 13180889, 13649260, 10220087, \
+ 12643278, 15280201, 11703184, 12305383, 14776446, 11168641, 9678912, 14155871, \
+ 4266926, 706672, 5370321, 6107790, 3549239, 6789600, 7094841, 3633434, \
+ 4107207, 4569660, 852393, 1496818, 14536471, 12873100, 9385584, 16164643, \
+ 16604348, 10964829, 15398274, 15836219, 9451368, 9112773, 12639254, 10049483, \
+ 1254640, 4898085, 6401742, 3691610, 7587585, 6881012, 2174319, 5976962, \
+ 5423825, 608588, 416447, 14655782, 10269001, 10840728, 15620391, 16040182, \
+ 12399544, 15083777, 13613270, 9753391, 10436792, 13015793, 9218830, 1388703, \
+ 8282976, 2218545, 2640058, 7550791, 7513812, 585128, 4415355, 5917910, \
+ 1152261, 534104, 4406755, 12119334, 11589341, 15402440, 10664979, 11124458, \
+ 14050669, 14636564, 8687490, 12852315, 14624420, 9762725, 11390042, 6708107, \
+ 4133428, 3449069, 7240618, 485395, 1888708, 5604157, 5118006, 240098, \
+ 5829145, 7487884, 2820599, 11049586, 15835561, 12218964, 8514119, 13146554, \
+ 13763193, 10163140, 12640415, 13336139, 11689968, 16352305, 14980942, 3042519, \
+ 3537920, 6088617, 463998, 396551, 6135704, 5694537, 943526, 6659767, \
+ 8162633, 3610512, 7104035, 15072622, 10383037, 9573888, 13206995, 8575726, \
+ 10189605, 13689072, 14783051, 11143454, 15816949, 16376681, 2290106, 4925639, \
+ 5282644, 1802429, 147810, 4815699, 108684, 4070237, 7668466, 7131435, \
+ 2616092, 8288965, 14524691, 8754874, 13524717, 13978900, 10286731, 8889674, \
+ 15604785, 11898532, 12571999, 15099010, 15286177, 9481596, 5965039, 4216595, \
+ 642120, 1294317, 5383990, 2692323, 2281432, 8084997, 3170790, 2732927, \
+ 4438696, 5786065, 9556574, 13557935, 13056369, 10234432, 12030367, 15679518, \
+ 10769121, 11909560, 16689167, 8729558, 9191701, 14146088, 6253555, 274438, \
+ 5219229, 7789529, 3755042, 2148287, 7059020, 3222593, 1605554, 4441199, \
+ 677364, 1650305, 13810762, 13346299, 10573348, 16276989, 15961803, 12203522, \
+ 10561013, 13565548, 9948987, 10311106, 12887629, 5226428, 1337507, 8209234, \
+ 7262621, 2557956, 8207222, 7774379, 1044504, 279509, 6101134, 1485115, \
+ 602848, 12611605, 16435998, 11770563, 15204720, 14922669, 12249694, 13728086, \
+ 12599977, 9081720, 9514471, 14184070, 8648025, 2802920, 7413559, 7998830, \
+ 2536649, 7169808, 5536999, 2067710, 4495136, 5059715, 1503066, 2031149, \
+ 7161012, 10884939, 12553866, 16055701, 15558500, 8836795, 14453010, 13699653, \
+ 9075100, 8642858, 16282355, 11602260, 11180045, 6325206, 3764579, 3860664, \
+ 4430813, 4722758, 1245883, 5962600, 5302389, 2716566, 2523722, 8231153, \
+ 3427236, 11498095, 15136218, 10227457, 9903160, 13534703, 12973606, 9727377, \
+ 16760264, 14976567, 11277734, 12012616, 8318617, 2209158, 657015, 5480360, \
+ 1625089, 30290, 4941775, 7386172, 3739633, 6446794, 7065631, 3728324, \
+ 11679856, 13338939, 8426438, 10043477, 14055848, 9284347, 10793334, 16646541, \
+ 16239196, 11327843, 15164082, 16659005, 1411524, 809618, 5194539, 1569004, \
+ 1878581, 6765442, 7230683, 3262244, 7888037, 6499418, 2733835, 5276816, \
+ 14376301, 8572910, 9024658, 13772097, 12267228, 10607911, 14700386, 16471769, \
+ 11576588, 16367319, 12734202, 9393449, 5621456, 6175559, 473151, 2925296, \
+ 7721313, 4081822, 2472719, 7184752, 7745713, 1526574, 5036247, 4653440, \
+ 10363705, 14006526, 15330087, 10637853, 12141000, 15776547, 11217590, 10645965, \
+ 14271056, 13884547, 9051502, 4302461, 5813632, 3894363, 2121422, 6915493, \
+ 3355761, 4073418, 6683923, 839236, 1525741, 6034490, 4566915, 9404244, \
+ 16147517, 16635810, 10915443, 11484556, 16050077, 11919475, 9394602, 12847677, \
+ 10063940, 9576855, 13335098, 6351329, 3903668, 7537167, 6830554, 2226801, \
+ 3826476, 5329375, 559683, 236416, 4350205, 1635182, 3402647, 15603784, \
+ 15008713, 12362934, 16252007, 15495128, 8690689, 10454278, 14030591, 9268265, \
+ 8846736, 16721615, 15996174, 2924209, 7335520, 7632155, 3794582, 4366181, \
+ 4918712, 1070763, 1763158, 4455581, 2633513, 3244402, 8032487, 14904092, \
+ 11040985, 15900898, 14357311, 8390892, 12704085, 14344850, 9793771, 11311988, \
+ 15108741, 12538187, 3433306, 7338661, 6727996, 1905355, 5555074, 5167381, \
+ 355052, 6040887, 7836674, 2492361, 2972956, 7531686, 12236795, 10560520, \
+ 13147269, 13881206, 9983019, 12679096, 13282885, 11705550, 12142395, 14866016, \
+ 11267569, 10501918, 7939780, 1742321, 282154, 5065215, 5681492, 2073097, \
+ 6560250, 7293031, 3593108, 3940761, 6633538, 3058615, 9814060, 14439004, \
+ 8899475, 9353226, 13902845, 15815332, 11190275, 14769114, 16263693, 11776308, \
+ 11187179, 12667914, 1793429, 1214052, 4797818, 11683, 3923520, 7390685, \
+ 6902958, 2338419, 7777768, 8222221, 411478, 1039587, 13897272, 10303477, \
+ 8905926, 15523610, 11882153, 12457072, 15185695, 15476878, 12024145, 14664608, \
+ 12882111, 8980830, 1751681, 5366040, 2642927, 2312886, 8096016, 7355081, \
+ 2843158, 6484263, 5884652, 1055577, 4923522, 12710655, 8939884, 11753633, \
+ 16422738, 11371599, 10894516, 16772960, 16119019, 9176478, 13049669, 14462192, \
+ 9795371, 5137954, 6802901, 4038412, 3409595, 7304690, 2420237, 4030108, \
+ 5375298, 4429491, 634300, 5405765, 6025874, 10518795, 15276152, 15862709, \
+ 12185870, 10608859, 15348672, 9668661, 10001406, 12804930, 13262865, 9829356, \
+ 16583279, 7213490, 2474945, 3996252, 7825831, 963174, 360569, 6166920, \
+ 1474071, 910831, 4502568, 8326705, 3448262, 15582239, 14841760, 12217825, \
+ 10075678, 12720015, 9126992, 9502521, 14282666, 8533079, 11044741, 15851160, \
+ 16403827, 3373030, 6857757, 4435272, 1710803, 1361974, 5108205, 402128, \
+ 1521923, 8161534, 2577021, 3031461, 16055002, 16628555, 8782244, 13488693, \
+ 13945706, 10451091, 8790788, 13415405, 11765946, 12213027, 14794972, 15245325, \
+ 3882791, 5246194, 4773129, 214676, 5913799, 5352810, 702137, 2311492, \
+ 7888471, 3202714, 2827617, 6305524, 14536591, 9887067, 13584080, 13416233, \
+ 9872638, 14630855, 14961936, 11388153, 11932518, 16590903, 10795144, 9356121, \
+ 5722294, 6048175, 506489, 4857984, 5337863, 3725950, 6474157, 6361648, \
+ 3711691, 3406222, 4868661, 87008, 9994587, 13777414, 14232005, 8446073, \
+ 15456170, 15863127, 12393548, 15116173, 15692914, 9784547, 10280860, 13599829, \
+ 276418, 1965627, 5696620, 7296981, 2426395, 8295850, 7811061, 2915364, \
+ 378267, 5936730, 1121569, 8990140, 12776047, 10183058, 12064913, 14912366, \
+ 15372726, 11624993, 16382792, 12765407, 8978982, 9442297, 14411848, 195335, \
+ 877270, 7835757, 4098992, 2439363, 7102798, 7861148, 1316961, 5049722, \
+ 4691599, 2024772, 1408465, 13561514, 10982719, 12322516, 16088585, 11267386, \
+ 10677987, 14227252, 13796508, 9166531, 12611378, 13726893, 10200956, 2104467, \
+ 6884490, 2291581, 3929316, 7350579, 4954970, 229569, 5787956, 5597934, \
+ 981451, 4563728, 8131277, 12044670, 11528739, 15495872, 12001629, 10394254, \
+ 12913651, 13389928, 9953933, 14530838, 12855366, 11506617, 15912992, 7957703, \
+ 2244510, 2860073, 5281264, 1591103, 253070, 4255697, 5846560, 1189311, \
+ 7065462, 6315584, 12215705, 15971946, 15249143, 8723900, 10405449, 14013906, \
+ 9186343, 8797820, 14661081, 16039938, 10836959, 15657452, 7712800, 3941331, \
+ 415818, 5229333, 1332132, 2044011, 4369306, 653829, 3162460, 8016811, \
+ 6400546, 2636245, 15934092, 14340146, 9030115, 8522284, 13285661, 9544902, \
+ 9983603, 14896568, 11066597, 11872086, 16659851, 15134328, 909173, 5657775, \
+ 6227802, 311233, 863412, 5658495, 3458754, 2989329, 6696776, 4175103, \
+ 3466550, 5197449, 12983384, 9994503, 13709991, 13265272, 8509569, 12108438, \
+ 15929679, 11152040, 10550065, 15954242, 14303903, 8493860, 4753633, 5452794, \
+ 1762063, 4247765, 7277416, 3545131, 4038902, 6579013, 3111064, 1363443, \
+ 6067814, 13042877, 9338700, 14544595, 14046650, 11470381, 14982901, 16645378, \
+ 12019227, 11073524, 12684581, 10100378, 9635275, 4781076, 4452277, 1777002, \
+ 7373843, 6915968, 2784333, 6383807, 7926690, 1245273, 728012, 4246023, \
+ 2093170, 9855977, 13474324, 14981575, 12520170, 16085561, 15524324, 10992223, \
+ 14551439, 13996512, 8839793, 9402798, 13969431, 1868624, 2560425, 6835262, \
+ 7471079, 3859600, 6501913, 4820966, 1104951, 1795853, 4220632, 637971, \
+ 3313582, 16455421, 11126016, 10682259, 16460894, 15742309, 9275056, 13000011, \
+ 14515662, 9823765, 9351529, 15141114, 12376835, 3654084, 7238397, 2433834, \
+ 4045043, 6212172, 4539149, 848050, 5745505, 6175420, 2162823, 2872131, \
+ 15878328, 12138797, 10527606, 15446175, 9459976, 10078961, 13890982, 13247775, \
+ 8470224, 15912193, 16504382, 10503918, 2735441, 7777944, 3942223, 349302, \
+ 5164709, 5717848, 1844443, 4700038, 7261309, 3431656, 8193795, 6730838, \
+ 11484652, 12349233, 14143650, 9355727, 8401436, 14264737, 13826938, 11092523, \
+ 14700932, 16484949, 11676330, 15217075, 6546020, 1760140, 1116187, 4731618, \
+ 762301, 1079324, 7883715, 6787154, 3051565, 7678972, 8322135, 2606474, \
+ 13391833, 13896804, 10469302, 8676955, 13464896, 11980693, 12553838, 14947835, \
+ 15083152, 12582413, 15748606, 13178403, 165152, 1686745, 5271046, 716214, \
+ 2348265, 7866152, 3348887, 3860558, 6386617, 6832288, 1219431, 5868446, \
+ 13135881, 8876912, 10414827, 16062734, 11273172, 10916033, 16640314, 11827959, \
+ 11501636, 13013273, 14486218, 1468791, 5173436, 4580041, 3939666, 4165255, \
+ 6608700, 2712948, 3309187, 8032026, 70893, 661300, 5500731, 14220490, \
+ 8464149, 15373476, 15828459, 12148538, 10644613, 15447388, 11568682, 9637027, \
+ 13557104, 8775373, 10318230, 5646947, 7183080, 2375965, 8344134, 7793627, \
+ 2996520, 2560741, 6194135, 1431562, 814033, 4665712, 5546031, 12163998, \
+ 14895169, 15388816, 11658047, 16394342, 14883217, 8962568, 8475903, 14380983, \
+ 9616936, 9020889, 14833158, 8113719, 3210748, 6897185, 7284626, 3446223, \
+ 6147692, 4611505, 1025130, 1357663, 6237573, 2579552, 2934779, 16082054, \
+ 16661589, 10857416, 15519787, 14107634, 10476229, 12625948, 12792707, 10101346, \
+ 11655485, 15260301, 2302546, 3781019, 7383724, 7035253, 147842, 5870107, \
+ 5384564, 735397, 127806, 7913931, 3627216, 2371389, 15578351, 11953778, \
+ 12539649, 12963036, 13541239, 9905826, 14460153, 12975948, 11423367, 11867510, \
+ 16623593, 10894480, 3108167, 7657167, 1819960, 662817, 4275934, 5825807, \
+ 1209472, 7031793, 6330670, 2859671, 3306304, 7989257, 10541754, 9044839, \
+ 13697181, 10009496, 8612451, 13529334, 16089901, 11966544, 15608275, 15037230, \
+ 12378365, 12015970, 4987411, 362972, 2027877, 5662391, 5111274, 2526809, \
+ 8329108, 7611759, 2752122, 6451073, 7341060, 1677023, 8556450, 13335601, \
+ 9463756, 10195982, 14814231, 15212520, 11658297, 16446854, 14778311, 11045912, \
+ 13866913, 6177398, 293199, 1043336, 6197873, 3473894, 2923070, 6810193, \
+ 8151488, 3420731, 7309806, 4593909, 1917464, 13955531, 13625462, 8657701, \
+ 12093688, 15978579, 11170694, 10578108, 15907689, 16484242, 8410143, 13160268, \
+ 12844725, 1582370, 1120203, 6987420, 2313477, 3700474, 7513131, 3128708, \
+ 2363092, 6149451, 5686450, 360037, 4992332, 14124187, 12572514, 10767865, \
+ 15728300, 11969351, 12398802, 12847913, 9427828, 9781478, 14430987, 12827352, \
+ 9079269, 7426878, 8044731, 2863424, 2173457, 7878830, 1294719, 578192, \
+ 4278665, 1747038, 1290918, 4800817, 6445784, 12308359, 16004374, 15541993, \
+ 10927992, 10472471, 14505934, 8828765, 9415840, 13909987, 10306654, 10933636, \
+ 7196529, 7683178, 4105647, 6813268, 5000393, 1265082, 1750631, 4269540, \
+ 622105, 1231370, 7459315, 7864876, 10697644, 15378771, 15825410, 10179517, \
+ 12746868, 13220739, 9447834, 10219597, 12895156, 11360315, 11995210, 16692177, \
+ 6643716, 3041790, 6281971, 5537792, 866269, 4664910, 6094131, 1394424, \
+ 3020365, 6786454, 3981027, 3372904, 15459773, 12623431, 10030430, 13776041, \
+ 13231904, 8945143, 13847566, 16488209, 10519776, 11103279, 15892414, 12182721, \
+ 4888, 4915887, 5683303, 1895216, 4682377, 5144914, 3508983, 3938988, \
+ 6775129, 2421442, 3959063, 5708156, 9339617, 8778002, 14575823, 14121949, \
+ 9212208, 14942443, 16472926, 11593861, 11138772, 14821243, 10198178, 1085205, \
+ 5928524, 746667, 44850, 5872877, 7472541, 2742018, 6352099, 8027452, \
+ 3343909, 824790, 4672779, 10387112, 9829877, 13411942, 8787867, 12422464, \
+ 16570981, 15164351, 11415626, 16091857, 14588828, 8798319, 9298930, 5552129, \
+ 1779928, 136151, 6930470, 7494073, 3828552, 6402071, 6848927, 1268328, \
+ 5298609, 4842374, 143967, 10103216, 13737507, 11192190, 10704269, 16559620, \
+ 16105459, 11404458, 12863029, 14540229, 9858122, 13580091, 12887268, 2086013, \
+ 4083594, 6609987, 2991476, 3553197, 8215638, 4509635, 775816, 5383549, \
+ 5880807, 240154, 4870425, 15811268, 12098103, 11741610, 15213265, 11129108, \
+ 9685135, 14310010, 12689697, 9089168, 13855582, 14440615, 10862768, 3113833, \
+ 7616670, 4041495, 2544488, 5193977, 1318694, 1945287, 4666712, 4482849, \
+ 1957622, 7773550, 15666829, 10761424, 12576107, 15949502, 8932677, 8492096, \
+ 14329499, 9534758, 8973557, 12830600, 16454923, 11546326, 6536996, 6972473, \
+ 3232722, 1608451, 4429980, 599021, 1339954, 6289819, 396108, 2953397, \
+ 7774626, 8387195, 10840276, 15520004, 14123643, 10230250, 9267249, 13034204, \
+ 10449359, 9767474, 15637473, 10723692, 12088863, 15822786, 6986873, 69548, \
+ 4790150, 5436499, 1830792, 31797, 4949350, 3315599, 3238936, 6913473, \
+ 6481598, 3871791, 13897152, 13618705, 8844686, 14509814, 13975089, 9341320, \
+ 10818143, 16540518, 12057017, 11446904, 15012803, 14061718, 2018157, 4553208, \
+ 5005363, 1291086, 5802204, 6379553, 2810866, 3338495, 7940868, 2230929, \
+ 757866, 13648683, 14250644, 8564045, 13155994, 14222883, 11720036, 15462044, \
+ 14691587, 12531154, 11962029, 13425964, 8735955, 2029322, 5612829, 4988132, \
+ 479079, 8311962, 7632585, 3092341, 2538686, 7702379, 1857104, 510085, \
+ 4766590, 9446131, 10162592, 12765789, 15321294, 10514739, 16491064, 15776233, \
+ 11028759, 8606342, 14336377, 9517104, 8530823, 4970846, 3199625, 3949472, \
+ 6797439, 7121550, 3486481, 8275008, 4710315, 822847, 1455300, 6268889, \
+ 314378, 11361767, 16140148, 12432393, 11283922, 15105639, 16500140, 9491961, \
+ 13307458, 12729759, 10073725, 9455588, 15359411, 2199050, 3717077, 7544884, \
+ 7010859, 2214906, 5902341, 5964700, 108795, 5011490, 5718933, 3985485, \
+ 10846490, 15612851, 12019816, 12448157, 15090310, 13572419, 9739256, 14524965, \
+ 13005142, 9423563, 16096008, 16123381, 2832111, 2158362, 7961793, 3294820, \
+ 1672639, 4300004, 4878161, 1275018, 5817391, 6496116, 2755745, 7468314, \
+ 16377815, 10648741, 11116344, 14190315, 9909526, 9334557, 12975852, 14614835, \
+ 11932290, 15567581, 15006036, 12548771, 7627130, 7180365, 461461, 1997146, \
+ 5628139, 979764, 985157, 7379146, 7963411, 2318560, 6847485, 7449358, \
+ 12193987, 8586096, 13171245, 9694647, 10172226, 12584585, 11115964, 11689575, \
+ 16344250, 14742793, 10989124, 16719287, 5555246, 915185, 421264, 6110222, \
+ 1345535, 3114080, 6774297, 3993566, 3650631, 7219120, 6624105, 10274902, \
+ 14121879, 13197388, 8958457, 9673634, 16402518, 11653597, 11198976, 14891123, \
+ 12069358, 11588109, 13353360, 4225771, 1681982, 5415333, 4919872, 2116379, \
+ 4118946, 8331892, 2373549, 2993290, 7790419, 6112684, 324669, 13549538, \
+ 14101699, 10245404, 15189989, 15654002, 11873563, 12367564, 15115348, 11100071, \
+ 9457402, 13870417, 13252228, 75359, 5954922, 7524017, 2691932, 6332879, \
+ 8108690, 3164449, 2707708, 4379414, 1747203, 1128696, 4776745, 13095078, \
+ 12339423, 16587528, 15114417, 11416422, 16079535, 16697496, 8885057, 9183998, \
+ 13973806, 10414689, 8672976, 7161099, 7773942, 4173285, 6317320, 7067355, \
+ 3853638, 1055805, 5842936, 193859, 617622, 5267404, 12291185, 10655410, \
+ 15218447, 15952988, 12246917, 14747194, 13112571, 9940740, 10287637, 12870122, \
+ 8901179, 12486836, 7670220, 3043867, 2613666, 8149349, 7670396, 1020291, \
+ 4497490, 6126569, 1468844, 1020535, 6296522, 3868697, 11795045, 14738406, \
+ 11079739, 11701184, 14393045, 12608558, 9140203, 13888592, 14159241, 10557342, \
+ 11191415, 15857056, 3698201, 2563407, 7308694, 5510713, 2059752, 5176983, \
+ 4568838, 1836505, 7839280, 7196455, 2389214, 4154957, 16161712, 11340027, \
+ 8803183, 14672020, 13756481, 8928106, 12779703, 15257956, 11627481, 15890570, \
+ 15442279, 10588924, 3803433, 5495762, 586435, 74029, 5913276, 5344067, \
+ 2740506, 6447757, 8387940, 3452083, 7282314, 15091029, 9815188, 10321707, \
+ 12987514, 9286789, 9733917, 16735454, 15134691, 11384624, 16065743, 16650070, \
+ 10870321, 4769256, 5453695, 1748614, 114009, 4933240, 3821735, 3271031, \
+ 6830796, 6500745, 3719282, 7461615, 4933948, 8564737, 10068930, 13776959, \
+ 9390756, 10802129, 16621578, 11938703, 11320181, 15056936, 16143259, 10437186, \
+ 12892549, 5189564, 1471587, 1885650, 6675997, 3030092, 3515891, 7927330, \
+ 2313693, 678997, 4228642, 6010363, 1191532, 12713877, 13157598, 11732587, \
+ 12074928, 14724133, 11237214, 11683731, 14277664, 8555517, 9384111, 13918466, \
+ 14474201, 481324, 7209271, 7713478, 4122633, 3111312, 6603495, 1872190, \
+ 1510025, 4995648, 4581846, 1983151, 5706608, 15239617, 10664462, 16474975, \
+ 15757536, 11128633, 8527322, 14222535, 9500468, 8584425, 13323634, 13670166, \
+ 3900557, 6438264, 6909603, 3208382, 7997277, 4529792, 822579, 1566318, \
+ 6190773, 331028, 958155, 7735226, 16086308, 11332293, 15202586, 16515203, \
+ 9798644, 13556077, 13002890, 10318675, 9601100, 13308349, 10488674, 11139267, \
+ 7529368, 7877188, 2169079, 4885290, 5984841, 1073620, 653871, 4360890, \
+ 1642993, 3261956, 7011743, 2583906, 12330545, 16225720, 13519950, 8740759, \
+ 14542112, 14070905, 9244598, 9182215, 16238296, 12482473, 10828854, 15708127, \
+ 3577416, 1917969, 4251622, 4976254, 1062293, 5833408, 4446299, 2804142, \
+ 3236453, 8040792, 2335115, 2103894, 14240229, 9695912, 8921875, 12663238, \
+ 14322236, 9949993, 15487202, 15182355, 12565388, 11804789, 15553314, 444587, \
+ 1964124, 5515141, 1029306, 1035643, 5525412, 8344596, 2532683, 7159538, \
+ 7351601, 3921868, 1296095, 13122818, 8630009, 10139516, 13718791, 13127378, \
+ 10739529, 16360637, 16266998, 10743115, 15391896, 13716229, 10105062, 237759, \
+ 5073664, 1333457, 2081070, 6591279, 7153904, 3586825, 8381087, 6640102, \
+ 920353, 5745336, 5550407, 9265686, 8838057, 14535016, 11801331, 11149710, \
+ 14941277, 16281328, 11752739, 13276255, 12693452, 9976849, 13788410, 4839407, \
+ 3092, 3874753, 8038234, 2225335, 2781092, 7507549, 6133130, 272147, \
+ 5207677, 5565868, 1924627, 8783040, 15634861, 11921974, 12351971, 15167512, \
+ 11305485, 10295782, 14035007, 13562792, 8773841, 14293575, 5475246, 3707001, \
+ 2188128, 6974367, 3201102, 3736545, 4330032, 780623, 1113046, 5988369, \
+ 4330984, 36603, 16342023, 15889820, 11396697, 10788130, 16714935, 9868876, \
+ 9233809, 13074066, 10366831, 9804988, 13370881, 15157082, 3996863, 7663397, \
+ 6756340, 3015819, 1433354, 5926133, 225644, 566075, 5281986, 5970245, \
+ 2147004, 6942819, 15870322, 12262029, 14713165, 13259510, 9661099, 10008920, \
+ 13214405, 8520454, 10180923, 16042720, 15627029, 10952862, 8166347, 7719216, \
+ 939172, 4581215, 6077458, 1523073, 984952, 4510895, 4179350, 3554905, \
+ 6663400, 7116599, 10700518, 14245337, 13696528, 9119462, 12727679, 14274088, \
+ 9625025, 11224414, 14792367, 12103156, 11753569, 6833034, 4309335, 1226852, \
+ 5974969, 4567050, 967622, 1530773, 8136744, 2470899, 3023366, 7690253, \
+ 4053976, 8831523, 13578682, 13937373, 10483716, 12992915, 13455978, 12429812, \
+ 11713941, 15281738, 10536443, 12309540, 13766525, 605658, 108035, 5928944, \
+ 5328109, 564790, 6531027, 8008776, 3276604, 2871015, 6444130, 1378201, \
+ 1883268, 13102455, 9205418, 9815049, 14653780, 15084175, 11346238, 16183777, \
+ 16730624, 10754334, 9274055, 14136112, 10250665, 359118, 4375383, 2822280, \
+ 3160697, 8121206, 6549639, 2638680, 7444705, 5933234, 97150, 549069, \
+ 5502224, 10096483, 10489086, 15447349, 15918784, 12156379, 15470382, 15177397, \
+ 10225016, 13925899, 13627282, 8844644, 1906349, 7769906, 3144771, 2385564, \
+ 8156461, 7834850, 3022747, 4521996, 6222037, 1309538, 4204587, 4723156, \
+ 11764548, 12089503, 14773226, 11186785, 11764116, 16259919, 12765778, 9167281, \
+ 13660780, 14222303, 8558978, 15288953, 7631357, 3596326, 3127955, 6557128, \
+ 4133937, 1497014, 5074031, 4471832, 2000769, 5608574, 7098303, 2621344, \
+ 12510289, 16070543, 11406894, 10669425, 13227976, 9987615, 9682374, 13143781, \
+ 12670008, 12207555, 15924822, 15280397, 2240744, 3904115, 7391631, 612572, \
+ 172867, 5812386, 1378941, 940996, 7325847, 7664442, 4137961, 6727732, \
+ 15522575, 11879130, 10375473, 13085605, 9189630, 9896203, 14602896, 10800253, \
+ 11353390, 16168627, 16360768, 2121433, 6508214, 5936487, 1156824, 737033
};
void p25p2_vf::process_vcw(const uint8_t vf[], int* b) {
@@ -623,7 +624,7 @@ static const uint32_t pr_n[4096] = { \
((b[6] & 0x1) << 3 ) | \
((b[7] & 0x1) << 2 ) | \
((b[8] & 0x3) );
- int m1 = pr_n[u0];
+ int m1 = pr_n[u0] >> 1;
c0 = golay_24_encode(u0);
c1 = golay_23_encode(u1) ^ m1;
c2 = u2;
@@ -812,145 +813,60 @@ static const uint32_t pr_n[4096] = { \
load_i(c3, _c3, 14);
}
+static const int m_list[] = {0, 1, 2, 3, 4, 5, 11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 26, 27, 28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 7, 8, 9, 10, 15, 16, 24, 25, 31, 32, 6};
+
+static const int d_list[] = {7, 1, 11, 21, 31, 25, 35, 45, 55, 49, 59, 69, 6, 0, 10, 20, 30, 24, 34, 44, 54, 48, 58, 68, 5, 15, 9, 19, 29, 39, 33, 43, 53, 63, 57, 67, 4, 14, 8, 18, 28, 38, 32, 42, 52, 62, 56, 66, 3, 13, 23, 17, 27, 37, 47, 41, 51, 61, 71, 65, 2, 12, 22, 16, 26, 36, 46, 40, 50, 60, 70, 64};
+
+static const int b_lengths[] = {7,4,6,9,7,4,4,4,3};
+
void p25p2_vf::encode_dstar(uint8_t result[72], const int b[9]) {
- uint8_t pbuf[49];
- pbuf[0] = (b[0] >> 6) & 1;
- pbuf[1] = (b[0] >> 5) & 1;
- pbuf[2] = (b[0] >> 4) & 1;
- pbuf[3] = (b[0] >> 3) & 1;
- pbuf[4] = (b[0] >> 2) & 1;
- pbuf[5] = (b[0] >> 1) & 1;
- pbuf[6] = (b[2] >> 5) & 1;
- pbuf[7] = (b[2] >> 4) & 1;
- pbuf[8] = (b[2] >> 3) & 1;
- pbuf[9] = (b[2] >> 2) & 1;
- pbuf[10] = (b[3] >> 8) & 1;
- pbuf[11] = (b[3] >> 7) & 1;
- pbuf[12] = (b[3] >> 6) & 1;
- pbuf[13] = (b[3] >> 5) & 1;
- pbuf[14] = (b[3] >> 4) & 1;
- pbuf[15] = (b[3] >> 3) & 1;
- pbuf[16] = (b[3] >> 2) & 1;
- pbuf[17] = (b[4] >> 6) & 1;
- pbuf[18] = (b[4] >> 5) & 1;
- pbuf[19] = (b[4] >> 4) & 1;
- pbuf[20] = (b[4] >> 3) & 1;
- pbuf[21] = (b[4] >> 2) & 1;
- pbuf[22] = (b[5] >> 3) & 1;
- pbuf[23] = (b[5] >> 2) & 1;
- pbuf[24] = 0; /* ? */
- pbuf[25] = (b[5] >> 1) & 1;
- pbuf[26] = b[5] & 1;
- pbuf[27] = (b[6] >> 3) & 1;
- pbuf[28] = (b[6] >> 2) & 1;
- pbuf[29] = (b[6] >> 1) & 1;
- pbuf[30] = b[6] & 1;
- pbuf[31] = (b[7] >> 3) & 1;
- pbuf[32] = (b[7] >> 2) & 1;
- pbuf[33] = (b[7] >> 1) & 1;
- pbuf[34] = b[7] & 1;
- pbuf[35] = (b[8] >> 3) & 1;
- pbuf[36] = (b[8] >> 2) & 1;
- pbuf[37] = (b[8] >> 1) & 1;
- pbuf[38] = (b[1] >> 3) & 1;
- pbuf[39] = (b[1] >> 2) & 1;
- pbuf[40] = (b[1] >> 1) & 1;
- pbuf[41] = b[1] & 1;
- pbuf[42] = (b[2] >> 1) & 1;
- pbuf[43] = b[2] & 1;
- pbuf[44] = (b[3] >> 1) & 1;
- pbuf[45] = b[3] & 1;
- pbuf[46] = (b[4] >> 1) & 1;
- pbuf[47] = b[4] & 1;
- pbuf[48] = b[0] & 1;
+ uint8_t pbuf[48];
+ uint8_t tbuf[48];
+ int tbufp = 0;
+ for (int i=0; i < 9; i++) {
+ store_reg(b[i], &tbuf[tbufp], b_lengths[i]);
+ tbufp += b_lengths[i];
+ }
+ for (int i=0; i < 48; i++)
+ pbuf[i] = tbuf[m_list[i]];
int u0 = load_reg(pbuf+0, 12);
int u1 = load_reg(pbuf+12, 12);
- int u2 = load_reg(pbuf+24, 11);
- int u3 = load_reg(pbuf+35, 14);
int m1 = pr_n[u0];
int c0 = golay_24_encode(u0);
- int c1 = golay_23_encode(u1) ^ m1;
- int c2 = u2;
- int c3 = u3;
+ int c1 = golay_24_encode(u1) ^ m1;
- uint8_t ambe_fr[4][24];
- dump_i(ambe_fr[0], c0, 24);
- dump_i(ambe_fr[1], c1, 23);
- dump_i(ambe_fr[2], c2, 11);
- dump_i(ambe_fr[3], c3, 14);
+ uint8_t pre_buf[72];
+ store_reg(c0, pre_buf, 24);
+ store_reg(c1, pre_buf+24, 24);
+ memcpy(pre_buf+48, pbuf+24, 24);
+ for (int i=0; i < 72; i++)
+ result[d_list[i]] = pre_buf[i];
+}
- result[0] = ambe_fr[0][10];
- result[1] = ambe_fr[0][22];
- result[2] = ambe_fr[3][11];
- result[3] = ambe_fr[2][9];
- result[4] = ambe_fr[1][10];
- result[5] = ambe_fr[1][22];
- result[6] = ambe_fr[0][11];
- result[7] = ambe_fr[0][23];
- result[8] = ambe_fr[1][8];
- result[9] = ambe_fr[1][20];
- result[10] = ambe_fr[0][9];
- result[11] = ambe_fr[0][21];
- result[12] = ambe_fr[3][10];
- result[13] = ambe_fr[2][8];
- result[14] = ambe_fr[1][9];
- result[15] = ambe_fr[1][21];
- result[16] = ambe_fr[3][8];
- result[17] = ambe_fr[2][6];
- result[18] = ambe_fr[1][7];
- result[19] = ambe_fr[1][19];
- result[20] = ambe_fr[0][8];
- result[21] = ambe_fr[0][20];
- result[22] = ambe_fr[3][9];
- result[23] = ambe_fr[2][7];
- result[24] = ambe_fr[0][6];
- result[25] = ambe_fr[0][18];
- result[26] = ambe_fr[3][7];
- result[27] = ambe_fr[2][5];
- result[28] = ambe_fr[1][6];
- result[29] = ambe_fr[1][18];
- result[30] = ambe_fr[0][7];
- result[31] = ambe_fr[0][19];
- result[32] = ambe_fr[1][4];
- result[33] = ambe_fr[1][16];
- result[34] = ambe_fr[0][5];
- result[35] = ambe_fr[0][17];
- result[36] = ambe_fr[3][6];
- result[37] = ambe_fr[2][4];
- result[38] = ambe_fr[1][5];
- result[39] = ambe_fr[1][17];
- result[40] = ambe_fr[3][4];
- result[41] = ambe_fr[2][2];
- result[42] = ambe_fr[1][3];
- result[43] = ambe_fr[1][15];
- result[44] = ambe_fr[0][4];
- result[45] = ambe_fr[0][16];
- result[46] = ambe_fr[3][5];
- result[47] = ambe_fr[2][3];
- result[48] = ambe_fr[0][2];
- result[49] = ambe_fr[0][14];
- result[50] = ambe_fr[3][3];
- result[51] = ambe_fr[2][1];
- result[52] = ambe_fr[1][2];
- result[53] = ambe_fr[1][14];
- result[54] = ambe_fr[0][3];
- result[55] = ambe_fr[0][15];
- result[56] = ambe_fr[1][0];
- result[57] = ambe_fr[1][12];
- result[58] = ambe_fr[0][1];
- result[59] = ambe_fr[0][13];
- result[60] = ambe_fr[3][2];
- result[61] = ambe_fr[2][0];
- result[62] = ambe_fr[1][1];
- result[63] = ambe_fr[1][13];
- result[64] = ambe_fr[3][0];
- result[65] = ambe_fr[3][12];
- result[66] = ambe_fr[2][10];
- result[67] = ambe_fr[1][11];
- result[68] = ambe_fr[0][0];
- result[69] = ambe_fr[0][12];
- result[70] = ambe_fr[3][1];
- result[71] = ambe_fr[3][13];
+void p25p2_vf::decode_dstar(const uint8_t codeword[72], int b[9]) {
+ uint8_t pre_buf[72];
+ uint8_t post_buf[48];
+ uint8_t tbuf[48];
+ for (int i=0; i < 72; i++)
+ pre_buf[i] = codeword[d_list[i]];
+
+ uint32_t c0 = load_reg(pre_buf, 24);
+ uint32_t c1 = load_reg(pre_buf+24, 24);
+ uint32_t u0 = gly24128Dec(c0);
+ uint32_t m1 = pr_n[u0];
+ uint32_t u1 = gly24128Dec(c1 ^ m1);
+
+ store_reg(u0, post_buf, 12);
+ store_reg(u1, post_buf+12, 12);
+ memcpy(post_buf+24, pre_buf+48, 24);
+ for (int i=0; i < 48; i++)
+ tbuf[m_list[i]] = post_buf[i];
+
+ int tbufp = 0;
+ for (int i=0; i < 9; i++) {
+ b[i] = load_reg(&tbuf[tbufp], b_lengths[i]);
+ tbufp += b_lengths[i];
+ }
}
diff --git a/op25/gr-op25_repeater/lib/p25p2_vf.h b/op25/gr-op25_repeater/lib/p25p2_vf.h
index d11fa95..b86d500 100644
--- a/op25/gr-op25_repeater/lib/p25p2_vf.h
+++ b/op25/gr-op25_repeater/lib/p25p2_vf.h
@@ -27,6 +27,7 @@ public:
void process_vcw(const uint8_t vf[], int* b);
void encode_vcw(uint8_t vf[], const int* b);
void encode_dstar(uint8_t result[72], const int b[9]);
+ void decode_dstar(const uint8_t codeword[72], int b[9]);
private:
void extract_vcw(const uint8_t _vf[], int& _c0, int& _c1, int& _c2, int& _c3);
void interleave_vcw(uint8_t _vf[], int _c0, int _c1, int _c2, int _c3);