ambe encoder patch

This commit is contained in:
Max 2016-12-18 10:20:08 -05:00
parent 3a558b03b2
commit 0bfa16971f
3 changed files with 652 additions and 1 deletions

View File

@ -32,6 +32,8 @@ public:
void imbe_decode(int16_t *frame_vector, int16_t *snd) {
decode(&my_imbe_param, frame_vector, snd);
}
// hack to enable ambe encoder read access to speech parameters
const IMBE_PARAM* param(void) {return &my_imbe_param;}
private:
IMBE_PARAM my_imbe_param;

View File

@ -1,4 +1,4 @@
// P25 TDMA Decoder (C) Copyright 2013, 2014 Max H. Parke KA1RBI
// P25 TDMA Decoder (C) Copyright 2013, 2014, 2016 Max H. Parke KA1RBI
//
// This file is part of OP25
//
@ -28,12 +28,535 @@ static void load_i(const uint8_t src[], int& dest, int count) {
dest = (dest << 1) + src[count-1-i];
}
static void dump_i(uint8_t dest[], int src, int count) {
for (int i=0; i<count; i++) {
dest[i] = src & 1;
src = src >> 1;
}
}
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
};
void p25p2_vf::process_vcw(const uint8_t vf[], int* b) {
int c0,c1,c2,c3;
int u0,u1,u2,u3;
extract_vcw(vf, c0, c1, c2, c3 );
u0 = gly24128Dec(c0);
// TODO: use pr_n[] to lookup m1
int pr[24];
int _m1[24];
pr[0] = 16 * u0;
@ -61,6 +584,130 @@ static void load_i(const uint8_t src[], int& dest, int count) {
b[8] = ((u2 << 2) & 0x04) + ( u3 & 0x3);
}
void p25p2_vf::encode_vcw(uint8_t vf[], const int* b) {
uint32_t c0,c1,c2,c3;
int u0,u1,u2,u3;
u0 = \
((b[0] & 0x78) << 5 ) | \
((b[1] & 0x1e) << 3 ) | \
((b[2] & 0x1e) >> 1 );
u1 = \
((b[3] & 0x1fe) << 3 ) | \
((b[4] & 0x78) >> 3 );
u2 = \
((b[5] & 0x1e) << 6 ) | \
((b[6] & 0xe) << 3 ) | \
((b[7] & 0xe) ) | \
((b[8] & 0x4) >> 2 );
u3 = \
((b[1] & 0x1) << 13 ) | \
((b[2] & 0x1) << 12 ) | \
((b[0] & 0x7) << 9 ) | \
((b[3] & 0x1) << 8 ) | \
((b[4] & 0x7) << 5 ) | \
((b[5] & 0x1) << 4 ) | \
((b[6] & 0x1) << 3 ) | \
((b[7] & 0x1) << 2 ) | \
((b[8] & 0x3) );
int m1 = pr_n[u0];
c0 = golay_24_encode(u0);
c1 = golay_23_encode(u1) ^ m1;
c2 = u2;
c3 = u3;
interleave_vcw(vf, c0, c1, c2, c3);
}
void p25p2_vf::interleave_vcw(uint8_t _vf[], int _c0, int _c1, int _c2, int _c3){
uint8_t vf[72];
uint8_t c0[24];
uint8_t c1[23];
uint8_t c2[11];
uint8_t c3[14];
dump_i(c0, _c0, 24);
dump_i(c1, _c1, 23);
dump_i(c2, _c2, 11);
dump_i(c3, _c3, 14);
vf[0] = c0[23];
vf[1] = c0[5];
vf[2] = c1[10];
vf[3] = c2[3];
vf[4] = c0[22];
vf[5] = c0[4];
vf[6] = c1[9];
vf[7] = c2[2];
vf[8] = c0[21];
vf[9] = c0[3];
vf[10] = c1[8];
vf[11] = c2[1];
vf[12] = c0[20];
vf[13] = c0[2];
vf[14] = c1[7];
vf[15] = c2[0];
vf[16] = c0[19];
vf[17] = c0[1];
vf[18] = c1[6];
vf[19] = c3[13];
vf[20] = c0[18];
vf[21] = c0[0];
vf[22] = c1[5];
vf[23] = c3[12];
vf[24] = c0[17];
vf[25] = c1[22];
vf[26] = c1[4];
vf[27] = c3[11];
vf[28] = c0[16];
vf[29] = c1[21];
vf[30] = c1[3];
vf[31] = c3[10];
vf[32] = c0[15];
vf[33] = c1[20];
vf[34] = c1[2];
vf[35] = c3[9];
vf[36] = c0[14];
vf[37] = c1[19];
vf[38] = c1[1];
vf[39] = c3[8];
vf[40] = c0[13];
vf[41] = c1[18];
vf[42] = c1[0];
vf[43] = c3[7];
vf[44] = c0[12];
vf[45] = c1[17];
vf[46] = c2[10];
vf[47] = c3[6];
vf[48] = c0[11];
vf[49] = c1[16];
vf[50] = c2[9];
vf[51] = c3[5];
vf[52] = c0[10];
vf[53] = c1[15];
vf[54] = c2[8];
vf[55] = c3[4];
vf[56] = c0[9];
vf[57] = c1[14];
vf[58] = c2[7];
vf[59] = c3[3];
vf[60] = c0[8];
vf[61] = c1[13];
vf[62] = c2[6];
vf[63] = c3[2];
vf[64] = c0[7];
vf[65] = c1[12];
vf[66] = c2[5];
vf[67] = c3[1];
vf[68] = c0[6];
vf[69] = c1[11];
vf[70] = c2[4];
vf[71] = c3[0];
for (int i=0; i<sizeof(vf)/2; i++) {
_vf[i] = (vf[i*2] << 1) | vf[i*2+1];
}
}
void p25p2_vf::extract_vcw(const uint8_t _vf[], int& _c0, int& _c1, int& _c2, int& _c3){
uint8_t vf[72];
uint8_t c0[24];

View File

@ -25,8 +25,10 @@
class p25p2_vf {
public:
void process_vcw(const uint8_t vf[], int* b);
void encode_vcw(uint8_t vf[], const int* b);
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);
};
#endif /* INCLUDED_P25P2_VF_H */