1 /*
2  * Real Audio 1.0 (14.4K)
3  * Copyright (c) 2003 The FFmpeg project
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include <stdint.h>
23 #include "avcodec.h"
24 #include "celp_filters.h"
25 #include "mathops.h"
26 #include "ra144.h"
27 
28 const int16_t ff_gain_val_tab[256][3] = {
29     { 541, 956,  768}, { 877, 581,  568}, { 675,1574,  635}, {1248,1464,  668},
30     {1246, 839, 1394}, {2560,1386,  991}, { 925, 687,  608}, {2208, 797, 1144},
31     { 535, 832,  799}, { 762, 605, 1154}, { 832,1122, 1003}, {1180, 687, 1176},
32     {1292, 901,  732}, {1656, 689,  896}, {1750,1248,  848}, {2284, 942, 1022},
33     { 824,1472,  643}, { 517, 765,  512}, { 562,1816, 1522}, { 694,1826, 2700},
34     { 704, 524,  672}, {1442, 757, 2232}, { 884, 551, 1266}, {2232,1007, 1692},
35     { 932, 746,  777}, {1132, 822,  926}, {1226, 771,  611}, {2948,1342, 1008},
36     {1302, 594, 1158}, {1602, 636, 1128}, {3408, 910, 1438}, {1996, 614,  575},
37     { 665, 935,  628}, { 631,1192,  829}, { 644, 926, 1052}, { 879, 988, 1226},
38     { 941,2768, 2772}, { 565,1344, 2304}, { 547, 628,  740}, { 639, 532, 1074},
39     { 955,1208,  598}, {1124,1160,  900}, {1206, 899, 1242}, { 746, 533,  624},
40     {1458,1028,  735}, {1706,1102,  692}, {1898,1018, 1004}, {2176, 988,  735},
41     {1578, 782, 1642}, { 897, 516,  754}, {2068, 702, 1656}, {2344, 818, 1526},
42     { 907, 652,  592}, {1056, 652,  642}, {2124,1416,  780}, {2664,1250,  727},
43     {1894, 727, 1108}, {2196, 657,  981}, {4840, 920, 1704}, {4992,1238,  983},
44     {2420, 909, 1094}, {2760, 935, 1032}, {2800, 612,  853}, {3068, 832,  574},
45     { 523,1796,  923}, { 722,1916, 1382}, {1226,1542,  928}, { 758, 757,  584},
46     { 512,1134,  577}, { 615,1276,  698}, { 574,2568, 2356}, { 993,2728, 3512},
47     { 539, 890,  913}, { 694, 928, 1088}, { 805, 600, 1360}, {2160, 951, 3128},
48     { 816, 950,  590}, { 955, 847,  811}, {1094, 883,  556}, {1304, 888,  604},
49     { 863,1170,  855}, {1023, 997, 1032}, { 932,1228, 1280}, { 627, 564,  573},
50     { 876, 900, 1448}, {1030, 857, 1792}, {1294, 953, 1758}, {1612, 854, 1714},
51     {1090,1166,  631}, {1314,1202,  751}, {1480, 905,  795}, {1682,1016,  568},
52     {1494,1178,  983}, { 878, 613,  526}, {1728,1446,  779}, {2136,1348,  774},
53     { 950, 649,  939}, {1180, 703,  899}, {1236, 527, 1158}, {1450, 647,  972},
54     {1282, 647,  707}, {1460, 663,  644}, {1614, 572,  578}, {3516,1222,  821},
55     {2668, 729, 1682}, {3128, 585, 1502}, {3208, 733,  976}, {6800, 871, 1416},
56     {3480, 743, 1408}, {3764, 899, 1170}, {3772, 632,  875}, {4092, 732,  638},
57     {3112, 753, 2620}, {3372, 945, 1890}, {3768, 969, 2288}, {2016, 559,  854},
58     {1736, 729,  787}, {1940, 686,  547}, {2140, 635,  674}, {4480,1272,  828},
59     {3976, 592, 1666}, {4384, 621, 1388}, {4400, 801,  955}, {4656, 522,  646},
60     {4848, 625, 1636}, {4984, 591,  874}, {5352, 535, 1001}, {11216,938, 1184},
61     { 925,3280, 1476}, { 735,1580, 1088}, {1150,1576,  674}, { 655, 783,  528},
62     { 527,2052, 1354}, { 782,1704, 1880}, { 578, 910, 1026}, { 692, 882, 1468},
63     { 586, 683,  715}, { 739, 609,  717}, { 778, 773,  697}, { 922, 785,  813},
64     { 766, 651,  984}, { 978, 596, 1030}, {1070, 757, 1080}, {1324, 687, 1178},
65     {1108,2144,  979}, { 723, 982,  690}, { 936, 956,  527}, {1180,1002,  547},
66     { 517,1306,  825}, { 832,1184,  974}, {1024, 957,  903}, {1262,1090,  906},
67     {1028, 720,  649}, {1192, 679,  694}, {2468,1480,  979}, {2844,1370,  877},
68     {1310, 835,  848}, {1508, 839,  698}, {1742,1030,  769}, {1910, 852,  573},
69     {1280, 859, 1174}, {1584, 863, 1108}, {1686, 708, 1364}, {1942, 768, 1104},
70     { 891, 536,  690}, {1016, 560,  663}, {2172, 870, 1348}, {2404, 999, 1170},
71     {1890, 966,  889}, {2116, 912,  777}, {2296,1020,  714}, {4872,1844,  932},
72     {2392, 778,  929}, {2604, 772,  744}, {2764, 957,  722}, {5832,1532,  984},
73     {2188, 519, 1264}, {2332, 532,  922}, {5064, 995, 2412}, {2708, 571,  874},
74     {2408, 545,  666}, {5016,1084,  875}, {5376, 983, 1196}, {5536, 979,  730},
75     {5344, 634, 1744}, {5688, 706, 1348}, {5912, 977, 1190}, {6072, 905,  763},
76     {6048, 582, 1526}, {11968,1013,1816}, {12864,937, 1900}, {12560,1086, 998},
77     {1998, 684, 1884}, {2504, 633, 1992}, {1252, 567,  835}, {1478, 571,  973},
78     {2620, 769, 1414}, {2808, 952, 1142}, {2908, 712, 1028}, {2976, 686,  741},
79     {1462, 552,  714}, {3296, 991, 1452}, {1590, 615,  544}, {3480,1150,  824},
80     {3212, 832,  923}, {3276, 839,  531}, {3548, 786,  852}, {3732, 764,  570},
81     {5728, 906, 2616}, {6272, 804, 2252}, {3096, 535,  876}, {3228, 598,  649},
82     {6536, 759, 1436}, {6648, 993,  846}, {6864, 567, 1210},{14016,1012, 1302},
83     {3408, 548, 1098}, {7160,1008, 1742}, {7136,1000, 1182}, {7480,1032,  836},
84     {7448, 612, 1552}, {7744, 614,  816}, {8384, 777, 1438}, {8784, 694,  786},
85     { 882,1508, 1068}, { 597, 837,  766}, {1270, 954, 1408}, { 803, 550,  798},
86     {1398,1308,  798}, {1848,1534,  738}, { 970, 675,  608}, {1264, 706,  684},
87     {1716, 767, 1126}, {2108, 765, 1404}, {2236, 924, 1003}, {2472,1048,  611},
88     { 999, 942,  963}, {1094, 857,  935}, {2936, 926, 1138}, {1934, 746,  551},
89     {3336, 633, 1762}, {3764, 701, 1454}, {1890, 564,  636}, {4096,1126,  793},
90     {3936, 556, 1140}, {3936, 540,  740}, {4216, 764,  874}, {8480,1328, 1014},
91     {2184, 515, 1042}, {4432, 934, 1344}, {4784, 945, 1112}, {5016,1062,  733},
92     {9216,1020, 2028}, {9968, 924, 1188}, {5424, 909, 1206}, {6512, 744, 1086}
93 };
94 
95 const uint8_t ff_gain_exp_tab[256] = {
96    15, 15, 15, 15, 15, 16, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14,
97    14, 13, 14, 14, 13, 14, 13, 14, 13, 13, 13, 14, 13, 13, 14, 13,
98    13, 13, 13, 13, 14, 13, 12, 12, 13, 13, 13, 12, 13, 13, 13, 13,
99    13, 12, 13, 13, 12, 12, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13,
100    13, 13, 13, 12, 12, 12, 13, 13, 12, 12, 12, 13, 12, 12, 12, 12,
101    12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12,
102    12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 13, 13, 13, 13,
103    13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14,
104    13, 12, 12, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
105    12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 11, 11, 11, 11,
106    12, 12, 12, 12, 11, 11, 12, 12, 12, 12, 12, 13, 12, 12, 12, 13,
107    12, 12, 13, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
108    12, 12, 11, 11, 12, 12, 12, 12, 11, 12, 11, 12, 12, 12, 12, 12,
109    13, 13, 12, 12, 13, 13, 13, 14, 12, 13, 13, 13, 13, 13, 13, 13,
110    11, 10, 11, 10, 11, 11, 10, 10, 11, 11, 11, 11, 10,  9, 11, 10,
111    12, 12, 11, 12, 12, 12, 12, 13, 11, 12, 12, 12, 13, 13, 12, 12
112 };
113 
114 const int8_t ff_cb1_vects[128][40]={
115     {
116      38,  -4,  15,  -4,  14, -13,  12, -11,  -2,  -6,
117      -6, -11, -45, -16, -11, -13,  -7,   6, -12,   4,
118     -20,   3, -16,  12,  -1,  12,  46,  24,   0,  33,
119      -3,   9, -12, -12,  -8,  -7,  17,  -6,   0,  -2,
120     }, {
121      60, -16,   3, -22,  10, -32,   0, -28, -17, -18,
122      -3, -25, -37, -23, -10,   3,   2,   3,   0,   3,
123     -14,   0, -14,  -1,   0,   2,  32,   9,  -1,  25,
124       7,  13,  -5,  13,   8,   1,   2,   8, -10,   6,
125     }, {
126      27, -12,  28,  -2,   6,  -7,  15,   9, -11,   1,
127     -13, -11, -40,   4, -29, -14, -19,  -5, -23,  -8,
128     -30, -13, -17,   0, -14,  12,  34,  20,  -2,  25,
129       2, -16,  -4, -12,  15,  16,  29,   7,  24,  10,
130     }, {
131      49, -24,  16, -20,   2, -26,   2,  -7, -25, -10,
132     -11, -25, -32,  -3, -27,   2,  -8,  -8, -11,  -9,
133     -24, -17, -16, -14, -13,   2,  20,   5,  -4,  17,
134      14, -12,   3,  13,  33,  25,  14,  23,  15,  19,
135     }, {
136      46,  -6,  21,   8,  -2, -16,  -5,  -8, -11,   4,
137       8,  15, -24,   4,  -2, -26,  -3, -16, -16, -14,
138      -9,  -2,  -1,   4,  19,   7,  36,  17,   9,  13,
139       0,  31,  -5, -12,   7,  -8,  11, -15, -13,  -4,
140     }, {
141      68, -18,   9,  -9,  -6, -35, -18, -25, -26,  -7,
142      10,   1, -16,  -3,  -1,  -9,   6, -19,  -4, -15,
143      -4,  -6,   0,  -8,  20,  -2,  23,   2,   7,   5,
144      12,  35,   1,  13,  24,   0,  -3,   0, -22,   4,
145     }, {
146      35, -14,  34,  10, -10, -10,  -1,  12, -20,  12,
147       0,  15, -18,  24, -20, -27, -14, -28, -27, -27,
148     -20, -19,  -2,  -8,   5,   7,  25,  13,   5,   5,
149       6,   5,   2, -12,  31,  15,  23,  -1,  12,   8,
150     }, {
151      57, -26,  22,  -7, -14, -28, -14,  -3, -35,   0,
152       3,   1, -11,  16, -18, -10,  -4, -31, -15, -28,
153     -14, -23,  -1, -21,   7,  -2,  11,  -1,   3,  -1,
154      18,   9,  10,  13,  49,  24,   8,  14,   2,  16,
155     }, {
156      25,  15,  22,  11,  18,   4,  15, -22,   8,  -2,
157     -17,  -9, -48, -20, -30, -17, -16,  11,  -1,  16,
158       2,  10,  -5,  26,  -2,  -4,  22,   0,   2,  10,
159      -6,  13, -14,  10, -23,   0,  10,  -2,   1,   0,
160     }, {
161      47,   3,  11,  -6,  15, -13,   2, -38,  -6, -13,
162     -15, -22, -40, -28, -28,   0,  -5,   8,  10,  15,
163       7,   7,  -4,  13,  -1, -14,   9, -14,   0,   2,
164       4,  18,  -7,  36,  -6,   8,  -3,  13,  -7,   8,
165     }, {
166      14,   7,  36,  13,  10,  10,  18,   0,   0,   5,
167     -25,  -8, -43,   0, -48, -18, -27,   0, -12,   3,
168      -7,  -6,  -7,  13, -15,  -5,  11,  -3,   0,   2,
169       0, -12,  -6,  10,   0,  23,  22,  11,  26,  12,
170     }, {
171      36,  -5,  24,  -4,   7,  -7,   6, -17, -14,  -5,
172     -22, -22, -35,  -8, -46,  -1, -17,  -3,   0,   2,
173      -2, -10,  -5,   0, -14, -15,  -2, -18,  -2,  -4,
174      11,  -7,   1,  36,  18,  32,   7,  27,  17,  20,
175     }, {
176      33,  13,  29,  24,   1,   1,  -2, -18,   0,   9,
177      -3,  17, -27,   0, -21, -30, -12, -11,  -5,  -2,
178      12,   4,   9,  19,  18,  -9,  13,  -6,  11,  -8,
179      -2,  35,  -8,  10,  -7,  -1,   4, -11, -10,  -2,
180     }, {
181      55,   1,  17,   6,  -1, -16, -15, -35, -15,  -2,
182       0,   4, -19,  -8, -20, -13,  -1, -14,   7,  -3,
183      18,   0,  10,   5,  19, -19,   0, -21,   8, -16,
184       9,  39,   0,  36,  10,   7,  -9,   4, -20,   5,
185     }, {
186      22,   5,  42,  26,  -6,   8,   1,   2,  -9,  17,
187     -10,  18, -21,  19, -39, -31, -23, -23, -16, -15,
188       2, -12,   7,   6,   5,  -9,   1, -10,   7, -16,
189       4,   9,   0,  10,  17,  22,  16,   2,  14,   9,
190     }, {
191      44,  -6,  30,   8,  -9, -10, -11, -14, -23,   5,
192      -8,   4, -14,  12, -37, -14, -12, -26,  -4, -16,
193       8, -16,   9,  -7,   6, -19, -12, -25,   5, -24,
194      15,  13,   8,  36,  34,  31,   1,  18,   4,  18,
195     }, {
196      -3,  -5,  -9,  -7,  15,  -1,   5,  13,   2,  12,
197       5,   2, -21, -23,  -2, -16,   0,   5,  -6,  13,
198     -23,   3, -32,  10, -15,   8,  44,  28,   9,  37,
199      -2,  13,  -9, -15, -12, -27,  -7, -12,   0, -11,
200     }, {
201      18, -17, -21, -25,  11, -19,  -6,  -3, -11,   0,
202       7, -11, -13, -31,  -1,   0,   9,   1,   5,  12,
203     -18,   0, -31,  -2, -13,  -1,  30,  14,   7,  29,
204       9,  18,  -1,  10,   4, -18, -22,   3, -10,  -2,
205     }, {
206     -13, -13,   3,  -5,   7,   4,   9,  34,  -5,  20,
207      -2,   3, -16,  -3, -20, -17, -11,  -7, -17,   0,
208     -34, -13, -33,  -2, -28,   8,  32,  24,   5,  29,
209       3, -12,   0, -15,  11,  -3,   3,   2,  24,   1,
210     }, {
211       8, -25,  -8, -23,   3, -13,  -3,  17, -20,   8,
212       0, -10,  -8, -11, -18,   0,  -1, -10,  -5,   0,
213     -28, -17, -32, -15, -26,  -1,  19,   9,   3,  21,
214      15,  -7,   6,   9,  29,   5, -10,  17,  15,   9,
215     }, {
216       4,  -6,  -3,   5,  -1,  -4, -11,  16,  -6,  23,
217      19,  29,   0,  -3,   6, -30,   3, -17, -10,  -5,
218     -13,  -2, -17,   3,   5,   3,  35,  21,  17,  17,
219       2,  35,  -2, -15,   3, -28, -13, -21, -13, -13,
220     }, {
221      26, -19, -15, -12,  -5, -22, -24,   0, -21,  12,
222      21,  15,   8, -11,   7, -12,  14, -20,   2,  -6,
223      -7,  -6, -16,  -9,   6,  -5,  21,   7,  15,  10,
224      13,  39,   5,  10,  20, -19, -28,  -5, -22,  -5,
225     }, {
226      -5, -15,   9,   7,  -9,   2,  -8,  37, -14,  31,
227      11,  29,   5,  16, -11, -30,  -7, -29, -21, -18,
228     -23, -19, -18,  -9,  -7,   3,  23,  17,  14,   9,
229       8,   9,   6, -15,  27,  -4,  -2,  -6,  12,  -1,
230     }, {
231      16, -27,  -2, -10, -13, -16, -20,  20, -29,  20,
232      14,  16,  13,   8,  -9, -13,   2, -33,  -9, -19,
233     -17, -23, -17, -22,  -6,  -6,   9,   2,  12,   2,
234      20,  13,  13,  10,  45,   4, -16,   8,   2,   7,
235     }, {
236     -16,  14,  -2,   8,  20,  17,   9,   2,  14,  16,
237      -6,   5, -24, -28, -21, -20,  -8,   9,   4,  25,
238      -1,  11, -22,  24, -15,  -8,  21,   5,  11,  14,
239      -5,  18, -11,   7, -27, -20, -14,  -7,   1,  -9,
240     }, {
241       6,   2, -14,  -9,  16,  -1,  -3, -14,   0,   5,
242      -3,  -8, -16, -36, -19,  -3,   1,   6,  17,  24,
243       4,   7, -21,  11, -14, -18,   7,  -9,   9,   7,
244       6,  22,  -3,  33, -10, -11, -28,   7,  -7,   0,
245     }, {
246     -26,   6,  11,  10,  12,  23,  12,  23,   5,  24,
247     -13,   5, -19,  -8, -38, -21, -20,  -2,  -6,  12,
248     -11,  -5, -23,  11, -29,  -9,   9,   0,   7,   6,
249       1,  -7,  -2,   7,  -3,   3,  -2,   6,  27,   3,
250     }, {
251      -4,  -6,   0,  -7,   8,   4,   0,   6,  -9,  13,
252     -11,  -7, -11, -15, -37,  -4,  -9,  -5,   5,  11,
253      -5,  -9, -22,  -1, -27, -18,  -4, -14,   5,   0,
254      12,  -3,   4,  32,  14,  12, -17,  22,  17,  11,
255     }, {
256      -8,  12,   3,  21,   3,  14,  -8,   5,   4,  28,
257       7,  32,  -2,  -8, -12, -34,  -4, -12,   1,   6,
258       9,   4,  -7,  17,   4, -13,  11,  -1,  19,  -4,
259       0,  39,  -4,   7, -11, -21, -20, -16, -10, -11,
260     }, {
261      13,   0,  -8,   3,   0,  -4, -21, -11,  -9,  16,
262      10,  18,   5, -16, -10, -16,   5, -15,  13,   5,
263      15,   1,  -6,   4,   6, -23,  -2, -16,  17, -12,
264      10,  44,   3,  33,   6, -12, -34,  -1, -20,  -3,
265     }, {
266     -18,   4,  17,  23,  -4,  20,  -4,  26,  -3,  36,
267       0,  32,   2,  12, -29, -34, -16, -24, -10,  -6,
268       0, -12,  -8,   4,  -8, -13,   0,  -6,  16, -12,
269       5,  13,   3,   7,  13,   3,  -8,  -2,  14,   0,
270     }, {
271       3,  -7,   5,   5,  -8,   2, -17,   9, -18,  24,
272       2,  19,  10,   4, -28, -17,  -5, -28,   2,  -7,
273       4, -15,  -7,  -8,  -6, -23, -13, -21,  14, -20,
274      17,  18,  11,  33,  30,  11, -23,  13,   5,   9,
275     }, {
276      60,  10,   7,  -1,   9,  -8,   6, -13,   2, -15,
277      -1, -10, -13, -11,  15,   0,   6,   9,  -1,   0,
278     -13,   1, -11,  -3, -13,  21,  13,  26,  -7,  31,
279     -10,  -7, -16, -33, -31, -10,  22,  -8,   1,  -2,
280     }, {
281      82,  -1,  -4, -19,   6, -27,  -6, -29, -12, -26,
282       1, -24,  -5, -18,  17,  17,  17,   6,  10,   0,
283      -7,  -2,  -9, -16, -12,  11,   0,  11,  -9,  23,
284       0,  -3,  -8,  -8, -13,  -1,   8,   7,  -7,   6,
285     }, {
286      49,   2,  21,   0,   1,  -2,   9,   8,  -6,  -6,
287      -8, -10,  -8,   9,  -2,   0,  -4,  -2, -13, -12,
288     -23, -15, -12, -16, -26,  21,   2,  21, -11,  23,
289      -4, -33,  -7, -33,  -6,  13,  34,   5,  27,  10,
290     }, {
291      71, -10,   9, -17,  -1, -20,  -3,  -8, -21, -18,
292      -6, -24,   0,   1,   0,  16,   6,  -5,   0, -13,
293     -17, -19, -11, -29, -25,  11, -11,   6, -13,  15,
294       7, -29,   0,  -8,  11,  22,  20,  21,  17,  18,
295     }, {
296      67,   8,  14,  11,  -7, -11, -11,  -9,  -7,  -3,
297      13,  16,   8,   9,  24, -12,  10, -13,  -5, -17,
298      -2,  -4,   3, -10,   6,  17,   4,  19,   0,  11,
299      -6,  13,  -9, -33, -14, -10,  16, -17, -10,  -4,
300     }, {
301      90,  -3,   2,  -6, -10, -29, -24, -26, -21, -15,
302      15,   2,  16,   1,  25,   4,  21, -16,   6, -18,
303       3,  -8,   5, -24,   8,   7,  -9,   4,  -1,   3,
304       5,  18,  -1,  -7,   2,  -1,   2,  -1, -19,   3,
305     }, {
306      57,   0,  27,  13, -14,  -5,  -7,  11, -15,   4,
307       5,  16,  13,  29,   6, -13,   0, -25, -16, -31,
308     -12, -22,   2, -23,  -6,  16,  -7,  14,  -2,   3,
309       0, -12,   0, -33,   9,  13,  28,  -3,  14,   7,
310     }, {
311      79, -11,  15,  -4, -18, -23, -20,  -5, -30,  -7,
312       7,   2,  21,  21,   8,   3,  10, -28,  -4, -31,
313      -6, -25,   3, -37,  -4,   7, -20,   0,  -4,  -4,
314      11,  -7,   6,  -8,  27,  22,  14,  12,   5,  16,
315     }, {
316      47,  30,  15,  14,  14,   9,   9, -23,  13, -10,
317     -12,  -7, -16, -15,  -3,  -3,  -1,  14,   9,  12,
318       9,   8,   0,  10, -14,   4,  -9,   2,  -5,   8,
319     -13,  -3, -18, -10, -45,  -3,  16,  -4,   4,   0,
320     }, {
321      69,  17,   3,  -3,  10,  -8,  -3, -40,  -1, -21,
322     -10, -21,  -8, -23,  -1,  13,   8,  11,  21,  11,
323      15,   4,   0,  -2, -13,  -5, -23, -12,  -7,   0,
324      -1,   0, -10,  14, -28,   5,   1,  11,  -5,   7,
325     }, {
326      36,  21,  28,  16,   6,  16,  12,  -2,   4,  -2,
327     -20,  -7, -11,   4, -20,  -4, -12,   2,  -1,   0,
328       0,  -8,  -2,  -2, -27,   4, -21,  -2,  -9,   0,
329      -6, -29,  -9, -10, -21,  21,  28,  10,  29,  11,
330     }, {
331      58,   9,  16,  -1,   2,  -2,   0, -19, -10, -13,
332     -17, -21,  -3,  -3, -19,  12,  -2,   0,  10,  -1,
333       5, -12,   0, -15, -26,  -5, -34, -16, -11,  -7,
334       4, -25,  -2,  14,  -3,  29,  13,  25,  20,  20,
335     }, {
336      55,  28,  21,  27,  -2,   7,  -8, -20,   4,   1,
337       1,  18,   5,   4,   5, -16,   2,  -8,   5,  -5,
338      19,   2,  14,   3,   6,   0, -18,  -4,   2, -11,
339      -8,  18, -11, -10, -29,  -3,  10, -13,  -8,  -3,
340     }, {
341      77,  16,   9,   9,  -6, -11, -21, -37, -10, -10,
342       4,   5,  13,  -3,   7,   0,  13, -11,  17,  -6,
343      25,  -1,  15,  -9,   7,  -9, -32, -19,   0, -18,
344       2,  22,  -3,  15, -12,   5,  -4,   2, -17,   5,
345     }, {
346      44,  20,  34,  29, -10,  13,  -4,   0,  -4,   9,
347      -5,  19,  10,  24, -11, -17,  -8, -20,  -5, -19,
348       9, -14,  12,  -9,  -6,   0, -30,  -9,   0, -19,
349      -2,  -7,  -2, -10,  -5,  20,  21,   1,  17,   9,
350     }, {
351      66,   8,  23,  11, -14,  -5, -17, -16, -19,  -2,
352      -3,   5,  18,  17, -10,   0,   1, -23,   6, -20,
353      15, -18,  14, -22,  -5, -10, -44, -23,  -2, -26,
354       9,  -3,   4,  14,  12,  29,   7,  16,   7,  18,
355     }, {
356      18,   9, -17,  -4,  11,   3,   0,  11,   7,   4,
357      10,   3,  10, -18,  24,  -3,  14,   7,   4,  10,
358     -16,   1, -27,  -4, -27,  17,  12,  30,   0,  35,
359      -9,  -3, -12, -36, -35, -30,  -2, -13,   2, -11,
360     }, {
361      40,  -2, -29, -22,   7, -14, -12,  -5,  -7,  -7,
362      12,  -9,  18, -26,  26,  14,  24,   4,  16,   9,
363     -10,  -2, -26, -18, -26,   7,  -1,  15,  -1,  27,
364       2,   0,  -4, -11, -17, -21, -16,   1,  -7,  -3,
365     }, {
366       8,   1,  -3,  -2,   3,  10,   3,  32,  -1,  12,
367       2,   4,  15,   1,   7,  -3,   2,  -4,  -6,  -3,
368     -26, -15, -29, -17, -40,  17,   0,  26,  -2,  27,
369      -2, -29,  -4, -36, -10,  -6,   9,   0,  27,   0,
370     }, {
371      30, -11, -15, -20,   0,  -8,  -9,  15, -15,   0,
372       5,  -9,  23,  -6,   8,  13,  13,  -7,   5,  -3,
373     -20, -19, -27, -31, -39,   7, -13,  11,  -4,  19,
374       8, -25,   3, -11,   7,   2,  -4,  16,  18,   9,
375     }, {
376      26,   7, -11,   8,  -5,   1, -17,  14,  -1,  15,
377      24,  30,  32,   1,  33, -16,  18, -14,   0,  -8,
378      -6,  -4, -12, -12,  -6,  13,   2,  23,   8,  15,
379      -4,  17,  -5, -36, -18, -30,  -8, -22, -10, -14,
380     }, {
381      48,  -4, -23,  -9,  -9, -17, -30,  -2, -16,   3,
382      26,  16,  40,  -6,  35,   1,  28, -17,  12,  -9,
383       0,  -8, -11, -25,  -5,   3, -10,   8,   6,   7,
384       6,  22,   1, -11,  -1, -21, -22,  -7, -19,  -5,
385     }, {
386      15,   0,   2,  10, -13,   7, -14,  35, -10,  23,
387      16,  31,  37,  21,  16, -17,   6, -26, -10, -21,
388     -16, -21, -13, -25, -19,  13,  -8,  19,   5,   7,
389       1,  -8,   2, -36,   5,  -6,   3,  -8,  15,  -1,
390     }, {
391      37, -12,  -9,  -7, -17, -11, -26,  18, -25,  12,
392      19,  17,  45,  14,  17,   0,  17, -30,   1, -22,
393     -10, -25, -12, -38, -18,   3, -22,   4,   3,   0,
394      13,  -3,  10, -11,  23,   2, -10,   7,   5,   7,
395     }, {
396       5,  29,  -9,  11,  15,  22,   3,   0,  18,   8,
397      -1,   6,   7, -23,   6,  -6,   5,  12,  15,  21,
398       5,   8, -17,   9, -28,   0, -11,   6,   2,  12,
399     -11,   0, -14, -13, -49, -22,  -8,  -9,   4,  -9,
400     }, {
401      27,  16, -21,  -6,  12,   3,  -9, -16,   3,  -2,
402       1,  -7,  15, -31,   7,  10,  16,   9,  27,  21,
403      11,   5, -16,  -3, -26,  -9, -24,  -7,   0,   4,
404       0,   4,  -6,  11, -32, -14, -23,   6,  -5,  -1,
405     }, {
406      -4,  20,   3,  13,   8,  28,   6,  21,  10,  16,
407      -8,   7,  12,  -3, -11,  -7,  -5,   0,   4,   8,
408      -4,  -8, -18,  -3, -41,   0, -22,   2,   0,   4,
409      -5, -25,  -6, -14, -25,   1,   2,   4,  29,   2,
410     }, {
411      17,   8,  -8,  -4,   4,  10,  -6,   5,  -4,   5,
412      -6,  -6,  20, -10,  -9,   9,   4,  -2,  16,   7,
413       1, -12, -17, -16, -39,  -9, -36, -12,  -2,  -3,
414       6, -21,   1,  11,  -7,  10, -11,  20,  20,  11,
415     }, {
416      13,  27,  -3,  24,  -1,  19, -14,   3,   9,  20,
417      12,  33,  29,  -3,  15, -20,   9,  -9,  11,   3,
418      16,   2,  -2,   2,  -7,  -3, -20,   0,  10,  -7,
419      -7,  22,  -7, -13, -33, -23, -14, -18,  -7, -12,
420     }, {
421      35,  15, -15,   6,  -4,   1, -27, -12,  -5,   8,
422      15,  19,  37, -11,  16,  -2,  20, -12,  23,   2,
423      22,  -1,  -1, -11,  -5, -13, -34, -14,   8, -14,
424       4,  26,   0,  11, -16, -14, -29,  -2, -17,  -3,
425     }, {
426       3,  19,   9,  26,  -8,  26, -10,  24,   0,  28,
427       5,  33,  34,  17,  -2, -20,  -1, -22,   0, -10,
428       6, -14,  -3, -10, -20,  -4, -32,  -4,   7, -15,
429       0,  -3,   0, -13,  -9,   0,  -3,  -4,  17,   0,
430     }, {
431      25,   7,  -2,   8, -12,   7, -23,   8, -13,  16,
432       7,  20,  42,   9,   0,  -3,   9, -25,  12, -10,
433      12, -18,  -2, -24, -19, -13, -46, -19,   5, -22,
434      10,   0,   8,  11,   8,   9, -17,  11,   7,   8,
435     }, {
436     -25,  -7,   2,  -8,  12,  -7,  23,  -8,  13, -16,
437      -7, -20, -42,  -9,   0,   3,  -9,  25, -12,  10,
438     -12,  18,   2,  24,  19,  13,  46,  19,  -5,  22,
439     -10,   0,  -8, -11,  -8,  -9,  17, -11,  -7,  -8,
440     }, {
441      -3, -19,  -9, -26,   8, -26,  10, -24,   0, -28,
442      -5, -33, -34, -17,   2,  20,   1,  22,   0,  10,
443      -6,  14,   3,  10,  20,   4,  32,   4,  -7,  15,
444       0,   3,   0,  13,   9,   0,   3,   4, -17,   0,
445     }, {
446     -35, -15,  15,  -6,   4,  -1,  27,  12,   5,  -8,
447     -15, -19, -37,  11, -16,   2, -20,  12, -23,  -2,
448     -22,   1,   1,  11,   5,  13,  34,  14,  -8,  14,
449      -4, -26,   0, -11,  16,  14,  29,   2,  17,   3,
450     }, {
451     -13, -27,   3, -24,   1, -19,  14,  -3,  -9, -20,
452     -12, -33, -29,   3, -15,  20,  -9,   9, -11,  -3,
453     -16,  -2,   2,  -2,   7,   3,  20,   0, -10,   7,
454       7, -22,   7,  13,  33,  23,  14,  18,   7,  12,
455     }, {
456     -17,  -8,   8,   4,  -4, -10,   6,  -5,   4,  -5,
457       6,   6, -20,  10,   9,  -9,  -4,   2, -16,  -7,
458      -1,  12,  17,  16,  39,   9,  36,  12,   2,   3,
459      -6,  21,  -1, -11,   7, -10,  11, -20, -20, -11,
460     }, {
461       4, -20,  -3, -13,  -8, -28,  -6, -21, -10, -16,
462       8,  -7, -12,   3,  11,   7,   5,   0,  -4,  -8,
463       4,   8,  18,   3,  41,   0,  22,  -2,   0,  -4,
464       5,  25,   6,  14,  25,  -1,  -2,  -4, -29,  -2,
465     }, {
466     -27, -16,  21,   6, -12,  -3,   9,  16,  -3,   2,
467      -1,   7, -15,  31,  -7, -10, -16,  -9, -27, -21,
468     -11,  -5,  16,   3,  26,   9,  24,   7,   0,  -4,
469       0,  -4,   6, -11,  32,  14,  23,  -6,   5,   1,
470     }, {
471      -5, -29,   9, -11, -15, -22,  -3,   0, -18,  -8,
472       1,  -6,  -7,  23,  -6,   6,  -5, -12, -15, -21,
473      -5,  -8,  17,  -9,  28,   0,  11,  -6,  -2, -12,
474      11,   0,  14,  13,  49,  22,   8,   9,  -4,   9,
475     }, {
476     -37,  12,   9,   7,  17,  11,  26, -18,  25, -12,
477     -19, -17, -45, -14, -17,   0, -17,  30,  -1,  22,
478      10,  25,  12,  38,  18,  -3,  22,  -4,  -3,   0,
479     -13,   3, -10,  11, -23,  -2,  10,  -7,  -5,  -7,
480     }, {
481     -15,   0,  -2, -10,  13,  -7,  14, -35,  10, -23,
482     -16, -31, -37, -21, -16,  17,  -6,  26,  10,  21,
483      16,  21,  13,  25,  19, -13,   8, -19,  -5,  -7,
484      -1,   8,  -2,  36,  -5,   6,  -3,   8, -15,   1,
485     }, {
486     -48,   4,  23,   9,   9,  17,  30,   2,  16,  -3,
487     -26, -16, -40,   6, -35,  -1, -28,  17, -12,   9,
488       0,   8,  11,  25,   5,  -3,  10,  -8,  -6,  -7,
489      -6, -22,  -1,  11,   1,  21,  22,   7,  19,   5,
490     }, {
491     -26,  -7,  11,  -8,   5,  -1,  17, -14,   1, -15,
492     -24, -30, -32,  -1, -33,  16, -18,  14,   0,   8,
493       6,   4,  12,  12,   6, -13,  -2, -23,  -8, -15,
494       4, -17,   5,  36,  18,  30,   8,  22,  10,  14,
495     }, {
496     -30,  11,  15,  20,   0,   8,   9, -15,  15,   0,
497      -5,   9, -23,   6,  -8, -13, -13,   7,  -5,   3,
498      20,  19,  27,  31,  39,  -7,  13, -11,   4, -19,
499      -8,  25,  -3,  11,  -7,  -2,   4, -16, -18,  -9,
500     }, {
501      -8,  -1,   3,   2,  -3, -10,  -3, -32,   1, -12,
502      -2,  -4, -15,  -1,  -7,   3,  -2,   4,   6,   3,
503      26,  15,  29,  17,  40, -17,   0, -26,   2, -27,
504       2,  29,   4,  36,  10,   6,  -9,   0, -27,   0,
505     }, {
506     -40,   2,  29,  22,  -7,  14,  12,   5,   7,   7,
507     -12,   9, -18,  26, -26, -14, -24,  -4, -16,  -9,
508      10,   2,  26,  18,  26,  -7,   1, -15,   1, -27,
509      -2,   0,   4,  11,  17,  21,  16,  -1,   7,   3,
510     }, {
511     -18,  -9,  17,   4, -11,  -3,   0, -11,  -7,  -4,
512     -10,  -3, -10,  18, -24,   3, -14,  -7,  -4, -10,
513      16,  -1,  27,   4,  27, -17, -12, -30,   0, -35,
514       9,   3,  12,  36,  35,  30,   2,  13,  -2,  11,
515     }, {
516     -66,  -8, -23, -11,  14,   5,  17,  16,  19,   2,
517       3,  -5, -18, -17,  10,   0,  -1,  23,  -6,  20,
518     -15,  18, -14,  22,   5,  10,  44,  23,   2,  26,
519      -9,   3,  -4, -14, -12, -29,  -7, -16,  -7, -18,
520     }, {
521     -44, -20, -34, -29,  10, -13,   4,   0,   4,  -9,
522       5, -19, -10, -24,  11,  17,   8,  20,   5,  19,
523      -9,  14, -12,   9,   6,   0,  30,   9,   0,  19,
524       2,   7,   2,  10,   5, -20, -21,  -1, -17,  -9,
525     }, {
526     -77, -16,  -9,  -9,   6,  11,  21,  37,  10,  10,
527      -4,  -5, -13,   3,  -7,   0, -13,  11, -17,   6,
528     -25,   1, -15,   9,  -7,   9,  32,  19,   0,  18,
529      -2, -22,   3, -15,  12,  -5,   4,  -2,  17,  -5,
530     }, {
531     -55, -28, -21, -27,   2,  -7,   8,  20,  -4,  -1,
532      -1, -18,  -5,  -4,  -5,  16,  -2,   8,  -5,   5,
533     -19,  -2, -14,  -3,  -6,   0,  18,   4,  -2,  11,
534       8, -18,  11,  10,  29,   3, -10,  13,   8,   3,
535     }, {
536     -58,  -9, -16,   1,  -2,   2,   0,  19,  10,  13,
537      17,  21,   3,   3,  19, -12,   2,   0, -10,   1,
538      -5,  12,   0,  15,  26,   5,  34,  16,  11,   7,
539      -4,  25,   2, -14,   3, -29, -13, -25, -20, -20,
540     }, {
541     -36, -21, -28, -16,  -6, -16, -12,   2,  -4,   2,
542      20,   7,  11,  -4,  20,   4,  12,  -2,   1,   0,
543       0,   8,   2,   2,  27,  -4,  21,   2,   9,   0,
544       6,  29,   9,  10,  21, -21, -28, -10, -29, -11,
545     }, {
546     -69, -17,  -3,   3, -10,   8,   3,  40,   1,  21,
547      10,  21,   8,  23,   1, -13,  -8, -11, -21, -11,
548     -15,  -4,   0,   2,  13,   5,  23,  12,   7,   0,
549       1,   0,  10, -14,  28,  -5,  -1, -11,   5,  -7,
550     }, {
551     -47, -30, -15, -14, -14,  -9,  -9,  23, -13,  10,
552      12,   7,  16,  15,   3,   3,   1, -14,  -9, -12,
553      -9,  -8,   0, -10,  14,  -4,   9,  -2,   5,  -8,
554      13,   3,  18,  10,  45,   3, -16,   4,  -4,   0,
555     }, {
556     -79,  11, -15,   4,  18,  23,  20,   5,  30,   7,
557      -7,  -2, -21, -21,  -8,  -3, -10,  28,   4,  31,
558       6,  25,  -3,  37,   4,  -7,  20,   0,   4,   4,
559     -11,   7,  -6,   8, -27, -22, -14, -12,  -5, -16,
560     }, {
561     -57,   0, -27, -13,  14,   5,   7, -11,  15,  -4,
562      -5, -16, -13, -29,  -6,  13,   0,  25,  16,  31,
563      12,  22,  -2,  23,   6, -16,   7, -14,   2,  -3,
564       0,  12,   0,  33,  -9, -13, -28,   3, -14,  -7,
565     }, {
566     -90,   3,  -2,   6,  10,  29,  24,  26,  21,  15,
567     -15,  -2, -16,  -1, -25,  -4, -21,  16,  -6,  18,
568      -3,   8,  -5,  24,  -8,  -7,   9,  -4,   1,  -3,
569      -5, -18,   1,   7,  -2,   1,  -2,   1,  19,  -3,
570     }, {
571     -67,  -8, -14, -11,   7,  11,  11,   9,   7,   3,
572     -13, -16,  -8,  -9, -24,  12, -10,  13,   5,  17,
573       2,   4,  -3,  10,  -6, -17,  -4, -19,   0, -11,
574       6, -13,   9,  33,  14,  10, -16,  17,  10,   4,
575     }, {
576     -71,  10,  -9,  17,   1,  20,   3,   8,  21,  18,
577       6,  24,   0,  -1,   0, -16,  -6,   5,   0,  13,
578      17,  19,  11,  29,  25, -11,  11,  -6,  13, -15,
579      -7,  29,   0,   8, -11, -22, -20, -21, -17, -18,
580     }, {
581     -49,  -2, -21,   0,  -1,   2,  -9,  -8,   6,   6,
582       8,  10,   8,  -9,   2,   0,   4,   2,  13,  12,
583      23,  15,  12,  16,  26, -21,  -2, -21,  11, -23,
584       4,  33,   7,  33,   6, -13, -34,  -5, -27, -10,
585     }, {
586     -82,   1,   4,  19,  -6,  27,   6,  29,  12,  26,
587      -1,  24,   5,  18, -17, -17, -17,  -6, -10,   0,
588       7,   2,   9,  16,  12, -11,   0, -11,   9, -23,
589       0,   3,   8,   8,  13,   1,  -8,  -7,   7,  -6,
590     }, {
591     -60, -10,  -7,   1,  -9,   8,  -6,  13,  -2,  15,
592       1,  10,  13,  11, -15,   0,  -6,  -9,   1,   0,
593      13,  -1,  11,   3,  13, -21, -13, -26,   7, -31,
594      10,   7,  16,  33,  31,  10, -22,   8,  -1,   2,
595     }, {
596      -3,   7,  -5,  -5,   8,  -2,  17,  -9,  18, -24,
597      -2, -19, -10,  -4,  28,  17,   5,  28,  -2,   7,
598      -4,  15,   7,   8,   6,  23,  13,  21, -14,  20,
599     -17, -18, -11, -33, -30, -11,  23, -13,  -5,  -9,
600     }, {
601      18,  -4, -17, -23,   4, -20,   4, -26,   3, -36,
602       0, -32,  -2, -12,  29,  34,  16,  24,  10,   6,
603       0,  12,   8,  -4,   8,  13,   0,   6, -16,  12,
604      -5, -13,  -3,  -7, -13,  -3,   8,   2, -14,   0,
605     }, {
606     -13,   0,   8,  -3,   0,   4,  21,  11,   9, -16,
607     -10, -18,  -5,  16,  10,  16,  -5,  15, -13,  -5,
608     -15,  -1,   6,  -4,  -6,  23,   2,  16, -17,  12,
609     -10, -44,  -3, -33,  -6,  12,  34,   1,  20,   3,
610     }, {
611       8, -12,  -3, -21,  -3, -14,   8,  -5,  -4, -28,
612      -7, -32,   2,   8,  12,  34,   4,  12,  -1,  -6,
613      -9,  -4,   7, -17,  -4,  13, -11,   1, -19,   4,
614       0, -39,   4,  -7,  11,  21,  20,  16,  10,  11,
615     }, {
616       4,   6,   0,   7,  -8,  -4,   0,  -6,   9, -13,
617      11,   7,  11,  15,  37,   4,   9,   5,  -5, -11,
618       5,   9,  22,   1,  27,  18,   4,  14,  -5,   0,
619     -12,   3,  -4, -32, -14, -12,  17, -22, -17, -11,
620     }, {
621      26,  -6, -11, -10, -12, -23, -12, -23,  -5, -24,
622      13,  -5,  19,   8,  38,  21,  20,   2,   6, -12,
623      11,   5,  23, -11,  29,   9,  -9,   0,  -7,  -6,
624      -1,   7,   2,  -7,   3,  -3,   2,  -6, -27,  -3,
625     }, {
626      -6,  -2,  14,   9, -16,   1,   3,  14,   0,  -5,
627       3,   8,  16,  36,  19,   3,  -1,  -6, -17, -24,
628      -4,  -7,  21, -11,  14,  18,  -7,   9,  -9,  -7,
629      -6, -22,   3, -33,  10,  11,  28,  -7,   7,   0,
630     }, {
631      16, -14,   2,  -8, -20, -17,  -9,  -2, -14, -16,
632       6,  -5,  24,  28,  21,  20,   8,  -9,  -4, -25,
633       1, -11,  22, -24,  15,   8, -21,  -5, -11, -14,
634       5, -18,  11,  -7,  27,  20,  14,   7,  -1,   9,
635     }, {
636     -16,  27,   2,  10,  13,  16,  20, -20,  29, -20,
637     -14, -16, -13,  -8,   9,  13,  -2,  33,   9,  19,
638      17,  23,  17,  22,   6,   6,  -9,  -2, -12,  -2,
639     -20, -13, -13, -10, -45,  -4,  16,  -8,  -2,  -7,
640     }, {
641       5,  15,  -9,  -7,   9,  -2,   8, -37,  14, -31,
642     -11, -29,  -5, -16,  11,  30,   7,  29,  21,  18,
643      23,  19,  18,   9,   7,  -3, -23, -17, -14,  -9,
644      -8,  -9,  -6,  15, -27,   4,   2,   6, -12,   1,
645     }, {
646     -26,  19,  15,  12,   5,  22,  24,   0,  21, -12,
647     -21, -15,  -8,  11,  -7,  12, -14,  20,  -2,   6,
648       7,   6,  16,   9,  -6,   5, -21,  -7, -15, -10,
649     -13, -39,  -5, -10, -20,  19,  28,   5,  22,   5,
650     }, {
651      -4,   6,   3,  -5,   1,   4,  11, -16,   6, -23,
652     -19, -29,   0,   3,  -6,  30,  -3,  17,  10,   5,
653      13,   2,  17,  -3,  -5,  -3, -35, -21, -17, -17,
654      -2, -35,   2,  15,  -3,  28,  13,  21,  13,  13,
655     }, {
656      -8,  25,   8,  23,  -3,  13,   3, -17,  20,  -8,
657       0,  10,   8,  11,  18,   0,   1,  10,   5,   0,
658      28,  17,  32,  15,  26,   1, -19,  -9,  -3, -21,
659     -15,   7,  -6,  -9, -29,  -5,  10, -17, -15,  -9,
660     }, {
661      13,  13,  -3,   5,  -7,  -4,  -9, -34,   5, -20,
662       2,  -3,  16,   3,  20,  17,  11,   7,  17,   0,
663      34,  13,  33,   2,  28,  -8, -32, -24,  -5, -29,
664      -3,  12,   0,  15, -11,   3,  -3,  -2, -24,  -1,
665     }, {
666     -18,  17,  21,  25, -11,  19,   6,   3,  11,   0,
667      -7,  11,  13,  31,   1,   0,  -9,  -1,  -5, -12,
668      18,   0,  31,   2,  13,   1, -30, -14,  -7, -29,
669      -9, -18,   1, -10,  -4,  18,  22,  -3,  10,   2,
670     }, {
671       3,   5,   9,   7, -15,   1,  -5, -13,  -2, -12,
672      -5,  -2,  21,  23,   2,  16,   0,  -5,   6, -13,
673      23,  -3,  32, -10,  15,  -8, -44, -28,  -9, -37,
674       2, -13,   9,  15,  12,  27,   7,  12,   0,  11,
675     }, {
676     -44,   6, -30,  -8,   9,  10,  11,  14,  23,  -5,
677       8,  -4,  14, -12,  37,  14,  12,  26,   4,  16,
678      -8,  16,  -9,   7,  -6,  19,  12,  25,  -5,  24,
679     -15, -13,  -8, -36, -34, -31,  -1, -18,  -4, -18,
680     }, {
681     -22,  -5, -42, -26,   6,  -8,  -1,  -2,   9, -17,
682      10, -18,  21, -19,  39,  31,  23,  23,  16,  15,
683      -2,  12,  -7,  -6,  -5,   9,  -1,  10,  -7,  16,
684      -4,  -9,   0, -10, -17, -22, -16,  -2, -14,  -9,
685     }, {
686     -55,  -1, -17,  -6,   1,  16,  15,  35,  15,   2,
687       0,  -4,  19,   8,  20,  13,   1,  14,  -7,   3,
688     -18,   0, -10,  -5, -19,  19,   0,  21,  -8,  16,
689      -9, -39,   0, -36, -10,  -7,   9,  -4,  20,  -5,
690     }, {
691     -33, -13, -29, -24,  -1,  -1,   2,  18,   0,  -9,
692       3, -17,  27,   0,  21,  30,  12,  11,   5,   2,
693     -12,  -4,  -9, -19, -18,   9, -13,   6, -11,   8,
694       2, -35,   8, -10,   7,   1,  -4,  11,  10,   2,
695     }, {
696     -36,   5, -24,   4,  -7,   7,  -6,  17,  14,   5,
697      22,  22,  35,   8,  46,   1,  17,   3,   0,  -2,
698       2,  10,   5,   0,  14,  15,   2,  18,   2,   4,
699     -11,   7,  -1, -36, -18, -32,  -7, -27, -17, -20,
700     }, {
701     -14,  -7, -36, -13, -10, -10, -18,   0,   0,  -5,
702      25,   8,  43,   0,  48,  18,  27,   0,  12,  -3,
703       7,   6,   7, -13,  15,   5, -11,   3,   0,  -2,
704       0,  12,   6, -10,   0, -23, -22, -11, -26, -12,
705     }, {
706     -47,  -3, -11,   6, -15,  13,  -2,  38,   6,  13,
707      15,  22,  40,  28,  28,   0,   5,  -8, -10, -15,
708      -7,  -7,   4, -13,   1,  14,  -9,  14,   0,  -2,
709      -4, -18,   7, -36,   6,  -8,   3, -13,   7,  -8,
710     }, {
711     -25, -15, -22, -11, -18,  -4, -15,  22,  -8,   2,
712      17,   9,  48,  20,  30,  17,  16, -11,   1, -16,
713      -2, -10,   5, -26,   2,   4, -22,   0,  -2, -10,
714       6, -13,  14, -10,  23,   0, -10,   2,  -1,   0,
715     }, {
716     -57,  26, -22,   7,  14,  28,  14,   3,  35,   0,
717      -3,  -1,  11, -16,  18,  10,   4,  31,  15,  28,
718      14,  23,   1,  21,  -7,   2, -11,   1,  -3,   1,
719     -18,  -9, -10, -13, -49, -24,  -8, -14,  -2, -16,
720     }, {
721     -35,  14, -34, -10,  10,  10,   1, -12,  20, -12,
722       0, -15,  18, -24,  20,  27,  14,  28,  27,  27,
723      20,  19,   2,   8,  -5,  -7, -25, -13,  -5,  -5,
724      -6,  -5,  -2,  12, -31, -15, -23,   1, -12,  -8,
725     }, {
726     -68,  18,  -9,   9,   6,  35,  18,  25,  26,   7,
727     -10,  -1,  16,   3,   1,   9,  -6,  19,   4,  15,
728       4,   6,   0,   8, -20,   2, -23,  -2,  -7,  -5,
729     -12, -35,  -1, -13, -24,   0,   3,   0,  22,  -4,
730     }, {
731     -46,   6, -21,  -8,   2,  16,   5,   8,  11,  -4,
732      -8, -15,  24,  -4,   2,  26,   3,  16,  16,  14,
733       9,   2,   1,  -4, -19,  -7, -36, -17,  -9, -13,
734       0, -31,   5,  12,  -7,   8, -11,  15,  13,   4,
735     }, {
736     -49,  24, -16,  20,  -2,  26,  -2,   7,  25,  10,
737      11,  25,  32,   3,  27,  -2,   8,   8,  11,   9,
738      24,  17,  16,  14,  13,  -2, -20,  -5,   4, -17,
739     -14,  12,  -3, -13, -33, -25, -14, -23, -15, -19,
740     }, {
741     -27,  12, -28,   2,  -6,   7, -15,  -9,  11,  -1,
742      13,  11,  40,  -4,  29,  14,  19,   5,  23,   8,
743      30,  13,  17,   0,  14, -12, -34, -20,   2, -25,
744      -2,  16,   4,  12, -15, -16, -29,  -7, -24, -10,
745     }, {
746     -60,  16,  -3,  22, -10,  32,   0,  28,  17,  18,
747       3,  25,  37,  23,  10,  -3,  -2,  -3,   0,  -3,
748      14,   0,  14,   1,   0,  -2, -32,  -9,   1, -25,
749      -7, -13,   5, -13,  -8,  -1,  -2,  -8,  10,  -6,
750     }, {
751     -38,   4, -15,   4, -14,  13, -12,  11,   2,   6,
752       6,  11,  45,  16,  11,  13,   7,  -6,  12,  -4,
753      20,  -3,  16, -12,   1, -12, -46, -24,   0, -33,
754       3,  -9,  12,  12,   8,   7, -17,   6,   0,   2
755     }
756 };
757 
758 const int8_t ff_cb2_vects[128][40]={
759     {
760      73, -32, -60, -15, -26,  59,   2, -33,  30, -10,
761      -3, -17,   8,  30,  -1, -26,  -4, -22,  10,  16,
762     -36,  -5, -11,  56,  37,   6, -10,  -5, -13,  -3,
763       6,  -5,  11,   4, -19,  -5, -16,  41,  24,  13,
764     }, {
765       4, -11, -37,  23,  -5,  46,  -2, -29,  -5, -39,
766     -21,  -9,   0,  49,  12,  -9, -16, -26,  22,  15,
767     -45, -20,  -5,  40,  22,  17, -26,  31, -14,   2,
768     -14,  10,  30,  20, -27,  -9, -39,  39,  18,   5,
769     }, {
770      34, -25, -48, -28, -11,  34,  -2, -41,   9,  -7,
771     -17,  21,  20,  24, -17, -33,   0, -24,  10,  42,
772       3,  -5,  10,  42,  11,   8,  -3,   3,  16,   9,
773      22,  -2,   0, -33, -10,  18,   7,  58,  10,  28,
774     }, {
775     -34,  -4, -25,  10,   9,  21,  -7, -36, -26, -36,
776     -35,  28,  12,  42,  -3, -16, -12, -28,  21,  42,
777      -5, -21,  16,  26,  -4,  19, -19,  39,  15,  15,
778       1,  13,  19, -17, -17,  14, -15,  55,   4,  19,
779     }, {
780      28, -20, -51, -14,  -6,   7,   0, -26,  27,  -4,
781      18, -40,  -6,  16,  -1, -15,   0, -55,  -5, -16,
782     -19,  14,  -3,  49,  14,   1, -22, -30, -12,   0,
783      24,  15,   9, -17, -45, -29,   4,  28,  51,  35,
784     }, {
785     -40,   0, -28,  24,  14,  -5,  -4, -21,  -7, -33,
786       0, -32, -15,  35,  12,   1, -11, -58,   5, -16,
787     -28,   0,   1,  33,   0,  11, -39,   5, -14,   6,
788       3,  31,  28,  -1, -53, -33, -19,  25,  46,  26,
789     }, {
790     -11, -14, -39, -27,   9, -17,  -4, -33,   6,   0,
791       4,  -1,   5,  10, -17, -22,   5, -57,  -5,   9,
792      20,  13,  18,  35, -11,   3, -16, -22,  17,  13,
793      40,  19,  -1, -55, -35,  -5,  27,  44,  37,  49,
794     }, {
795     -80,   6, -16,  11,  30, -30,  -9, -28, -28, -29,
796     -13,   6,  -2,  28,  -3,  -5,  -7, -60,   5,   9,
797      11,  -1,  24,  19, -27,  13, -32,  13,  15,  19,
798      19,  35,  17, -39, -43,  -9,   4,  42,  32,  41,
799     }, {
800      78, -21, -43,   4, -38,  17,  17,  -5,  55,  24,
801     -15, -36,  14,   4,  24, -24,  12,   5,  17,  31,
802     -54,  -5,  -2,  27,  43, -12,   2,   9,  -9, -15,
803      22,  -3,  28,  21, -20,   3,  20,  28,   9,  -5,
804     }, {
805       9,  -1, -20,  43, -17,   3,  12,   0,  20,  -4,
806     -33, -29,   6,  22,  38,  -7,   0,   1,  29,  30,
807     -63, -21,   3,  11,  27,  -1, -14,  45, -10,  -9,
808       1,  12,  47,  37, -28,   0,  -2,  26,   4, -13,
809     }, {
810      39, -14, -30,  -8, -22,  -8,  12, -12,  34,  27,
811     -29,   2,  26,  -2,   8, -31,  16,   3,  17,  57,
812     -14,  -6,  19,  13,  16, -10,   8,  17,  20,  -2,
813      38,   0,  17, -16, -11,  27,  44,  45,  -4,   8,
814     }, {
815     -29,   5,  -7,  30,  -1, -21,   7,  -7,   0,   0,
816     -47,   9,  18,  15,  22, -14,   4,   0,  28,  57,
817     -23, -21,  25,  -2,   1,   0,  -7,  53,  19,   3,
818      17,  15,  36,   0, -19,  24,  21,  43,  -9,   0,
819     }, {
820      33, -10, -34,   5, -17, -35,  15,   1,  53,  30,
821       6, -59,   0, -10,  24, -13,  17, -27,   1,  -1,
822     -37,  13,   4,  20,  20, -18, -10, -16,  -8, -11,
823      39,  18,  26,   0, -46, -20,  41,  15,  37,  15,
824     }, {
825     -35,  10, -11,  44,   3, -48,  10,   6,  17,   2,
826     -11, -51,  -8,   8,  38,   3,   4, -31,  12,  -2,
827     -46,  -1,  10,   4,   5,  -7, -26,  19, -10,  -5,
828      18,  34,  45,  15, -54, -24,  18,  13,  31,   7,
829     }, {
830      -5,  -3, -21,  -7,  -2, -60,  10,  -5,  32,  34,
831      -7, -20,  11, -16,   8, -20,  21, -29,   1,  24,
832       2,  13,  27,   6,  -5, -15,  -3,  -8,  21,   1,
833      55,  21,  15, -38, -37,   3,  65,  32,  23,  30,
834     }, {
835     -74,  17,   0,  31,  18, -73,   5,   0,  -3,   5,
836     -25, -12,   3,   1,  22,  -3,   9, -33,  12,  24,
837      -6,  -2,  33,  -9, -21,  -5, -20,  27,  19,   7,
838      34,  37,  34, -22, -44,   0,  41,  29,  17,  21,
839     }, {
840      76, -35, -31, -28, -49,  43, -40,   0,  29, -14,
841       8,   5,  10,  18, -26, -46,   0,   7,   6,   3,
842     -25,  -7,  -2,  40,  28,  14,  18,  -3, -27, -28,
843      -8, -45, -13,  34, -13, -27, -15,  31,  12,   3,
844     }, {
845       7, -15,  -9,   9, -28,  29, -45,   5,  -6, -43,
846      -9,  12,   2,  36, -12, -30, -11,   3,  17,   3,
847     -34, -22,   3,  24,  12,  24,   2,  32, -28, -22,
848     -29, -29,   5,  50, -21, -31, -38,  29,   7,  -5,
849     }, {
850      36, -29, -19, -41, -34,  18, -45,  -6,   8, -10,
851      -5,  43,  23,  11, -42, -53,   5,   5,   6,  30,
852      14,  -8,  20,  26,   1,  16,  25,   4,   3, -15,
853       7, -41, -23,  -3,  -4,  -3,   8,  48,  -1,  17,
854     }, {
855     -32,  -8,   3,  -2, -13,   4, -50,  -1, -27, -39,
856     -23,  51,  15,  30, -27, -37,  -7,   1,  17,  29,
857       5, -23,  25,  10, -14,  26,   8,  41,   1,  -9,
858     -13, -26,  -5,  12, -12,  -7, -14,  45,  -6,   9,
859     }, {
860      31, -24, -23, -27, -29,  -9, -43,   8,  26,  -7,
861      30, -17,  -4,   3, -26, -35,   5, -24, -10, -28,
862      -9,  12,   5,  33,   5,   8,   5, -29, -26, -24,
863       9, -23, -14,  12, -39, -52,   5,  18,  39,  24,
864     }, {
865     -37,  -3,   0,  10,  -7, -22, -48,  12,  -8, -36,
866      12,  -9, -12,  22, -12, -19,  -6, -28,   0, -29,
867     -18,  -3,  11,  17, -10,  18, -10,   7, -27, -18,
868     -11,  -7,   3,  28, -47, -55, -18,  15,  34,  16,
869     }, {
870      -8, -17, -10, -40, -13, -34, -47,   0,   5,  -4,
871      16,  21,   8,  -2, -42, -43,  10, -26, -10,  -2,
872      31,  11,  27,  19, -21,  10,  12, -20,   3, -11,
873      25, -20, -25, -25, -29, -28,  28,  34,  25,  38,
874     }, {
875     -77,   2,  11,  -1,   7, -47, -52,   5, -29, -33,
876      -1,  28,   0,  15, -28, -26,  -2, -30,   0,  -2,
877      22,  -4,  33,   3, -36,  21,  -3,  15,   2,  -5,
878       4,  -4,  -6,  -9, -37, -31,   5,  32,  20,  30,
879     }, {
880      81, -25, -14,  -8, -61,   0, -25,  28,  54,  20,
881      -3, -14,  17,  -8,   0, -44,  16,  35,  13,  18,
882     -43,  -7,   6,  11,  33,  -4,  30,  11, -22, -40,
883       6, -43,   3,  50, -14, -18,  22,  18,  -1, -16,
884     }, {
885      12,  -4,   8,  29, -39, -12, -30,  33,  19,  -8,
886     -21,  -6,   8,   9,  13, -28,   4,  31,  24,  18,
887     -52, -23,  12,  -4,  18,   5,  14,  47, -24, -34,
888     -14, -27,  22,  66, -22, -22,  -1,  16,  -6, -24,
889     }, {
890      41, -18,  -2, -21, -45, -24, -30,  21,  33,  24,
891     -17,  24,  29, -15, -16, -51,  21,  33,  13,  45,
892      -3,  -8,  28,  -2,   7,  -2,  37,  19,   7, -27,
893      22, -39,  -7,  12,  -5,   5,  45,  35, -15,  -1,
894     }, {
895     -27,   1,  20,  17, -24, -38, -35,  26,  -1,  -4,
896     -35,  32,  21,   3,  -2, -35,   8,  29,  24,  44,
897     -12, -24,  34, -18,  -8,   7,  21,  55,   5, -21,
898       2, -23,  11,  28, -13,   1,  22,  33, -21, -10,
899     }, {
900      36, -13,  -5,  -7, -40, -51, -28,  36,  52,  27,
901      18, -36,   2, -22,   0, -33,  21,   2,  -3, -13,
902     -26,  11,  14,   4,  10, -10,  18, -14, -22, -36,
903      24, -21,   1,  28, -40, -42,  42,   5,  25,   5,
904     }, {
905     -32,   6,  17,  31, -19, -65, -33,  41,  16,  -1,
906       0, -29,  -6,  -4,  13, -17,   9,  -1,   8, -14,
907     -35,  -3,  19, -11,  -4,   0,   1,  21, -23, -30,
908       3,  -5,  20,  44, -48, -46,  19,   3,  20,  -3,
909     }, {
910      -3,  -7,   6, -20, -25, -77, -32,  29,  31,  30,
911       4,   2,  14, -29, -16, -40,  26,   0,  -3,  12,
912      13,  10,  36,  -9, -15,  -8,  24,  -6,   7, -22,
913      40, -17,  -8,  -9, -31, -18,  66,  22,  11,  19,
914     }, {
915     -72,  13,  29,  18,  -4, -90, -37,  34,  -4,   1,
916     -13,   9,   6, -11,  -2, -24,  13,  -3,   7,  11,
917       4,  -4,  42, -25, -31,   1,   8,  29,   6, -17,
918      19,  -2,  10,   6, -38, -22,  42,  19,   6,  11,
919     }, {
920     116, -20, -68, -30, -28,  83,  28, -18,  32, -22,
921     -13, -21,   5,  28,   5,  -7, -24,  -8, -22,  17,
922     -23,  30, -25,  45,  15,  -9, -11, -18,  22, -10,
923       4,  -2,  19, -12,  23,   3, -43,   2,  12,  -4,
924     }, {
925      47,   0, -45,   7,  -7,  69,  23, -13,  -2, -51,
926     -32, -14,  -3,  47,  19,   8, -37, -11, -10,  16,
927     -32,  15, -19,  29,   0,   1, -28,  18,  20,  -4,
928     -16,  13,  38,   3,  15,   0, -66,   0,   7, -13,
929     }, {
930      77, -13, -56, -43, -13,  57,  23, -26,  11, -19,
931     -27,  16,  17,  22, -10, -15, -19, -10, -22,  43,
932      16,  30,  -2,  31, -11,  -6,  -5,  -9,  52,   2,
933      20,   0,   8, -50,  33,  27, -19,  19,  -1,   9,
934     }, {
935       8,   6, -33,  -4,   7,  44,  18, -21, -23, -48,
936     -46,  24,   9,  40,   3,   1, -32, -13, -11,  43,
937       7,  14,   3,  15, -26,   3, -21,  26,  50,   8,
938       0,  16,  27, -34,  25,  23, -43,  17,  -6,   1,
939     }, {
940      71,  -9, -59, -29,  -8,  30,  26, -11,  30, -16,
941       8, -44,  -9,  14,   5,   2, -19, -40, -38, -15,
942      -7,  50, -17,  38,  -7, -14, -24, -43,  22,  -6,
943      22,  19,  17, -34,  -2, -20, -23, -10,  39,  16,
944     }, {
945       2,  11, -36,   9,  13,  17,  21,  -6,  -5, -45,
946     -10, -36, -18,  33,  19,  19, -31, -44, -27, -15,
947     -16,  34, -11,  22, -22,  -4, -40,  -7,  21,   0,
948       1,  35,  36, -18, -10, -24, -46, -12,  34,   8,
949     }, {
950      32,  -2, -47, -42,   7,   5,  21, -18,   9, -12,
951      -5,  -5,   2,   8, -10,  -4, -14, -42, -38,  10,
952      33,  49,   5,  24, -33, -12, -17, -35,  52,   6,
953      38,  22,   7, -72,   7,   3,   0,   6,  25,  30,
954     }, {
955     -36,  18, -24,  -3,  28,  -7,  16, -13, -26, -41,
956     -24,   1,  -5,  26,   3,  12, -27, -46, -27,  10,
957      24,  34,  10,   8, -49,  -2, -34,   0,  51,  12,
958      17,  38,  25, -56,   0,   0, -22,   3,  20,  22,
959     }, {
960     121,  -9, -50, -10, -40,  40,  43,   9,  58,  12,
961     -25, -41,  11,   2,  31,  -5,  -8,  19, -15,  32,
962     -41,  30, -16,  16,  20, -28,   0,  -3,  26, -22,
963      19,   0,  36,   4,  22,  12,  -6,  -9,  -1, -24,
964     }, {
965      52,  10, -27,  27, -18,  26,  38,  14,  23, -16,
966     -44, -33,   3,  20,  45,  10, -20,  15,  -3,  31,
967     -50,  14, -10,   0,   5, -17, -15,  32,  24, -16,
968      -1,  15,  55,  20,  14,   8, -29, -12,  -7, -32,
969     }, {
970      82,  -3, -38, -23, -24,  15,  38,   2,  37,  15,
971     -39,  -2,  23,  -4,  15, -12,  -3,  17, -15,  58,
972      -1,  29,   6,   2,  -5, -26,   7,   4,  56,  -9,
973      35,   3,  25, -33,  32,  36,  17,   7, -15,  -9,
974     }, {
975      13,  17, -15,  15,  -3,   1,  33,   7,   1, -12,
976     -58,   5,  15,  13,  29,   3, -16,  13,  -4,  57,
977     -10,  13,  11, -13, -21, -15,  -9,  40,  55,  -3,
978      14,  19,  44, -17,  24,  32,  -5,   4, -21, -18,
979     }, {
980      76,   1, -41,  -9, -19, -12,  41,  17,  55,  18,
981      -3, -63,  -3, -12,  30,   5,  -3, -12, -31,   0,
982     -24,  49,  -8,   9,  -1, -33, -12, -29,  27, -18,
983      37,  21,  34, -17,  -3, -11,  14, -23,  25,  -2,
984     }, {
985       7,  22, -18,  29,   1, -25,  36,  21,  20,  -9,
986     -22, -56, -11,   6,  45,  21, -15, -16, -20,  -1,
987     -33,  34,  -2,  -6, -17, -23, -28,   6,  25, -12,
988      16,  37,  53,  -1, -11, -15,  -8, -25,  20, -11,
989     }, {
990      37,   8, -29, -22,  -4, -37,  36,   9,  34,  22,
991     -17, -24,   8, -18,  15,  -2,   1, -14, -31,  25,
992      15,  48,  13,  -4, -28, -31,  -5, -21,  57,  -4,
993      53,  24,  23, -55,   6,  12,  37,  -6,  11,  11,
994     }, {
995     -31,  28,  -6,  16,  16, -50,  31,  14,   0,  -6,
996     -36, -17,   0,   0,  29,  14, -11, -18, -20,  25,
997       6,  33,  19, -20, -43, -21, -21,  14,  55,   0,
998      32,  40,  42, -39,  -1,   8,  14,  -8,   6,   3,
999     }, {
1000     119, -24, -39, -44, -51,  66, -14,  15,  31, -26,
1001      -1,   0,   7,  16, -19, -28, -19,  22, -26,   4,
1002     -13,  28, -16,  29,   5,  -1,  16, -16,   8, -35,
1003     -10, -42,  -4,  17,  29, -19, -42,  -7,   0, -15,
1004     }, {
1005      50,  -3, -16,  -5, -30,  53, -19,  20,  -3, -55,
1006     -19,   8,   0,  34,  -5, -11, -32,  18, -15,   4,
1007     -22,  13, -10,  13,  -9,   8,   0,  19,   7, -29,
1008     -31, -26,  13,  33,  21, -22, -65,  -9,  -4, -23,
1009     }, {
1010      79, -17, -27, -56, -36,  41, -19,   8,  10, -22,
1011     -15,  39,  20,   9, -35, -35, -15,  20, -26,  31,
1012      26,  27,   6,  15, -20,   0,  23,  -8,  38, -22,
1013       5, -38, -15, -20,  39,   4, -18,   9, -13,  -1,
1014     }, {
1015      10,   3,  -4, -18, -15,  27, -24,  13, -24, -51,
1016     -34,  47,  12,  28, -21, -19, -27,  16, -15,  30,
1017      17,  12,  12,   0, -36,  10,   7,  27,  37, -16,
1018     -15, -22,   3,  -4,  31,   1, -42,   7, -18,  -9,
1019     }, {
1020      74, -12, -30, -42, -30,  14, -16,  23,  29, -19,
1021      20, -21,  -7,   1, -19, -17, -14, -10, -43, -27,
1022       3,  48,  -8,  22, -16,  -7,   4, -42,   9, -31,
1023       6, -20,  -6,  -4,   3, -43, -22, -20,  28,   5,
1024     }, {
1025       5,   7,  -7,  -4,  -9,   0, -21,  28,  -6, -48,
1026       2, -14, -15,  20,  -5,   0, -27, -14, -32, -28,
1027      -5,  32,  -2,   6, -32,   3, -12,  -5,   8, -25,
1028     -14,  -4,  12,  11,  -4, -47, -45, -22,  22,  -2,
1029     }, {
1030      34,  -6, -18, -55, -15, -11, -21,  16,   8, -16,
1031       6,  16,   5,  -4, -35, -24, -10, -12, -43,  -1,
1032      43,  47,  14,   8, -43,  -5,  10, -34,  39, -18,
1033      22, -16, -17, -42,  13, -19,   1,  -3,  14,  20,
1034     }, {
1035     -34,  14,   4, -17,   5, -24, -26,  20, -27, -45,
1036     -12,  24,  -2,  13, -21,  -8, -22, -16, -32,  -2,
1037      34,  31,  20,  -7, -58,   5,  -5,   2,  38, -12,
1038       2,  -1,   1, -26,   5, -23, -21,  -6,   8,  11,
1039     }, {
1040     124, -13, -21, -23, -62,  23,   0,  43,  57,   8,
1041     -13, -18,  14, -10,   6, -26,  -3,  49, -19,  19,
1042     -31,  27,  -7,   0,  11, -20,  29,  -1,  12, -47,
1043       4, -39,  11,  34,  28,  -9,  -5, -19, -13, -34,
1044     }, {
1045      55,   6,   1,  14, -41,  10,  -4,  48,  22, -20,
1046     -31, -10,   5,   7,  20,  -9, -16,  45,  -8,  19,
1047     -40,  12,  -1, -15,  -4, -10,  12,  34,  11, -41,
1048     -16, -24,  30,  49,  20, -13, -28, -22, -18, -43,
1049     }, {
1050      84,  -6,  -9, -36, -47,  -1,  -4,  36,  36,  12,
1051     -27,  20,  26, -17,  -9, -33,   1,  47, -19,  46,
1052       9,  27,  15, -13, -15, -18,  35,   6,  42, -33,
1053      20, -36,   1,  -4,  38,  14,  18,  -2, -27, -20,
1054     }, {
1055      15,  13,  13,   1, -26, -14,  -9,  41,   1, -16,
1056     -46,  27,  18,   1,   4, -16, -11,  43,  -8,  45,
1057       0,  11,  21, -29, -30,  -8,  19,  42,  41, -28,
1058       0, -20,  20,  11,  30,  10,  -4,  -5, -32, -28,
1059     }, {
1060      79,  -2, -12, -22, -42, -28,  -1,  51,  54,  15,
1061       8, -41,   0, -24,   6, -15,   1,  17, -36, -12,
1062     -14,  47,   0,  -6, -11, -26,  16, -27,  13, -43,
1063      22, -18,  10,  12,   2, -34,  15, -33,  13, -13,
1064     }, {
1065      10,  18,  10,  15, -21, -41,  -6,  56,  19, -13,
1066      -9, -33,  -9,  -6,  20,   1, -11,  13, -24, -13,
1067     -23,  32,   6, -22, -26, -15,   0,   8,  12, -37,
1068       1,  -2,  28,  27,  -5, -37,  -7, -35,   8, -21,
1069     }, {
1070      39,   4,   0, -35, -27, -53,  -6,  44,  33,  18,
1071      -5,  -2,  11, -31,  -9, -22,   6,  15, -36,  13,
1072      25,  46,  23, -20, -37, -24,  23, -19,  43, -29,
1073      38, -14,   0, -26,  12, -10,  38, -16,   0,   0,
1074     }, {
1075     -29,  25,  22,   2,  -6, -67, -11,  49,  -1, -10,
1076     -24,   5,   3, -13,   4,  -5,  -6,  11, -25,  12,
1077      16,  31,  28, -36, -53, -13,   6,  16,  42, -24,
1078      17,   1,  18, -10,   4, -13,  15, -18,  -5,  -7,
1079     }, {
1080      29, -25, -22,  -2,   6,  67,  11, -49,   1,  10,
1081      24,  -5,  -3,  13,  -4,   5,   6, -11,  25, -12,
1082     -16, -31, -28,  36,  53,  13,  -6, -16, -42,  24,
1083     -17,  -1, -18,  10,  -4,  13, -15,  18,   5,   7,
1084     }, {
1085     -39,  -4,   0,  35,  27,  53,   6, -44, -33, -18,
1086       5,   2, -11,  31,   9,  22,  -6, -15,  36, -13,
1087     -25, -46, -23,  20,  37,  24, -23,  19, -43,  29,
1088     -38,  14,   0,  26, -12,  10, -38,  16,   0,   0,
1089     }, {
1090     -10, -18, -10, -15,  21,  41,   6, -56, -19,  13,
1091       9,  33,   9,   6, -20,  -1,  11, -13,  24,  13,
1092      23, -32,  -6,  22,  26,  15,   0,  -8, -12,  37,
1093      -1,   2, -28, -27,   5,  37,   7,  35,  -8,  21,
1094     }, {
1095     -79,   2,  12,  22,  42,  28,   1, -51, -54, -15,
1096      -8,  41,   0,  24,  -6,  15,  -1, -17,  36,  12,
1097      14, -47,   0,   6,  11,  26, -16,  27, -13,  43,
1098     -22,  18, -10, -12,  -2,  34, -15,  33, -13,  13,
1099     }, {
1100     -15, -13, -13,  -1,  26,  14,   9, -41,  -1,  16,
1101      46, -27, -18,  -1,  -4,  16,  11, -43,   8, -45,
1102       0, -11, -21,  29,  30,   8, -19, -42, -41,  28,
1103       0,  20, -20, -11, -30, -10,   4,   5,  32,  28,
1104     }, {
1105     -84,   6,   9,  36,  47,   1,   4, -36, -36, -12,
1106      27, -20, -26,  17,   9,  33,  -1, -47,  19, -46,
1107      -9, -27, -15,  13,  15,  18, -35,  -6, -42,  33,
1108     -20,  36,  -1,   4, -38, -14, -18,   2,  27,  20,
1109     }, {
1110     -55,  -6,  -1, -14,  41, -10,   4, -48, -22,  20,
1111      31,  10,  -5,  -7, -20,   9,  16, -45,   8, -19,
1112      40, -12,   1,  15,   4,  10, -12, -34, -11,  41,
1113      16,  24, -30, -49, -20,  13,  28,  22,  18,  43,
1114     }, {
1115    -124,  13,  21,  23,  62, -23,   0, -43, -57,  -8,
1116      13,  18, -14,  10,  -6,  26,   3, -49,  19, -19,
1117      31, -27,   7,   0, -11,  20, -29,   1, -12,  47,
1118      -4,  39, -11, -34, -28,   9,   5,  19,  13,  34,
1119     }, {
1120      34, -14,  -4,  17,  -5,  24,  26, -20,  27,  45,
1121      12, -24,   2, -13,  21,   8,  22,  16,  32,   2,
1122     -34, -31, -20,   7,  58,  -5,   5,  -2, -38,  12,
1123      -2,   1,  -1,  26,  -5,  23,  21,   6,  -8, -11,
1124     }, {
1125     -34,   6,  18,  55,  15,  11,  21, -16,  -8,  16,
1126      -6, -16,  -5,   4,  35,  24,  10,  12,  43,   1,
1127     -43, -47, -14,  -8,  43,   5, -10,  34, -39,  18,
1128     -22,  16,  17,  42, -13,  19,  -1,   3, -14, -20,
1129     }, {
1130      -5,  -7,   7,   4,   9,   0,  21, -28,   6,  48,
1131      -2,  14,  15, -20,   5,   0,  27,  14,  32,  28,
1132       5, -32,   2,  -6,  32,  -3,  12,   5,  -8,  25,
1133      14,   4, -12, -11,   4,  47,  45,  22, -22,   2,
1134     }, {
1135     -74,  12,  30,  42,  30, -14,  16, -23, -29,  19,
1136     -20,  21,   7,  -1,  19,  17,  14,  10,  43,  27,
1137      -3, -48,   8, -22,  16,   7,  -4,  42,  -9,  31,
1138      -6,  20,   6,   4,  -3,  43,  22,  20, -28,  -5,
1139     }, {
1140     -10,  -3,   4,  18,  15, -27,  24, -13,  24,  51,
1141      34, -47, -12, -28,  21,  19,  27, -16,  15, -30,
1142     -17, -12, -12,   0,  36, -10,  -7, -27, -37,  16,
1143      15,  22,  -3,   4, -31,  -1,  42,  -7,  18,   9,
1144     }, {
1145     -79,  17,  27,  56,  36, -41,  19,  -8, -10,  22,
1146      15, -39, -20,  -9,  35,  35,  15, -20,  26, -31,
1147     -26, -27,  -6, -15,  20,   0, -23,   8, -38,  22,
1148      -5,  38,  15,  20, -39,  -4,  18,  -9,  13,   1,
1149     }, {
1150     -50,   3,  16,   5,  30, -53,  19, -20,   3,  55,
1151      19,  -8,   0, -34,   5,  11,  32, -18,  15,  -4,
1152      22, -13,  10, -13,   9,  -8,   0, -19,  -7,  29,
1153      31,  26, -13, -33, -21,  22,  65,   9,   4,  23,
1154     }, {
1155    -119,  24,  39,  44,  51, -66,  14, -15, -31,  26,
1156       1,   0,  -7, -16,  19,  28,  19, -22,  26,  -4,
1157      13, -28,  16, -29,  -5,   1, -16,  16,  -8,  35,
1158      10,  42,   4, -17, -29,  19,  42,   7,   0,  15,
1159     }, {
1160      31, -28,   6, -16, -16,  50, -31, -14,   0,   6,
1161      36,  17,   0,   0, -29, -14,  11,  18,  20, -25,
1162      -6, -33, -19,  20,  43,  21,  21, -14, -55,   0,
1163     -32, -40, -42,  39,   1,  -8, -14,   8,  -6,  -3,
1164     }, {
1165     -37,  -8,  29,  22,   4,  37, -36,  -9, -34, -22,
1166      17,  24,  -8,  18, -15,   2,  -1,  14,  31, -25,
1167     -15, -48, -13,   4,  28,  31,   5,  21, -57,   4,
1168     -53, -24, -23,  55,  -6, -12, -37,   6, -11, -11,
1169     }, {
1170      -7, -22,  18, -29,  -1,  25, -36, -21, -20,   9,
1171      22,  56,  11,  -6, -45, -21,  15,  16,  20,   1,
1172      33, -34,   2,   6,  17,  23,  28,  -6, -25,  12,
1173     -16, -37, -53,   1,  11,  15,   8,  25, -20,  11,
1174     }, {
1175     -76,  -1,  41,   9,  19,  12, -41, -17, -55, -18,
1176       3,  63,   3,  12, -30,  -5,   3,  12,  31,   0,
1177      24, -49,   8,  -9,   1,  33,  12,  29, -27,  18,
1178     -37, -21, -34,  17,   3,  11, -14,  23, -25,   2,
1179     }, {
1180     -13, -17,  15, -15,   3,  -1, -33,  -7,  -1,  12,
1181      58,  -5, -15, -13, -29,  -3,  16, -13,   4, -57,
1182      10, -13, -11,  13,  21,  15,   9, -40, -55,   3,
1183     -14, -19, -44,  17, -24, -32,   5,  -4,  21,  18,
1184     }, {
1185     -82,   3,  38,  23,  24, -15, -38,  -2, -37, -15,
1186      39,   2, -23,   4, -15,  12,   3, -17,  15, -58,
1187       1, -29,  -6,  -2,   5,  26,  -7,  -4, -56,   9,
1188     -35,  -3, -25,  33, -32, -36, -17,  -7,  15,   9,
1189     }, {
1190     -52, -10,  27, -27,  18, -26, -38, -14, -23,  16,
1191      44,  33,  -3, -20, -45, -10,  20, -15,   3, -31,
1192      50, -14,  10,   0,  -5,  17,  15, -32, -24,  16,
1193       1, -15, -55, -20, -14,  -8,  29,  12,   7,  32,
1194     }, {
1195    -121,   9,  50,  10,  40, -40, -43,  -9, -58, -12,
1196      25,  41, -11,  -2, -31,   5,   8, -19,  15, -32,
1197      41, -30,  16, -16, -20,  28,   0,   3, -26,  22,
1198     -19,   0, -36,  -4, -22, -12,   6,   9,   1,  24,
1199     }, {
1200      36, -18,  24,   3, -28,   7, -16,  13,  26,  41,
1201      24,  -1,   5, -26,  -3, -12,  27,  46,  27, -10,
1202     -24, -34, -10,  -8,  49,   2,  34,   0, -51, -12,
1203     -17, -38, -25,  56,   0,   0,  22,  -3, -20, -22,
1204     }, {
1205     -32,   2,  47,  42,  -7,  -5, -21,  18,  -9,  12,
1206       5,   5,  -2,  -8,  10,   4,  14,  42,  38, -10,
1207     -33, -49,  -5, -24,  33,  12,  17,  35, -52,  -6,
1208     -38, -22,  -7,  72,  -7,  -3,   0,  -6, -25, -30,
1209     }, {
1210      -2, -11,  36,  -9, -13, -17, -21,   6,   5,  45,
1211      10,  36,  18, -33, -19, -19,  31,  44,  27,  15,
1212      16, -34,  11, -22,  22,   4,  40,   7, -21,   0,
1213      -1, -35, -36,  18,  10,  24,  46,  12, -34,  -8,
1214     }, {
1215     -71,   9,  59,  29,   8, -30, -26,  11, -30,  16,
1216      -8,  44,   9, -14,  -5,  -2,  19,  40,  38,  15,
1217       7, -50,  17, -38,   7,  14,  24,  43, -22,   6,
1218     -22, -19, -17,  34,   2,  20,  23,  10, -39, -16,
1219     }, {
1220      -8,  -6,  33,   4,  -7, -44, -18,  21,  23,  48,
1221      46, -24,  -9, -40,  -3,  -1,  32,  13,  11, -43,
1222      -7, -14,  -3, -15,  26,  -3,  21, -26, -50,  -8,
1223       0, -16, -27,  34, -25, -23,  43, -17,   6,  -1,
1224     }, {
1225     -77,  13,  56,  43,  13, -57, -23,  26, -11,  19,
1226      27, -16, -17, -22,  10,  15,  19,  10,  22, -43,
1227     -16, -30,   2, -31,  11,   6,   5,   9, -52,  -2,
1228     -20,   0,  -8,  50, -33, -27,  19, -19,   1,  -9,
1229     }, {
1230     -47,   0,  45,  -7,   7, -69, -23,  13,   2,  51,
1231      32,  14,   3, -47, -19,  -8,  37,  11,  10, -16,
1232      32, -15,  19, -29,   0,  -1,  28, -18, -20,   4,
1233      16, -13, -38,  -3, -15,   0,  66,   0,  -7,  13,
1234     }, {
1235    -116,  20,  68,  30,  28, -83, -28,  18, -32,  22,
1236      13,  21,  -5, -28,  -5,   7,  24,   8,  22, -17,
1237      23, -30,  25, -45, -15,   9,  11,  18, -22,  10,
1238      -4,   2, -19,  12, -23,  -3,  43,  -2, -12,   4,
1239     }, {
1240      72, -13, -29, -18,   4,  90,  37, -34,   4,  -1,
1241      13,  -9,  -6,  11,   2,  24, -13,   3,  -7, -11,
1242      -4,   4, -42,  25,  31,  -1,  -8, -29,  -6,  17,
1243     -19,   2, -10,  -6,  38,  22, -42, -19,  -6, -11,
1244     }, {
1245       3,   7,  -6,  20,  25,  77,  32, -29, -31, -30,
1246      -4,  -2, -14,  29,  16,  40, -26,   0,   3, -12,
1247     -13, -10, -36,   9,  15,   8, -24,   6,  -7,  22,
1248     -40,  17,   8,   9,  31,  18, -66, -22, -11, -19,
1249     }, {
1250      32,  -6, -17, -31,  19,  65,  33, -41, -16,   1,
1251       0,  29,   6,   4, -13,  17,  -9,   1,  -8,  14,
1252      35,   3, -19,  11,   4,   0,  -1, -21,  23,  30,
1253      -3,   5, -20, -44,  48,  46, -19,  -3, -20,   3,
1254     }, {
1255     -36,  13,   5,   7,  40,  51,  28, -36, -52, -27,
1256     -18,  36,  -2,  22,   0,  33, -21,  -2,   3,  13,
1257      26, -11, -14,  -4, -10,  10, -18,  14,  22,  36,
1258     -24,  21,  -1, -28,  40,  42, -42,  -5, -25,  -5,
1259     }, {
1260      27,  -1, -20, -17,  24,  38,  35, -26,   1,   4,
1261      35, -32, -21,  -3,   2,  35,  -8, -29, -24, -44,
1262      12,  24, -34,  18,   8,  -7, -21, -55,  -5,  21,
1263      -2,  23, -11, -28,  13,  -1, -22, -33,  21,  10,
1264     }, {
1265     -41,  18,   2,  21,  45,  24,  30, -21, -33, -24,
1266      17, -24, -29,  15,  16,  51, -21, -33, -13, -45,
1267       3,   8, -28,   2,  -7,   2, -37, -19,  -7,  27,
1268     -22,  39,   7, -12,   5,  -5, -45, -35,  15,   1,
1269     }, {
1270     -12,   4,  -8, -29,  39,  12,  30, -33, -19,   8,
1271      21,   6,  -8,  -9, -13,  28,  -4, -31, -24, -18,
1272      52,  23, -12,   4, -18,  -5, -14, -47,  24,  34,
1273      14,  27, -22, -66,  22,  22,   1, -16,   6,  24,
1274     }, {
1275     -81,  25,  14,   8,  61,   0,  25, -28, -54, -20,
1276       3,  14, -17,   8,   0,  44, -16, -35, -13, -18,
1277      43,   7,  -6, -11, -33,   4, -30, -11,  22,  40,
1278      -6,  43,  -3, -50,  14,  18, -22, -18,   1,  16,
1279     }, {
1280      77,  -2, -11,   1,  -7,  47,  52,  -5,  29,  33,
1281       1, -28,   0, -15,  28,  26,   2,  30,   0,   2,
1282     -22,   4, -33,  -3,  36, -21,   3, -15,  -2,   5,
1283      -4,   4,   6,   9,  37,  31,  -5, -32, -20, -30,
1284     }, {
1285       8,  17,  10,  40,  13,  34,  47,   0,  -5,   4,
1286     -16, -21,  -8,   2,  42,  43, -10,  26,  10,   2,
1287     -31, -11, -27, -19,  21, -10, -12,  20,  -3,  11,
1288     -25,  20,  25,  25,  29,  28, -28, -34, -25, -38,
1289     }, {
1290      37,   3,   0, -10,   7,  22,  48, -12,   8,  36,
1291     -12,   9,  12, -22,  12,  19,   6,  28,   0,  29,
1292      18,   3, -11, -17,  10, -18,  10,  -7,  27,  18,
1293      11,   7,  -3, -28,  47,  55,  18, -15, -34, -16,
1294     }, {
1295     -31,  24,  23,  27,  29,   9,  43,  -8, -26,   7,
1296     -30,  17,   4,  -3,  26,  35,  -5,  24,  10,  28,
1297       9, -12,  -5, -33,  -5,  -8,  -5,  29,  26,  24,
1298      -9,  23,  14, -12,  39,  52,  -5, -18, -39, -24,
1299     }, {
1300      32,   8,  -3,   2,  13,  -4,  50,   1,  27,  39,
1301      23, -51, -15, -30,  27,  37,   7,  -1, -17, -29,
1302      -5,  23, -25, -10,  14, -26,  -8, -41,  -1,   9,
1303      13,  26,   5, -12,  12,   7,  14, -45,   6,  -9,
1304     }, {
1305     -36,  29,  19,  41,  34, -18,  45,   6,  -8,  10,
1306       5, -43, -23, -11,  42,  53,  -5,  -5,  -6, -30,
1307     -14,   8, -20, -26,  -1, -16, -25,  -4,  -3,  15,
1308      -7,  41,  23,   3,   4,   3,  -8, -48,   1, -17,
1309     }, {
1310      -7,  15,   9,  -9,  28, -29,  45,  -5,   6,  43,
1311       9, -12,  -2, -36,  12,  30,  11,  -3, -17,  -3,
1312      34,  22,  -3, -24, -12, -24,  -2, -32,  28,  22,
1313      29,  29,  -5, -50,  21,  31,  38, -29,  -7,   5,
1314     }, {
1315     -76,  35,  31,  28,  49, -43,  40,   0, -29,  14,
1316      -8,  -5, -10, -18,  26,  46,   0,  -7,  -6,  -3,
1317      25,   7,   2, -40, -28, -14, -18,   3,  27,  28,
1318       8,  45,  13, -34,  13,  27,  15, -31, -12,  -3,
1319     }, {
1320      74, -17,   0, -31, -18,  73,  -5,   0,   3,  -5,
1321      25,  12,  -3,  -1, -22,   3,  -9,  33, -12, -24,
1322       6,   2, -33,   9,  21,   5,  20, -27, -19,  -7,
1323     -34, -37, -34,  22,  44,   0, -41, -29, -17, -21,
1324     }, {
1325       5,   3,  21,   7,   2,  60, -10,   5, -32, -34,
1326       7,  20, -11,  16,  -8,  20, -21,  29,  -1, -24,
1327      -2, -13, -27,  -6,   5,  15,   3,   8, -21,  -1,
1328     -55, -21, -15,  38,  37,  -3, -65, -32, -23, -30,
1329     }, {
1330      35, -10,  11, -44,  -3,  48, -10,  -6, -17,  -2,
1331      11,  51,   8,  -8, -38,  -3,  -4,  31, -12,   2,
1332      46,   1, -10,  -4,  -5,   7,  26, -19,  10,   5,
1333     -18, -34, -45, -15,  54,  24, -18, -13, -31,  -7,
1334     }, {
1335     -33,  10,  34,  -5,  17,  35, -15,  -1, -53, -30,
1336      -6,  59,   0,  10, -24,  13, -17,  27,  -1,   1,
1337      37, -13,  -4, -20, -20,  18,  10,  16,   8,  11,
1338     -39, -18, -26,   0,  46,  20, -41, -15, -37, -15,
1339     }, {
1340      29,  -5,   7, -30,   1,  21,  -7,   7,   0,   0,
1341      47,  -9, -18, -15, -22,  14,  -4,   0, -28, -57,
1342      23,  21, -25,   2,  -1,   0,   7, -53, -19,  -3,
1343     -17, -15, -36,   0,  19, -24, -21, -43,   9,   0,
1344     }, {
1345     -39,  14,  30,   8,  22,   8, -12,  12, -34, -27,
1346      29,  -2, -26,   2,  -8,  31, -16,  -3, -17, -57,
1347      14,   6, -19, -13, -16,  10,  -8, -17, -20,   2,
1348     -38,   0, -17,  16,  11, -27, -44, -45,   4,  -8,
1349     }, {
1350      -9,   1,  20, -43,  17,  -3, -12,   0, -20,   4,
1351      33,  29,  -6, -22, -38,   7,   0,  -1, -29, -30,
1352      63,  21,  -3, -11, -27,   1,  14, -45,  10,   9,
1353      -1, -12, -47, -37,  28,   0,   2, -26,  -4,  13,
1354     }, {
1355     -78,  21,  43,  -4,  38, -17, -17,   5, -55, -24,
1356      15,  36, -14,  -4, -24,  24, -12,  -5, -17, -31,
1357      54,   5,   2, -27, -43,  12,  -2,  -9,   9,  15,
1358     -22,   3, -28, -21,  20,  -3, -20, -28,  -9,   5,
1359     }, {
1360      80,  -6,  16, -11, -30,  30,   9,  28,  28,  29,
1361      13,  -6,   2, -28,   3,   5,   7,  60,  -5,  -9,
1362     -11,   1, -24, -19,  27, -13,  32, -13, -15, -19,
1363     -19, -35, -17,  39,  43,   9,  -4, -42, -32, -41,
1364     }, {
1365      11,  14,  39,  27,  -9,  17,   4,  33,  -6,   0,
1366      -4,   1,  -5, -10,  17,  22,  -5,  57,   5,  -9,
1367     -20, -13, -18, -35,  11,  -3,  16,  22, -17, -13,
1368     -40, -19,   1,  55,  35,   5, -27, -44, -37, -49,
1369     }, {
1370      40,   0,  28, -24, -14,   5,   4,  21,   7,  33,
1371       0,  32,  15, -35, -12,  -1,  11,  58,  -5,  16,
1372      28,   0,  -1, -33,   0, -11,  39,  -5,  14,  -6,
1373      -3, -31, -28,   1,  53,  33,  19, -25, -46, -26,
1374     }, {
1375     -28,  20,  51,  14,   6,  -7,   0,  26, -27,   4,
1376     -18,  40,   6, -16,   1,  15,   0,  55,   5,  16,
1377      19, -14,   3, -49, -14,  -1,  22,  30,  12,   0,
1378     -24, -15,  -9,  17,  45,  29,  -4, -28, -51, -35,
1379     }, {
1380      34,   4,  25, -10,  -9, -21,   7,  36,  26,  36,
1381      35, -28, -12, -42,   3,  16,  12,  28, -21, -42,
1382       5,  21, -16, -26,   4, -19,  19, -39, -15, -15,
1383      -1, -13, -19,  17,  17, -14,  15, -55,  -4, -19,
1384     }, {
1385     -34,  25,  48,  28,  11, -34,   2,  41,  -9,   7,
1386      17, -21, -20, -24,  17,  33,   0,  24, -10, -42,
1387      -3,   5, -10, -42, -11,  -8,   3,  -3, -16,  -9,
1388     -22,   2,   0,  33,  10, -18,  -7, -58, -10, -28,
1389     }, {
1390      -4,  11,  37, -23,   5, -46,   2,  29,   5,  39,
1391      21,   9,   0, -49, -12,   9,  16,  26, -22, -15,
1392      45,  20,   5, -40, -22, -17,  26, -31,  14,  -2,
1393      14, -10, -30, -20,  27,   9,  39, -39, -18,  -5,
1394     }, {
1395     -73,  32,  60,  15,  26, -59,  -2,  33, -30,  10,
1396       3,  17,  -8, -30,   1,  26,   4,  22, -10, -16,
1397      36,   5,  11, -56, -37,  -6,  10,   5,  13,   3,
1398      -6,   5, -11,  -4,  19,   5,  16, -41, -24, -13
1399     }
1400 };
1401 
1402 const uint16_t ff_cb1_base[128]={
1403     19657, 18474, 18365, 17520, 21048, 18231, 18584, 16671,
1404     20363, 19069, 19409, 18430, 21844, 18753, 19613, 17411,
1405     20389, 21772, 20129, 21702, 20978, 20472, 19627, 19387,
1406     21477, 23134, 21841, 23919, 22089, 21519, 21134, 20852,
1407     19675, 17821, 19044, 17477, 19986, 16955, 18446, 16086,
1408     21138, 18899, 20952, 18929, 21452, 17833, 20104, 17159,
1409     19770, 20056, 20336, 20866, 19329, 18217, 18908, 18004,
1410     21556, 21948, 23079, 23889, 20922, 19544, 20984, 19781,
1411     19781, 20984, 19544, 20922, 23889, 23079, 21948, 21556,
1412     18004, 18908, 18217, 19329, 20866, 20336, 20056, 19770,
1413     17159, 20104, 17833, 21452, 18929, 20952, 18899, 21138,
1414     16086, 18446, 16955, 19986, 17477, 19044, 17821, 19675,
1415     20852, 21134, 21519, 22089, 23919, 21841, 23134, 21477,
1416     19387, 19627, 20472, 20978, 21702, 20129, 21772, 20389,
1417     17411, 19613, 18753, 21844, 18430, 19409, 19069, 20363,
1418     16671, 18584, 18231, 21048, 17520, 18365, 18474, 19657,
1419 };
1420 
1421 const uint16_t ff_cb2_base[128]={
1422     12174, 13380, 13879, 13832, 13170, 13227, 13204, 12053,
1423     12410, 13988, 14348, 14631, 13100, 13415, 13224, 12268,
1424     11982, 13825, 13499, 14210, 13877, 14788, 13811, 13109,
1425     11449, 13275, 12833, 13717, 12728, 13696, 12759, 12405,
1426     10230, 12185, 11628, 13161, 11762, 13458, 12312, 12818,
1427     10443, 12773, 12011, 14020, 11818, 13825, 12453, 13226,
1428     10446, 13162, 11881, 14300, 12859, 16288, 13490, 15053,
1429     10155, 12820, 11519, 13973, 12041, 15081, 12635, 14198,
1430     14198, 12635, 15081, 12041, 13973, 11519, 12820, 10155,
1431     15053, 13490, 16288, 12859, 14300, 11881, 13162, 10446,
1432     13226, 12453, 13825, 11818, 14020, 12011, 12773, 10443,
1433     12818, 12312, 13458, 11762, 13161, 11628, 12185, 10230,
1434     12405, 12759, 13696, 12728, 13717, 12833, 13275, 11449,
1435     13109, 13811, 14788, 13877, 14210, 13499, 13825, 11982,
1436     12268, 13224, 13415, 13100, 14631, 14348, 13988, 12410,
1437     12053, 13204, 13227, 13170, 13832, 13879, 13380, 12174,
1438 };
1439 
1440 const int16_t ff_energy_tab[32]={
1441         0,    16,    20,    25,    32,    41,    51,    65,
1442        81,   103,   129,   163,   205,   259,   326,   410,
1443       516,   650,   819,  1031,  1298,  1634,  2057,  2590,
1444      3261,  4105,  5168,  6507,  8192, 10313, 12983, 16345
1445 };
1446 
1447 static const int16_t lpc_refl_cb1[64]={
1448     -4041, -4018, -3998, -3977, -3954, -3930, -3906, -3879,
1449     -3852, -3825, -3795, -3764, -3731, -3699, -3666, -3631,
1450     -3594, -3555, -3513, -3468, -3420, -3372, -3321, -3268,
1451     -3212, -3153, -3090, -3021, -2944, -2863, -2772, -2676,
1452     -2565, -2445, -2328, -2202, -2072, -1941, -1808, -1660,
1453     -1508, -1348, -1185,  -994,  -798,  -600,  -374,  -110,
1454       152,   447,   720,   982,  1229,  1456,  1682,  1916,
1455      2130,  2353,  2595,  2853,  3118,  3363,  3588,  3814
1456 };
1457 
1458 static const int16_t lpc_refl_cb2[32]={
1459     -3091, -2386, -1871, -1425, -1021,  -649,  -316,   -20,
1460       267,   544,   810,  1065,  1305,  1534,  1756,  1970,
1461      2171,  2359,  2536,  2700,  2854,  2996,  3133,  3263,
1462      3386,  3499,  3603,  3701,  3789,  3870,  3947,  4020
1463 };
1464 
1465 static const int16_t lpc_refl_cb3[32]={
1466     -3525, -3295, -3081, -2890, -2696, -2511, -2328, -2149,
1467     -1979, -1817, -1658, -1498, -1341, -1188, -1032,  -876,
1468      -721,  -561,  -394,  -228,   -54,   119,   296,   484,
1469       683,   895,  1123,  1373,  1651,  1965,  2360,  2854
1470 };
1471 
1472 static const int16_t lpc_refl_cb4[16]={
1473     -1845, -1057,  -522,   -77,   301,   647,   975,  1285,
1474      1582,  1873,  2163,  2452,  2735,  3017,  3299,  3569
1475 };
1476 
1477 static const int16_t lpc_refl_cb5[16]={
1478     -2691, -2187, -1788, -1435, -1118,  -837,  -571,  -316,
1479       -59,   201,   470,   759,  1077,  1457,  1908,  2495
1480 };
1481 
1482 static const int16_t lpc_refl_cb6[8]={
1483     -1372,  -474,   133,   632,  1100,  1571,  2075,  2672
1484 };
1485 
1486 static const int16_t lpc_refl_cb7[8]={
1487     -2389, -1787, -1231,  -717,  -239,   234,   770,  1474
1488 };
1489 
1490 static const int16_t lpc_refl_cb8[8]={
1491     -1569,  -864,  -296,   200,   670,  1151,  1709,  2385
1492 };
1493 
1494 static const int16_t lpc_refl_cb9[8]={
1495     -2200, -1608, -1062,  -569,  -120,   338,   863,  1621
1496 };
1497 
1498 static const int16_t lpc_refl_cb10[4]={
1499      -617,   190,   802,  1483
1500 };
1501 
1502 const int16_t * const ff_lpc_refl_cb[10]={
1503     lpc_refl_cb1, lpc_refl_cb2, lpc_refl_cb3, lpc_refl_cb4, lpc_refl_cb5,
1504     lpc_refl_cb6, lpc_refl_cb7, lpc_refl_cb8, lpc_refl_cb9, lpc_refl_cb10
1505 };
1506 
add_wav(int16_t * dest,int n,int skip_first,int * m,const int16_t * s1,const int8_t * s2,const int8_t * s3)1507 static void add_wav(int16_t *dest, int n, int skip_first, int *m,
1508                     const int16_t *s1, const int8_t *s2, const int8_t *s3)
1509 {
1510     int i;
1511     int v[3];
1512 
1513     v[0] = 0;
1514     for (i=!skip_first; i<3; i++)
1515         v[i] = (ff_gain_val_tab[n][i] * (unsigned)m[i]) >> ff_gain_exp_tab[n];
1516 
1517     if (v[0]) {
1518         for (i=0; i < BLOCKSIZE; i++)
1519             dest[i] = (int)((s1[i]*(unsigned)v[0]) + s2[i]*v[1] + s3[i]*v[2]) >> 12;
1520     } else {
1521         for (i=0; i < BLOCKSIZE; i++)
1522             dest[i] = (             s2[i]*v[1] + s3[i]*v[2]) >> 12;
1523     }
1524 }
1525 
1526 /**
1527  * Copy the last offset values of *source to *target. If those values are not
1528  * enough to fill the target buffer, fill it with another copy of those values.
1529  */
ff_copy_and_dup(int16_t * target,const int16_t * source,int offset)1530 void ff_copy_and_dup(int16_t *target, const int16_t *source, int offset)
1531 {
1532     source += BUFFERSIZE - offset;
1533 
1534     memcpy(target, source, FFMIN(BLOCKSIZE, offset)*sizeof(*target));
1535     if (offset < BLOCKSIZE)
1536         memcpy(target + offset, source, (BLOCKSIZE - offset)*sizeof(*target));
1537 }
1538 
1539 /**
1540  * Evaluate the reflection coefficients from the filter coefficients.
1541  *
1542  * @return 1 if one of the reflection coefficients is greater than
1543  *         4095, 0 if not.
1544  */
ff_eval_refl(int * refl,const int16_t * coefs,AVCodecContext * avctx)1545 int ff_eval_refl(int *refl, const int16_t *coefs, AVCodecContext *avctx)
1546 {
1547     int b, i, j;
1548     int buffer1[LPC_ORDER];
1549     int buffer2[LPC_ORDER];
1550     int *bp1 = buffer1;
1551     int *bp2 = buffer2;
1552 
1553     for (i=0; i < LPC_ORDER; i++)
1554         buffer2[i] = coefs[i];
1555 
1556     refl[LPC_ORDER-1] = bp2[LPC_ORDER-1];
1557 
1558     if ((unsigned) bp2[LPC_ORDER-1] + 0x1000 > 0x1fff) {
1559         av_log(avctx, AV_LOG_ERROR, "Overflow. Broken sample?\n");
1560         return 1;
1561     }
1562 
1563     for (i = LPC_ORDER-2; i >= 0; i--) {
1564         b = 0x1000-((bp2[i+1] * bp2[i+1]) >> 12);
1565 
1566         if (!b)
1567             b = -2;
1568 
1569         b = 0x1000000 / b;
1570         for (j=0; j <= i; j++) {
1571 #if CONFIG_FTRAPV
1572             int a = bp2[j] - ((int)(refl[i+1] * (unsigned)bp2[i-j]) >> 12);
1573             if((int)(a*(unsigned)b) != a*(int64_t)b)
1574                 return 1;
1575 #endif
1576             bp1[j] = (int)((bp2[j] - ((int)(refl[i+1] * (unsigned)bp2[i-j]) >> 12)) * (unsigned)b) >> 12;
1577         }
1578 
1579         if ((unsigned) bp1[i] + 0x1000 > 0x1fff)
1580             return 1;
1581 
1582         refl[i] = bp1[i];
1583 
1584         FFSWAP(int *, bp1, bp2);
1585     }
1586     return 0;
1587 }
1588 
1589 /**
1590  * Evaluate the LPC filter coefficients from the reflection coefficients.
1591  * Does the inverse of the ff_eval_refl() function.
1592  */
ff_eval_coefs(int * coefs,const int * refl)1593 void ff_eval_coefs(int *coefs, const int *refl)
1594 {
1595     int buffer[LPC_ORDER];
1596     int *b1 = buffer;
1597     int *b2 = coefs;
1598     int i, j;
1599 
1600     for (i=0; i < LPC_ORDER; i++) {
1601         b1[i] = refl[i] * 16;
1602 
1603         for (j=0; j < i; j++)
1604             b1[j] = ((int)(refl[i] * (unsigned)b2[i-j-1]) >> 12) + b2[j];
1605 
1606         FFSWAP(int *, b1, b2);
1607     }
1608 
1609     for (i=0; i < LPC_ORDER; i++)
1610         coefs[i] >>= 4;
1611 }
1612 
ff_int_to_int16(int16_t * out,const int * inp)1613 void ff_int_to_int16(int16_t *out, const int *inp)
1614 {
1615     int i;
1616 
1617     for (i = 0; i < LPC_ORDER; i++)
1618         *out++ = *inp++;
1619 }
1620 
1621 /**
1622  * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an
1623  * odd way to make the output identical to the binary decoder.
1624  */
ff_t_sqrt(unsigned int x)1625 int ff_t_sqrt(unsigned int x)
1626 {
1627     int s = 2;
1628     while (x > 0xfff) {
1629         s++;
1630         x >>= 2;
1631     }
1632 
1633     return ff_sqrt(x << 20) << s;
1634 }
1635 
ff_rms(const int * data)1636 unsigned int ff_rms(const int *data)
1637 {
1638     int i;
1639     unsigned int res = 0x10000;
1640     int b = LPC_ORDER;
1641 
1642     for (i = 0; i < LPC_ORDER; i++) {
1643         res = (((0x1000000 - data[i]*data[i]) >> 12) * res) >> 12;
1644 
1645         if (res == 0)
1646             return 0;
1647 
1648         while (res <= 0x3fff) {
1649             b++;
1650             res <<= 2;
1651         }
1652     }
1653 
1654     return ff_t_sqrt(res) >> b;
1655 }
1656 
ff_interp(RA144Context * ractx,int16_t * out,int a,int copyold,int energy)1657 int ff_interp(RA144Context *ractx, int16_t *out, int a, int copyold, int energy)
1658 {
1659     int work[LPC_ORDER];
1660     int b = NBLOCKS - a;
1661     int i;
1662 
1663     // Interpolate block coefficients from the this frame's forth block and
1664     // last frame's forth block.
1665     for (i = 0; i < LPC_ORDER; i++)
1666         out[i] = (a * ractx->lpc_coef[0][i] + b * ractx->lpc_coef[1][i])>> 2;
1667 
1668     if (ff_eval_refl(work, out, ractx->avctx)) {
1669         // The interpolated coefficients are unstable, copy either new or old
1670         // coefficients.
1671         ff_int_to_int16(out, ractx->lpc_coef[copyold]);
1672         return ff_rescale_rms(ractx->lpc_refl_rms[copyold], energy);
1673     } else {
1674         return ff_rescale_rms(ff_rms(work), energy);
1675     }
1676 }
1677 
ff_rescale_rms(unsigned int rms,unsigned int energy)1678 unsigned int ff_rescale_rms(unsigned int rms, unsigned int energy)
1679 {
1680     return (rms * energy) >> 10;
1681 }
1682 
1683 /** inverse root mean square */
ff_irms(AudioDSPContext * adsp,const int16_t * data)1684 int ff_irms(AudioDSPContext *adsp, const int16_t *data)
1685 {
1686     unsigned int sum = adsp->scalarproduct_int16(data, data, BLOCKSIZE);
1687 
1688     if (sum == 0)
1689         return 0; /* OOPS - division by zero */
1690 
1691     return 0x20000000 / (ff_t_sqrt(sum) >> 8);
1692 }
1693 
ff_subblock_synthesis(RA144Context * ractx,const int16_t * lpc_coefs,int cba_idx,int cb1_idx,int cb2_idx,int gval,int gain)1694 void ff_subblock_synthesis(RA144Context *ractx, const int16_t *lpc_coefs,
1695                            int cba_idx, int cb1_idx, int cb2_idx,
1696                            int gval, int gain)
1697 {
1698     int16_t *block;
1699     int m[3];
1700 
1701     if (cba_idx) {
1702         cba_idx += BLOCKSIZE/2 - 1;
1703         ff_copy_and_dup(ractx->buffer_a, ractx->adapt_cb, cba_idx);
1704         m[0] = (ff_irms(&ractx->adsp, ractx->buffer_a) * (unsigned)gval) >> 12;
1705     } else {
1706         m[0] = 0;
1707     }
1708     m[1] = (ff_cb1_base[cb1_idx] * gval) >> 8;
1709     m[2] = (ff_cb2_base[cb2_idx] * gval) >> 8;
1710     memmove(ractx->adapt_cb, ractx->adapt_cb + BLOCKSIZE,
1711             (BUFFERSIZE - BLOCKSIZE) * sizeof(*ractx->adapt_cb));
1712 
1713     block = ractx->adapt_cb + BUFFERSIZE - BLOCKSIZE;
1714 
1715     add_wav(block, gain, cba_idx, m, cba_idx? ractx->buffer_a: NULL,
1716             ff_cb1_vects[cb1_idx], ff_cb2_vects[cb2_idx]);
1717 
1718     memcpy(ractx->curr_sblock, ractx->curr_sblock + BLOCKSIZE,
1719            LPC_ORDER*sizeof(*ractx->curr_sblock));
1720 
1721     if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + LPC_ORDER, lpc_coefs,
1722                                     block, BLOCKSIZE, LPC_ORDER, 1, 0, 0xfff))
1723         memset(ractx->curr_sblock, 0, (LPC_ORDER+BLOCKSIZE)*sizeof(*ractx->curr_sblock));
1724 }
1725